NLP学习笔记(十一)Transformer模型2(Transformer Model (2/2): From Shallow to Deep)

423 阅读8分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第4天,点击查看活动详情

Transformer模型2(Transformer Model (2/2): From Shallow to Deep)

这节课我们继续讲Transformer模型,上节课我们构造了Attention layer和Self-attention ayer。这节课我们用这些组件来搭建一个深度神经网络。

Multi-Head Attention(多头注意力机制)

首先我们拿上节课的Attention组建Multi-Head Attention。 在这里插入图片描述 上节课我们定义了Self-attention层,输入是一个序列x1,,xmx_1, \cdots, x_m。Self-attention层有三个参数矩阵,分别是WQ,WK,WVW_Q, W_K, W_V。输出是一个序列c1,,cmc_1, \cdots, c_m

在这里插入图片描述

这样的Self-attention层被称为Single-head Self-attention。单头Self-attention。

在这里插入图片描述

多头Self-attention是由ll个单头Self-attention组成的。它们各自有各自的参数,不共享参数。每个单头Self-attention有三个参数矩阵,所以多头Self-attention一共有3l3l个参数矩阵。

在这里插入图片描述

所有单头Self-attention都有相同的输入,都是序列x1,,xmx_1, \cdots, x_m。但是它们的参数矩阵各不相同。所以输出的cc序列也各不相同。把ll个单头序列的输出做Concatenation,堆叠起来。作为多头Self-attention的最终输出。如果每个单头的输出都是dmd*m的矩阵,那么多头的输出就是(ld)m(ld)*m的矩阵。

在这里插入图片描述

刚才我们用ll个单头Self-Attention构造多头Self-Attention,我们同样可以用ll个Attention构造多头AttentionAttention。所有单头Attention的输入都是两个序列。把它们的输出堆叠起来就是多头的输出。

Stacked Self-attention Layers(堆叠Self-attention层)

我们已经构造除了多头的Self-attention层和Attention层,接下来我们用这两种层来搭建一个深度神经网络。

首先用多头Self-attention和全连接层搭建一个Encoder网络。示意图如下:

在这里插入图片描述 在多头Self-attention层的后面连接一个全连接层,把向量c1c_1作为输入。全连接层把向量c1c_1乘到矩阵WUW_U上,然后再用ReLU或者其他激活函数得到向量u1u_1

在这里插入图片描述

把同一个全连接层用到c2c_2上,得到输出u2u_2,其计算方法完全与u1u_1一致。注意:两个全连接层是完全相同的,它们的参数矩阵都是WUW_U

在这里插入图片描述

以此类推,我们可以得到m个输出向量uu。这些全连接层都是完全一样的。有同一个参数矩阵WUW_U

刚才我们搭了两层,一个Self-attention,一个全连接层。输入是m个向量x1,,xmx_1, \cdots, x_m,输出也是m个向量u,,umu_, \cdots, u_muiu_i向量的值依赖于所有xx向量的值,而不仅仅与xix_i相关。

我们可以继续搭更多层。可以再搭建一个多头Self-attention层和全连接层。想搭多少层都可以,这样就可以搭建出一个深度神经网络。道理和多层RNN是一样的。

Transformer Encoder(Transformer的Encoder部分)

现在我们来搭建Transformer模型的Encoder网络。一个block有两层:一个多头Attention层和一个全连接层。输入是512m512*m的矩阵,输出也是512m512*m的矩阵。这里的m是输入序列x的长度,每个x向量都是512维的。 在这里插入图片描述 下图为Encoder网络的结构,输入是512m512*m的矩阵XXXX每一列都是512维的词向量。Block 1就是我们刚刚定义的block,它有两层:一个多头的Self-attention层和一个全连接层。输出也是一个512m512*m的矩阵。 在这里插入图片描述 输入和输出的大小一样,所以可以使用ResNet那种连接,把输入加到输出上。 在这里插入图片描述

然后搭第2个block,输出还是512m512*m的矩阵。

在这里插入图片描述

这样我们想搭多少个block都可以。Transformer的Encoder网络一共有6个Encoder。每个block有两层,每个block有自己的参数,它们之间不共享参数。 在这里插入图片描述

最终的输出还是512m512*m的矩阵,与输入的大小一致。

Stacked Attention Layers(堆叠Attention层)

刚才我们通过堆叠Self-attention层和全连接层搭建出了Encoder网络,Encoder网络有6个blocks。每个block有两层,现在我们进一步使用Attention层,从而搭建Transformer的Decoder网络。

在这里插入图片描述 Transformer是一个Seq2seq模型,它有一个Encoder和一个Decoder。输入是两个序列,如果我们想把英语翻译成德语,那么xx序列是英语的词向量,xx^{\prime}是德语的词向量。

在这里插入图片描述

刚才我们搭建好了Encoder网络,它有6个blocks,输入和输出都是512维的向量。输入序列有m个词向量x1,,xmx_1, \cdots, x_m。现在我们开始搭建Decoder网络的一个Block。

Block的第一层是个多头Self-attention,输入是x1,,xtx_1^{\prime}, \cdots, x_t^{\prime}。输出是序列c1,,ctc_1, \cdots, c_t,它们全都是512维的向量。

在这里插入图片描述

第二层是多头Attention。这一层的输入是两个序列。一个序列是u1,,umu_1, \cdots, u_m,它们是Encoder网络的输出。另一个序列是刚刚得到的c1,,ctc_1, \cdots, c_t。多头Attention的输出是z1,,ztz_1, \cdots, z_t,它们也都是512维的向量。 在这里插入图片描述

最后,再搭一个全连接层。输入是512维的向量z1z_1,输出是512维的向量s1s_1。全连接层都一样,都是把矩阵WSW_S和输入的向量zz相乘。然后用ReLU激活函数得到向量ss在这里插入图片描述

z2z_2作为输入,全连接层输出s2s_2

在这里插入图片描述

用同样的方法,把所有的zz向量映射到ss向量。

在这里插入图片描述

我们已经搭建了Decoder网络的一个Block,这个block有三层,分别是多头Self-attention层、多头Attention层以及全连接层。

在这里插入图片描述

输入的两个序列长度分别为m和t。如果把英语句子翻译成德语,m是输入英文句子的单词数,t是已经生成的德语句子的单词数。

在这里插入图片描述

这个block的输出长度为t,每个向量都是512维的。

Put Everything Together(全都放一块儿)

现在我们已经得到了Transformer的所有组件,我们把它们放到一块儿来搭建Transformer。 在这里插入图片描述

其中Encoder网络很简单,依次叠加6个Block就可以,每个Block有两层。Encoder的输入是矩阵XX,它有m列,每列都是512维词向量。输出是矩阵UU,大小与XX完全一样。

之前我们已经搭好了一个Decoder的block,它的输入是两个序列,输出是一个序列。如图为Decoder网络的最底层模块。

在这里插入图片描述

该模块左边输入序列是512m512*m的矩阵UU,也即是Encoder网络的输出。右边的输入序列是512t512*t的矩阵XX^{\prime}。这个模块输出512t512*t的矩阵,大小和右边的输入矩阵XX^{\prime}一样。 在这里插入图片描述

再来一个Block,左边的输入矩阵还是Encoder的输出UU。右边的输入是Decoder网络上一个模块的输出。第二个Block的输出还是512t512*t的矩阵。 在这里插入图片描述

一共搭了6个Block组成了Decoder网络。这里的每个Block有3层,分别是Self-attention层、Attention层和全连接层。每个Block有两个输入序列和一个输出序列。左边输入序列都是矩阵UU,即Encoder网络的输出。右边输入序列是前一个Block的输出。左边的Encoder网络和右边的Decoder网络组合起来就是Transformer模型。最终输出的序列是t个向量,每个向量都是512维的。

我们来回顾一下RNN的Seq2seq模型,它有两个输入序列,Encoder输入序列是x1,,xmx_1, \cdots, x_m,Decoder输入序列是x1,,xtx_1^{\prime}, \cdots, x_t^{\prime}。Transformer模型也有这两个输入序列。Decoder输出t个状态向量,s1,,sts_1, \cdots, s_t。Transformer也是这样。

在这里插入图片描述

可以看出,Transformer模型和RNN的Seq2seq模型输入大小和输出大小完全一样。所以,所有RNN的Seq2seq模型能做的,Transformer模型也都能做。

Summary(总结)

这节课我们从单头Attention和Self-attention入手,最终搭建出Transformer这样一个深度神经网络。现在来总结一下这节课的内容。 在这里插入图片描述

这节课我们构造了多头Self-attention,它们都单头Self-attention堆叠而来。每个Self-attention有各自的参数矩阵,都把矩阵XX作为输入。它们输出各自的CC矩阵,大小都是dmd*m,m是输入序列长度。然后把所有得到的CC做Concatenation就可以得到一个更高的矩阵,这个矩阵就是多头Self-attention的输出。

在这里插入图片描述

使用同样的方法可以把单头Attention变成多头Attention。Encoder网络就是用多头Self-attention和全连接层搭出来的。每个block有两层,分别是Self-attention层和全连接层。每个Block的输入和输出都是512m512*m的矩阵。Encoder网络一共用了6个 这样的Block,每个都有自己的参数,Block之间不共享参数。这些Block中还有向ResNet那样的Skip-connection的技巧,这里就不详细介绍了。

在这里插入图片描述 Decoder网络就是用多头Self-attention、多头Attention和全连接层搭出来的。每个block有三层,分别是Self-attention层、Attention层和全连接层。每个Block的输入是512m512*m的矩阵和512t512*t的矩阵,输出一个序列长度为t。Decoder网络一共用了6个 这样的Block,每个都有自己的参数,Block之间不共享参数。 在这里插入图片描述

最后,总结一下Transformer模型。Transformer模型是Seq2seq模型,有Encoder和Decoder网络,可以用于机器翻译。Transformer不是RNN,没有循环结构,其全部基于Attention和全连接层。Transformer的输入和输出大小与RNN都完全一样。Transformer的效果非常好。

在这里插入图片描述