目录

一、transformer的应用背景

二、transformer的结构

2.1 encode中的多头注意力Multi-Head Attention

2.2 transformer编码器

2.3 transformer解码器


之前介绍了RNN的模型结构,有兴趣的同志们可以往回翻翻看看,RNN(Recurrent Neural Networks)循环神经网络-CSDN博客。RNN在训练时,输入的序列只能顺序串行输入,无法并行处理,同时注意力范围有限,当序列较长时,容易遗忘之前的输入序列是什么。

因此为了解决单词间长距离依赖和并行计算的问题,Vaswani等人提出transformer的模型架构。

Vaswani A, Shazeer N, Parmar N, et al. Attention is all you need[J]. Advances in neural information processing systems, 2017, 30.

一、transformer的应用背景

1、序列到序列的学习,即Seq2Seq,指的是自然语言任务的输入是一段序列,输出也是一段序列,输入序列和输出序列的长度不一定是相等的。例如以下2个场景的应用场景:

(1)机器翻译,输入为源语言句子,输出为目标语言句子。

(2)文本摘要,输入为原始文档,输出位摘要内容。

2、Encoder-Decoder结构,序列到序列的任务常用的架构,神经网络均可理解为是一个黑箱模型,Transformer的黑箱主要由两部分组成:EncodersDecoders。以文本翻译任务为例,输入文本会先经过Encoders模块(编码器),该模块对文本数据进行编码;编码后的文本数据再被传入Decoders模块(解码器),该模块对文本数据进行解码得到最终的翻译结果。

二、transformer的结构

transformer里最重要的部分即为自注意力机制,此机制主要由多头注意力和掩码多头注意力两部分组成,下面我们将详细进行介绍。

2.1 encode中的多头注意力Multi-Head Attention

在多头注意力机制中,用到了一种叫做缩放点积注意力的计算方式,

1、计算查询向量q,键向量k和值向量v

根据每个单词的向量表示(x1,x2,x3,...xn),通过线性变换,计算对应的查询向量q、键向量k和值向量v,Wq、Wk、Wv为三个对应的权重矩阵,计算公式如下:

例如对于这样一段话:篮球 应该 怎么 打,我们分别对每个词进行词嵌入后得到x1、x2、x3、x4,每个词的向量分别乘以权重矩阵,得到q1、k1、v1~q4、k4、v4

2、多头分解

将查询向量q、键向量k和值向量v分解为多个向量(这个就称为多头),如下所示,以分解为2个为例:

 在transformer中,分解成几个头是可以自己选择的,在应用中一般输入向量为768维,分解成12个头,每个头64维。

3、缩放点积注意力

(1)对每个头,分别计算注意力权重,计算公式如下:

分母即为缩放,其中^{d_{k}}为q和k的纬度,例如每个q为64维,那么分母就位\sqrt{64}

例如对于“打”字中的其中一个头的q值,让其分别乘上篮球、应该、怎么和自己的k值,得到值b

(2)利用softmax对b值进行归一化,得到注意权重a,这一步的目的意味中重要的信息通过softmax函数隐射到了a值上。

(3)归一化后的值乘以自身的v值,然后聚合上下文信息,得到最终打字的隐层输出值c。这个c值,就能包含得到上下文的信息了

(4)拼接不同头的计算结果。上述的例子中,只是计算一个头中,“打”字如何结合上下文的信息得到隐层输出,由于transformer中,存在多个头,因此需要对多个头的结果进行聚合,得到最终的结果。拼接完成后,再做一个线性变化,最终得到隐层的输出h

 最终结果就是如下了,其中h4是包含了x1、x2、x3、x4的输入信息的,说明transformer是能够很好的联系上下文的。

4、多头注意力机制的优势

(1)解决长距离上下文联系的问题。

(2)能够实现并行计算。比如编码“篮球”、“应该”、“怎么”、“打”时,完全互不影响,所以可以并行。

(3)多头注意力机制能够在不同子空间的表示上实现信息聚合,比如“playing”这个词,在句法空间上,是依赖上文“good at”的,他决定了词态是进行时“ing”;使用play,又由basketball决定的,因为打篮球使用“play”而不是“do”或者“make”。

(4)给定一个单词分别计算q、k、v,这样就能在计算一个词的时候其最终的b值是跟上下文强相关的,比如b(篮球,打)和b(打,篮球),这两个值不应该一样,这样输入的句子中的字得到的值就不会是静态的(相比于word2vector这种静态embedding而言)。

2.2 transformer编码器

1、输入增加位置向量

在输入端增加位置向量的目的,一是因为句子中的单词位置,对句子的语义是有很大影响的,比如“我比你高”和“你比我高”,这两句话是完全不一样的结果。二是因为自注意力机制中,没有包含句子顺序的任何信息。

因此,在词输入到多头自注意力层前,我们添加一个位置信息进去,例如对于n个单词的词向量(x1,x2,x3,...xn),添加对应的位置向量(p1,p2,p3,...pn),得到如下结果

 

 位置向量如何确定呢,主要是有两种:

(1)将位置向量看做参数,随机初始化,根据训练数据进行优化;

(2)按照一定规则,在训练过程中是固定不变的。这是实际应用中常见的一种方式,如下:

2、transformer编码器 

一个transformer编码器encode由一个多头自注意力子层、两个残差连接和层归一化子层和一个前馈网络子层组成。结构如下

(1)多头自注意力子层,已经在2.1中进行了介绍,在encode中的编码器中,自注意力的计算是同时计算左右两端的上下文的,而在decode编码器中,自注意力计算是只关注左边的词的(后面会介绍为什么)。

(2)残差连接和层归一化

残差链接是深度学习网络中一个场景的做法,其目的是将误差信号不经过中间权重矩阵变化直接传播到底层,缓解梯度消失问题。

其做法是见输入的x和经过网络变换的f(x)直接进行相加,作为该层的输出。

层归一化是为了是每层输入和输出数据的分布相对稳定,加速学习速度。

(3)前馈网络子层

他是由两层的前馈网络组成的,第一层使用Relu对结果进行非线性变换,第二层使用线性变化输出结果。计算公式如下:

2.3 transformer解码器

transformer解码器相比编码器,多了一个编码解码注意力子层,主要组成如下:

(1)1个掩码多头自注意力子层。

(2) 3个残差连接和层归一化。

(3)1个编码解码注意力子层。

(4)1个前馈网络层。

1、掩码多头自注意力子层

相比于encode里的多头注意力子层,在decode里的掩码多头自注意力子层有如下不同:

(1)对于一个目标单词,只和前面出现过的单词计算q、k、v的值,而把后面的单词掩盖掉。其目的为了保证模型在训练和测试阶段保持一致。

2、编码-解码注意力子层

对于某一个目标单词而言,只与原端单词的隐层状态计算注意力,为了能够在解码过程中利用到源语言的信息,其做法是在注意力计算中,q只与目标单词的隐层状态进行计算,而k和v来自源端隐层状态。(目标单词为因为,源端单词为中文,做的是中文翻译英文)。

如图红框所示:

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐