modern-transformer-parts.md · 可读全文

这里保留原文的中文、公式标记、代码和链接。可直接交给 Agent 读取,也可选取下方原文复制。此入口返回 HTML;原始 .md / .py 文件仍保留,完整候选包同时包含 UTF-8 原件。

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

课堂接续:[T31](https://codingai-lec05.pages.dev/classroom/T31.html?step=b0) · [T32](https://codingai-lec05.pages.dev/classroom/T32.html?step=b0)。连续读本:[第5章](https://codingai-lec05.pages.dev/lecture.html#chapter-5);本主题提供独立定义、例子、代码与来源。

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

![完整post-norm块为现代部件比较提供具体位置](https://codingai-lec05.pages.dev/assets/r72/classroom/T31-b4.svg)

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


[阅读本主题](https://codingai-lec05.pages.dev/course/knowledge/modern-transformer-parts.html) · [返回实验](https://deepnote.com/workspace/ise3309jingao-5ba66b0a-4283-4f5a-ae06-3f68d3201e99/project/Fall-26-Lecture-05-841ec8e7-e352-4840-b628-d3742b03d6d0/notebook/LAB-03-Transformer-9c5b3d45acdb438a8e7df1dc6cb97e40?utm_content=9c5b3d45acdb438a8e7df1dc6cb97e40&utm_source=openai&utm_medium=mcp&utm_campaign=openaimcp&utm_term=get_notebook) · [与Agent共读全文](https://codingai-lec05.pages.dev/course/knowledge/modern-transformer-parts.md.read.html)

读本:[ CLS 02 · Attention 与 Transformer ](https://deepnote.com/workspace/ise3309jingao-5ba66b0a-4283-4f5a-ae06-3f68d3201e99/project/Fall-26-Lecture-05-841ec8e7-e352-4840-b628-d3742b03d6d0/notebook/CLS-02-Attention-Transformer-2d44adcb6f3d409aa7dfb25c21a748a3?utm_content=2d44adcb6f3d409aa7dfb25c21a748a3&utm_source=openai&utm_medium=mcp&utm_campaign=openaimcp&utm_term=get_notebook),查找“在已经认识的 block 上读懂现代部件”;实验中查找“F · 跟着一个 token 穿过完整 encoder block”。


<span id="modern-transformer-parts-s01"></span>

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

![旧版独立扩展:现代部件首先定位到完整block的既有职责](https://codingai-lec05.pages.dev/assets/r71/classroom/S23-b5.svg)

<span id="read-R49"></span>

结构接通以后,训练还得稳定地把误差信号传回参数。联系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更好的质量结论。

<span id="modern-transformer-parts-s02"></span>

## 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设计,用来说明改动位置。

<span id="modern-transformer-parts-s03"></span>

## 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也变了。

<span id="modern-transformer-parts-s04"></span>

## 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成绩。

<span id="modern-transformer-parts-s05"></span>

## 位置与 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有效与事实使用分别检查。

<span id="modern-transformer-parts-s06"></span>

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

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

来源:[Xiong2020](https://proceedings.mlr.press/v119/xiong20b/xiong20b.pdf)、[RMSNorm2019 v1](https://arxiv.org/html/1910.07467v1)、[QKNorm2020 §3](https://aclanthology.org/2020.findings-emnlp.379.pdf)、[GLU Variants2020](https://arxiv.org/pdf/2002.05202)、[Switch2022 §2](https://www.jmlr.org/papers/volume23/21-0998/21-0998.pdf)、[RoFormer v5 §3](https://arxiv.org/html/2104.09864v5)。原始提出年份与实际核读版本分别记录;不把后续修订内容当2017已知事实。


<span id="modern-transformer-parts-s07"></span>

## 相邻知识与复核资源

[同一段文本,三种预训练问题](https://codingai-lec05.pages.dev/course/knowledge/model-objectives.html) · [从2017计算图到2020组合,再看持续状态系统](https://codingai-lec05.pages.dev/course/knowledge/architecture-choices-and-state.html)

[全部主题](https://codingai-lec05.pages.dev/course/knowledge/index.html) · [关键结果JSON](https://codingai-lec05.pages.dev/course/knowledge/data/learning-paths.json) · [只读诊断源码](https://codingai-lec05.pages.dev/course/knowledge/code/learning_paths.py.read.html) · [Seq2Seq完整实现](https://codingai-lec05.pages.dev/course/knowledge/code/seq2seq.py.read.html) · [视觉机制实现](https://codingai-lec05.pages.dev/course/knowledge/code/mechanisms.py.read.html) · [TinyDecoder与cache实现](https://codingai-lec05.pages.dev/course/knowledge/code/legacy_numpy.py.read.html)