再讲解Transformer,一文读懂架构精讲:从“我爱AI”到“I love AI”
本文详细解析了Transformer模型在机器翻译中的工作原理。模型由编码器和解码器组成:编码器通过自注意力机制理解输入文本(如中文"我爱AI"),解码器逐步生成目标语言(如英文"I love AI")。重点讲解了多头注意力机制如何拆分语义信息,以及训练与推理时的关键差异。文章通过具体数值示例展示了词嵌入、位置编码、注意力权重计算等核心过程,并总结了Tran
文章目录
文章目录
再讲解Transformer,一文读懂,架构精讲:从"我爱AI"到"I love AI"
一、整体架构视图
中文输入 英文输出
↓ ↑
┌─────────────┐ ┌─────────────┐
│ 编码器 │ │ 解码器 │
│ (理解) │ │ (生成) │
│ │ │ │
"我爱AI" → [Encoder] → 上下文向量 → [Decoder] → "I love AI"
│ │ │ │
└─────────────┘ └─────────────┘
↓ ↑
理解中文含义 生成英文翻译
二、编码器:理解"我爱AI"
2.1 输入处理
原始句子: "我爱AI"
分词: ["我", "爱", "AI"]
词嵌入(每个词→512维向量):
我: [0.1, 0.2, 0.3, ..., 0.512] ← 512个数字
爱: [0.4, 0.5, 0.6, ..., 0.512]
AI: [0.7, 0.8, 0.9, ..., 0.512]
位置编码(告诉模型词的位置):
位置0: [+0.0, +0.1, +0.0, +0.1, ...] ← "我是第一个"
位置1: [+0.1, +0.2, +0.1, +0.2, ...] ← "我是第二个"
位置2: [+0.2, +0.3, +0.2, +0.3, ...] ← "我是第三个"
最终输入 = 词嵌入 + 位置编码
2.2 自注意力机制(核心)
以"爱"字为例,看它如何与句子中所有词互动:
"爱"的Query向量: Q_爱 = [爱向量] × W_Q
计算与每个词的相关性:
score_爱→我 = Q_爱 · K_我 / √512
score_爱→爱 = Q_爱 · K_爱 / √512
score_爱→AI = Q_爱 · K_AI / √512
假设得到: [0.7, 0.2, 0.1] → softmax后 → [0.65, 0.23, 0.12]
更新"爱"的表示:
新的"爱" = 0.65×V_我 + 0.23×V_爱 + 0.12×V_AI
= 65%的"我" + 23%自己 + 12%的"AI"
这个过程的可视化:
初始: 我 爱 AI
↓ ↓ ↓
[向量][向量][向量]
自注意力计算:
我 ←→ 爱 ←→ AI (每个词与其他词互动)
更新后:
我' 爱' AI'
↓ ↓ ↓
[新向量][新向量][新向量]
其中: 爱' = 0.65×我 + 0.23×爱 + 0.12×AI
2.3 多头注意力:8个专家会诊
关键澄清:头数≠词数!头数=8是固定参数
"爱"的512维向量拆分成8组:
维度 0-63: 专家1分析 → 输出64维
维度 64-127: 专家2分析 → 输出64维
维度 128-191:专家3分析 → 输出64维
...
维度 448-511:专家8分析 → 输出64维
每个专家的分析重点不同:
专家1: 分析语法("爱"是动词)
专家2: 分析语义("爱"≈love)
专家3: 分析情感("爱"是正面情感)
专家4: 分析时态(现在是爱)
专家5: 分析主谓(我 爱)
专家6: 分析动宾(爱 AI)
专家7: 分析词性(动词)
专家8: 分析搭配(爱+AI)
最后合并: 8个64维 → 1个512维
数学公式:
对于第i个头(i=1…8):
head_i = Attention(H·W_Q_i, H·W_K_i, H·W_V_i)
其中W_Q_i, W_K_i, W_V_i ∈ ℝ^{512×64}
MultiHead = Concat(head₁,...,head₈)·W_O
W_O ∈ ℝ^{512×512}
2.4 编码器层堆叠
编码器有6层,每层做相同的事:
第1层输入: [我, 爱, AI]的初始表示
↓
第1层处理: 自注意力 + 前馈网络
↓
第1层输出: [我¹, 爱¹, AI¹] ← 包含一些上下文
第2层输入: [我¹, 爱¹, AI¹]
↓
第2层处理: 自注意力 + 前馈网络
↓
第2层输出: [我², 爱², AI²] ← 包含更多上下文
...重复6次...
第6层输出: [我⁶, 爱⁶, AI⁶] ← 包含完整的句子上下文
最终编码器输出:
我⁶: [512维向量,包含"我爱AI"的全部信息]
爱⁶: [512维向量,包含"我爱AI"的全部信息]
AI⁶: [512维向量,包含"我爱AI"的全部信息]
形状: 3×512矩阵
三、解码器:生成"I love AI"
3.1 训练 vs 推理的关键区别
训练时(有标准答案):
已知: 中文"我爱AI",英文"I love AI"
训练过程:
1. 编码器理解中文 → 输出上下文向量
2. 解码器输入: "<sos> I love AI" ← 英文右移一位
3. 期望输出: "I love AI <eos>" ← 正确答案
学习目标:
输入"<sos>" → 应该输出"I"
输入"<sos> I" → 应该输出"love"
输入"<sos> I love" → 应该输出"AI"
输入"<sos> I love AI" → 应该输出"<eos>"
推理时(无答案,自己生成):
真实翻译过程:
第1步: 输入"<sos>" → 输出"I"
第2步: 输入"<sos> I" → 输出"love"
第3步: 输入"<sos> I love" → 输出"AI"
第4步: 输入"<sos> I love AI" → 输出"<eos>"
结果: "I love AI"
3.2 解码器的三层结构
解码器每层有三部分:
第1部分: 掩码自注意力
↓
输入: 已生成的英文词(如"<sos> I")
掩码: 只能看到已生成的词,不能看未来的词
输出: 英文词的上下文表示
第2部分: 编码器-解码器注意力
↓
Query: 来自解码器(英文)
Key,Value: 来自编码器(中文)
作用: 寻找英文词对应的中文词
第3部分: 前馈网络
↓
同编码器,每个位置独立处理
3.3 编码器-解码器注意力:翻译对齐
当生成"love"时的具体过程:
解码器状态: 已生成"<sos> I",现在要生成下一个词
1. 解码器Query: "我需要一个表达情感的动词"
2. 与中文Key比较:
Q_love · K_我 = 0.1 ← 不太相关
Q_love · K_爱 = 0.8 ← 高度相关!
Q_love · K_AI = 0.1 ← 不太相关
3. 注意力权重: [0.1, 0.8, 0.1]
4. 加权求和:
context = 0.1×V_我 + 0.8×V_爱 + 0.1×V_AI
= 80%的中文"爱"信息
5. 基于这个context,解码器生成"love"
对齐可视化:
英文: I love AI
↓ ↓ ↓
中文: 我 爱 AI
↓ ↓ ↓
权重: 0.9 0.8 0.7
3.4 损失函数:如何训练
对于训练序列" I love AI":
位置0: 输入"<sos>",模型预测"I"的概率=0.9
损失₁ = -log(0.9) = 0.105
位置1: 输入"<sos> I",模型预测"love"的概率=0.8
损失₂ = -log(0.8) = 0.223
位置2: 输入"<sos> I love",模型预测"AI"的概率=0.7
损失₃ = -log(0.7) = 0.357
位置3: 输入完整序列,模型预测"<eos>"的概率=0.95
损失₄ = -log(0.95) = 0.051
总损失 = (0.105 + 0.223 + 0.357 + 0.051) / 4 = 0.184
目标: 通过调整参数,让这个损失变小
四、关键公式总结
4.1 自注意力公式
Attention ( Q , K , V ) = softmax ( Q K T d k ) V \text{Attention}(Q,K,V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right) V Attention(Q,K,V)=softmax(dkQKT)V
其中:
- Q Q Q = 查询矩阵(我想找什么)
- K K K = 键矩阵(我有什么)
- V V V = 值矩阵(我的实际内容)
- d k d_k dk = 512(向量维度)
4.2 多头注意力公式
对于第i个头 : head i = Attention ( H W Q i , H W K i , H W V i ) \text{对于第i个头}: \text{head}_i = \text{Attention}(HW_{Q_i}, HW_{K_i}, HW_{V_i}) 对于第i个头:headi=Attention(HWQi,HWKi,HWVi)
MultiHead = Concat ( head 1 , . . . , head 8 ) W O \text{MultiHead} = \text{Concat}(\text{head}_1,...,\text{head}_8) W_O MultiHead=Concat(head1,...,head8)WO
4.3 位置编码公式
P E ( p o s , 2 i ) = sin ( p o s 10000 2 i / 512 ) PE(pos,2i) = \sin\left(\frac{pos}{10000^{2i/512}}\right) PE(pos,2i)=sin(100002i/512pos)
P E ( p o s , 2 i + 1 ) = cos ( p o s 10000 2 i / 512 ) PE(pos,2i+1) = \cos\left(\frac{pos}{10000^{2i/512}}\right) PE(pos,2i+1)=cos(100002i/512pos)
4.4 前馈网络公式
FFN ( x ) = max ( 0 , x W 1 + b 1 ) W 2 + b 2 \text{FFN}(x) = \max(0, xW_1 + b_1)W_2 + b_2 FFN(x)=max(0,xW1+b1)W2+b2
其中: W 1 ∈ R 512 × 2048 W_1 \in \mathbb{R}^{512\times2048} W1∈R512×2048, W 2 ∈ R 2048 × 512 W_2 \in \mathbb{R}^{2048\times512} W2∈R2048×512
4.5 损失函数公式
L = − 1 T ∑ t = 1 T log P ( y t ∣ y < t , x ) L = -\frac{1}{T} \sum_{t=1}^T \log P(y_t | y_{<t}, x) L=−T1t=1∑TlogP(yt∣y<t,x)
五、维度一致性说明
为什么编码器输入输出维度相同?
输入: 3个词 × 512维 = 3×512矩阵
编码器每层:
1. 自注意力: 输入3×512 → 输出3×512
2. 残差连接: 需要输入+输出 → 必须维度相同
3. 前馈网络: 输入3×512 → 输出3×512
最终输出: 3×512矩阵
解码器的维度流动:
解码器输入: 4个英文词 × 512维 = 4×512
(包括<sos> I love AI)
每层处理保持4×512维度
最终输出: 4×50000(4个位置,每个位置50000个词的概率)
六、完整信息流
训练阶段:
1. 编码器: "我爱AI" → 3×512中文表示
2. 解码器输入: "<sos> I love AI" (4×512)
3. 掩码: 确保每个位置只能看到前面的词
4. 编码器-解码器注意力: 英文词找对应的中文词
5. 输出: 4个位置的概率分布
6. 计算损失: 与"I love AI <eos>"比较
推理阶段:
1. 编码器: "我爱AI" → 3×512中文表示
2. 解码器从<sos>开始:
步骤1: 输入"<sos>" → 输出"I"
步骤2: 输入"<sos> I" → 输出"love"
步骤3: 输入"<sos> I love" → 输出"AI"
步骤4: 输入"<sos> I love AI" → 输出"<eos>"
3. 最终翻译: "I love AI"
七、为什么Transformer高效?
- 并行训练:所有位置同时计算
- 长距离依赖:每个词直接看到所有词
- 对齐学习:注意力权重天然学习翻译对应
- 扩展性强:加层数就能提升能力
从"我爱AI"到"I love AI",Transformer通过注意力机制让中文和英文的词直接"对话",实现了高质量的翻译。
更多推荐



所有评论(0)