Transformer模型

Transformer模型

1.Transformer整体架构

        Transformer抛弃了传统的RNN和CNN,首先它使用了Attention机制,将序列中的任意两个位置之间的距离是缩小为一个常量;其次它不是类似RNN的顺序结构,因此具有更好的并行性,符合现有的GPU框架,有效的解决了NLP中棘手的长期依赖问题 。

        Transformer是一个encoder-decoder的结构,由若干个编码器和解码器堆叠形成。如上图的左侧部分为编码器,由Multi-Head Attention和一个全连接组成,用于将输入语料转化成特征向量。右侧部分是解码器,其输入为编码器的输出以及已经预测的结果,由Masked Multi-Head Attention, Multi-Head Attention以及一个全连接组成,用于输出最后结果的条件概率 。

        由框图可以看出,有三个输入Q、K、V,假设我们输入了n个word,首先对每个word做embedding,然后对这n个embedding进行self-attention,所以Q这个矩阵装的是所有的word的embedding,而K和V装的是用来描述这些word的embedding的矩阵,其中K与Q的维度要保持一致,且V的维度要与K、Q经过attention后输出的维度保持一致,K、V的长度必须一致。

        在Q、K、V中,Q代表着query,是个M个维度为d的向量(可以理解为M长度的sequence的向量),代表需要被表达的序列,K代表着key,是个N个维度为d的向量(可以理解为N长度的sequence向量),与V一起用来表达Q的序列,公式如下:

        这里与传统RNN的区别在encoder中就可以明显体现出来了,RNN需要对每一个时刻都产生输入与输出,而transformer只需要将所有序列全部输入,就可以进行attention计算了。

        其中一些词汇的解释:

  • 长期依赖: 长期依赖是指当前系统的状态,可能受很长时间之前系统状态的影响,是RNN中无法解决的一个问题。

  • Embedding这是一种从文本语料库构建低维向量表示的方法,该方法可以保留单词的上下文相似性。

  • token令牌,即标记的意思。

  • context背景

  • target目标

  • multi-head attention多头注意

  • mask保证训练与推理的一致性

2.对Transformer框架中模块的理解

2.1 Input(输入)

  • 在该模型中,每时每刻的输入都是input embedding + positional encoding,即所带有的信息加上其位置编码,其中embedding就是用来取代传统RNN(如seq2seq)中的hidden states。

  • 由于transformer模型属于自回归模型,因此它的下一个输出需要基于上一个输出进行推断,即主框架中的outputs(shifted right)

  • position encoding是位置编码,是不可以缺失的一部分,它可以将attention计算方式无法捕捉的位置信息变成embedding形式,直接叠加到变换为embedding形式后的input中。

  • encoder(编码器)会接收到一个list(每个元素都是512维的词向量)

  • 这里介绍Transformer的一个关键特性,每个位置的词仅仅流过它自己的编码器路径。在self-attention层中,这些路径两两之间是相互依赖的。前向网络层(FFN)则没有这些依赖性,但这些路径在流经前向网络时可以并行执行。

  • 因为在解码的时候,仅知道当前词左边的部分。由此,利用masking(当前词右侧的内容被设置为−∞,这样softmax的值为0)屏蔽了当前词右边部分的影响,保持了自回归的特性。

2.2 Multi-head Attention(多头注意)

        multi-head attention由多个scaled dot-product attention这样的基础单元经过堆叠而成,multi-head attention把query和key映射到高维空间的不同子空间中去计算相似度,且多头注意的输入都是query Q、key K 、value V 三个元素,只是 Q、K、V 的取值不同。

        为了更好的理解multi-head attention,我们分成两步走:

  1. scaled dot-product attention(缩放的点乘注意力)介绍:

        首先,attention也叫self-attention,顾名思义,就是自己和自己做attention操作,即得到所有时刻的数据后,可以用其中每一时刻数据与所有数据中任意一时刻数据进行计算attention(相似程度)。

        其次,如框图所示,可以分成6步来看:

1)将编码器与文本输入生成输入向量,然后将其生成三个向量,生成方法是将输入向量分别乘以三个权重矩阵,这些矩阵是可以在训练过程学习的,而且所有的输入向量都共享这三个权重矩阵。

2)计算attention,即计算一个分值,将对应的Q、K依次进行点积获得每个位置的分值。

3)保持训练与推理的数据一致性。

4)对计算出来的分值进行softmax操作,归一化分值使得全为正数且它们的和为1。

5)将softmax分值与V的向量按位相乘,保留关注词的value值,削弱非相关词的value值。

6)将所有加权向量加起来,产生该位置的self-attention的输出结果。

  1. multi-head attention(多头注意)介绍:

        如上图所示,这就是scaled dot-product attention的堆叠(stacking),先把我们上面讲过的Q、K、V进行线性变换变成Q'、K'、V',然后进行attention计算,重复这样的操作h次,然后将这h次的结果进行concat(合并),最后总的做一次线性变换,输出的就是多头注意这个模块的输出了。

        而在主框架中右半部分的多头注意中,与其他两个多头注意有些差异,它是一个cross_attention,它的Q是由目标端序列而来,K、V是由源端序列来的。

2.3 ADD&Normalization(残差连接与添加规范化)

        在主框架中每一个模块后面,都有一个残差连接和规范化层,它是一个通用的技术,它的本质是可以有效的改善深层模型中梯度消失的问题,且能打破网络对称性,改善网络退化问题,加速收敛,规范化优化空间。

2.4 Feed Forward Network(FFN,前馈神经网络)

        每一层经过attention之后,还会有一个FFN,这个FFN的作用就是空间变换。FFN包含了2层linear transformation(线性变换)层,中间的激活函数是ReLu 。

3.Transformer的缺点

  1. 缺少recurrent inductive bias: 学习算法中Inductive Bias可以用来预测从未遇到的输入的输出 , 对于很多序列建模任务(如需要对输入的层次结构进行建模时,或者在训练和推理期间输入长度的分布不同时),Recurrent Inductive Bias至关重要。

  2. 不能很好的处理超长输入: 理论上来说,attention可以关联两个任意远距离的词,但实际中,由于计算资源有限,仍然会限制输入序列的长度,超过这个长度的序列会被截断。

  3. transformer是非图灵完备的:就是说不能解决所有问题, 它的输入是一个需要对每个输入元素进行顺序处理的函数,在这种情况下,对于任意给定的深度T的transformer,都可以构造一个长度为N>T的embedding。

  4. transformer缺少conditional computation(条件计算): transformer在encoder的过程中,所有输入元素都有相同的计算量,比如对于“I arrived at the bank after crossing the river", 和"river"相比,需要更多的背景知识来推断单词"bank"的含义,然而transformer在编码这个句子的时候,无条件对于每个单词应用相同的计算量,这样的过程显然是低效的。

原文地址:https://www.cnblogs.com/minyuan/p/13299192.html