注意力层解决"从哪读",FFN 解决"存了什么"。上一篇说残差流是一条总线,这一篇问一个更具体的问题:一个模型的事实知识("巴黎是法国首都"这种东西)物理上存在哪?目前最有解释力的答案是 Geva et al.(2022,Transformer Feed-Forward Layers Are Key-Value Memories)的键值记忆假说。
代数形式:两层恰好是"匹配 + 调出"
把 FFN 的两层展开(忽略 GeLU 与偏置的细节,本质是逐元素的激活门控):
$$ \mathrm{FFN}(x) = W_2\,\sigma\!\big(W_1^\top x\big), $$
其中 $W_1, W_2 \in \mathbb{R}^{d \times d_{ff}}$,$\sigma$ 是 ReLU/GeLU 这类非线性。逐神经元写出来,第 $j$ 个中间神经元的贡献是
$$ a_j(x)\cdot w^{(2)}_j,\qquad a_j(x) = \sigma\big(\langle w^{(1)}_j,\, x\rangle\big), $$
$w^{(1)}_j$ 是 $W_1$ 的第 $j$ 列,$w^{(2)}_j$ 是 $W_2$ 的第 $j$ 列。于是整个 FFN 是 $d_{ff}$ 个"(键,值)对"的叠加:
- 键 $w^{(1)}_j$:一个 $d$ 维方向,和输入 $x$ 做点积做匹配。$\sigma$ 的阈值特性(ReLU 在负半轴直接归零)让每个神经元只在输入靠近自己键方向时被激活——这是稀疏的、局部的模式匹配。
- 值 $w^{(2)}_j$:被激活后加到残差流上的一个 $d$ 维向量,就是这条神经元要"写入"的信息。
这套解读在代数上没有任何近似,就是原式的重写;它的价值在于给出了可检验的预言。
实验证据:擦除与因果追踪
Geva et al. 的关键实验沿着因果链走:
- 激活与事实绑定:给模型喂"巴黎是法国的首都"这类陈述,计算最后一层 FFN 各神经元的 $a_j$。把 top 激活的神经元的值向量 $w^{(2)}_j$ 与 unembedding 做内积,发现它们系统性指向答案 token 的方向——激活最强的神经元,其值向量恰好在答案的词嵌入附近有大的投影。
- 知识神经元(Dai et al. 2022):对某个特定事实("某人的母语是 X"),总能找到少量神经元,抑制它们后模型对该事实的预测概率断崖式下跌;对其他事实几乎无影响。这符合"一个键值对承载一条知识"的图景,而不是知识分布式地泡在整层参数里。
- 上层 FFN 改动输入、下层 FFN 补充事实:逐层看激活,越深的层值向量越"语义化"(直接指向实体 token 的嵌入),越浅的层越句法化。这与残差流视角的"logit lens"观察完全一致:深层 FFN 往总线上写的增量,已经长得像一个"待输出的 token"。
这个假说的边界
三个地方不能过度延伸。第一,匹配不是精确检索:$a_j = \sigma(\langle w^{(1)}_j, x\rangle)$ 是连续打分,键与键之间有重叠,一条知识往往由多个神经元冗余承载——所以擦除实验只能找到"充分相关"的神经元,不是全部。第二,值向量不携带完整命题:一个值向量通常只指向答案实体("法国"),句子其余部分(主语、谓词)的组装靠的是注意力把正确的上下文搬到 FFN 输入里。FFN 存的是"部件",装配在注意力层完成。第三,非事实性知识(语法、风格、推理启发式)是否也按同样方式存储,证据弱得多——键值假说对百科式事实最强,对程序性知识可能只是隐喻。
小结
FFN 的两层矩阵恰好构成"匹配—调出"结构:第一层是 $d_{ff}$ 个键方向的打分,第二层同名列是待写入的值向量,ReLU/GeLU 负责稀疏门控。知识神经元实验给了这个图景直接的因果证据:事实知识以"少量键值对"的形式物理地存在 FFN 里,注意力层负责把装配上下文摆到正确位置。这也回答了模型编辑(ROME 一类方法为什么改 $W_2$ 的一列就能"改掉"一条事实)——那正是往键值库里覆盖一条记录。