Lecture 05 · 在已经认识的 block 上读懂现代部件

在已经认识的 block 上读懂现代部件

课堂接续:T31 · T32。连续读本:第5章;本主题提供独立定义、例子、代码与来源。

当前九单位翻译器已经明确:跨位置读取、同位置多头合并、残差、归一化、逐位置FFN共同组成block。以下现代改动分别针对这些职责,不能只用架构名推断收益。

完整post-norm块为现代部件比较提供具体位置

比较时保留真实任务、预算和基线;原四维BLOCK仍是独立可复算构造,不是当前九单位已训练系统。下列历史论文与未训练算子核验各自保持原身份。

阅读本主题 · 返回实验 · 与Agent共读全文

读本: CLS 02 · Attention 与 Transformer ,查找“在已经认识的 block 上读懂现代部件”;实验中查找“F · 跟着一个 token 穿过完整 encoder block”。

归一化:放在哪里,处理哪一个轴

旧版独立扩展:现代部件首先定位到完整block的既有职责

结构接通以后,训练还得稳定地把误差信号传回参数。联系L2关于学习率和梯度尺度的经验,一个自然问题是:同样的残差分支,归一化放在分支前还是相加后,会怎样影响较大学习率下的初始训练?这让一个部件选择对应到明确的损失曲线、梯度和失败率,而不只剩“哪个名字更新”。

post-LN:y=LN(x+F(x));pre-LN:y=x+F(LN(x)),完整pre-LN堆叠末端加最终LN。Xiong et al.(ICML2020)§3的初始化分析与§4的实验提供机制和任务证据。

采用Figure4的IWSLT14德→英设置:6层encoder+6层decoder,d=512,4heads,FFN=1024;Adam β=(.9,.98),最大/初始lr=5e−4。post-LN有4000步warmup及逆平方根衰减,pre-LN无warmup且第8epoch降到.1倍。两者约34BLEU,pre-LN第9个checkpoint与post-LN第15个近似相当。

这项对照同时改变了归一化位置和学习率调度,因而支持上述配置可行,不能把收益单独归因于位置,也不能把checkpoint差直接当硬件速度提升。要区分两个因素,可以设计位置×warmup的2×2,固定数据、tokenizer、初始化种子组、更新数、batch、优化器、最大学习率与warmup结束后的调度函数。先看loss曲线、各层梯度范数及失败率,再看固定预算验证NLL/BLEU。与已调优post-LN比较。历史证据来自原论文;这里的2×2是待执行实验,不是新训练结果。

设F=0,前者仍得到LN(x),后者保留x,这已经是不同的前向系统。pre-LN的残差通路不必每次穿过归一化,提供一种改善深层优化的动机;具体学习率、warmup与最终质量仍要训练验证。LAB03 F的开关只验证计算图,不是稳定性实验。

LayerNorm 与 RMSNorm 的算子区别

LayerNorm在每个token的特征轴上减均值并按方差缩放,再逐特征乘g/加b。它不把一行变成概率。常见无bias RMSNorm用

$$\operatorname{RMSNorm}(x)=g\odot\frac{x}{\sqrt{d^{-1}\sum_i x_i^2+\epsilon}}.$$

对x=(1,3)、g=(1,1),忽略很小eps,LN得到(-1,1),RMSNorm得到(1/√5,3/√5)。给两项同时加10,LN不变,RMSNorm会变;RMSNorm省掉均值中心化,不是数值相同的“快速LN”。论文讨论其缩放性质与效率;本课没有训练出RMSNorm更好的质量结论。

QK normalization处理匹配,不处理词表概率

Henry2020的QKNorm在每个head特征轴上把q/k做L2归一,再用可学习g乘余弦相似度作为score,替代普通的点积/√d_k。让某key整体放大10倍,普通点积会放大,归一后的方向匹配不变(忽略eps);g还可以控制softmax分布尖锐程度。它关注匹配尺度和softmax饱和,不是把V也归一,不是对token轴先做softmax。

现代实现有用RMSNorm处理Q/K的不同版本,不能套原论文L2公式而声称逐值相同。要复现实验,应记录归一轴、是否有可学习尺度、eps以及与RoPE的先后顺序。本节采用的是明确的2020设计,用来说明改动位置。

FFN 与 SwiGLU:每行自己的非线性计算

普通FFN为 W_2 φ(W_1 x+b_1)+b_2(这里列向量约定);同一参数处理每个token,attention已把别处内容带入x。激活使它超出一层线性变换。其宽度常大于模型维度,既是表示能力来源,也是decode时不可忽略的计算。

用行向量写SwiGLU:

$$u=xW_u,\quad g=xW_g,\quad \operatorname{SwiGLU}(x)=(\operatorname{SiLU}(g)\odot u)W_d,\quad \operatorname{SiLU}(a)=a\sigma(a).$$

两条投影分支逐元素相乘,一条调节另一条的通过程度。SiLU不是只取sigmoid;负输入也可以产生负门值。这不是LSTM跨时间保存的forget gate,它作用在当前token的FFN中间特征。若普通FFN中间宽4d,两大矩阵约8d²参数;SwiGLU三矩阵要用约8d/3中间宽才近似同参数预算(忽略bias和硬件整除)。直接把宽度都设4d再比性能,额外参数与FLOPs也变了。

MoE:总模型很大,一次只调用一部分

想象三个FFN专家E1/E2/E3,router对一个token输出(.1,.7,.2)。在Switch具体top-1约定里,只计算E2,输出乘.7;并不是所有top-1实现都自动重新归一为权重1。其他模型可用top-2等路由,权重归一、容量和丢弃规则都要按实现说明。

如果一批token都涌向E2,另两个专家空闲,E2却拥挤。负载平衡loss、容量限制、跨设备通信因此进入问题。假如每专家有P参数、共有E个,每token调用k个,总专家参数EP,激活专家参数约kP,另加共享层和router;这些数与延迟、设备内存也不是同一量。只宣称“总参数翻倍但FLOPs不变”会漏掉路由、通信和实际batch效率。

对实验设计而言,先固定数据、激活计算与训练预算,再看质量和吞吐;还应记录丢token/容量策略。当前读本只解释机制与比较条件,没有训练MoE成绩。

位置与 RoPE:相对关系如何进入匹配

加性位置在输入embedding处加入位置向量,原Transformer用正弦/余弦;学习式绝对位置也可用。RoPE把q和k的每对坐标旋转:列向量约定下q_i'=R(iθ)q_i、k_j'=R(jθ)k_j,于是

$$q_i'^T k_j'=q_i^T R((j-i)\theta)k_j.$$

共同平移i/j同一数量,在这个局部匹配式里保留相对旋转;不同频率的二维子空间共同承载位置关系。例:q=k=(1,0),θ=π/2,位置差0时点积1、差1时0、差2时−1,说明同一内容因相对距离得到不同分数。这是构造旋转,不是训练出的语言关系。

“式子含相对位置”并不保证从训练长度外推到任意长文档:未见距离的相位组合、频率、训练数据、模型利用方式都可能不同。模型也不能只靠位置知道哪条消息被撤回。去上下文路径时,要把几何可计算、cache有效与事实使用分别检查。

一次有约束的比较怎样开始

训练初期loss不稳定:可能归一位置影响梯度,也可能学习率过大或mask有错。先用已有数值链排除前向/遮挡错误,再做pre/post×warmup的2×2训练,会比同时换RMSNorm/SwiGLU/初始化更能区分解释。显存紧张则先列参数、激活、KV各占多少;MoE和GQA(让一组query头共享K/V头)解决的并非同一瓶颈。这些是未执行的研究方案,不要求每个学生把所有现代部件都训练一遍。

来源:Xiong2020、RMSNorm2019 v1、QKNorm2020 §3、GLU Variants2020、Switch2022 §2、RoFormer v5 §3。原始提出年份与实际核读版本分别记录;不把后续修订内容当2017已知事实。

相邻知识与复核资源

同一段文本,三种预训练问题 · 从2017计算图到2020组合,再看持续状态系统

全部主题 · 关键结果JSON · 只读诊断源码 · Seq2Seq完整实现 · 视觉机制实现 · TinyDecoder与cache实现