上一章 · 返回首页 · 内容清单 · 下一章

课程锚点:Lecture03 Slides34–46;Lecture02 Slides39–44;Tutorial04 Cells35起的现代部分;Tutorial07 Cells4–19;Assignment1 QuestionII。

4.1 LayerNorm 与 RMSNorm

对一个token的D个特征归一化,不是跨batch或跨整段序列:

μ=1D∑ixi,v=1D∑i(xi−μ)2,\mu={1\over D}\sum_i x_i,\quad v={1\over D}\sum_i(x_i-\mu)^2, LN⁡(x)i=γixi−μv+ϵ+βi.\operatorname{LN}(x)_i=\gamma_i{x_i-\mu\over\sqrt{v+\epsilon}}+\beta_i.

RMSNorm通常不减均值、不加可学平移:

RMSNorm⁡(x)i=γixiD−1∑jxj2+ϵ.\operatorname{RMSNorm}(x)_i=\gamma_i{x_i\over\sqrt{D^{-1}\sum_jx_j^2+\epsilon}}.

区别: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θ)=[cos⁡(pθ)−sin⁡(pθ)sin⁡(pθ)cos⁡(pθ)].R(p\theta)=\begin{bmatrix}\cos(p\theta)&-\sin(p\theta)\\\sin(p\theta)&\cos(p\theta)\end{bmatrix}.

把所有二维旋转拼成块对角矩阵R_p。由于旋转正交且角度可加:R_mᵀ=R_-m,R_-m R_n=R_(n-m),因此

(Rmq)T(Rnk)=qTRmTRnk=qTRn−mk.(R_mq)^T(R_nk)=q^TR_m^TR_nk=q^TR_{n-m}k.

相同内容向量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:

SwiGLU⁡(x)=(SiLU⁡(xWg)⊙xWu)Wd,\operatorname{SwiGLU}(x)=\big(\operatorname{SiLU}(xW_g)\odot xW_u\big)W_d, SiLU⁡(z)=zσ(z),SiLU⁡′(z)=σ(z)+zσ(z)(1−σ(z)).\operatorname{SiLU}(z)=z\sigma(z),\quad \operatorname{SiLU}'(z)=\sigma(z)+z\sigma(z)(1-\sigma(z)).

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主要取舍
MHAHqHq每头独立KV容量大,表达自由度高
MQAHq1所有Q共享一组KV显著减cache,可能损失质量
GQAHqHkv每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原论文;考试计算以题给头数、维度和精度为准。


上一章 · 返回首页 · 内容清单 · 下一章

Built with LogoFlowershow