04 从原始 Transformer 到现代架构
课程锚点:Lecture03 Slides34–46;Lecture02 Slides39–44;Tutorial04 Cells35起的现代部分;Tutorial07 Cells4–19;Assignment1 QuestionII。
4.1 LayerNorm 与 RMSNorm
对一个token的D个特征归一化,不是跨batch或跨整段序列:
RMSNorm通常不减均值、不加可学平移:
区别:LN近似具有共同平移不变性(忽略仿射项作用的变化);RMSNorm没有。RMSNorm保留原始方向与相对分量,只按均方根缩放再逐维乘γ。两者都依赖epsilon;“缩放不变性”也需考虑epsilon和缩放符号,不应无限绝对化。
例x=[1,3]:均值2,方差1,LN(γ=1,β=0,忽略eps)得[-1,1];RMS=√5,RMSNorm得[1/√5,3/√5]。归一化不是把每项变成概率,也不是每次都让向量欧氏长度变1:RMSNorm后平方均值约1,欧氏长度约√D。
实现常在FP32累计平方/均值,最后转回输入dtype。γ是训练参数;position cos/sin缓存常是buffer,二者都能随模型移动设备,但只有参数通常交给优化器。
4.2 Pre-norm 的梯度通路
pre-norm x_next=x+F(Norm(x)),Jacobian=I+J_F J_Norm;post-norm Norm(x+F(x)),Jacobian=J_Norm(I+J_F)。多层相乘时,后者每层的主通路都被norm Jacobian调制。由此理解pre-norm为何常改善优化,而不是简单背“norm前移性能一定更好”。
现代block常写:u=x+Attn(RMSNorm(x)),y=u+SwiGLU(RMSNorm(u)),不同子层各自有norm参数。最终还常有一个RMSNorm。不要把RMSNorm、残差、attention三者执行次序写反。
4.3 为什么需要位置表示
无位置信息、无mask的self-attention对token重排具有置换等变性:Attn(PX)=P Attn(X)。同一内容集合可能无法表达“谁在谁前面”。causal mask本身带来部分顺序结构,因此严谨说法不是“任何无显式PE模型都绝对学不到位置”,而是裸双向attention没有显式顺序区分,需要机制表达序列结构。
绝对sin/cos位置编码把位置向量加到输入;learned absolute PE查可学位置表,直接外推超表长度受限;相对位置bias直接改attention分数。RoPE则旋转投影后的Q/K,使点积带相对位置信息,通常不旋转V。
4.4 RoPE 逐步推导
本课作业用相邻成对(0,1),(2,3)…、列向量、弧度。头维d为正偶数,频率 θ_r=10000^{-2r/d}。位置p的每一对旋转:
把所有二维旋转拼成块对角矩阵R_p。由于旋转正交且角度可加:R_mᵀ=R_-m,R_-m R_n=R_(n-m),因此
相同内容向量q/k下,只依赖位置差。对二维q=(a,b)、k=(c,d),展开为
(ac+bd)cos((n-m)θ)+(bc-ad)sin((n-m)θ)。
这也解释只比较(1,3)和(11,13)时为什么要固定q/k内容;若换了上下文hidden state,内容变化也会改变内积。**相对位置性质不表示整网在任意上下文平移下输出完全相同,更不保证无限长外推。**频率覆盖不同变化尺度,但点积不会对所有内容都随距离单调下降。
作业例d=4,频率[1,0.01],q=[1,2,3,4]位置1,k=[4,3,2,1]位置3:
R1q≈[-1.1426,1.9221,2.9599,4.0298];
R3k≈[-4.3833,-2.4055,1.9691,1.0595];
内积约 10.4830。验证脚本同时核验(1,3)、(11,13)和qᵀR₂k得到相同结果。
如果用行向量,旋转写法要转置一致;不能一半用列向量公式、一半用行向量乘法。某些实现使用half-split pairing,与相邻配对可通过维度重排对应,但在现成权重下不能随意换约定。
4.5 RoPE 代码流程和 cache 位置
输入作业形状[B,T,H,d]:先FP32→取偶/奇分量[B,T,H,d/2]→位置[T]或[B,T]乘频率→把sin/cos广播成[1,T,1,d/2]或[B,T,1,d/2]→二维旋转→交错拼回→cast回bf16。
课程类内部常用[B,H,T,d],sin/cos要变[B,1,T,d/2]。不能直接照抄作业的轴位置。Assignment1要求FP32内部计算,课程某些示例把sin/cos转回低精度再乘;需要按题面实现,不混淆两种数值策略。
decode时新token position应接历史长度,不是每步重置0。缓存一般保存已经旋转好的历史K;下次不用重新旋转旧K,也不能二次旋转。padding/packed sequence的position IDs要与训练约定匹配。
4.6 ReLU → GLU → SwiGLU
经典FFN(行向量约定)ReLU(xW1)W2。GLU用一条分支调节另一条;SwiGLU:
Wg/Wu:[D,F],Wd:[F,D],约3DF参数;经典两投影FFN约2DF。若经典F=4D,等参数SwiGLU常取F≈8D/3,再按硬件对齐调整。不能在同F下说SwiGLU完全不增加参数。
gate不是概率分布,不要求和为1;SiLU可为负,SwiGLU gate也不是0–1的sigmoid gate。它增加可学习的乘性特征交互,经验上对质量/效率有利;并非已证明对任何数据优于ReLU。
4.7 MHA、MQA、GQA 的精确区别
| 机制 | Q头数 | KV头数 | 每组Q共享多少KV | 主要取舍 |
|---|---|---|---|---|
| MHA | Hq | Hq | 每头独立 | KV容量大,表达自由度高 |
| MQA | Hq | 1 | 所有Q共享一组KV | 显著减cache,可能损失质量 |
| GQA | Hq | Hkv | 每Hq/Hkv个Q共享 | 在容量与质量之间折中 |
通常Hq可被Hkv整除,d=D/Hq。Q:[B,Hq,T,d],K/V:[B,Hkv,T,d]。WK/WV输出宽Hkv*d,WQ仍宽D。每个Q头仍独立产生一行attention权重;共享KV不等于所有头attention相同。
Tutorial07用repeat_interleave对齐头数是教学实现;生产kernel能直接按组读取,缓存应按未重复的Hkv存。重复后的临时张量若真的物化会增加临时内存,不能按它判断架构固有cache大小。
本节的背景与命名可查 GQA原论文;考试计算以题给头数、维度和精度为准。