0
概念导读 · Concepts
在看数字之前,先把概念讲清楚

7 个核心类比,帮你建立直觉。理解了"为什么",再看数字就不会迷失。

注意力机制
注意力 vs RNN · 圆桌 vs 电话传话 Self-Attention

RNN(旧方式):电话传话游戏——信息从第一个人耳语给第二个人,再传给第三个人。到最后一个人,最初的话早已失真。长距离依赖几乎不可能准确保留。

Transformer(新方式):圆桌会议——所有人同时能互相看到彼此、互相提问。「真」这个词可以直接"问"「天气」:"你的信息对我有多重要?"不需要中间人转达。

技术实现:每个 token 同时计算它与所有其他 token 的相关性(注意力权重),再加权平均它们的信息。

Q / K / V · 图书馆检索系统 Query / Key / Value

Query(查询单)):你走进图书馆,心里想的问题——"我需要关于天气的信息"

Key(书脊标签):每本书背面的关键词——"天气" "今天" "预报" ……

Value(书的内容):真正要读的信息。

注意力权重 = 你的 Query 和每个 Key 的匹配度(点积得分 → softmax)。
输出 = 所有 Value 按匹配度加权求和:匹配度越高,这本书贡献越多内容。

本例:真 在查什么?
「真」的 Q 向量主要提取"天气质量"维度;「天气」的 K 向量在该维度最强,所以「真」最终把 50.6% 的注意力给了「天气」。
多头注意力 · 多位编辑同时标注 Multi-Head Attention

一篇文章交给多位编辑同时审阅:语法编辑标注句法关系,内容编辑标注语义依赖,风格编辑标注修辞结构。最终把所有标注合并。

多头注意力 = 并行运行多个独立的 Q/K/V 投影(每个"头"),各自捕捉不同类型的依赖关系,最后拼接后通过 W_O 合并。
本教程简化为单头(single-head)以便数值追踪。


Transformer Block 内部
残差连接 · 便利贴草稿 Residual Connection

你在白板上写草稿(Self-Attention 的输出),同时保留一张原始便利贴(输入 x)。最后把两者叠加:h_out = Attention(x) + x

作用:① 原始信息不会被"覆盖"丢失;② 梯度反传时有一条高速公路,解决梯度消失。每个 Block 后做两次(Attention 后一次、FFN 后一次)。

FFN · 特征提炼工坊 Feed-Forward Network

Self-Attention 负责"收集信息"(从其他 token 那里汇聚内容);FFN 负责"加工信息"(在每个 token 内部独立地做非线性变换,提炼出更抽象的特征)。

结构:Linear(d_model→d_ff) → ReLU → Linear(d_ff→d_model)。d_ff 通常是 d_model 的 4 倍,给网络更多"加工空间"。
本例 d_model=4, d_ff=8(2倍,便于数值展示)。

自回归生成 · 逐字填空 Autoregressive

语言模型每次只预测下一个 token。"今天天气真___" → 模型给出所有词的概率分布 → 选最高的(或采样)→ 追加到序列 → 再预测下一个……

关键:模型只用最后一个 token(「真」)的隐状态去预测下一词。输出层 logits = h_last · W_out,再 softmax 得概率。

LayerNorm · 考试标准化 Layer Normalization

同班同学(同一个 token 的各维度)统一做标准化:减去班级平均分(均值),除以班级标准差。让每层输入的数值范围保持稳定,训练更快更稳。

公式:LN(x) = (x − μ) / σ(γ=1, β=0 本例简化)。对每个 token 向量单独做,不跨 token。

1
网络架构 · Architecture
5 个堆叠的 Transformer Block

输入「今天 天气 真」,经过 5 层 Block 逐步提炼特征,最终预测「好」。

整体架构
输入序列:今天 · 天气 ·
Embedding 查表 + 位置编码 (PE)
Block 1 ← 本教程完整展开
Self-Attention (Q/K/V) + LayerNorm + FFN + LayerNorm
Block 2
相同结构,参数独立
Block 3
Block 4
Block 5
取最后 token「真」的隐状态 hlast
输出头 W_out → Softmax → P(好) = 22.25%

超参数
参数说明
d_model4隐状态维度(真实 GPT-3 = 12288)
d_k = d_v2Q/K/V 投影维度,√d_k = √2 ≈ 1.414
d_ff8FFN 中间层维度(= 2×d_model)
n_layers5堆叠 Block 数
vocab_size8词表:今天/天气/真/好/坏/晴/不/的
n_tokens3输入序列长度
lr0.1学习率(梯度下降步长)

Block 1 权重矩阵

以下是 Block 1 的所有可训练权重(Block 2–5 结构相同但参数不同)。

W_Q ∈ ℝ4×2
00
20
02
00
W_K ∈ ℝ4×2(= W_Q)
00
20
02
00
W_V ∈ ℝ4×2
10
01
00
00
W_O ∈ ℝ2×4
1000
0100
W_Q / W_K 的设计直觉
W_Q 的第 2 行 [2, 0] 提取输入的 dim1(天气/质量维度)→ Q 的第 1 分量。
W_Q 的第 3 行 [0, 2] 提取 dim2(强调词维度)→ Q 的第 2 分量。
这使得 Q·K 点积变成"天气内容相似度"的度量:「天气」的 Q/K 幅度最大 → 吸引所有 token 的注意力。

FFN 权重概览
W1 ∈ ℝ4×8:前 4 列构成单位矩阵 I₄,后 4 列全 0
W2 ∈ ℝ8×4:前 4 行构成 0.5 × I₄,后 4 行全 0
效果:FFN(h) ≈ 0.5 × ReLU(h) —— 正分量缩小一半,负分量清零
W_out ∈ ℝ4×8:随机初始化(seed=7, scale=0.3)
2
输入准备 · Input
Embedding 查表 + 位置编码

三个 token 各自从词向量表查出 4 维向量,再叠加位置编码,得到 X ∈ ℝ3×4

分词

今天 天气 索引 0 索引 1 索引 2


Embedding 查表(词向量矩阵 E 的前 4 行)

每行对应一个词,每列是一个语义维度:dim0 = 时间词dim1 = 天气/质量词,dim2 = 强调词,dim3 = 通用信号。

索引dim0 (时间)dim1 (天气/质量)dim2dim3
0今天1.0000.2000.0000.100
1天气0.2001.0000.0000.100
20.1000.8000.0000.100
3好(目标词)0.0001.2000.0000.100

位置编码 (Positional Encoding)

公式:PE[pos, 2i] = sin(pos / 10000^(2i/d_model))PE[pos, 2i+1] = cos(...)

posTokendim0dim1dim2dim3
0今天0.0001.0000.0001.000
1天气0.8410.5400.0101.000
20.909−0.4160.0200.999

X = Embedding + PE(送入 Block 1 的实际输入)
Tokendim0dim1dim2dim3
今天 1.000+0.000 = 1.000 0.200+1.000 = 1.200 0.000+0.000 = 0.000 0.100+1.000 = 1.100
天气 0.200+0.841 = 1.041 1.000+0.540 = 1.540 0.000+0.010 = 0.010 0.100+1.000 = 1.100
0.100+0.909 = 1.009 0.800+(−0.416) = 0.384 0.000+0.020 = 0.020 0.100+0.999 = 1.099
注意力的关键:dim1 差异
天气的 dim1 最大(1.540),今天次之(1.200),真最小(0.384)。
W_Q 放大了 dim1:Q 向量第一维 = 2×dim1。所以 Q_天气 = [3.080, 0.020],幅度最大,意味着"天气相关性"最强 → 成为注意力焦点。
3
Block 1 · Self-Attention
计算 Q、K、V 与 3×3 注意力矩阵

完整展开:投影 → 打分 → Softmax → 加权求和。

步骤一:线性投影得 Q、K、V

公式:Q = X · W_QK = X · W_KV = X · W_V(本例 W_Q = W_K)

Q 计算(W_Q 第 2 行 ×2 提取 dim1,第 3 行 ×2 提取 dim2)
Q_今天=[1.200×2, 0.000×2] = [2.400, 0.000]
Q_天气=[1.540×2, 0.010×2] = [3.080, 0.020]
Q_真=[0.384×2, 0.020×2] = [0.768, 0.040]
V 计算(W_V 直接取 dim0、dim1)
V_今天=[1.000, 1.200]
V_天气=[1.041, 1.540]
V_真=[1.009, 0.384]

步骤二:打分矩阵 S = Q · Kᵀ / √d_k

√d_k = √2 ≈ 1.414。以「真」为例:

真 对每个 token 的原始分数
s(真,今天)=(0.768×2.400 + 0.040×0.000) / 1.414 = 1.843 / 1.414 = 1.303
s(真,天气)=(0.768×3.080 + 0.040×0.020) / 1.414 = 2.367 / 1.414 = 1.674
s(真,真)=(0.768×0.768 + 0.040×0.040) / 1.414 = 0.592 / 1.414 = 0.418

完整 3×3 分数矩阵:

Query↓ / Key→ 今天天气
今天 4.073 5.227 1.303
天气 5.227 6.708 1.674
1.303 1.674 0.418

步骤三:Softmax → 注意力权重矩阵 A

对每行分别做 softmax:指数化后除以行和,确保每行之和为 1。

「真」行的 Softmax
e^1.303=3.681 e^1.674 = 5.332 e^0.418 = 1.519 sum = 10.532
A[真]=[3.681/10.532, 5.332/10.532, 1.519/10.532] = [0.3496, 0.5061, 0.1443]

完整 3×3 注意力权重(颜色深度 ∝ 权重大小):

Query↓ / Key→ 今天天气
今天 0.2362 0.7490 0.0148
天气 0.1843 0.8105 0.0053
0.3496 0.5061 0.1443
语言学故事
所有三个 token 都主要关注「天气」——它是句子的核心内容词(dim1 最大)。
「真」的注意力分布:天气 50.6%,今天 35.0%,真自身 14.4%。
这意味着「真」最终吸收了 50.6% 来自「天气」的语义内容,用于预测下一词。

步骤四:上下文向量 C = A · V

每个 token 的新表示 = 各 token 的 V 按注意力权重加权求和:

C_真 = A[真] · V
dim0=0.3496×1.000 + 0.5061×1.041 + 0.1443×1.009 = 0.350 + 0.527 + 0.146 = 1.022
dim1=0.3496×1.200 + 0.5061×1.540 + 0.1443×0.384 = 0.420 + 0.779 + 0.055 = 1.254
TokenC (2维)含义
今天[1.031, 1.443]吸收了 74.9% 天气信息
天气[1.033, 1.471]主要是自身信息(81.1%)
[1.022, 1.254]50.6% 来自天气,已"知道"天气是核心
4
Block 1 · Residual + FFN
输出投影 → 残差 → LayerNorm → FFN

以「真」token 为例,逐步展示 Block 1 后半段的完整计算。

步骤五:输出投影 O = C · W_O

W_O ∈ ℝ2×4 将 2 维上下文映射回 d_model=4 维:

O_真 = [1.022, 1.254] · W_O
O_真=[1.022×1 + 1.254×0, 1.022×0 + 1.254×1, 0, 0] = [1.022, 1.254, 0.000, 0.000]

步骤六:第一次残差连接 + LayerNorm
+
O_真 = [1.022, 1.254, 0.000, 0.000]
=
h = [2.031, 1.638, 0.020, 1.099]
LayerNorm(h_真)
μ=(2.031 + 1.638 + 0.020 + 1.099) / 4 = 4.788 / 4 = 1.197
偏差=[0.834, 0.441, −1.177, −0.098]
σ²=(0.834² + 0.441² + 1.177² + 0.098²) / 4 = 2.285 / 4 = 0.571 σ = 0.756
H1_真=[0.834/0.756, 0.441/0.756, −1.177/0.756, −0.098/0.756] = [1.103, 0.583, −1.557, −0.130]

步骤七:FFN(以「真」为例)

FFN(h) = W2 · ReLU(W1 · h + b1) + b2

W1 · H1_真 → ReLU → W2 · a
z = W1·h=[1.103, 0.583, −1.557, −0.130, 0, 0, 0, 0]
a = ReLU(z)=[1.103, 0.583, 0, 0, 0, 0, 0, 0] ← 负值清零
o_ff = W2·a=[1.103×0.5, 0.583×0.5, 0, 0] = [0.552, 0.292, 0.000, 0.000]

步骤八:第二次残差 + LayerNorm → H1_out
+
o_ff = [0.552, 0.292, 0.000, 0.000]
=
[1.655, 0.875, −1.557, −0.130]
第二次 LayerNorm
μ=(1.655 + 0.875 − 1.557 − 0.130) / 4 = 0.843 / 4 = 0.211
σ=√[(1.444² + 0.664² + 1.768² + 0.341²)/4] = √1.442 = 1.201
H1_out_真=[1.444/1.201, 0.664/1.201, −1.768/1.201, −0.341/1.201] = [1.202, 0.553, −1.472, −0.284]
Block 1 全部 3 个 token 的输出
今天:[0.537, 1.285, −1.359, −0.462]
天气:[0.388, 1.397, −1.284, −0.501]
真:[1.202, 0.553, −1.472, −0.284]

注意 dim1 值:今天 1.285 ≈ 天气 1.397 > 真 0.553。「真」经过 Block 1 后 dim1 稍微下降,但在后续 Block 中将逐渐从「天气」吸收质量信息(见页 5)。
5
Blocks 2–5 · Evolution
信息如何在 5 层间演化

每层的注意力矩阵 + 「真」的隐状态向量逐层变化,揭示深层网络的信息融合过程。

两条演化规律
1. 注意力趋向均匀:Block 1 的极端偏向(天气 81%)随层数加深逐渐平摊,到 Block 5 几乎均匀分配。
2. 「真」的 dim1 持续增长:从 Block 1 的 0.553 增长到 Block 5 的 1.702——不断从「天气」吸收质量信息。

Block 2 注意力矩阵
Q↓ / K→今天天气
今天 0.4175 0.4420 0.1404
天气 0.4197 0.4557 0.1245
0.3770 0.3521 0.2709

「真」隐状态(Block 2 输出)

1.0500.886−1.315−0.621

天气偏向从 50.6% → 35.2%;「真」越来越关注自身,说明 Block 2 开始整合自己的特征


Block 3 注意力矩阵
Q↓ / K→今天天气
今天 0.3755 0.3828 0.2417
天气 0.3778 0.3875 0.2347
0.3559 0.3503 0.2937

「真」隐状态(Block 3 输出)

0.7051.241−1.162−0.783

dim1 从 0.886 → 1.241:「真」的天气/质量特征持续增强


Block 4 注意力矩阵
Q↓ / K→今天天气
今天 0.3464 0.3476 0.3061
天气 0.3470 0.3487 0.3043
0.3413 0.3399 0.3188

「真」隐状态(Block 4 输出)

0.2141.546−0.974−0.785

注意力几乎均匀;dim1 继续增长到 1.546


Block 5 注意力矩阵(最终层)
Q↓ / K→今天天气
今天 0.3352 0.3350 0.3298
天气 0.3353 0.3351 0.3296
0.3344 0.3338 0.3318

「真」隐状态(Block 5 输出 = h_last)

−0.2681.702−0.759−0.675

dim1 = 1.702(Block 1 时为 0.553,增长了 3× )
「真」已完全融合了「天气质量」信息,准备预测「好」。


「真」向量 dim1 演化趋势
Blockdim0dim1 (天气/质量)dim2dim3
11.2020.553−1.472−0.284
21.0500.886−1.315−0.621
30.7051.241−1.162−0.783
40.2141.546−0.974−0.785
5 (h_last)−0.2681.702−0.759−0.675
6
输出层 · Output
Logits → Softmax → 概率分布

用「真」的最终隐状态 h_last 预测下一个词。

h_last(Block 5 后「真」的隐状态)
−0.26811.7019−0.7588−0.6750

Logits = h_last · W_out

W_out ∈ ℝ4×8,每列对应词表中一个词:

索引logit概率 (softmax)
今天00.26660.1456
天气10.60960.2053
2−0.30240.0825
30.69050.2225← 目标词,最高 logit
4−0.26680.0854
5−0.08440.1025
60.11460.1251
7−1.27990.0310
结果:P(好) = 22.25%
未经训练的随机初始化下,「好」已经获得了最高的预测概率!这得益于我们设计的 Embedding 和 W_Q/W_K,使得「真」在 Block 1 就主要关注「天气」的质量维度,经过 5 层逐步强化,h_last 的 dim1 增长为 1.702,而「好」的词向量在 dim1 方向正好很强(Emb_好[1] = 1.200)。

概率分布可视化
好 (目标)
22.25%
天气
20.53%
12.51%
今天
14.56%
其他
≈ 30%
7
损失函数 · Loss
交叉熵损失 L = −ln(P_目标)

量化当前预测有多错,为反向传播提供优化目标。

公式

对于多分类问题,交叉熵损失只关心目标类别的概率

L = −∑ y_i · ln(p̂_i) = −ln(p̂_好)   ← y 为 one-hot,只有 y_好=1
计算过程
p̂_好=0.2225 (来自 Softmax)
L=−ln(0.2225) = 1.5026
当前损失
L = 1.5026

参考值:完美预测时 L = 0;随机猜 8 个词时 L = ln(8) ≈ 2.08。当前 1.50 说明已略优于随机猜测。


为什么用交叉熵而不用 MSE?
交叉熵的优点
· 对概率输出(Softmax)天然匹配
· 当正确答案概率极低时(p̂ → 0),L → ∞,给出很强的梯度信号
· 与 Softmax 结合后梯度公式非常简洁:δlogits = p̂ − y
MSE 的问题
· 对概率输出梯度会饱和(sigmoid/softmax 的"平坦区域")
· 不匹配信息论中的不确定性度量
· 实际训练收敛慢

损失 → 梯度的关键桥梁
Softmax + 交叉熵的梯度公式
∂L/∂logit_i = p̂_i − y_i

即:目标词的梯度 = p̂_好 − 1 = 0.2225 − 1 = −0.7775(负值 → 增大 logit_好)
其余词的梯度 = p̂_i(正值 → 减小其 logit)

这个公式极其简洁,是交叉熵与 Softmax 结合的精华。
8
反向传播 · Backprop
梯度从输出层逐层流回

链式法则:每层的梯度 = 后层梯度 × 本层偏导数。完整数值展示。

第一步:Softmax 梯度

公式:δᵢ = ∂L/∂logitᵢ = p̂ᵢ − yᵢ(y 为 one-hot,y₃=1 对应「好」)

δ = p̂ − y = [0.146, 0.205, 0.083, −0.778, 0.085, 0.103, 0.125, 0.031]
        今天 天气 真 好← 坏 晴 不 的

「好」的 δ = −0.778 ← 负值代表"这个 logit 需要增大"
其他词 δ > 0 ← 代表"这些 logit 需要减小"

第二步:∂L/∂W_out

公式:∂L/∂W_out = h_lastT ⊗ δ(外积,shape = 4×8)

以「好」列(索引 3)为例,这一列梯度直接告诉我们 W_out 中哪些权重需要调整

∂L/∂W_out[:, 3] = h_last × δ_好 = h_last × (−0.7775)
dim0=−0.2681 × (−0.7775) = +0.2084 → 下次减小此权重
dim1=+1.7019 × (−0.7775) = −1.3232 → 下次增大此权重 ⬆
dim2=−0.7588 × (−0.7775) = +0.5899 → 减小此权重
dim3=−0.6750 × (−0.7775) = +0.5248 → 减小此权重
关键洞察:dim1 梯度为负 = 需要增大
W_out[dim1, 好] 的梯度 = −1.323。更新时:W_new = W_old − lr × (−1.323) = W_old + 0.132
直觉:h_last 在 dim1(天气质量维度)最大(1.702),增大 W_out[1,3] 能直接提高「好」的 logit。
梯度自动找到了最有效的改进方向!

第三步:∂L/∂h_last(流入 Block 5)

公式:∂L/∂h_last = W_out · δ(矩阵乘向量,shape = 4)

数值结果
∂L/∂h_last=[−0.0856, +0.0883, +0.4461, +0.4286] ‖grad‖ = 0.631

第四步:梯度流过 Block 5 → Block 1

梯度信号从 Block 5 反向传播至 Block 1,每层经过 FFN、LayerNorm、Self-Attention 的链式法则。

Attention 梯度公式

∂L/∂W_Q = XT · ∂L/∂Q
∂L/∂W_K = XT · ∂L/∂K
∂L/∂W_V = XT · ∂L/∂V
∂L/∂W_O = CT · ∂L/∂O

其中 ∂L/∂Q 需要通过 Softmax 的雅可比矩阵:
∂L/∂S = diag(a)·∂L/∂a − a·(aT·∂L/∂a)
∂L/∂Q = ∂L/∂S · K / √d_k

FFN 梯度公式

∂L/∂W2 = a_ffT · ∂L/∂h_out
∂L/∂W1 = hT · (ReLU'(z)⊙∂L/∂z)

ReLU' = 1(若 z > 0),0(若 z ≤ 0)

残差连接保证梯度同时流过
两条路径(主路 + 捷径),
避免梯度消失。

梯度幅度衰减
位置‖梯度‖(近似)说明
输出层 W_out‖δ‖ ≈ 1.00归一化参考
∂L/∂h_last0.631经过 W_out 后
Block 5 → Block 4~0.40经过 LN + FFN
Block 4 → Block 3~0.25持续衰减
Block 3 → Block 2~0.15
Block 1 的 ∂L/∂W_Q~0.06最底层梯度最弱,但残差连接减缓了衰减
为什么残差连接对反传至关重要?
没有残差:梯度需经过 5 个 FFN + 5 个 Attention(约 10 次连乘),每次连乘若 < 1 就会指数级衰减 → 梯度消失。
有残差:每个 Block 存在"梯度直通公路"(1 的导数),确保底层 Block 始终能收到有效的梯度信号。
9
权重更新 · Verification
梯度下降一步后,P(好) 显著提升

lr = 0.1,更新 W_out,验证损失下降与概率提升。

更新公式
W_new = W_old − lr × ∂L/∂W
W_new = W_old − 0.1 × ∂L/∂W_out

W_out 的「好」列更新(col = 3)
维度W_old梯度 ∂L/∂W更新量 (lr=0.1)W_new
dim0+0.1223+0.2084−0.021+0.1014
dim1 ⬆−0.0515−1.3232+0.132+0.0809
dim2−0.4580+0.5899−0.059−0.5170
dim3−0.6865+0.5248−0.052−0.7390
dim1 的权重增大了!
W_out[dim1, 好] 从 −0.0515 变为 +0.0809(增加了 0.132)。
这直接增强了"天气/质量特征 → 预测「好」"的连接强度,正是网络需要学到的!

验证:重新前向传播

损失对比

更新前
L = 1.5026
更新后
L = 1.2315

损失下降 18.0%(一步梯度下降)

P(好) 对比

更新前
22.25%
更新后
29.19%

「好」的概率提升 +6.94 个百分点


汇总表
指标更新前更新后变化
交叉熵损失 L1.50261.2315−18.0%
P(好)22.25%29.19%+6.94pp
W_out[dim1, 好]−0.0515+0.0809+0.132 ↑
更新矩阵仅 W_out(lr=0.1,一步)

真实训练中会发生什么?
持续迭代
重复:前向传播 → 计算损失 → 反向传播 → 更新所有权重(W_Q, W_K, W_V, W_O, W1, W2, W_out, Embeddings)
批量训练
实际用数千个句子同时计算平均梯度(mini-batch),每步更新一次权重。GPT-3 训练了约 300B 个 token。
优化器
Adam(而非简单的 SGD):每个参数有独立的自适应学习率,收敛更稳定。lr 通常从 3e-4 开始随时间衰减。
完整推演总结:今天天气真→好
1. Embedding + PE:3 个 token 变成带位置信息的 4 维向量
2. Block 1 自注意力:「真」把 50.6% 注意力给「天气」,开始吸收天气语义
3. Blocks 2-5:注意力趋向均匀,「真」的 dim1 从 0.553 增长到 1.702
4. 输出层:P(好) = 22.25%(最高概率),L = 1.5026
5. 反向传播:梯度从输出层流回,W_out[dim1,好] 的梯度最大(−1.323)
6. 权重更新:一步 SGD 后 L → 1.2315(−18%),P(好) → 29.19%