F14|把Attention装进一层:残差、归一化与前馈网络
从具体对象与小例子开始,理解计算过程与适用条件。
本章目录
一层Transformer不是只有Attention
读其他位置之后,为什么还要残差、归一化和FFN?
可以把一层分成“从上下文取信息”和“在本位置加工信息”两段。残差提供原表示的直接通路,新的计算提供增量;归一化整理每行数值尺度,但不是把语义洗成一样。前馈网络通常对每个位置分别计算,不再像Attention那样直接跨位置加权。
输入与适用条件:展示常见pre-norm结构的运算依赖,不假定所有Transformer采用相同顺序。完整模型数值见已有贯通算例。
1 / 6 · 进入本层
窄屏可左右滑动图形,或点击“放大图形”。文字解释紧随图后。
上一层已经加工过的表示也可以作为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。模型最后通常还有归一化和词表输出投影,下一课就从这里走到文字。
归一化、残差和前馈分别改变哪份数
输入与条件。当前位置输入 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]。示例输入和场景由本书明确设定。
同样的[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先算SiLU | SiLU(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注意力。
课后自检
对[2,4]按LayerNorm的中心化、单位方差计算,忽略ε与可学习缩放偏移,得到什么?
查看参考答案收起参考答案
FFN把d=4升到8再降回4,会让Token数量翻倍吗?
查看参考答案收起参考答案
延伸阅读:相关系统问题
02|一次Transformer前向:逐张量、逐算子讲明白03|注意力的深入追问:位置、掩码、多头与反向传播
04|输出是怎样一个Token一个Token生成的
27|事实可靠性、多模态与可解释性:能力边界在哪里
机制依据:[TR]。本节数值与情景除另注外均为原创教学示例;来源不代替中文讲解。