• Attention机制学习记录(四)之Transformer


    前言

    注意力(Attention)机制[2]由Bengio团队与2014年提出并在近年广泛的应用在深度学习中的各个领域,例如在计算机视觉方向用于捕捉图像上的感受野,或者NLP中用于定位关键token或者特征。谷歌团队近期提出的用于生成词向量的BERT[3]算法在NLP的11项任务中取得了效果的大幅提升,堪称2018年深度学习领域最振奋人心的消息。而BERT算法的最重要的部分便是本文中提出的Transformer的概念。

    正如论文的题目所说的,**Transformer中抛弃了传统的CNN和RNN,整个网络结构完全是由Attention机制组成。更准确地讲,Transformer由且仅由self-Attenion和Feed Forward Neural Network组成。**一个基于Transformer的可训练的神经网络可以通过堆叠Transformer的形式进行搭建,作者的实验是通过搭建编码器和解码器各6层,总共12层的Encoder-Decoder,并在机器翻译中取得了BLEU值得新高。

    作者采用Attention机制的原因是考虑到RNN(或者LSTM,GRU等)的计算限制为是顺序的,也就是说RNN相关算法只能从左向右依次计算或者从右向左依次计算,这种机制带来了两个问题:

    时间片 的计算依赖 时刻的计算结果,这样限制了模型的并行能力;
    顺序计算的过程中信息会丢失,尽管LSTM等门机制的结构一定程度上缓解了长期依赖的问题,但是对于特别长期的依赖现象,LSTM依旧无能为力。
    Transformer的提出解决了上面两个问题,首先它使用了Attention机制,将序列中的任意两个位置之间的距离是缩小为一个常量;其次它不是类似RNN的顺序结构,因此具有更好的并行性,符合现有的GPU框架。论文中给出Transformer的定义是:

    Transformer is the first transduction model relying entirely on
    self-attention to compute representations of its input and output
    without using sequence aligned RNNs or convolution。

    遗憾的是,作者的论文比较难懂,尤其是Transformer的结构细节和实现方式并没有解释清楚。尤其是论文中的 , , 究竟代表什么意思作者并没有说明。通过查阅资料,发现了一篇非常优秀的讲解Transformer的技术博客。本文中的大量插图也会从该博客中截取。首先感谢Jay Alammer详细的讲解,其次推荐大家去阅读原汁原味的文章。

    1. Transformer 详解

    1.1 高层Transformer

    论文中的验证Transformer的实验室基于机器翻译的,下面我们就以机器翻译为例子详细剖析Transformer的结构,在机器翻译中,Transformer可概括为如图1:
    在这里插入图片描述
    如论文中所设置的,编码器由6个编码block组成,同样解码器是6个解码block组成。与所有的生成模型相同的是,编码器的输出会作为解码器的输入,如图3所示:
    在这里插入图片描述
    我们继续分析每个encoder的详细结构:在Transformer的encoder中,数据首先会经过一个叫做‘self-attention’的模块得到一个加权之后的特征向量 Z ,这个Z 便是论文公式1中的 Attention(Q,K,V):
    在这里插入图片描述
    得到 Z 之后,它会被送到encoder的下一个模块,即Feed Forward Neural Network。这个全连接有两层,第一层的激活函数是ReLU,第二层是一个线性激活函数,可以表示为:
    在这里插入图片描述
    Encoder的结构如图4所示:
    在这里插入图片描述
    Decoder的结构如图5所示,它和encoder的不同之处在于Decoder多了一个Encoder-Decoder Attention,两个Attention分别用于计算输入和输出的权值:

    Self-Attention:当前翻译和已经翻译的前文之间的关系;
    Encoder-Decnoder Attention:当前翻译和编码的特征向量之间的关系。

    在这里插入图片描述

    1.2 输入编码

    1.1节介绍的就是Transformer的主要框架,下面我们将介绍它的输入数据。如图6所示,首先通过Word2Vec等词嵌入方法将输入语料转化成特征向量,论文中使用的词嵌入的维度为 dmodel=512 。
    在这里插入图片描述
    在最底层的block中, X 将直接作为Transformer的输入,而在其他层中,输入则是上一个block的输出。为了画图更简单,我们使用更简单的例子来表示接下来的过程,如图7所示:
    在这里插入图片描述

    1.3 Self-Attention

    Self-Attention是Transformer最核心的内容,然而作者并没有详细讲解,下面我们来补充一下作者遗漏的地方。回想Bahdanau等人提出的用Attention[2],其核心内容是为输入向量的每个单词学习一个权重,例如在下面的例子中我们判断it代指的内容,

    The animal didn’t cross the street because it was too tired

    通过加权之后可以得到类似图8的加权情况,在讲解self-attention的时候我们也会使用图8类似的表示方式
    在这里插入图片描述
    在self-attention中,每个单词有3个不同的向量,它们分别是Query向量( Q),Key向量( K )和Value向量( V ),长度均是64。它们是通过3个不同的权值矩阵由嵌入向量 X 乘以三个不同的权值矩阵 WQ ,WK ,WV 得到,其中三个矩阵的尺寸也是相同的。均是 512*64 。
    注意是每个单词都有这三个向量

    即1512X51264=1*64

    那么Query,Key,Value是什么意思呢?它们在Attention的计算中扮演着什么角色呢?我们先看一下Attention的计算方法,整个过程可以分成7步:

    如上文,将输入单词转化成嵌入向量;
    根据嵌入向量得到 Q,K ,V 三个向量;
    为每个向量计算一个score:score=Q*K ;
    为了梯度的稳定,Transformer使用了score归一化,即除以 d   k   2 \sqrt[2]{d~k~} 2d k 
    对score施以softmax激活函数;
    softmax点乘Value值 ,得到加权的每个输入向量的评分v ;
    相加之后得到最终的输出结果 :Z= ∑ i = 0 n \sum_{i=0}^n i=0n v 。

    上面步骤的可以表示为该图的形式。
    在这里插入图片描述
    实际计算过程中是采用基于矩阵的计算方式,那么论文中的 Q ,K ,V 的计算方式如图11:注意 X, Q, K, V 的每一行都表示一个单词
    在这里插入图片描述
    总结为矩阵形式:
    在这里插入图片描述
    详细计算过程如下:
    公式中计算矩阵Q和K每一行向量的内积,为了防止内积过大,因此除以 dk 的平方根。Q乘以K的转置后,得到的矩阵行列数都为 n,n 为句子单词数,这个矩阵可以表示单词之间的 attention 强度。下图为Q乘以 KT ,1234 表示的是句子中的单词。
    对该式的解释:
    dk是Q,K矩阵的列数,即向量的维度,Q,K,V如何得到呢,在self-Attention有相关介绍
    在这里插入图片描述
    得到 QKT之后,使用 Softmax 计算每一个单词对于其他单词的 attention 系数,公式中的 Softmax 是对矩阵的每一行进行 Softmax,即每一行的和都变为 1.
    在这里插入图片描述
    得到 Softmax 矩阵之后可以和V相乘,得到最终的输出Z。
    在这里插入图片描述
    上图中 Softmax 矩阵的第 1 行表示单词 1 与其他所有单词的 attention 系数,最终单词 1 的输出 Zi 等于所有单词 i 的值 Vi 根据 attention 系数的比例加在一起得到,如下图所示:
    在这里插入图片描述

    在self-attention需要强调的最后一点是其采用了残差网络中的short-cut结构,目的当然是解决深度学习中的退化问题,得到的最终结果如下图。
    在这里插入图片描述
    Query,Key,Value的概念取自于信息检索系统,举个简单的搜索的例子来说。当你在某电商平台搜索某件商品(年轻女士冬季穿的红色薄款羽绒服)时,你在搜索引擎上输入的内容便是Query,然后搜索引擎根据Query为你匹配Key(例如商品的种类,颜色,描述等),然后根据Query和Key的相似度得到匹配的内容(Value)。

    self-attention中的Q,K,V也是起着类似的作用,在矩阵计算中,点积是计算两个矩阵相似度的方法之一,因此式1中使用了QKT 进行相似度的计算。接着便是根据相似度进行输出的匹配,这里使用了加权匹配的方式,而权值就是query与key的相似度。

    1.4 Multi-Head Attention

    而 Multi-Head Attention 是由多个 Self-Attention 组合形成的,下图是论文中 Multi-Head Attention 的结构图。
    在这里插入图片描述
    Multi-Head Attention相当于 h 个不同的self-attention的集成(ensemble),在这里我们以 h=8 举例说明。Multi-Head Attention的输出分成3步:
    将数据 X 分别输入到图13所示的8个self-attention中,得到8个加权后的特征矩阵 Zi { i=1,2…8 } 。
    将8个Zi 按列拼成一个大的特征矩阵;
    特征矩阵经过一层全连接后得到输出 Z 。
    在这里插入图片描述
    得到 8 个输出矩阵 Z1 到 Z8 之后,Multi-Head Attention 将它们拼接在一起 (Concat),然后传入一个Linear层,得到 Multi-Head Attention 最终的输出Z。
    在这里插入图片描述
    可以看到 Multi-Head Attention 输出的矩阵Z与其输入的矩阵X的维度是一样的。
    同self-attention一样,multi-head attention也加入了short-cut机制。

    1.5 Encoder-Decoder Attention

    在解码器中,Transformer block比编码器中多了个encoder-cecoder attention。在encoder-decoder attention中, Q 来自于解码器的上一个输出,K 和 V 则来自于与编码器的输出。其计算方式相同。

    由于在机器翻译中,解码过程是一个顺序操作的过程,也就是当解码第 K 个特征向量时,我们只能看到第 K-1 及其之前的解码结果,论文中把这种情况下的multi-head attention叫做masked multi-head attention。

    解码器解码之后,解码的特征向量经过一层激活函数为softmax的全连接层之后得到反映每个单词概率的输出向量。

    2.Encoder层详解

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

    2.1 Add & Norm

    Add & Norm 层由 Add 和 Norm 两部分组成,其计算公式如下:
    在这里插入图片描述
    其中 X表示 Multi-Head Attention 或者 Feed Forward 的输入,MultiHeadAttention(X) 和 FeedForward(X) 表示输出 (输出与输入 X 维度是一样的,所以可以相加)。

    Add指 X+MultiHeadAttention(X),是一种残差连接,通常用于解决多层网络训练的问题,可以让网络只关注当前差异的部分,在 ResNet 中经常用到:
    在这里插入图片描述
    Norm指 Layer Normalization,通常用于 RNN 结构,Layer Normalization 会将每一层神经元的输入都转成均值方差都一样的,这样可以加快收敛。

    2.2 Feed Forward

    Feed Forward 层比较简单,是一个两层的全连接层,第一层的激活函数为 Relu,第二层不使用激活函数,对应的公式如下。
    在这里插入图片描述
    X是输入,Feed Forward 最终得到的输出矩阵的维度与X一致。

    2.3 组成 Encoder

    通过上面描述的 Multi-Head Attention, Feed Forward, Add & Norm 就可以构造出一个 Encoder block,Encoder block 接收输入矩阵 Xn*d ,并输出一个矩阵On*d 。通过多个 Encoder block 叠加就可以组成 Encoder。

    第一个 Encoder block 的输入为句子单词的表示向量矩阵,后续 Encoder block 的输入是前一个 Encoder block 的输出,最后一个 Encoder block 输出的矩阵就是编码信息矩阵 C,这一矩阵后续会用到 Decoder 中。

    3.Decoder 结构

    在这里插入图片描述
    上图红色部分为 Transformer 的 Decoder block 结构,与 Encoder block 相似,但是存在一些区别:

    包含两个 Multi-Head Attention 层。
    第一个 Multi-Head Attention 层采用了 Masked 操作。
    第二个 Multi-Head Attention 层的K, V矩阵使用 Encoder 的编码信息矩阵C进行计算,而Q使用上一个 Decoder block 的输出计算。
    最后有一个 Softmax 层计算下一个翻译单词的概率。

    3.1 第一个 Multi-Head Attention

    Decoder block 的第一个 Multi-Head Attention 采用了 Masked 操作,因为在翻译的过程中是顺序翻译的,即翻译完第 i 个单词,才可以翻译第 i+1 个单词。通过 Masked 操作可以防止第 i 个单词知道 i+1 个单词之后的信息。下面以 “我有一只猫” 翻译成 “I have a cat” 为例,了解一下 Masked 操作。

    下面的描述中使用了类似 Teacher Forcing 的概念,不熟悉 Teacher Forcing 的童鞋可以参考以下上一篇文章Seq2Seq 模型详解。在 Decoder 的时候,是需要根据之前的翻译,求解当前最有可能的翻译,如下图所示。首先根据输入 “” 预测出第一个单词为 “I”,然后根据输入 “ I” 预测下一个单词 “have”。
    在这里插入图片描述
    Decoder 可以在训练的过程中使用 Teacher Forcing 并且并行化训练,即将正确的单词序列 ( I have a cat) 和对应输出 (I have a cat ) 传递到 Decoder。那么在预测第 i 个输出时,就要将第 i+1 之后的单词掩盖住,注意 Mask 操作是在 Self-Attention 的 Softmax 之前使用的,下面用 0 1 2 3 4 5 分别表示 “ I have a cat ”。

    第一步:是 Decoder 的输入矩阵和 Mask 矩阵,输入矩阵包含 “ I have a cat” (0, 1, 2, 3, 4) 五个单词的表示向量,Mask 是一个 5×5 的矩阵。在 Mask 可以发现单词 0 只能使用单词 0 的信息,而单词 1 可以使用单词 0, 1 的信息,即只能使用之前的信息。
    在这里插入图片描述
    第二步:接下来的操作和之前的 Self-Attention 一样,通过输入矩阵X计算得到Q,K,V矩阵。然后计算Q和 KT 的乘积 QKT
    在这里插入图片描述
    第三步:在得到 QKT 之后需要进行 Softmax,计算 attention score,我们在 Softmax 之前需要使用Mask矩阵遮挡住每一个单词之后的信息,遮挡操作如下:
    在这里插入图片描述
    得到 Mask QKT 之后在 Mask QKT 上进行 Softmax,每一行的和都为 1。但是单词 0 在单词 1, 2, 3, 4 上的 attention score 都为 0。

    第四步:使用 Mask QKT与矩阵 V相乘,得到输出 Z,则单词 1 的输出向量 Z1 是只包含单词 1 信息的。
    在这里插入图片描述
    第五步:通过上述步骤就可以得到一个 Mask Self-Attention 的输出矩阵Zi ,然后和 Encoder 类似,通过 Multi-Head Attention 拼接多个输出Zi 然后计算得到第一个 Multi-Head Attention 的输出Z,Z与输入X维度一样。

    3.2 第二个 Multi-Head Attention

    Decoder 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)。

    3.3 Softmax 预测输出单词

    Decoder block 最后的部分是利用 Softmax 预测下一个单词,在之前的网络层我们可以得到一个最终的输出 Z,因为 Mask 的存在,使得单词 0 的输出 Z0 只包含单词 0 的信息,如下:
    在这里插入图片描述
    Softmax 根据输出矩阵的每一行预测下一个单词:

    这就是 Decoder block 的定义,与 Encoder 一样,Decoder 是由多个 Decoder block 组合而成。

    4. Transformer 总结

    Transformer 与 RNN 不同,可以比较好地并行训练。
    Transformer 本身是不能利用单词的顺序信息的,因此需要在输入中添加位置 Embedding,否则 Transformer 就是一个词袋模型了。
    Transformer 的重点是 Self-Attention 结构,其中用到的 Q, K, V矩阵通过输出进行线性变换得到。
    Transformer 中 Multi-Head Attention 中有多个 Self-Attention,可以捕获单词之间多种维度上的相关系数 attention score。

  • 相关阅读:
    Spring boot 整合 JWT
    万字总结:分布式系统的38个知识点
    Python数据攻略-Pandas进行CSV和Excel文件读写
    PAT 1065 A+B and C (64bit)
    【Linux】指针常量和常量指针
    2023最新最热ChatGPT/GPT-4科研论文写作与项目开发及AI绘图实战
    刷爆 LeetCode 周赛 339,贪心 / 排序 / 拓扑排序 / 平衡二叉树
    PTA:7-4 顺序表(删除)
    Linux常用命令(Hadoop)
    5G网络助力智慧文旅发展:实现旅游资源的优化配置与高效利用
  • 原文地址:https://blog.csdn.net/pengxiang1998/article/details/127545787