从零理解 Transformer

从零理解 Transformer:为什么“注意力”改变了AI?

人类如何处理信息?—— 从直觉理解“注意力”

假设你读这句话:“那只猫坐在垫子上,因为它很柔软。”
你会自然关注:

  • “它” 指代的是 “垫子”(而不是猫)
  • “柔软” 是垫子的属性

关键直觉:人类在处理信息时,会动态关注不同部分的关联性。这正是 Transformer 的核心思想!


传统模型的缺陷:RNN 为什么不够好?

RNN 的工作原理

传统模型(如RNN)像一条“传送带”,逐个单词处理: 句子:The → cat → sat → on → the → mat 处理:RNN逐步更新隐藏状态,最后输出结果

问题

  • 处理到句尾时,可能已经忘记句首的信息
  • 无法并行计算(必须按顺序处理)

长距离依赖问题

例子:翻译 “The animal didn’t cross the street because it was too tired”

  • RNN 可能混淆 “it” 指代的是 “animal” 还是 “street”
  • 而人类能直接通过注意力找到关联

Transformer 的核心创新:自注意力机制

自注意力如何工作?

想象你在阅读句子**“猫坐在垫子上”**时,大脑会本能地:

1️⃣ 提取核心对象(“猫"是主体)
2️⃣ 关联动作描述(“坐"定义状态)
3️⃣ 忽略次要成分(“上"仅表方位)


🛠️ 自注意力工作流程分解(以"猫"为例)

步骤1:构建"问题-答案"映射系统

每个词语生成三组向量:

向量类型 类比意义 实例说明
Query “我想知道什么?” “猫"需要知道自己的状态特征
Key “我能回答什么?” “坐"能提供动作信息
Value “我的完整语义是什么?” “垫子"包含物体属性信息

步骤2:建立语义关联度矩阵

通过点积计算"猫"与其他词语的关联强度:

$$ \text{相似度}(Q_{\text{猫}}, K_{\text{坐}}) = \frac{Q_{\text{猫}} \cdot K_{\text{坐}}^T}{\sqrt{d_k}} $$

注意力权重分布

步骤3:信息融合与特征增强

加权聚合各词语的Value信息:

$$ \text{新表示}_{猫} = 0.6 \times V_{猫} + 0.3 \times V_{坐} + 0.1 \times V_{垫子} $$

此时"猫"的表示包含:

自身物种特征(60%)

坐姿状态信息(30%)

所处环境线索(10%)

为什么要“多头”注意力?—— 分工合作

  • 头1:关注“猫”和“坐”的动作关系
  • 头2:关注“垫子”和“上”的位置关系
  • 头3:捕捉其他语法特征
    这样,每个头都能聚焦不同的信息,提高模型的表达能力

如何实现“多头”注意力?—— 矩阵运算

  • 矩阵乘法:计算注意力权重
  • 点积:衡量相似度
  • Softmax:归一化权重

Transformer 的完整架构

两大核心模块

  编码器(理解输入)                解码器(生成输出)
      ↓                               ↓
[自注意力 + 前馈网络]        [自注意力 + 交叉注意力 + 前馈网络]

编码器详解

  1. 输入嵌入:将单词转换为向量
    • 例:“猫” → [0.2, 1.3, -0.5, …]
  2. 位置编码:添加位置信息(否则模型不知道单词顺序)
    • 类似给每个词加“页码”:位置1 → 正弦波,位置2 → 不同正弦波…
  3. 自注意力层:计算词与词之间的关系
  4. 前馈网络:对每个词独立做非线性变换

解码器如何工作?

  1. 输入:已生成的部分结果(例如“猫 坐在”)
  2. 掩码自注意力:防止偷看未来信息(只能看已生成的词)
  3. 交叉注意力:连接编码器的输出(知道原文信息)
  4. 预测下一个词:输出概率分布(例如“垫子”的概率最高)

为什么 Transformer 如此强大?

三大优势

优势 说明 类比
并行计算 同时处理所有单词,速度极快 多人协同工作
全局视野 任意两个词可直接交互,无论距离多远 直接查阅全书任意章节
灵活扩展 通过堆叠更多层提升性能 增加专家团队规模

实际影响

  • BERT:理解语言含义的模型(用于搜索引擎、问答系统)
  • GPT:生成文本的模型(用于写作助手、聊天机器人)
  • DALL·E:生成图像的模型也借鉴了注意力机制

关键数学公式

自注意力公式

$$ \text{Attention}(Q, K, V) = \text{softmax}\left(\dfrac{QK^T}{\sqrt{d_k}}\right)V $$
  • Q(查询):当前关注的焦点
  • K(键):其他词的身份标识
  • V(值):实际携带的信息
  • d_k:缩放因子,防止数值过大

位置编码公式

$$ PE_{(pos,2i)} = \sin\left(pos/10000^{2i/d}\right) \\ PE_{(pos,2i+1)} = \cos\left(pos/10000^{2i/d}\right) $$
  • 通过正弦波组合,让模型感知位置差异

多头注意力公式

$$ \text{MultiHead}(Q, K, V) = \text{Concat}\left(\text{head}_1, \dots, \text{head}_h\right)W^O $$
  • 多个头并行计算,最后合并结果

前馈网络公式

$$ \text{FFN}(x) = \text{max}(0, xW_1 + b_1)W_2 + b_2 $$
  • 两层线性变换,增加非线性表达能力

损失函数公式

$$ \text{Loss} = -\sum_{i=1}^{N}\log p(y_i|x) $$
  • 交叉熵损失,用于训练模型

梯度下降公式

$$ \theta_{t+1} = \theta_t - \alpha \nabla_{\theta} \text{Loss} $$
  • 反向传播更新模型参数

总结:为什么“注意力”就够了?

  • 传统方法:依赖复杂的循环结构,像用望远镜逐字查看
  • Transformer:用注意力机制直接建立全局联系,像展开整本书同时阅读
comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy