Transformer 的每一层有两个模块:注意力模块和前馈网络模块。注意力负责让 token 之间交换信息;前馈网络负责对每个 token 独立地做非线性变换。
注意力不够用
你可能会问:注意力模块已经做了矩阵乘法和 softmax,为什么还需要一个前馈网络?
因为注意力模块的计算本质上是线性的加上一个 softmax。加权求和之后的结果还是输入向量的线性组合。注意力能做的是「混合」不同 token 的信息,但不能对信息做复杂的非线性变换。
打个比方:注意力像是一张会议桌,不同的人(token)在桌上交换看法。但每个人内部的思考——对收到的信息进行加工、判断、推理——是在会议结束后独立完成的。前馈网络就是这个「独立思考」的过程。
最基本的前馈网络
最简单的前馈网络就是两个矩阵乘法中间夹一个激活函数:
中间层 = 激活函数(输入 × W₁)
输出 = 中间层 × W₂
W₁ 把维度从 1,536 扩展到一个更大的中间维度,激活函数引入非线性,W₂ 把维度压缩回 1,536。
中间维度通常是输入维度的若干倍。扩展到更大的维度,做一次非线性变换,再压缩回来——这个「膨胀-收缩」的过程让网络能够在更大的空间里做变换,然后把结果浓缩到原来的维度。
激活函数的选择
第 02 章节介绍过 ReLU:正数通过,负数变零。ReLU 简单有效,但它有一个缺点——负数部分完全被丢弃了,梯度也变成了零。
SiLU(也叫 Swish)是一种更平滑的替代:
SiLU(x) = x × sigmoid(x)
sigmoid 函数把任意数字映射到 0 和 1 之间。当 x 很大时 sigmoid(x) ≈ 1,SiLU(x) ≈ x;当 x 很负时 sigmoid(x) ≈ 0,SiLU(x) ≈ 0。在零附近,SiLU 是一条平滑的曲线,而不是 ReLU 那样的硬拐角。
平滑意味着梯度更稳定——没有不连续的跳变,训练更平稳。
GLU:门控线性单元
GLU(Gated Linear Unit)是一种更强大的前馈网络设计。它不是简单地对一个矩阵乘法的结果做激活,而是用两条并行的通路,其中一条作为「门」来控制另一条的信息流动。
通路 1 = 输入 × W_gate ← 门控信号
通路 2 = 输入 × W_up ← 内容信号
中间层 = 激活函数(通路 1) ⊙ 通路 2 ← ⊙ 是逐元素相乘
输出 = 中间层 × W_down
⊙ 表示逐元素相乘——两个向量对应位置的数字一一相乘。
门控的直觉是:通路 1 决定「允许多少信息通过」(经过激活函数后,每个维度的值在 0 到 1 之间,像一扇门),通路 2 提供实际的信息内容。两者相乘之后,被门控信号关闭(接近 0)的维度被抑制,打开(接近 1)的维度被保留。
这比简单的激活函数更灵活——模型可以对每个维度独立地决定保留还是丢弃。
如果门控通路用的激活函数是 SiLU,这个组合就叫 SwiGLU——目前主流语言模型最常用的前馈网络设计。LLaMA、Mistral 等模型都使用 SwiGLU。
SiTU-GLU:Sophia 的选择
Sophia 使用了一种自研的变体叫 SiTU-GLU。它的结构跟 SwiGLU 类似,但把门控通路的激活函数替换成了一种特别设计的函数。
具体来说,SiTU(Sigmoid-Tanh Unit)把 sigmoid 和 tanh 组合在了一起。Sophia 的技术报告在消融实验中验证了这个选择在她的训练设定下优于标准 SiLU。
细节上的区别对理解整体架构不重要。重要的是理解前馈网络在做什么:对每个 token 独立地做非线性变换,让信息在通过注意力融合之后被进一步加工。
前馈网络的参数量
GLU 结构有三个权重矩阵:W_gate、W_up、W_down。
如果中间维度是 4,096(Sophia 的实际设定),那:
W_gate: 1,536 × 4,096 = 6,291,456 个参数
W_up: 1,536 × 4,096 = 6,291,456 个参数
W_down: 4,096 × 1,536 = 6,291,456 个参数
一层前馈网络总参数 ≈ 1,890 万
28 层的前馈网络总共约 5.3 亿参数——占 Sophia 总参数量的一半以上。前馈网络是 Transformer 中参数最密集的部分。
这些参数存储的是模型的「知识」。注意力机制决定了信息怎么流动,但前馈网络决定了信息怎么被加工。研究者发现,把训练好的模型的前馈网络权重删掉,模型就失去了几乎所有的知识——它还能处理语法结构,但不再「知道」任何事实。
下一章节来看一个 Transformer 需要但还没有解决的问题:位置。到目前为止,模型知道了每个 token 是什么,也知道了怎么让 token 之间交换信息——但它还不知道每个 token 在句子中的位置。