一起养成写作习惯!这是我参与「掘金日新计划 · 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层,输入是一个序列。Self-attention层有三个参数矩阵,分别是。输出是一个序列。
这样的Self-attention层被称为Single-head Self-attention。单头Self-attention。
多头Self-attention是由个单头Self-attention组成的。它们各自有各自的参数,不共享参数。每个单头Self-attention有三个参数矩阵,所以多头Self-attention一共有个参数矩阵。
所有单头Self-attention都有相同的输入,都是序列。但是它们的参数矩阵各不相同。所以输出的序列也各不相同。把个单头序列的输出做Concatenation,堆叠起来。作为多头Self-attention的最终输出。如果每个单头的输出都是的矩阵,那么多头的输出就是的矩阵。
刚才我们用个单头Self-Attention构造多头Self-Attention,我们同样可以用个Attention构造多头。所有单头Attention的输入都是两个序列。把它们的输出堆叠起来就是多头的输出。
Stacked Self-attention Layers(堆叠Self-attention层)
我们已经构造除了多头的Self-attention层和Attention层,接下来我们用这两种层来搭建一个深度神经网络。
首先用多头Self-attention和全连接层搭建一个Encoder网络。示意图如下:
在多头Self-attention层的后面连接一个全连接层,把向量作为输入。全连接层把向量乘到矩阵上,然后再用ReLU或者其他激活函数得到向量。
把同一个全连接层用到上,得到输出,其计算方法完全与一致。注意:两个全连接层是完全相同的,它们的参数矩阵都是。
以此类推,我们可以得到m个输出向量。这些全连接层都是完全一样的。有同一个参数矩阵。
刚才我们搭了两层,一个Self-attention,一个全连接层。输入是m个向量,输出也是m个向量。向量的值依赖于所有向量的值,而不仅仅与相关。
我们可以继续搭更多层。可以再搭建一个多头Self-attention层和全连接层。想搭多少层都可以,这样就可以搭建出一个深度神经网络。道理和多层RNN是一样的。
Transformer Encoder(Transformer的Encoder部分)
现在我们来搭建Transformer模型的Encoder网络。一个block有两层:一个多头Attention层和一个全连接层。输入是的矩阵,输出也是的矩阵。这里的m是输入序列x的长度,每个x向量都是512维的。
下图为Encoder网络的结构,输入是的矩阵,每一列都是512维的词向量。Block 1就是我们刚刚定义的block,它有两层:一个多头的Self-attention层和一个全连接层。输出也是一个的矩阵。
输入和输出的大小一样,所以可以使用ResNet那种连接,把输入加到输出上。
然后搭第2个block,输出还是的矩阵。
这样我们想搭多少个block都可以。Transformer的Encoder网络一共有6个Encoder。每个block有两层,每个block有自己的参数,它们之间不共享参数。
最终的输出还是的矩阵,与输入的大小一致。
Stacked Attention Layers(堆叠Attention层)
刚才我们通过堆叠Self-attention层和全连接层搭建出了Encoder网络,Encoder网络有6个blocks。每个block有两层,现在我们进一步使用Attention层,从而搭建Transformer的Decoder网络。
Transformer是一个Seq2seq模型,它有一个Encoder和一个Decoder。输入是两个序列,如果我们想把英语翻译成德语,那么序列是英语的词向量,是德语的词向量。
刚才我们搭建好了Encoder网络,它有6个blocks,输入和输出都是512维的向量。输入序列有m个词向量。现在我们开始搭建Decoder网络的一个Block。
Block的第一层是个多头Self-attention,输入是。输出是序列,它们全都是512维的向量。
第二层是多头Attention。这一层的输入是两个序列。一个序列是,它们是Encoder网络的输出。另一个序列是刚刚得到的。多头Attention的输出是,它们也都是512维的向量。
最后,再搭一个全连接层。输入是512维的向量,输出是512维的向量。全连接层都一样,都是把矩阵和输入的向量相乘。然后用ReLU激活函数得到向量。
把作为输入,全连接层输出。
用同样的方法,把所有的向量映射到向量。
我们已经搭建了Decoder网络的一个Block,这个block有三层,分别是多头Self-attention层、多头Attention层以及全连接层。
输入的两个序列长度分别为m和t。如果把英语句子翻译成德语,m是输入英文句子的单词数,t是已经生成的德语句子的单词数。
这个block的输出长度为t,每个向量都是512维的。
Put Everything Together(全都放一块儿)
现在我们已经得到了Transformer的所有组件,我们把它们放到一块儿来搭建Transformer。
其中Encoder网络很简单,依次叠加6个Block就可以,每个Block有两层。Encoder的输入是矩阵,它有m列,每列都是512维词向量。输出是矩阵,大小与完全一样。
之前我们已经搭好了一个Decoder的block,它的输入是两个序列,输出是一个序列。如图为Decoder网络的最底层模块。
该模块左边输入序列是的矩阵,也即是Encoder网络的输出。右边的输入序列是的矩阵。这个模块输出的矩阵,大小和右边的输入矩阵一样。
再来一个Block,左边的输入矩阵还是Encoder的输出。右边的输入是Decoder网络上一个模块的输出。第二个Block的输出还是的矩阵。
一共搭了6个Block组成了Decoder网络。这里的每个Block有3层,分别是Self-attention层、Attention层和全连接层。每个Block有两个输入序列和一个输出序列。左边输入序列都是矩阵,即Encoder网络的输出。右边输入序列是前一个Block的输出。左边的Encoder网络和右边的Decoder网络组合起来就是Transformer模型。最终输出的序列是t个向量,每个向量都是512维的。
我们来回顾一下RNN的Seq2seq模型,它有两个输入序列,Encoder输入序列是,Decoder输入序列是。Transformer模型也有这两个输入序列。Decoder输出t个状态向量,。Transformer也是这样。
可以看出,Transformer模型和RNN的Seq2seq模型输入大小和输出大小完全一样。所以,所有RNN的Seq2seq模型能做的,Transformer模型也都能做。
Summary(总结)
这节课我们从单头Attention和Self-attention入手,最终搭建出Transformer这样一个深度神经网络。现在来总结一下这节课的内容。
这节课我们构造了多头Self-attention,它们都单头Self-attention堆叠而来。每个Self-attention有各自的参数矩阵,都把矩阵作为输入。它们输出各自的矩阵,大小都是,m是输入序列长度。然后把所有得到的做Concatenation就可以得到一个更高的矩阵,这个矩阵就是多头Self-attention的输出。
使用同样的方法可以把单头Attention变成多头Attention。Encoder网络就是用多头Self-attention和全连接层搭出来的。每个block有两层,分别是Self-attention层和全连接层。每个Block的输入和输出都是的矩阵。Encoder网络一共用了6个 这样的Block,每个都有自己的参数,Block之间不共享参数。这些Block中还有向ResNet那样的Skip-connection的技巧,这里就不详细介绍了。
Decoder网络就是用多头Self-attention、多头Attention和全连接层搭出来的。每个block有三层,分别是Self-attention层、Attention层和全连接层。每个Block的输入是的矩阵和的矩阵,输出一个序列长度为t。Decoder网络一共用了6个 这样的Block,每个都有自己的参数,Block之间不共享参数。
最后,总结一下Transformer模型。Transformer模型是Seq2seq模型,有Encoder和Decoder网络,可以用于机器翻译。Transformer不是RNN,没有循环结构,其全部基于Attention和全连接层。Transformer的输入和输出大小与RNN都完全一样。Transformer的效果非常好。