简单通俗理解Transformer
简单通俗理解Transformer
简单通俗理解Transformer
用「序列到序列 → 编码器-解码器 → 注意力机制 → Transformer 结构 → 训练与推理」这条线,通俗梳理 Transformer 在做什么、为什么需要注意力、以及整体数据流。
目录
1. 从序列到序列说起
序列到序列(Seq2Seq):输入是一个序列,输出也是一个序列,且长度可以不同。
例如中译英:
- 输入:这老板真水(5 个字)
- 输出:This boss is really a joke(6 个词)
难点在于不是逐字对应:「水」在这里被译成「a joke」而不是 water,所以模型必须理解整句关系和词义。
2. 编码器-解码器架构
解决 Seq2Seq 的经典做法是:编码器理解输入,解码器产生输出。
人类翻译的类比:
- 先听懂中文的「意思」
- 再把这个「意思」用英文说出来
对应到机器:
1
2
人类: 中文「你好」 → 脑中「问候」这一意思 → 英文「hello」
机器: 输入「你好」 → 编码器输出一串数字(内部表示) → 解码器输出「hello」
文字流程图:
1
输入序列(你好) → 编码器 → 内部表示(如 1,5,9,8) → 解码器 → 输出序列(hello)
- 编码:把输入变成机器内部的数字表示。
- 解码:把内部表示变成人类可读的输出。
- Transformer 用的就是这套编码器-解码器架构;差异在于用注意力来搭建编码器和解码器。
3. 注意力机制
3.1 作用:理解序列里元素之间的关系
以「这老板真水」为例:
- 「水」在这里不是指水,而是形容老板水平差。
- 人能懂,是因为会「注意」到「水」在修饰「老板」。
注意力机制要做的事:让模型也能根据序列中元素之间的关系来理解每个位置的含义,而不是只看单字。
3.2 直观理解:Query、Key、Value
可以抽象成三样东西:
- Query(q):当前元素带着的「问题」——我想关注谁?
- Key(k):每个元素提供的「关键词」——我容易被什么关注?
- Value(v):每个元素提供的「实际内容」——被关注时贡献什么信息?
过程可以概括为:
- 每个位置用自己的 q 去和所有位置的 k 做匹配,得到「注意力权重」。
- 再用这些权重对所有位置的 v 做加权平均,得到当前位置的「上下文表示」。
文字示意(以「水」关注「老板」为例):
1
2
「水」的 q ←匹配→ 各词的 k → 得到注意力权重 → 对各词的 v 加权 → 「水」的上下文向量
(其中对「老板」权重大)
要点:
- 注意力是在「看过所有位置的 k」之后才产生的(包括自己)。
- 真正被用来更新表示的是 v;k 负责「吸引注意」,v 负责「提供信息」。
- 每个位置的输出 = 自己的注意力对所有位置 v 的加权平均。
3.3 用到的数学:矩阵乘法与向量内积
- 向量内积:两向量对应元素相乘再相加,得到一个数,用来衡量「相似度」;q 和 k 的内积越大,表示越相关,注意力权重越高。
- 矩阵乘法:一次算多组(例如所有 token 的 q 与所有 k 的内积),得到注意力分数矩阵,再经 softmax 得到权重,最后与 v 的矩阵相乘得到输出。
3.4 输入输出与特点
- 输入:一个序列(每个元素有一个向量表示)。
- 输出:每个元素对应一个上下文向量——融入了「对其他元素的注意力加权」后的表示。
特点简要归纳:
| 特点 | 说明 |
|---|---|
| 与距离无关 | 任意两位置都可算注意力(q、k 内积),不因距离变远而失效,利于长距离依赖。 |
| 可并行 | 各位置的 q、k、v 算好后,所有注意力可同时算,训练快。 |
| 依赖可学习参数 | q、k、v 由输入通过 K、Q、V 三个矩阵 得到,这三个矩阵是训练学的,决定注意力是否准确。 |
4. Transformer 在做什么
Transformer 用纯注意力(配合位置编码、归一化、残差、前馈等)来搭建编码器和解码器(论文标题 Attention is All You Need 即此意)。
4.1 编码器
- 输入:待翻译的原文(如中文句子)。
- 过程:经过多层(如 6 层)自注意力 + 前馈等,让每个位置都融合整句信息。
- 输出:整句的内部表示(一堆数字),送给解码器。
1
原文序列 → [注意力层 + 前馈等] × N层 → 原文的编码表示
4.2 解码器
- 输入:已生成的译文(训练时用标准译文;推理时用当前已生成的 token)。
- 过程:先对「已生成的译文」做自注意力;再和编码器送来的「原文表示」做交叉注意力(解码器位置当 q,编码器输出当 k、v);如此重复多层。
- 输出:下一个 token 的概率分布,按概率采样或取最大得到下一个词。
1
已生成译文 → 自注意力 → 与编码器输出做交叉注意力 → … → 下一个 token 的概率分布
4.3 整体数据流(文字箭头)
1
2
3
4
5
[编码器] 原文 → 多层自注意力+前馈 → 原文编码
↓
[解码器] 已生成译文 → 自注意力 → 与原文编码做交叉注意力 → … → 下一个词概率 → 采样得新 token
↑_________________________________________________________|
(新 token 拼回,继续生成下一 token)
5. 训练与使用
5.1 训练数据
准备「原文 – 译文」配对语料即可,例如:
1
2
3
我爱你 ↔ I love you
这老板真水 ↔ This boss is really a joke
...
5.2 训练时在做什么
- 把原文送入编码器,完整译文送入解码器(解码器一次看到整句译文,但用 mask 遮住「未来」的 token,只允许看已生成的)。
- 模型对每个位置预测「下一个 token」,与标准译文对比,用损失函数更新参数(包括 K、Q、V 等)。
- 语料一对一对地喂入,不断更新参数,使预测越来越接近标准译文。
流程简写:
1
语料对(原文, 译文) → 编码器(原文) + 解码器(译文) → 预测下一 token → 与真实译文算损失 → 反向传播更新参数
5.3 推理时怎么用(只给原文)
训练完成后,推理时只输入原文,不输入译文:
- 原文 → 编码器 → 得到原文编码。
- 解码器一开始没有译文,只给一个「开始」符号。
- 解码器根据「开始 + 原文编码」预测第 1 个 token,例如 “This”。
- 把 “This” 拼到解码器输入,再预测第 2 个 token,例如 “boss”。
- 重复:每次把新生成的 token 拼进去,再预测下一个,直到生成「结束」符号。
文字流程:
1
2
3
原文 → 编码器 → 原文编码
↓
开始符 → 预测 token₁ → 开始符+token₁ → 预测 token₂ → … → 结束符
所以:训练时需要「原文+译文」一起输入;推理时只给原文,译文是一个 token 一个 token 自回归生成的。
小结
| 概念 | 一句话 |
|---|---|
| Seq2Seq | 输入输出都是序列,长度可不同,如机器翻译。 |
| 编码器-解码器 | 编码器把输入变成内部表示,解码器把内部表示变成输出。 |
| 注意力 | 用 q、k、v 让每个位置关注整句,得到带上下文的表示;与距离无关、可并行。 |
| Transformer | 用多层自注意力+前馈建编码器,用自注意力+交叉注意力建解码器。 |
| 训练 | 用原文+译文语料对,预测下一 token,更新 K/Q/V 等参数。 |
| 推理 | 只输入原文,解码器从开始符起逐个生成 token,直到结束。 |
本文由作者按照 CC BY 4.0 进行授权
