详解 一文看懂Transformer( 三 )


的作用是:通过线性变换,先将数据映射到高纬度的空间再映射到低纬度的空间,提取了更深层次的特征 。
完了之后再经过一个Add&Norm,得到一个[3,64]的大小
至此部分就结束了

详解  一文看懂Transformer

文章插图
将输出再作为输入,将此部分重复N次 。
input
翻译是一个的任务,输入三个单词我们并不知道要翻译出来几个单词,这些是不确定的 。
所以我们需要让网络知道在哪里结束,所以我们翻译我爱你的时候
的输入是我爱你
的输入是 I love you
的输出是I love you
首先说的输入,有两种输入,一种是训练时候的输入,一种是预测时候的输入 。
这边的输入,同样的经过位置编码,相加之后,输入进去 。
同样的的输入也不是等长的,所以我们部分也需要一个 mask 。
接下来才是核心的部分 。
Multi-Head
首先是一个 Multi-Head
可以看到,这里和里面的自注意力不一样,加了个mask,为什么加了个mask呢 。
我们首先来看下,部分输入句子我爱你,经过编码送入自注意力中,如下图所示
Q和K的转置相乘就是注意力分数,然后会做一个 。在做之前,要注意,最后这个[4,4]的矩阵,第一行代表的就是第一个词语与整个句子四个词语分别计算得到的相关性 。第二行同理 。
但是有一个问题,我们现在是在训练,我们自然掌握了 Truth,但是我们实际预测的时候,没有标准答案,实际的预测是我们把输入进去,然后网络预测出I,然后将 I当作输入,再过一遍,以此类推,最终翻译出整个句子 。那我们训练的时候怎么做到这一点呢?
这就是用到 mask了,在之前,用一个掩码矩阵,右上角全部是一个负的极大值,左下角为0,与注意力分数的矩阵相加,就可以保留下来左下角的数据了 。经过,右上角的数据都会被处理为0 。
这个操作的意义就在于,经过这个操作,第一行,只能看到它跟自己的注意力分数(相关度),而第二行我字,可以看到他与和我的注意力分数,同理,第三行能看到前三个的,每一个单词都只能考虑他以及他之前的单词 。这是符合预测的,因为第一个单词进来的时候,是不应该看到之后的单词的,实际中我们做预测的时候也确实是这么做的 。所以训练的时候使用多头自注意力 。
将这个mask后的注意力分数,经过,在与V相乘,就得到自注意力的输出Z,这个Z的第一行Z1只包含第一个单词的信息,第二行只包含前两个单词的信息,以此类推 。多个头,就得到了多个Z 。
多头的结果cat起来,经过一个线性层,改变尺寸,使尺寸与出入同样大小 。
然后经过Add&Norm,这就和那里一样 。这样,解码器的第一部分就完成了 。
解码器的第二部分,没有什么新的东西,主要就是,将编码器的输出,计算得到Q和K,然后将解码器第一部分的输出,计算得到V,拿这个Q,K,V去参与自注意力运算,最后再过一个Add&Norm,然后再过一个Feed ,再过一个Add&Norm 。就结束,这就是整个的内容 。将这部分也重复N次 。
编码器和解码器都会重复N次,但是解码器中使用的编码器的结果,都是最后一次编码器给出的 。他们的关系是这样的
test时的
上面说的是训练时候的,实际测试的时候,比如我们输入我爱你,让网络翻译 。
实际的流程是我爱你被输入到中,最顶层的输出一个结果,然后中输入,经过输出I,然后再将和I一同输入,用结果的最后一个维度来预测love
预测
完了之后,就是最后一部分,预测单词