再讲解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(dk QKT)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} W1R512×2048, W 2 ∈ R 2048 × 512 W_2 \in \mathbb{R}^{2048\times512} W2R2048×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=1TlogP(yty<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高效?

  1. 并行训练:所有位置同时计算
  2. 长距离依赖:每个词直接看到所有词
  3. 对齐学习:注意力权重天然学习翻译对应
  4. 扩展性强:加层数就能提升能力

从"我爱AI"到"I love AI",Transformer通过注意力机制让中文和英文的词直接"对话",实现了高质量的翻译。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐