Transformer模型详解

0 / 5

前言

Transformer 由论文《Attention is All You Need》提出,现在是谷歌云 TPU 推荐的参考模型。论文相关的 Tensorflow 的代码可以从 GitHub 获取,其作为 Tensor2Tensor 包的一部分。哈佛的 NLP 团队也实现了一个基于 PyTorch 的版本,并注释该论文。

在本文中,我们将试图把模型简化一点,并逐一介绍里面的核心概念,希望让普通读者也能轻易理解。

Attention is All You Need:Attention Is All You Need

1.Transformer 整体结构

首先介绍 Transformer 的整体结构,下图是 Transformer 用于中英文翻译的整体结构:

Transformer 的整体结构,左图 Encoder 和右图 Decoder可以看到 Transformer 由 Encoder 和 Decoder 两个部分组成 ,Encoder 和 Decoder 都包含 6 个 block。Transformer 的工作流程大体如下:

第一步 获取输入句子的每一个单词的表示向量 XX 由单词的 Embedding(Embedding 就是从原始数据提取出来的 Feature) 和单词位置的 Embedding 相加得到。

Transformer 的输入表示第二步 将得到的单词表示向量矩阵 (如上图所示,每一行是一个单词的表示 x ) 传入 Encoder 中,经过 6 个 Encoder block 后可以得到句子所有单词的编码信息矩阵 C ,如下图。单词向量矩阵用 表示, n 是句子中单词个数,d 是表示向量的维度 (论文中 d=512)。每一个 Encoder block 输出的矩阵维度与输入完全一致。

Transformer Encoder 编码句子信息第三步 :将 Encoder 输出的编码信息矩阵 C 传递到 Decoder 中,Decoder 依次会根据当前翻译过的单词 1~ i 翻译下一个单词 i+1,如下图所示。在使用的过程中,翻译到单词 i+1 的时候需要通过 Mask (掩盖) 操作遮盖住 i+1 之后的单词。

Transofrmer Decoder 预测上图 Decoder 接收了 Encoder 的编码矩阵 C ,然后首先输入一个翻译开始符 "",预测第一个单词 "I";然后输入翻译开始符 "" 和单词 "I",预测单词 "have",以此类推。这是 Transformer 使用时候的大致流程,接下来是里面各个部分的细节。

2.Transformer 的输入

Transformer 中单词的输入表示 x单词 Embedding位置 Embedding (Positional Encoding)相加得到。

Transformer 的输入表示

2.1 单词 Embedding

单词的 Embedding 有很多种方式可以获取,例如可以采用 Word2Vec、Glove 等算法预训练得到,也可以在 Transformer 中训练得到。

2.2 位置 Embedding

Transformer 中除了单词的 Embedding,还需要使用位置 Embedding 表示单词出现在句子中的位置。因为 Transformer 不采用 RNN 的结构,而是使用全局信息,不能利用单词的顺序信息,而这部分信息对于 NLP 来说非常重要。 所以 Transformer 中使用位置 Embedding 保存单词在序列中的相对或绝对位置。

位置 Embedding 用 PE 表示,PE 的维度与单词 Embedding 是一样的。PE 可以通过训练得到,也可以使用某种公式计算得到。在 Transformer 中采用了后者,计算公式如下:

其中,pos 表示单词在句子中的位置,d 表示 PE 的维度 (与词 Embedding 一样),2i 表示偶数的维度,2i+1 表示奇数维度 (即 2i≤d, 2i+1≤d)。使用这种公式计算 PE 有以下的好处:* 使 PE 能够适应比训练集里面所有句子更长的句子,假设训练集里面最长的句子是有 20 个单词,突然来了一个长度为 21 的句子,则使用公式计算的方法可以计算出第 21 位的 Embedding。

  • 可以让模型容易地计算出相对位置,对于固定长度的间距 k,PE(pos+k) 可以用 PE(pos) 计算得到。因为 Sin(A+B) = Sin(A)Cos(B) + Cos(A)Sin(B), Cos(A+B) = Cos(A)Cos(B) - Sin(A)Sin(B)。

将单词的词 Embedding 和位置 Embedding 相加,就可以得到单词的表示向量 xx 就是 Transformer 的输入。

3.Self-Attention(自注意力机制)

Transformer Encoder 和 Decoder上图是论文中 Transformer 的内部结构图,左侧为 Encoder block,右侧为 Decoder block。红色圈中的部分为 Multi-Head Attention ,是由多个 Self-Attention 组成的,可以看到 Encoder block 包含一个 Multi-Head Attention,而 Decoder block 包含两个 Multi-Head Attention (其中有一个用到 Masked)。Multi-Head Attention 上方还包括一个 Add & Norm 层,Add 表示残差连接 (Residual Connection) 用于防止网络退化,Norm 表示 Layer Normalization,用于对每一层的激活值进行归一化。

因为 Self-Attention 是 Transformer 的重点,所以我们重点关注 Multi-Head Attention 以及 Self-Attention,首先详细了解一下 Self-Attention 的内部逻辑。

3.1 Self-Attention 结构

Self-Attention 结构上图是 Self-Attention 的结构,在计算的时候需要用到矩阵 Q(查询),K(键值),V(值) 。在实际中,Self-Attention 接收的是输入(单词的表示向量 x 组成的矩阵 X) 或者上一个 Encoder block 的输出。而 Q,K,V 正是通过 Self-Attention 的输入进行线性变换得到的。

3.2 Q, K, V 的计算

Self-Attention 的输入用矩阵 X 进行表示,则可以使用线性变阵矩阵 WQ,WK,WV 计算得到 Q,K,V 。计算如下图所示,注意 X, Q, K, V 的每一行都表示一个单词。

Q, K, V 的计算

3.3 Self-Attention 的输出

得到矩阵 Q, K, V 之后就可以计算出 Self-Attention 的输出了,计算的公式如下:

Self-Attention 的输出公式中计算矩阵 QK 每一行向量的内积,为了防止内积过大,因此除以dkdk 的平方根。Q 乘以 K 的转置后,得到的矩阵行列数都为 n,n 为句子单词数,这个矩阵可以表示单词之间的 attention 强度。下图为 Q 乘以 KTKT ,1234 表示的是句子中的单词。

Q 乘以 K 的转置的计算得到 QKTKT 之后,使用 Softmax 计算每一个单词对于其他单词的 attention 系数,公式中的 Softmax 是对矩阵的每一行进行 Softmax,即每一行的和都变为 1.

对矩阵的每一行进行 Softmax得到 Softmax 矩阵之后可以和 V 相乘,得到最终的输出 Z

Self-Attention 输出上图中 Softmax 矩阵的第 1 行表示单词 1 与其他所有单词的 attention 系数,最终单词 1 的输出 Z1Z1 等于所有单词 i 的值得到 8 个输出矩阵 到 之后,Multi-Head Attention 将它们拼接在一起 (Concat) ,然后传入一个 Linear 层,得到 Multi-Head Attention 最终的输出 Z 。 根据 attention 系数的比例加在一起得到,如下图所示:

Zi 的计算方法

3.4 Multi-Head Attention

在上一步,我们已经知道怎么通过 Self-Attention 计算得到输出矩阵 Z,而 Multi-Head Attention 是由多个 Self-Attention 组合形成的,下图是论文中 Multi-Head Attention 的结构图。

Multi-Head Attention从上图可以看到 Multi-Head Attention 包含多个 Self-Attention 层,首先将输入 X 分别传递到 h 个不同的 Self-Attention 中,计算得到 h 个输出矩阵 Z 。下图是 h=8 时候的情况,此时会得到 8 个输出矩阵 Z

多个 Self-Attention得到 8 个输出矩阵Z1Z1 到 Z8Z8 之后,Multi-Head Attention 将它们拼接在一起 (Concat) ,然后传入一个 Linear 层,得到 Multi-Head Attention 最终的输出 Z

Multi-Head Attention 的输出可以看到 Multi-Head Attention 输出的矩阵 Z 与其输入的矩阵 X 的维度是一样的。

4. Encoder 结构

Transformer Encoder block上图红色部分是 Transformer 的 Encoder block 结构,可以看到是由 Multi-Head Attention, Add & Norm, Feed Forward, Add & Norm 组成的。刚刚已经了解了 Multi-Head Attention 的计算过程,现在了解一下 Add & Norm 和 Feed Forward 部分。

4.1 Add & Norm

Add & Norm 层由 Add 和 Norm 两部分组成,其计算公式如下:

Add & Norm 公式其中 X 表示 Multi-Head Attention 或者 Feed Forward 的输入,MultiHeadAttention(X ) 和 FeedForward(X ) 表示输出 (输出与输入 X 维度是一样的,所以可以相加)。

AddX +MultiHeadAttention(X ),是一种残差连接,通常用于解决多层网络训练的问题,可以让网络只关注当前差异的部分,在 ResNet 中经常用到:

![](http://aiqianji.oss-cn-shenzhen.aliyuncs.com/images/2025/10/27/c7ee6ff549feade4d4a6354c93c6a82b