文章

简单通俗理解Transformer

简单通俗理解Transformer

简单通俗理解Transformer

用「序列到序列 → 编码器-解码器 → 注意力机制 → Transformer 结构 → 训练与推理」这条线,通俗梳理 Transformer 在做什么、为什么需要注意力、以及整体数据流。

  • 原文作者:风中一匹狼
  • 原文链接:https://www.zhihu.com/question/445556653/answer/1899277050965100191

目录


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):每个元素提供的「实际内容」——被关注时贡献什么信息?

过程可以概括为:

  1. 每个位置用自己的 q 去和所有位置的 k 做匹配,得到「注意力权重」。
  2. 再用这些权重对所有位置的 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. 原文 → 编码器 → 得到原文编码。
  2. 解码器一开始没有译文,只给一个「开始」符号。
  3. 解码器根据「开始 + 原文编码」预测第 1 个 token,例如 “This”。
  4. 把 “This” 拼到解码器输入,再预测第 2 个 token,例如 “boss”。
  5. 重复:每次把新生成的 token 拼进去,再预测下一个,直到生成「结束」符号。

文字流程:

1
2
3
原文  →  编码器  →  原文编码
                        ↓
开始符  →  预测 token₁  →  开始符+token₁  →  预测 token₂  →  …  →  结束符

所以:训练时需要「原文+译文」一起输入;推理时只给原文,译文是一个 token 一个 token 自回归生成的。


小结

概念一句话
Seq2Seq输入输出都是序列,长度可不同,如机器翻译。
编码器-解码器编码器把输入变成内部表示,解码器把内部表示变成输出。
注意力用 q、k、v 让每个位置关注整句,得到带上下文的表示;与距离无关、可并行。
Transformer用多层自注意力+前馈建编码器,用自注意力+交叉注意力建解码器。
训练用原文+译文语料对,预测下一 token,更新 K/Q/V 等参数。
推理只输入原文,解码器从开始符起逐个生成 token,直到结束。
本文由作者按照 CC BY 4.0 进行授权