Transformer 模型详解 1. 前言transformer结构是google在2017年的Attention Is All You Need论文中提出在NLP的多个任务上取得了非常好的效果可以说目前NLP发展都离不开transformer。最大特点是抛弃了传统的CNN和RNN整个网络结构完全是由Attention机制组成。由于其出色性能以及对下游任务的友好性或者说下游任务仅仅微调即可得到不错效果在计算机视觉领域不断有人尝试将transformer引入近期也出现了一些效果不错的尝试典型的如目标检测领域的detr和可变形DETR分类领域的vision transformer等等。本文从transformer结构出发结合视觉中的transformer成果具体是vision transformer和DETR进行分析。1.1. Transformer 概览首先让我们先将 Transformer 模型视为一个黑盒如下图所示。在机器翻译任务中将一种语言的一个句子作为输入然后将其翻译成另一种语言的一个句子作为输出。Transformer 模型黑盒模式Transformer 本质上是一个 Encoder-Decoder 架构。因此中间部分的 Transformer 可以分为两个部分编码组件和解码组件。如下图所示Transformer 模型Encoder-Decoder 架构模式其中编码组件由多层编码器 (Encoder) 组成在论文中作者使用了 6 层编码器在实际使用过程中你可以尝试其他层数。解码组件也是由相同层数的解码器 (Decoder) 组成在论文也使用了 6 层。如下图所示每个编码器由两个子层组成Self-Attention 层自注意力层和 Position-wise Feed Forward Network前馈网络缩写为 FFN如下图所示。每个编码器的结构都是相同的但是它们使用不同的权重参数。编码器的输入会先流入 Self-Attention 层。它可以让编码器在对特定词进行编码时使用输入句子中的其他词的信息可以理解为当我们翻译一个词时不仅只关注当前的词而且还会关注其他词的信息。后面我们将会详细介绍 Self-Attention 的内部结构。然后Self-Attention 层的输出会流入前馈网络。解码器也有编码器中这两层但是它们之间还有一个注意力层即 Encoder-Decoder Attention其用来帮忙解码器关注输入句子的相关部分类似于 seq2seq 模型中的注意力。1.2. 引入张量现在我们已经了解了模型的主要组成部分让我们开始研究各种向量/张量以及他们在这些组成部分之间是如何流动的从而将输入经过已训练的模型转换为输出。和通常的 NLP 任务一样首先我们使用词嵌入算法 (Embedding) 将每个词转换为一个词向量。在 Transformer 论文中词嵌入向量的维度是 512。每个词被嵌入到大小为 512 的向量中。我们将用这些简单的框代表这些向量。嵌入仅发生在最底层的编码器中。所有编码器都会接收到一个大小为 512 的向量列表——底部编码器接收的是词嵌入向量其他编码器接收的是上一个编码器的输出。这个列表大小是我们可以设置的超参数——基本上这个参数就是训练数据集中最长句子的长度。对输入序列完成嵌入操作后每个词都会流经编码器的两层。接下来我们将换一个更短的句子作为示例来说明在编码器的每个子层中发生了什么。上面我们提到编码器会接收一个向量作为输入。编码器首先将这些向量传递到 Self-Attention 层然后传递到前馈网络最后将输出传递到下一个编码器。1.3. Transformer 整体结构Transformer 的整体结构左图Encoder和右图Decoder可以看到Transformer 由 Encoder 和 Decoder 两个部分组成Encoder 和 Decoder 都包含 6 个 block。Transformer 的工作流程大体如下第一步获取输入句子的每一个单词的表示向量XX由单词的 EmbeddingEmbedding就是从原始数据提取出来的Feature和单词位置的 Embedding 相加得到。Transformer 的输入表示第二步将得到的单词表示向量矩阵如上图所示每一行是一个单词的表示x传入 Encoder 中经过 6 个 Encoder block 后可以得到句子所有单词的编码信息矩阵C如下图。单词向量矩阵用表示n 是句子中单词个数d 是表示向量的维度论文中 d512。每一个 Encoder block 输出的矩阵维度与输入完全一致。Transformer Encoder 编码句子信息第三步将 Encoder 输出的编码信息矩阵C传递到 Decoder 中Decoder 依次会根据当前翻译过的单词 1~i 翻译下一个单词 i1如下图所示。在使用的过程中翻译到单词 i1 的时候需要通过Mask掩盖操作遮盖住 i1 之后的单词。Transofrmer Decoder 预测上图 Decoder 接收了 Encoder 的编码矩阵C然后首先输入一个翻译开始符 Begin预测第一个单词 I然后输入翻译开始符 Begin 和单词 I预测单词 have以此类推。这是 Transformer 使用时候的大致流程接下来是里面各个部分的细节。2. Transformer 的输入Transformer 中单词的输入表示x由单词 Embedding和位置 Embedding(Positional Encoding) 相加得到。Transformer 的输入表示2.1. 单词 Embedding单词的 Embedding 有很多种方式可以获取例如可以采用 Word2Vec、Glove 等算法预训练得到也可以在 Transformer 中训练得到。2.2. 位置 EmbeddingTransformer 中除了单词的 Embedding还需要使用位置 Embedding 表示单词出现在句子中的位置。因为 Transformer 不采用 RNN 的结构而是使用全局信息不能利用单词的顺序信息而这部分信息对于 NLP 来说非常重要。所以 Transformer 中使用位置 Embedding 保存单词在序列中的相对或绝对位置。位置 Embedding 用PE表示PE的维度与单词 Embedding 是一样的。PE 可以通过训练得到也可以使用某种公式计算得到。在 Transformer 中采用了后者计算公式如下其中pos 表示单词在句子中的位置d 表示 PE的维度与词 Embedding 一样2i 表示偶数的维度2i1 表示奇数维度 (即 2i≤d, 2i1≤d)。使用这种公式计算 PE 有以下的好处使 PE 能够适应比训练集里面所有句子更长的句子假设训练集里面最长的句子是有 20 个单词突然来了一个长度为 21 的句子则使用公式计算的方法可以计算出第 21 位的 Embedding。可以让模型容易地计算出相对位置对于固定长度的间距 kPE(posk)可以用PE(pos)计算得到。因为 Sin(AB) Sin(A)Cos(B) Cos(A)Sin(B), Cos(AB) 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 的输出公式中计算矩阵Q和K每一行向量的内积为了防止内积过大因此除以的平方根。Q乘以K的转置后得到的矩阵行列数都为 nn 为句子单词数这个矩阵可以表示单词之间的 attention 强度。下图为Q乘以1234 表示的是句子中的单词。Q乘以K的转置的计算得到之后使用 Softmax 计算每一个单词对于其他单词的 attention 系数公式中的 Softmax 是对矩阵的每一行进行 Softmax即每一行的和都变为 1.对矩阵的每一行进行 Softmax得到 Softmax 矩阵之后可以和V相乘得到最终的输出Z。Self-Attention 输出上图中 Softmax 矩阵的第 1 行表示单词 1 与其他所有单词的 attention 系数最终单词 1 的输出等于所有单词 i 的值根据 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。下图是 h8 时候的情况此时会得到 8 个输出矩阵Z。多个 Self-Attention得到 8 个输出矩阵到之后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 AttentionAdd NormFeed ForwardAdd Norm组成的。刚刚已经了解了 Multi-Head Attention 的计算过程现在了解一下 Add Norm 和 Feed Forward 部分。4.1. Add NormAdd Norm 层由 Add 和 Norm 两部分组成其计算公式如下Add amp;amp;amp;amp;amp; Norm 公式其中X表示 Multi-Head Attention 或者 Feed Forward 的输入MultiHeadAttention(X) 和 FeedForward(X) 表示输出输出与输入X维度是一样的所以可以相加。Add指XMultiHeadAttention(X)是一种残差连接通常用于解决多层网络训练的问题可以让网络只关注当前差异的部分在 ResNet 中经常用到残差连接Norm指 Layer Normalization通常用于 RNN 结构Layer Normalization 会将每一层神经元的输入都转成均值方差都一样的这样可以加快收敛。4.2. Feed ForwardFeed Forward 层比较简单是一个两层的全连接层第一层的激活函数为 Relu第二层不使用激活函数对应的公式如下。Feed ForwardX是输入Feed Forward 最终得到的输出矩阵的维度与X一致。4.3. 组成 Encoder通过上面描述的 Multi-Head AttentionFeed ForwardAdd Norm 就可以构造出一个 Encoder blockEncoder block 接收输入矩阵并输出一个矩阵。通过多个 Encoder block 叠加就可以组成 Encoder。第一个 Encoder block 的输入为句子单词的表示向量矩阵后续 Encoder block 的输入是前一个 Encoder block 的输出最后一个 Encoder block 输出的矩阵就是编码信息矩阵 C这一矩阵后续会用到 Decoder 中。Encoder 编码句子信息5. Decoder 结构Transformer Decoder block上图红色部分为 Transformer 的 Decoder block 结构与 Encoder block 相似但是存在一些区别包含两个 Multi-Head Attention 层。第一个 Multi-Head Attention 层采用了 Masked 操作。第二个 Multi-Head Attention 层的K, V矩阵使用 Encoder 的编码信息矩阵C进行计算而Q使用上一个 Decoder block 的输出计算。最后有一个 Softmax 层计算下一个翻译单词的概率。5.1. 第一个 Multi-Head AttentionDecoder block 的第一个 Multi-Head Attention 采用了 Masked 操作因为在翻译的过程中是顺序翻译的即翻译完第 i 个单词才可以翻译第 i1 个单词。通过 Masked 操作可以防止第 i 个单词知道 i1 个单词之后的信息。下面以我有一只猫翻译成 I have a cat 为例了解一下 Masked 操作。下面的描述中使用了类似 Teacher Forcing 的概念不熟悉 Teacher Forcing 的童鞋可以参考以下上一篇文章 Seq2Seq 模型详解。在 Decoder 的时候是需要根据之前的翻译求解当前最有可能的翻译如下图所示。首先根据输入 Begin 预测出第一个单词为 I然后根据输入 Begin I 预测下一个单词 have。Decoder 预测Decoder 可以在训练的过程中使用 Teacher Forcing 并且并行化训练即将正确的单词序列 (Begin I have a cat) 和对应输出 (I have a cat end) 传递到 Decoder。那么在预测第 i 个输出时就要将第 i1 之后的单词掩盖住注意 Mask 操作是在 Self-Attention 的 Softmax 之前使用的下面用 0 1 2 3 4 5 分别表示 Begin I have a cat end。第一步是 Decoder 的输入矩阵和Mask矩阵输入矩阵包含 Begin I have a cat (0, 1, 2, 3, 4) 五个单词的表示向量Mask是一个 5×5 的矩阵。在Mask可以发现单词 0 只能使用单词 0 的信息而单词 1 可以使用单词 0, 1 的信息即只能使用之前的信息。输入矩阵与 Mask 矩阵第二步接下来的操作和之前的 Self-Attention 一样通过输入矩阵X计算得到Q, K, V矩阵。然后计算Q和的乘积。Q乘以K的转置第三步在得到之后需要进行 Softmax计算 attention score我们在 Softmax 之前需要使用Mask矩阵遮挡住每一个单词之后的信息遮挡操作如下Softmax 之前 Mask得到Mask之后在Mask上进行 Softmax每一行的和都为 1。但是单词 0 在单词 1, 2, 3, 4 上的 attention score 都为 0。第四步使用Mask与矩阵V相乘得到输出Z则单词 1 的输出向量是只包含单词 1 信息的。第五步通过上述步骤就可以得到一个 Mask Self-Attention 的输出矩阵然后和 Encoder 类似通过 Multi-Head Attention 拼接多个输出然后计算得到第一个 Multi-Head Attention 的输出ZZ与输入X维度一样。5.2. 第二个 Multi-Head AttentionDecoder block 第二个 Multi-Head Attention 变化不大主要的区别在于其中 Self-Attention 的K, V矩阵不是使用上一个 Decoder block 的输出计算的而是使用Encoder 的编码信息矩阵 C计算的。根据 Encoder 的输出C计算得到K, V根据上一个 Decoder block 的输出Z计算Q如果是第一个 Decoder block 则使用输入矩阵X进行计算后续的计算方法与之前描述的一致。这样做的好处是在 Decoder 的时候每一位单词都可以利用到 Encoder 所有单词的信息这些信息无需Mask。5.3. Softmax 预测输出单词Decoder block 最后的部分是利用 Softmax 预测下一个单词在之前的网络层我们可以得到一个最终的输出 Z因为 Mask 的存在使得单词 0 的输出 Z0 只包含单词 0 的信息如下Decoder Softmax 之前的 ZSoftmax 根据输出矩阵的每一行预测下一个单词Decoder Softmax 预测这就是 Decoder block 的定义与 Encoder 一样Decoder 是由多个 Decoder block 组合而成。6. Transformer 总结Transformer 与 RNN 不同可以比较好地并行训练。Transformer 本身是不能利用单词的顺序信息的因此需要在输入中添加位置 Embedding否则 Transformer 就是一个词袋模型了。Transformer 的重点是 Self-Attention 结构其中用到的Q, K, V矩阵通过输出进行线性变换得到。Transformer 中 Multi-Head Attention 中有多个 Self-Attention可以捕获单词之间多种维度上的相关系数 attention score。参考文献Attention Is All You NeedTransformer 模型详解_空杯的境界的博客-CSDN博客_transformerTransformer模型详解图解最完整版 - 知乎3W字长文带你轻松入门视觉transformer - 知乎台大李宏毅21年机器学习课程 self-attention和transformer_哔哩哔哩_bilibiliThe Illustrated Transformer – Jay Alammar – Visualizing machine learning one concept at a time.