到第 7 课为止,注意力这个零件已经齐了:Q/K/V、多头、因果掩码。 可它现在还只是孤零零的一个机制—— 直接把它叠十几层,信号会在路上衰减成一团噪声,数值还会一路涨到溢出。 这一课给它配三个保镖:残差连接(一条直通的高速公路)、LayerNorm(把音量调到标准大小)、FFN(每个字回自己座位独立消化)。 拼完这一课,你手上就有了一个能真的堆起来、跑起来的 Transformer。
先跟着一条样本走一遍。输入「三加五等于?」, 镜头跟着数据一层层往下走 —— 从切字开始,到最后吐出「词表里每个字的分数」。 点「自动播放」,或者自己一步一步点。
x = x + 注意力(LayerNorm(x))、x = x + FFN(LayerNorm(x))。把第 5、6 课的注意力,和第 7 课那两个「保镖」写在一起,一层就是下面这两行:
就这两行。它们藏着四个零件:注意力(信息交流)、FFN(自己消化)、残差(那个加号)、LayerNorm(每一块之前那一次)。
读法要念对:先 LayerNorm、再做本层的运算、最后加回原来的 x。 这个顺序叫 Pre-LN(归一化在前),现在的模型基本都用它 —— 原因是它训练更稳(第 12 课讲训练时会再回来提一句)。
[6, 8] → [6, 8]+(·)注意力 / FFN这两件事经常被混在一起说,其实它们管的完全不是一回事。 下面两台仪表,一台量「信息还剩多少」,一台量「数值有多大」:
x = x + 注意力(LayerNorm(x))、x = x + FFN(LayerNorm(x))。注意力是「全班讨论」——每个字都要看别人。可讨论完还得各自消化: 这就是 FFN(也叫 MLP)的活。它一层里只干三件事:放大、筛选、缩回。
两层线性夹在一起,如果没有激活函数,那还是一层线性:
右边那个 W1·W2 本身就是一张矩阵 —— 堆 100 层也等价于 1 层。 所以 GELU 才是让「深」有意义的那一步:它把一部分方向直接掐断, 让每一层能表达「在这些方向上要、在那些方向上不要」。
顺带一个常被问到的细节:中间为什么是 4 倍? 没有硬道理,是个经验值(原始论文就是 4)。真实模型有 8/3 倍再取整的、 也有靠门控结构(SwiGLU)的,思路一样:先铺开到更宽的空间里挑一遍。
零件齐了,数一下这个模型到底有多少个数。 公式只有一条:一层 = 注意力 + FFN + 两个 LayerNorm。
三个规模之间只差几个数字:层数、宽度、FFN 倍数。 公式一条没变,形状规则一条没变 —— 这也是为什么我们敢在这个玩具规模上 把整台机器算一遍,然后再去理解几亿参数的大模型。
现在这一层的输入和输出形状完全一样([6, 8]), 所以可以放心地叠 4 层、40 层、80 层。 下一课我们让它开口说话:把最后吐出来的那 20 个分数变成一个字, 再把这个字接回输入、接着猜下一个 —— 顺便把「温度」「top-k」这些旋钮搞明白。
一个 Transformer 层就是两条公式:x = x + 注意力(LayerNorm(x))、x = x + FFN(LayerNorm(x))。残差(那个加号)是一条直通的高速公路:本层输出 = 原样直通的输入 + 本层新学的东西,它保证信号和梯度都不会被一层层覆盖掉 (没有它,12 层后信号只剩 0.218%)。LayerNorm 在每个运算之前把 token 向量的音量调成标准大小 (均值 0、方差 1,再乘 γ 加 β),否则数值会一路滚大到溢出 (没有它,12 层后是 281 倍)。FFN 是「各自消化」:8 → 32 → 8,中间靠 GELU 把不要的方向掐断 —— 没有非线性,堆多少层都等于一层。 一层 = 注意力 288 + FFN 552 + LayerNorm 32 = 872 个数;整个演示模型 3824 个数。 形状全程不变,所以能一直叠上去。