MultiHead_SelfAttention
1、简介
之前构造了attention layer和Self-Attention layer, 本文通过基本组件搭建深度神经网络。
首先通过attention构建multi-head attention。之前定义的Self-Attention层, 输入是一个序列, x1到xm, Self-Attention有三个参数矩阵, Wq, Wk, Wv, 输出是一个序列, 这样的Self-Attention被称为single head。
Multi-Head Self-Attention是由多个单头Self-Attention组成。它们各自有各自的参数, 不共享参数。每个单头Self-Attention有三个参数矩阵, 所以Multi-Head Self-Attention有3l个参数矩阵, 这样就得到了多头注意力。所有单头Self-Attention都有相同的输入, 输入都是x序列, 但它们的参数矩阵各不相同, 所以输出的c序列也各不相同。
把l个单头Self-Attention输出的序列做concatination堆叠起来, 作为多头Self-Attention的输出,堆叠起来的c向量变得更高。如果每个单头的输出都是d×m的矩阵, 那么多头的输出就是(ld)×m的矩阵。
上面用l个单头Self-Attention构造出多头Self-Attention, 也可以用l个单头attention构造多头attention。所有单头attention的输入都是两个序列, x1到xm, 以及x’1到x‘m。每个单头attention都有各自的参数矩阵, 它们不共享参数, 每个单头都有自己的输出序列c1到ct, 把单头输出的c堆叠起来就是多头的输出。
2、网络搭建
2.1 stacked Self-Attention layer
已经构造出多头Self-Attention与多头attention, 接下来用这两种层搭建一个深度神经网络。首先用多头Self-Attention与全连接层搭建一个encoder网络。
下面是刚才定义的多头Self-Attention层, 输入是序列x1到xm, 输出是序列c1到cm。
然后再搭建一个全连接层, 把向量c1作为输入, 全连接层把c1乘到参数矩阵Wu上, 然后再用Relu或其他激活函数得到输出向量u1。
把同一个全连接层用到c2上, 同样的操作得到输出u2。注意两个全连接才能够是完全相同的, 它们的参数矩阵都是Wu。
依次类推一直输出Um, 得到m个输出向量u, 这些全连接层都是一样的, 有同一个参数矩Wu。
上面搭建了两层, 一个多头Self-Attention, 一个全连接层。输入是m个向量x1到xm。输出也是m个向量u1到um。ui向量在xi向量之上, 但它不仅仅依赖于xi, ui依赖于所有的m个向量。改变任何一个x向量, ui都会发生变化, 当然对ui影响最大的还是xi。
可以继续搭建更多层。再搭一个多头Self-Attention层和一个全连接层。想搭多少层都可以, 这样就可以搭建出一个深度神经网络, 道理跟多层RNN是一样的。
3、transformer encoder网络
现在来搭建transformer模型的encoder网络。 一个block有两层, 一个多头Self-Attention层, 一个全连接层。输入是512×m的矩阵, 输出也是512×m的矩阵。这里的m是输入序列x的长度, 每个x向量都是512维的。
这是encoder网络的结构, 输入是512×m的矩阵x, x的每一列都是512维的词向量。下面是刚刚定义的block, 它有两层, 一个Self-Attention层, 一个全连接层。输出也是512×m的矩阵。输入和输出的大小一样, 所以可以用resnet中的捷径分支进行连接, 把输入加到输出上。
然后搭第二个block, 输出还是512乘以m的矩阵, 想搭多少个block都可以。
transformer的encoder网络一共搭了6个blocks, 每个block有两层, 每个block都有自己的参数。block之间不共享参数, 最终输出是512乘以m的矩阵。输出与输入的大小是一样的。
通过堆叠多个Self-Attention与全连接层搭建出encoder网络, encoder网络有6个block, 每个block有两层。现在进一步用attention层, transformer的decoder网络。
4、transformer decoder网络
transformer是一个seq2seq模型, 它有一个encoder和一个decoder。输入是两个序列, 如果要把英语翻译成德语, 那么x的序列就是英语的词向量, x’是德语的词向量。
上面搭建的encoder网络, 它有6个block, 每个block有两层, 包含一个Multi-Head Self-Attention层与一个全连接层。encoder的输入和输出都是512维的向量, 输入序列有m个词向量, x1到xm。输出序列也有m个词向量, u1到um。
现在开始搭建decoder网络的一个block。block的第一层是一个多头Self-Attention层, 输入是序列x1‘到xt’, 输出是序列c1到ct, 它们全都是512维的向量。
第二层是多头的attention层, 第一层的输入是两个序列。一个序列是u1到um。 他们是encoder网络的输出。另外一个序列是刚刚得到的c1到ct, 多头attention的输出是z1到zt, 它们也都是512维的向量。
最后再搭建一个全连接层, 输入是512维的向量z1, 输出是512维的向量s1。全连接层都一样, 都是把参数矩阵Ws与输入的z向量相乘, 然后用relu激活函数, 得到向量s1。
同理再把z2作为输入, 得到全连接层的输出s2。
依次类推, 把所有的z向量映射到s向量。
上面是搭建的decoder网络的一个block。 可以发现decoder的一个block包含三层, 分别是Self-Attention层, attention层以及全连接层。
再重复一遍, decode的一个block中包含三层, 分别是Self-Attention层, attention层以及全连接层。这三层组成decoder的一个block。这个block需要两个输入序列, 两个序列都是512维的向量, 两个序列的长度分别是m个t。如果把英语翻译成德语, 那么m是英语句子的长度, t是德语句子的长度。这个block输出序列的长度是t,每个向量都是512维的。
5、搭建transformer
将上面的所有模块拼接起来得到最终的transformer模型。
首先是encoder网络。 encoder网络很简单, 依次叠加6个block, 每个block有两层(Self-Attention层+dense层)。 encoder网络的输入是矩阵x, 它有m列, 每列是512维的词向量。输出是矩阵u, 它跟输入矩阵x的大小完全一样。
之前已经搭建了decoder网络的一个block, 它的输入是两个序列, 输出是一个序列。block1是decoder网络的最底层模块, 左边输入序列是512×m的矩阵U, 也是encoder网络的输出。右边输入序列是512xt的矩阵x’。这个模块输出512×t的矩阵, 大小跟右边的输入x‘一样。
再堆叠decode中的一个block。
依次类推, 一共堆叠了6个block。 组成了decoder网络。每个网络有三层, 分别是Self-Attention层, attention层以及全连接层。每个block有两个输入序列和一个输出序列。
左边的encoder网络和右边的decoder网络组合起来就是transformer模型。最终输出的序列是t个向量, 每个向量都是512维的。
现在回顾一下RNN seq2seq模型。它有两个输入序列, encoder输入是x1到xm。 decoder输出是x1’到xt’。transformer模型也有两个输入序列, 输出也是t个向量。可以看出RNN seq2seq与transformer模型, 二者输入大小完全一样, 输出大小也完全一样。
所有RNN seq2seq模型能做的, transformer模型也能做。
以英语德语翻译为例。
输入是一系列单词,经过embedding层映射之后得到x1到xm向量, m个向量经过6个block堆叠而成的Encoder网络之后输出m个向量, u1、u2到um。
将encoder的输出向量u作为decoder网络的输入。
encoder的输出u加上新的输入x‘1经过6个block堆叠而成的decoder之后得到输出y1。
通过随机采样得到第一个德语单词, 并将其作为decoder网络的输入序列x2’
依次类推完成整个句子的翻译。
6、single head 到Multi-Head
利用上述单头Self-Attention搭建多头Self-Attention。方法很简单, 就是用多个单头Self-Attention, 它们各自有各自的参数, 都把矩阵x作为输入, 分别输出各自的c矩阵。每个c矩阵的大小都是d×m, m是输入序列的长度。
把所有得到的c矩阵做concatination得到更高的矩阵, 这个矩阵就是多头Self-Attention的输出。同样的方法也可以得到多头的attention的输出。
encoder就是用多头Self-Attention和全连接层搭建的, 每个block有两层, 分别是多头Self-Attention层和全连接层。
decoder有三层, 分别是多头Self-Attention层, 多头attention层以及全连接层。
transformer是seq2seq模型, 它有encoder网络和decoder网络, 可以用来做机器翻译。
transformer没有RNN, 不是循环结构。transformer完全基于attention和全连接层。transformer与RNN的输入输出大小完全都一样,transformer在nlp上的效果非常好, 所以transformer已经是业界的标准。