Block 的最后一个零件。注意力让词之间"横向交流";FFN 让每个词"自己纵向深加工"。学完它,一个 Transformer Block 的部件就齐了。
| Topic | Feed-Forward Network(FFN / MLP) |
| Objectives | 理解 FFN 做什么、为什么需要非线性、"交流 vs 计算"的分工 |
| Prerequisites | 矩阵=变换 ✅、注意力 ✅、残差/LayerNorm ✅ |
| Outcome | 能说清 FFN 的两层结构、非线性的必要性、逐词独立 |
| Warning | FFN 对每个词单独处理,不看别的词(交流是注意力干的) |
注意力做的事本质是加权平均(把别的词的 value 按权重混进来)——这基本是线性操作:混合、搬运信息。它擅长"让词之间交流",但不擅长对单个词做复杂的非线性加工。
一个关键事实:纯线性变换叠再多层,等价于一层(多个矩阵相乘还是一个矩阵)。要让模型能表达复杂函数,必须引入非线性。
FFN 就是补这个:给每个词的向量做一次带非线性的深加工,增强表达能力。
对一个词向量做三步(先放大、非线性、再缩回):
d_model → d_ff(通常 d_ff = 4×d_model,如 512 → 2048)。给它一个更宽的"草稿纸"做计算。d_ff → d_model(2048 → 512)。压缩回原来的宽度,好接下一步(呼应残差/主干 d_model 恒定)。一个 Transformer Block 的两个子层,现在你都学完了:
下一课(收尾综合,不是新概念):把这个 Block 叠 N 层(你多次问到的"多层"),再接输出层,就是完整的 Transformer——终于能回答"如何预测下一个 token"。
❌ 不是二元化,而是门控。以 ReLU = max(0, x) 为例:
所以它像一道门/闸:负的堵死、正的原样放行。真正作用是引入非线性(折线拐点)——很多折线拼起来能逼近任意复杂曲线,这才是激活的意义,不是"二值化"。
"淘汰"太窄——它只抓住了 ReLU 砍负值那半,漏了 FFN 的主要动作。FFN 是"展开→筛选→重组"的完整加工:先 W₁ 放大到 2048(造出很多新特征)、激活门控、再 W₂ 缩回 512,输出一个更精炼的新向量,不是"删掉一些东西"。
措辞要小心:"权重"易混。注意力算出注意力权重(该关注每个词多少),用它把别的词的信息加权混进来 → 更新的是自身的表示(hidden state),不是自身的权重参数(W 是固定的)。
| 注意力 | 交流:从别的词收集信息、更新自己的表示 —— 像开会(听取别人、更新看法) |
| FFN | 提炼:自己消化加工收来的信息 —— 像会后独自复盘(整理成新结论) |
矩阵的"大小" = 参数个数 = 行×列。W₁、W₂ 有一维是 d_ff=2048(=4×512),所以特别"胖"。一层里对比(d_model=512, d_ff=2048):
| 注意力 4 个矩阵 | W_Q/K/V/O 各 512×512 → 合计 ~105 万 |
| FFN W₁ + W₂ | 512×2048 + 2048×512 → 合计 ~210 万 |
FFN 两个矩阵 ≈ 注意力全部四个的两倍 → 约占 210/(210+105) ≈ 2/3。根源就是那个 ×4 放大。
答完这 3 题,Block 的零件就全通关了 🎉 下一课把它们拼装 + 多层堆叠 → 完整 Transformer。