解剖层 · 第 7 / 25 课

FFN:词与词之间的知识仓库

真权重交互 复用已加载权重(未加载则需确认下载 28.1MB) 建议 15–30 分钟

学完这课你能

  1. 理解 FFN 是逐 token 独立的两层 MLP(token 之间不交流),与注意力分工:注意力传话、FFN 加工。
  2. 理解为什么需要 GELU 这类非线性激活(没有它两层矩阵乘等价一层)。
  3. 知道 FFN 占参数大头、「FFN 存知识」假说,以及激活的稀疏性。

想象一间加工车间:毛坯从左边传送带进来,穿过一排机床,出门时已经锃亮上色。注意力负责把料搬到车间门口,FFN 就是里面那排机床。

加工车间里一颗灰色毛坯球从左侧传送带进厂,穿过带齿轮的机床,右侧传送带送出一颗亮橙色圆球
类比 灰毛坯球=注意力搬来的信息;车间机床=FFN 加工;亮橙球=加工完的新表示。

01分工:一个管通信,一个管计算

拆开 transformer 的每一层,里面其实只有两个零件:上节课的注意力,和本课的主角 FFN(前馈网络,feed-forward network)。分工一句话就能记住:注意力负责传话——把别处的信息搬到当前位置;FFN 负责加工——对着搬来的信息埋头计算。

「埋头」是字面义:FFN 对每个 token 完全独立地做同样的变换,token 之间零交流。你在第 5 课热图里看到的密集连线,到了 FFN 这里,一格信息都不流动。

02结构账

pythia 的 FFN 是两层矩阵乘夹一个激活:128 维进,先升到 512 维(4 倍),激活后再压回 128 维。来算笔参数账:每层注意力约 6.6 万个参数,FFN 约 13.1 万个——单层就是两倍差距,6 层叠完,FFN 占的参数份额远超注意力。参数大头在哪,下面的图直接给你标出来了。

这就引出一个有意思的问题:模型的大部分「脑容量」,花在了一个不跟邻居交流的部件上。它在里面存什么?先记着这个问题。

参数大头:两层矩阵乘的权重 128 维 进 升维矩阵 128 → 512(×4) GELU 逐个神经元弯折 降维矩阵 512 → 128 128 维 出
FFN 三段:升到 512 维、GELU 逐神经元弯折、压回 128 维——权重全在两端矩阵。

03GELU:非线性的理由

中间夹的那个激活函数,存在感不强,作用却生死攸关。为什么?矩阵乘法是线性的:两层矩阵乘连着做,数学上等价于一层——不弯折,叠 100 层也白叠。在中间加一个非线性「弯折」(激活函数),层与层才真正有了区别,网络才有深度可言。

早期常用 ReLU(负数归零、正数放行),pythia 用更平滑的 GELU:负半轴不是一刀切零,而是 softly 押下去,像一道软门——大部分负输入被拦,少数小负数也能漏一点过。实验台里画着这条曲线,你的输入在曲线上是个会动的小圆点,去推推看。

04知识仓库假说

「FFN 存知识」是 interpretability 研究里的主流猜想。直觉版是这样的:第一层矩阵当 key 用——检测「当前语境是不是某种模式」(比如「首都」「法语相关」);第二层矩阵当 value 用——检测命中后,往残差流里写出相应内容(比如「Paris」方向的信息)。key 对上、value 写出——匹配模式、输出事实,一整套机制。

点到即止:这个假说有大量证据,也有反例。但它给了我们看 FFN 的正确姿势——不是黑盒,而是一柜子待触发的抽屉。

05稀疏性:谁被点亮

看真实激活你会发现:神经元是被「点名」的——对每个输入,少数神经元输出巨大的正值,绝大多数挤在 0 附近或小幅负值(GELU 软门把大部分单元拦在门外)。像一串串好的灯:少数几盏亮起,其余大多熄着——模型就用「少数抽屉的组合」表达特征。但先别把教科书结论当教条:pythia-14m 只是个 14M 小模型,稀疏程度不如大模型夸张——实验台的稀疏性读数会给你每一层的真实数字。

消融开关能让你亲手验证这件事的分量:把最亮的那个神经元置零,后续输出和最终预测立刻变脸;随手关一个接近 0 的,几乎无人察觉。重要与不重要,差距就这么直白。

网络状悬线上挂着十几只灯泡,正中一盏亮起橙色光晕,其余保持熄灭
类比 亮着的一盏=被点名的神经元,熄着的灯群=被软门拦在 0 附近的大多数。

交互实验:神经元激活观察台 + 消融开关

引擎加载中…

选句中一个 token、选一层,看它在 FFN 中间层的全部激活值热条(canvas 单行色带,亮 = 绝对值大,top-10 有刻度);hover/方向键查真值;GELU 曲线联动标注被选中神经元的前激活值;消融模式点神经元「置零」,现场从该层重算到底并对照 logits 变化 top5。

组件挂载点 · 激活观察台将在下一波接入(复用已加载权重)