单层解码块:Pre-Norm 的"因果自注意力 + 前馈网络(稠密或 MoE)"。
LLMBlock
01 Syntax
02 Methods
| Name | Overloads | Summary |
|---|---|---|
| .ctor | 1 | |
| Align | 1 | 把 value 向上对齐到 alignment 的倍数。 |
| RegisterParameters | 1 | 把本层全部子模块的参数登记进参数集。 |
| Forward | 1 | 前向:x ← x + Attn(Norm₁(x));x ← x + FFN(Norm₂(x))。 |
| Backward | 1 | 反向传播:返回对输入的梯度。 |
| ZeroGradients | 1 | 清零本层全部子模块的梯度累加器。 |
| MakeTrainingStep | 1 | 按 AdamW 规则更新本层全部子模块。 |
03 Properties
| Name | Overloads | Summary |
|---|---|---|
| IsMixtureOfExperts | 1 | 本层是否使用 MoE。 |
| LastCache | 1 | 最近一次 LLMBlock.Forward()) 的中间量缓存。 |
| TotalParameters | 1 | 本层总参数(稠密层为实际参数;MoE 层为全部专家的参数之和)。 |
| ActiveParametersPerToken | 1 | 本层单个 token 实际激活的参数(MoE 层远小于 LLMBlock.TotalParameters)。 |
04 Fields
05 Members
参数刻意命名为 moeLayer 而不是 moe:VB 的标识符大小写不敏感, 若形参叫 moe,它会与字段 LLMBlock.MoE 视为同一名字而被遮蔽, 于是 MoE = moe 退化成自赋值、字段永远是 Nothing。
| Name | Type | Description |
|---|---|---|
dModel | Int32 | 模型宽度 |
nHeads | Int32 | 注意力 Query 头数 |
nKvHeads | Int32 | 注意力 K/V 头数(GQA / MQA) |
headDim | Int32 | 单头维度 |
moeLayer | MoELayer | 本层使用的 MoE 子层;传 |
denseHidden | Int32 | 稠密 SwiGLU 的中间层宽度;<= 0 时按 4·dModel 向上对齐到 64 的倍数 |
Int32, Int32)把 value 向上对齐到 alignment 的倍数。
把本层全部子模块的参数登记进参数集。
前向:x ← x + Attn(Norm₁(x));x ← x + FFN(Norm₂(x))。
| Name | Type | Description |
|---|---|---|
x | Tensor | 输入 |
positions | Int32() | 长度 S 的绝对位置序列 |
rope | RotaryEmbedding | 共享的 RoPE 模块 |
caches | KVCache() | 长度 B 的 K/V 缓存; |
反向传播:返回对输入的梯度。
| Name | Type | Description |
|---|---|---|
forwardCache | Cache | 与该次前向对应的缓存快照 |
dOut | Tensor | 对本层输出的梯度 |
rope | RotaryEmbedding | 前向使用的同一个 RoPE 模块 |
清零本层全部子模块的梯度累加器。
Double, Int32)按 AdamW 规则更新本层全部子模块。
本层是否使用 MoE。
最近一次 LLMBlock.Forward() 的中间量缓存。
本层总参数(稠密层为实际参数;MoE 层为全部专家的参数之和)。
本层单个 token 实际激活的参数(MoE 层远小于 LLMBlock.TotalParameters)。
注意力子层前的 RMSNorm。
前馈子层前的 RMSNorm。
因果自注意力子层。
MoE 前馈子层;为 Nothing 时本层使用稠密 SwiGLU。
稠密 SwiGLU 前馈子层;为 Nothing 时本层使用 MoE。