基础篇

F14|把Attention装进一层:残差、归一化与前馈网络

基础篇约 3.3 千字1 组分步图解

从具体对象与小例子开始,理解计算过程与适用条件。

本章目录
动态图解 · F14

一层Transformer不是只有Attention

读其他位置之后,为什么还要残差、归一化和FFN?

可以把一层分成“从上下文取信息”和“在本位置加工信息”两段。残差提供原表示的直接通路,新的计算提供增量;归一化整理每行数值尺度,但不是把语义洗成一样。前馈网络通常对每个位置分别计算,不再像Attention那样直接跨位置加权。

残差把子层输入与子层输出相加。
Norm本例指按每行特征进行的归一化。
FFN带非线性的逐位置前馈网络。

输入与适用条件:展示常见pre-norm结构的运算依赖,不假定所有Transformer采用相同顺序。完整模型数值见已有贯通算例。

1 / 6 · 进入本层

第1步,共6步

窄屏可左右滑动图形,或点击“放大图形”。文字解释紧随图后。

一层Transformer不是只有Attention:进入本层进入本层当前表示x,不是Token编号归一化后读上下文Norm(x) → Attention第一次残差相加原x + 注意力输出 = h逐位置加工Norm(h) → FFN第二次残差相加原h + FFN输出 = y进入下一层y成为下一层的输入教学流程;高亮表示当前步骤,不表示真实耗时比例。

上一层已经加工过的表示也可以作为x,不能每一层都回到最初Embedding。

本步状态由图形与说明共同给出。

默认静止。用“下一步”看完解释再继续;播放到最后一步自动停止。键盘聚焦播放器后,可用左右键逐步查看、空格播放/暂停。图中颜色辅助区分,含义同时用文字注明。

为什么需要

深层网络需要稳定的数值与梯度通路,同时具备上下文读取和局部变换能力。

怎样实现

明确本模型的pre-norm/post-norm约定,逐个算子跟踪来源与去向。

可能的代价与误解

把LayerNorm与RMSNorm视为同一公式,或忘记γ/β/ε,会得到不同结果。

如何判断是否做对

比较每个子层前后张量形状与实际数值;任何替换都需重新验证输出与训练稳定性。

先把一层写成两段,而不是一大堆缩写

先对照这段流程里出现的对象

Decoder层是一段用于构成生成网络的计算;子层是其中的注意力或前馈部分。输出投影是注意力结果再乘一张Wo参数表,以便回到残差需要的宽度,不是把它直接解成文字。下面X、R、Y都代表临时数组:X是输入,R是第一次相加的结果,Y是第二次相加的结果。Norm表示规范化函数,它的具体逐格算式紧接在下文定义。

一种常见的pre-norm Decoder层可这样读:先归一化输入,再算Attention,把结果加回原输入;再归一化,经过前馈网络,再加回去。

原输入X
  -> 归一化 -> Attention -> 输出投影
  -> 与X相加,得到R
R -> 归一化 -> 前馈网络
  -> 与R相加,得到本层输出Y

pre-norm表示归一化在子层变换之前。其他架构可能使用不同位置或变体,本课给一个具体模型骨架,不声称全部网络顺序相同。

残差连接:保留一条直接通路

残差(residual)连接就是输出=输入+变换结果。输入[1,2],本段变换结果[0.3,-0.1],相加得到[1.3,1.9]。

这样子层可以学习在已有表示上如何调整,而不必每次从零重建一切。它也影响反向传播的通路;详细梯度在F17。相加要求维度兼容,因此Attention通常经输出投影回到原隐藏宽度d。

残差不是把“原话”保存一份中文副本,而是在数字表示上相加。

均值、方差和标准差从两个数算起

对一排数[1,3]:均值μ=(1+3)/2=2;每项偏离均值为[-1,1];平方后[1,1];平均得方差σ²=1;开平方得标准差σ=1。

平方是为了不让正负偏差互相抵消,方差描述波动大小。标准差与原数值有同样的量纲。这里按总体平均除以元素数,不能把其他统计场景的除以n−1不加区分地搬来。

LayerNorm实际规范化哪一排数

在典型Transformer中,对每个位置的隐藏特征独立计算均值与方差,再执行:

标准化值_i = (x_i − μ) / sqrt(σ² + ε)
输出_i = γ_i × 标准化值_i + β_i

ε是很小的正数,防止除以0等问题;γ、β是可学习的缩放与偏移参数。先忽略很小ε并设γ=1、β=0,上例[1,3]变成[-1,1]。

关键是按每个Token的特征轴计算,不是把本批所有句子所有Token一起求均值。若你改变归一化范围,模型行为和缓存可复用的前提都会改变。

RMSNorm常用均方根r=sqrt(mean(x_i²)+ε)缩放,不减均值。对[1,3],忽略ε,r=√5,结果约[0.4472,1.3416],与LayerNorm不同。名称都含Norm,不等于同一个操作。

FFN到底做了什么

前馈网络FFN通常对每个位置独立做“升维线性变换→非线性→降维线性变换”。例如d=4,中间宽度8,再回到4:[B,T,4]→[B,T,8]→[B,T,4]。

它不在这个步骤中直接对不同Token求和,但输入已经由Attention带入上下文,因此它能处理混合后的信息。它不是没有作用的装饰层,也不能简单认定是可按条目查询的事实数据库。

SiLU(x)=x×sigmoid(x),其中sigmoid(x)=1/(1+exp(-x))。SwiGLU类门控结构用一个分支调节另一个分支,常含逐元素乘。这和矩阵乘不同,回看F07即可区分。

多层如何连起来

第0层输出作为第1层输入,各层通常有不同参数。每个Token位置的宽度d可以保持不变,但表示内容不断变换。深层的K/V来自深层输入,不是复制第一层缓存。

“32层、4096宽”分别描述深度与每位置宽度,不能读成32个独立聊天Agent。模型最后通常还有归一化和词表输出投影,下一课就从这里走到文字。

运行示例 · F14

归一化、残差和前馈分别改变哪份数

输入与条件。当前位置输入 x=[1,3]。先手算无仿射参数的LayerNorm,临时令ε=0且本例方差非零;再独立给一份注意力增量 [0.5,-0.5]。

步骤与对象内部动作中间结果 / 新状态
1算平均(1+3)/2均值2。
2算方差((1−2)²+(3−2)²)/2方差1,标准差1,归一化为 [-1,1]。
3残差相加原x加给定增量[1,3]+[0.5,-0.5]=[1.5,2.5];不是覆盖原x。
4前馈演示对 [-1,1] 应用ReLU再乘0.5得到 [0,0.5],展示逐位置非线性。
5再加残差把前馈增量加到当前状态若当前状态为 [1.5,2.5],结果为 [1.5,3.0]。

把过程连起来。Norm、Attention分支、残差和FFN有不同角色。当前例中的给定增量用于隔离各动作;整层自洽计算见系统篇Q005。

边界与反例。实际LayerNorm使用正ε并可含可训练缩放/平移。此例不是完整注意力前向,也不能据此删除实际模型组件。

依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。

运行示例 · X02

同样的[1,3],LayerNorm、RMSNorm和SwiGLU分别做什么

输入与条件。先只看一个位置上的两个特征 [1,3]。LayerNorm和RMSNorm都取ε=0.00001、缩放参数全为1;LayerNorm的平移参数为0。门控示例另把三个投影都设为单位矩阵。

步骤与对象内部动作中间结果 / 新状态
1LayerNorm的均值与方差均值=(1+3)/2=2,方差=((1−2)²+(3−2)²)/2=1分母sqrt(1+ε),输出约[-0.999995,0.999995]。
2RMSNorm的均方根均方=(1²+3²)/2=5,不减均值输出约[0.447213,1.341639],两项仍为正。
3先算SiLUSiLU(x)=x/(1+exp(−x))SiLU(1)≈0.731059,SiLU(3)≈2.857722;它不是“把负数全部删掉”。
4独立门控例用[1,2],单位投影下SwiGLU为SiLU(x)逐元素乘x得到[0.731059,3.523188]。这里没有再乘0.25;完整模型案例单独指定了该输出投影。

把过程连起来。归一化、激活和门控不是一回事。每一步要写明作用在哪个轴、是否减均值、有没有可训练缩放与投影。

边界与反例。这些数值只对应显式指定的参数。SiLU和SwiGLU是逐元素计算与投影的组合,不包含跨Token注意力。

依据与适用范围:[LN] [GLU]。示例输入和场景由本书明确设定。

课后自检

自检 1

对[2,4]按LayerNorm的中心化、单位方差计算,忽略ε与可学习缩放偏移,得到什么?

查看参考答案收起参考答案
均值3,方差1,结果[-1,1]。
自检 2

FFN把d=4升到8再降回4,会让Token数量翻倍吗?

查看参考答案收起参考答案
不会。改变的是每个位置内部特征宽度,位置数T不因此改变。

机制依据:[TR]。本节数值与情景除另注外均为原创教学示例;来源不代替中文讲解。

记录保存在本机浏览器。

输入关键词即可检索。

↑ ↓ 选择 Enter 打开Esc 关闭 · 仅本地搜索

阅读设置

阅读设置仅保存在本机浏览器,不上传任何数据。