Transformer 三分之二的参数在 FFN 里,但它的作用长期被注意力研究遮住。这篇论文把 FFN 的
ReLU(xKᵀ)V 读成一张非归一化的键值记忆表:键负责识别输入里的模式,
值负责给出该模式之后最可能出现的词;一层输出由成百上千条记忆加权组合,再经残差逐层修正。
FFN 的公式和神经记忆几乎一样:FF(x)=ReLU(x·Kᵀ)·V,
MN(x)=softmax(x·Kᵀ)·V。差别只在归一化:softmax 把系数压成一个和为 1 的分布,
ReLU 不归一化。于是 FFN 允许很多条记忆同时以不同强度激活,输出是它们的加权和,而不是一次只挑一条。
键对应输入模式,值对应输出分布。论文在一个 16 层、d=1024、
dm=4096 的 WikiText-103 语言模型上,按激活值取每个键的 top-25 触发前缀,
让人工标注:平均每个键能识别出 3.6 种模式;低层偏浅层 n-gram,高层偏语义话题。
值不是词,是词表分布。把值向量乘输出嵌入再 softmax,得到
pi=softmax(vi·E)。第 16 层里,值分布的头号词与键的 top-1
触发样本的下一词一致率达到 3.5%,而随机猜只有 0.0004%;低层(1-10)几乎为零。
一层不是一条记忆,而是组合。约 10%-50% 的记忆单元会被激活;至少约 68% 的样本里, 层输出与层内任何单条记忆的预测都不同。残差连接再把每层输出逐层“修正”成最终预测。
读完这节要知道:FFN 不是注意力的附属品,它占了模型大部分参数,却长期没有一个能落到具体记忆内容上的解释。
一个标准 Transformer 层里,自注意力大约占 4d² 个参数, FFN 占 8d²——按论文的算法,FFN 是参数的大头,整体约占三分之二(摘要;4d²/8d² 见 §1)。 但可解释性研究长期集中在注意力:注意力头在看哪里、是否学到句法,这些都有大量工作;FFN 则常被当作一个逐位置的 “特征变换”,很少被问“它到底存了什么”。
FFN 的形式很简单:FF(x) = f(x·K⊤)·V,其中
K, V ∈ ℝdₘ×d,f 通常是 ReLU。它是一个逐位置函数,不混合 token;
输入是残差流里的一个向量,输出再写回残差流。真正的问题是:K 的每一行和 V
的每一行,分别在表示什么?
论文要回答的不是“FFN 是否像记忆”这种类比问题,而是更具体的一步:如果它真是键值记忆,那么键里存的是哪些输入模式、
值里存的是哪些输出分布、一层里的多条记忆怎么合成一个输出。为了能回答,作者选了一个可控的模型:
Baevski & Auli 2019 的 16 层 Transformer 语言模型,d=1024、dm=4096、
247M 参数,训练数据是 WikiText-103(§3.1、Appendix B)。
论文的分析对象是 Baevski & Auli 2019 的模型,不是今天的大模型。§7 的原话是:这个「FFN 即键值记忆」的表述 「generalizes to any transformer model, e.g. BERT encoders and neural translation models」,作者 「expect our qualitative empirical observations to hold across diverse settings, and leave verification of this for future work」——即预期可推广到其他 transformer,但验证留待以后。原文没有点名「其他语言」或「其他规模」。 读后面的数字时,模型规模、层数、数据集这三个条件不能丢。
读完这节要知道:把 FFN 叫“键值记忆”不是这篇论文的新发明;它的新意在于把记忆内容逐条读出来。
把 FFN 看成键值记忆并不是这篇论文第一次提出。Sukhbaatar et al. (2015) 的神经记忆把记忆写成
MN(x)=softmax(x·Kᵀ)·V;Sukhbaatar et al. (2019) 还把 FFN 的参数当作 persistent memory
塞进自注意力。前一个给出了公式上的对应,后一个证明了这种重参数化能工作。但它们都没有回答:在标准 Transformer 里,
这些记忆到底存了什么?
MN(x)=softmax(x·Kᵀ)·V。系数被 softmax 压成和为 1 的分布,读出的是键分布的期望值。
它倾向于把概率集中在一小部分键上,输出是这些值的凸组合。
Sukhbaatar et al. 2015 · Eq. 2
FF(x)=ReLU(x·Kᵀ)·V。系数非负,但可以大于 1,也不需要加起来等于 1。
多条记忆可以同时以不同强度激活,输出是非归一化加权和。
Vaswani et al. 2017 · Eq. 1
这个差别不是细节:softmax 让记忆读成一个和为 1 的凸组合,ReLU 让记忆读成一个可叠加的稀疏组合。 后者为后文的组合性观察提供了一个机制解释推断(依据:§2 的 ReLU 非归一化定义 + §5.1 的多记忆加权和)。 论文的新意不在于重复这个类比,而在于用触发样本、人工标注和一致率,把“记忆内容”变成可检验的对象。
读完这节要知道:K 的行怎么读、V 的行怎么读,以及为什么“多条记忆同时激活”不是比喻而是公式的直接结果。
把公式拆开,FFN 的一次前向就是三步:
mi = ReLU(x · ki),第 i 条记忆的系数。y = Σi mi vi,用系数加权所有值向量。o = y + r,FFN 输出加回残差流。dm 是记忆条数;K 的每一行是一个键,V 的每一行是一个值
对每个键 ki,论文在训练集的所有句子上计算每个前缀的 mi,
取激活最高的 top-25 前缀,交给 NLP 研究生标注。标注规则要求一个模式至少出现在 3 个前缀里,才认定为该键的模式;
每个模式再标成 shallow(重复 n-gram)或 semantic(重复话题)。Table 1 是几个例子:第 1 层的
k4491 对以 “substitutes” 结尾的前缀敏感;第 16 层的
k193516 对电视剧/剧集话题敏感(§3.1、Table 1)。
vi 本身是一个 d 维向量,不是词。论文把它乘上输出嵌入矩阵 E
再 softmax,得到词表分布 pi = softmax(vi·E)(§4)。
这个分布是未校准的:推理时 vi 还会乘上 mi,系数会改变分布的陡峭程度;
但排序不受系数影响,所以仍可比较。这个转换还假设所有层共享同一个嵌入空间——论文自己称这个假设是 naïve 的(§4)。
下面的模拟把六条来自 Table 2 的记忆放在一起:每条记忆有一个触发示例(键)和一个顶词预测(值)。 输入一段前缀,先按实词重叠算相似度,再按相似度加权投票,看哪条记忆被检索、输出由谁主导。 六条记忆的触发示例、顶词和 precision@50 都逐字取自 Table 2;相似度计算是本页的简化,不是论文模型的复现。
覆盖:§2 的 FF(x)=ReLU(x·Kᵀ)·V 结构;§5.1 的
y=Σ mivi 加权和;Table 2 六条记忆的触发示例、顶词和 precision@50;
ReLU 后多条记忆同时激活。
未覆盖:真实的 1024 维稠密键/值(这里用触发示例的去停用词词集合代替); 真实的全词表分布(这里把每条值压成顶词 one-hot);自适应 softmax;偏置项;16 层堆叠与残差 refine; 自注意力输入。因此这是简化模拟,不是对论文模型的复现。
相似度定义:小写,非字母数字转空格,按空格切分,去停用词,去重;用 binary bag-of-words
余弦 cos(A,B)=|A∩B|/√(|A|·|B|),再取 mi=max(0,cos)。
真实模型是 ReLU(x·ki),键是学习到的稠密向量,不是词集合。
去停用词表:a, an, and, are, as, at, be, been, by, for, from, in, is, it, its, of, on, or, that, the, these, those, to, was, were, with。
组合输出:p(token)=Σi:predi=token mi / Σi mi,
这是把每条值压成 one-hot 后的加权投票,不是 softmax(y·E)。
相似度显示保留 3 位小数,百分比保留 1 位,百分比用未舍入的 cos 计算。
手算 1(单条记忆):输入 But when bees and wasps resemble each。
{bees, but, each, resemble, wasps, when},|A| = 6。v22215 的触发示例分词后同样是这 6 个词,|B| = 6,交集 = 6;cos = 6 / √(6×6) = 1.000。each = 1.000 / 1.000 = 100.0%。手算 2(组合):输入 But when bees and wasps resemble each other, like a ship of the line。
{bees, but, each, like, line, other, resemble, ship, wasps, when},|A| = 10。v22215:|B| = 6,交集 = {bees, but, each, resemble, wasps, when} = 6;cos = 6 / √(10×6) = 6 / √60 = 0.7746。v207016:|B| = 7,交集 = {line, ship} = 2;cos = 2 / √(10×7) = 2 / √70 = 0.2390。each = 0.7746 / 1.0136 = 76.4%;line = 0.2390 / 1.0136 = 23.6%。precision@50 不参与组合。卡片上的 P@50 是 Table 2 的原始指标,表示该值的顶词在对应键的 top-50 触发示例中命中多少比例;它只用来对照,不进入上面的加权投票。
读完这节要知道:每个结论对应哪类实验、样本量多大、指标怎么定义;条件丢了,数字就会变形。
16 层模型,每层随机抽 10 个键,共 160 个;每个键取激活最高的 top-25 前缀;模式必须出现在至少 3 个前缀里; 标成 shallow 或 semantic(§3.1)。
pi=softmax(vi·E);比较 argmax(pi)
与键的 top-1 触发样本的下一词;统计一致率(§4)。
4,000 个验证集前缀;统计激活记忆比例;比较层输出与所有单条记忆的预测;再看残差预测与最终输出的关系(§5)。
模型条件是共同的:Baevski & Auli 2019,16 层,d=1024,dm=4096,
每层 4096 条记忆,16 层共 65,536 个潜在键;
247M 参数,WikiText-103(§3.1、Appendix B)。这是下面所有数字的背景,不是可省略的脚注。
键的实验还做了一个扰动测试:另外采样 1,600 个随机键(每层 100 个),对每个键的 top-50 触发示例分别删除第一个、 最后一个或随机一个 token,看记忆系数怎么变(Figure 3)。结果是模型把示例的结尾看得比开头更重;到了上层, 删除最后一个 token 的影响变小,这和“上层键不再那么依赖表面 n-gram”的判断一致(§3.2)。
主张—证据对照 · 引文来自 §3.2 / §4 / §5.1 / §5.2
| 主张 | 页面用到的数字 | 原文原句(节选) |
|---|---|---|
| 键捕获可解释的输入模式 | 平均 3.6 个模式/键;65%-80% 的触发前缀至少命中一个模式 | “Experts were able to identify at least one pattern for every key, with an average of 3.6 identified patterns per key. Furthermore, the vast majority of retrieved prefixes (65%-80%) were associated with at least one identified pattern (Figure 2).” |
| 值诱导输出词表分布,且与键模式相关 | 第 16 层一致率 3.5%;随机 0.0004%;低层 1-10 接近 0 | “the agreement rate is close to zero in the lower layers (1-10), but starting from layer 11, the agreement rate quickly rises until 3.5%, showing higher agreement between keys and values on the identity of the top-ranked token.” |
| 一层输出是多条记忆的组合 | 至少约 68% 的样本;10%-50% 的记忆被激活 | “Figure 8 shows that, for any layer in the network, the layer’s final prediction is different than every one of the memories’ predictions in at least ∼68% of the examples.” |
| 残差连接逐层 refine 预测 | 约三分之一的预测在底部几层确定;从第 10 层起快速上升 | “Figure 9 shows that roughly a third of the model’s predictions are determined in the bottom few layers. This number grows rapidly from layer 10 onwards.” |
读完这节要知道:FFN 的输入不是一个孤立的词向量,而是残差流里的当前状态;输出也不是最终预测,而是写回残差流的一次修正。
这张图解释了为什么“FFN 是记忆”不能理解成“查表取一个词”:一次前向会同时算出 dm 个系数,
每个系数都乘上对应的值向量。系数为 0 的记忆不贡献,系数为正的记忆都进入加权和。下一节的效果分析,就是在这个结构上
问三个问题:键是否可读、值是否有预测性、一层输出是否真的由多条记忆组合。
读完这节要知道:键的模式、值的预测、层内组合和层间 refine 分别有什么证据;哪些数字是条件性的,不能单独引用。
Table 1 · 键的触发模式示例(原文每行 3 个触发前缀,此处各摘 1 个;完整表见原文)
| 键 | 层 | 模式 | 触发前缀(摘录) |
|---|---|---|---|
k4491 | 1 | 以 “substitutes” 结尾(shallow) | In German service, they were used as substitutes |
k25466 | 6 | 军事语境,以 “base”/“bases” 结尾(shallow + semantic) | Bombers flying missions to Rabaul and other Japanese bases |
k299710 | 10 | “part of” 关系(semantic) | He was also a part of the Indian delegation |
k298913 | 13 | 以时间范围结尾(semantic) | Weekend tolls are in effect from 7:00 pm Friday until |
k193516 | 16 | 电视剧/剧集话题(semantic) | Time shifting viewing added 57 percent to the episode’s |
Table 2 · 值向量投影到词表后的顶词、precision@50 与一个匹配的触发示例(完整转录)
| 值 | 顶词 | precision@50 | 触发示例(顶词加粗) |
|---|---|---|---|
v22215 | each | 68% | But when bees and wasps resemble each |
v75216 | played | 16% | Her first role was in Vijay Lalwani’s psychological thriller Karthik Calling Karthik, where Padukone was cast as the supportive girlfriend of a depressed man ( played |
v260113 | extratropical | 4% | Most of the winter precipitation is the result of synoptic scale, low pressure weather systems (large scale storms such as extratropical |
v88115 | part | 92% | Comet served only briefly with the fleet, owing in large part |
v207016 | line | 84% | Sailing from Lorient in October 1805 with one ship of the line |
v318612 | jail | 4% | On May 11, 2011, four days after scoring 6 touchdowns for the Slaughter, Grady was sentenced to twenty days in jail |
专家为每个键都找到了至少一个模式,平均每个键 3.6 个; 65%-80% 的触发前缀至少命中一个模式(§3.2、Figure 2)。
低层(1-9)以 shallow 模式为主,常共享最后一个词;高层(10-16)以 semantic 模式为主,前缀来自相似语境, 没有明显的表面相似性(§3.2)。Figure 2 的堆叠柱还包含 “shallow + semantic” 与 “not-covered” 两类, 所以不能把某一层的比例简单读成“浅层 vs 语义”二分。
第 16 层的一致率达到 3.5%,随机从约 27 万词表里猜只有 0.0004%;按原文两个一致率相除,约 8750 倍。低层 1-10 的一致率接近 0,从第 11 层开始快速上升(§4、Figure 4)。 词表规模约 27 万,见 Figure 5 的图注。
被最大概率挑出的 100 个值里,97/100 在 11-16 层; 其中 46/100 至少有一个触发示例与顶词一致(§4、Table 2)。 这些分布未校准,排序仍可比较。
4,000 个验证集前缀里,每层被激活的记忆占 10%-50%(Figure 7); 但至少约 68% 的样本里,层输出与层内所有单条记忆的预测都不同(Figure 8)。 换句话说,大多数时候不是某一条记忆在“拍板”,而是多条记忆的加权结果。
在至少一条记忆与层预测一致的样本里,60% 的目标词是常见停用词, 43% 的前缀少于 5 个 token(§5.1)。作者据此推测,非常常见的模式可能被单条记忆 “缓存”,不需要组合;这个解释是推测,不是实验证明。
层间看残差:约三分之一的预测在底部几层就已确定,从第 10 层起快速上升(§5.2、Figure 9)。Figure 11 的分解显示, 残差预测最常见的结局是保持不变;当它改变时,往往是 residual 与 FFN 的折中,而不是直接采纳 FFN 的预测(§5.2)。 最后一层 100 个 composition 案例中,66 个变成语义上更远的词,34 个变成相关词(§5.2)。
在一个约 27 万词的词表里(Figure 5 图注),值分布的头号词能命中触发样本的下一词,3.5% 听起来很小;但随机猜只有 0.0004%, 两者相差约 8750 倍(3.5 / 0.0004,按原文两个一致率计算)。论文的结论不是“FFN 已经解决了下一个词预测”, 而是“上层值里确实有与键模式相关的、非随机的预测信息”。低层接近 0 也不等于低层没有记忆:论文在 §4 的 Discussion 里提出,低层可能不在同一个输出嵌入空间里,并把这个现象留作开放问题。
读完这节要知道:哪些结论可以带走,哪些一旦外推就会过头;论文自己列出的开放问题也要算进边界。
全部实验基于 Baevski & Auli 2019 的 16 层、247M 参数模型和 WikiText-103(英文维基文本)。 论文在 §7 说这套表述可推广到任意 transformer(举例 BERT 编码器、神经翻译模型),并「leave verification of this for future work」;其他语言、其他规模是本页按此做的外推推断,原文没有点名。 把 3.5% 或 68% 直接搬到今天的 大模型上,是没有原文依据的外推。
论文的做法是:找出最能激活某个键的前缀,再看对应值的顶词是否与这些前缀的下一词一致。这是观察性证据, 不是对键或值做消融/干预后的因果证据。论文的用词也是 “correlates”“suggests”,没有声称“键导致了预测”。 页面里的“键是模式探测器”应理解为一种有实验支持的功能描述,而不是已经证明的因果机制。
第 16 层 3.5% 的一致率是在“值顶词 vs 键的 top-1 触发样本下一词”这个定义下得到的;低层 1-10 接近 0。 值分布还是未校准的,投影到词表时假设所有层共享同一个嵌入空间,论文自己称这个假设是 naïve 的(§4)。 所以 3.5% 不能读成“FFN 的输出有 3.5% 是正确的”,它只是一个特定一致性指标。
模式由 NLP 研究生标注,要求至少出现在 3 个前缀里;每个键由一个专家标注。65%-80% 的触发前缀被至少一个模式覆盖, 这意味着仍有 20%-35% 没有被覆盖(100 − 80 与 100 − 65)。shallow / semantic 的划分也是人的分类,不是模型内部的自然类别。
“至少约 68% 的层输出与所有单条记忆预测不同”说明组合是常态,但没有说明组合具体怎么算。60% / 43% 这两个数字 只在“至少一条记忆与层预测一致”的子样本里成立,不能当成全体样本的比例。最后一层 66 / 34 的语义远近判断, 是 100 个随机案例的人工分析,不是大规模自动评估。
论文把 FFN 单独拿出来分析;但 FFN 的输入来自残差流,残差流里已经混入了自注意力的输出。作者在 §7 把 “层的嵌入空间如何随层变化”列为开放问题,并指出这不可能只靠 FFN 的键值读取解释,可能涉及 FFN 与注意力的相互作用。 所以“FFN 是键值记忆”是一个局部解释,不是对整个 Transformer 的完整解释。