【无标题】

6.1 测试时
在NLP任务中,通常在Encoder中输入待翻译的句子,若句子中有3个词且翻译后为3个词(如"我""是""谁"——>"who""am""I"),则Encoder输入(先不考虑Padding Mask)的大小为(3, 512)。
而Decoder的输入输出相对不太一样。在Decoder的Multi-Head Attention层中,K和V均是Encoder的输出Memory经过线性变换后的结果(此时的Memory中包含了原始输入序列每个位置的编码信息),而Q是Decoder的Masked Multi-Head Attention层输出的隐含向量经过线性变换后的结果。在Decoder对每一个时刻进行解码时,首先需要做的便是通过Q与K进行交互(query查询),并计算得到注意力权重矩阵;然后再通过注意力权重与V进行计算得到一个权重向量,该权重向量所表示的含义就是在解码时如何将注意力分配到Memory的各个位置上。
在解码第1个时刻时,Decoder输入一个表征的向量(表示句子开头),输入大小为(1, 512),即下图中所示。得到Q、K、V后,首先Q通过与K进行交互得到权重向量,此时可以看做是Q(待解码向量)在K(本质上也就是Memory)中查询Memory中各个位置与Q有关的信息;然后将权重向量与V进行运算得到解码向量,此时这个解码向量可以看作是考虑了Memory中各个位置编码信息的输出向量,也就是说它包含了在解码当前时刻时应该将注意力放在Memory中哪些位置上的信息。进一步,Decoder得到输出结果后,再经过一次线性层然后输入到分类层中进行分类得到当前时刻的解码输出值。若模型准确,则应当得到"who"的输出结果。


当第1个时刻的解码过程完成之后,应将解码第1个时刻时的输入,以及解码第1个时刻后的输出均作为解码器的输入来解码预测第2个时刻的输出。同理第2个时刻的解码过程完成之后,应将解码第1、2个时刻时的输入,以及解码第2个时刻后的输出均作为解码器的输入来解码预测第2个时刻的输出。

完整流程如下:
第一个时刻:{<start>} ——>{who}
第二个时刻:{<start>, who} ——>{am}
第三个时刻:{<start>, who, am} ——>{I}
第四个时刻:{<start>, who, am, I} ——>{<end>}
显然这时候存在一个问题。如在第三个时刻,输入了{<start>, who, am},应是一个(3, 512)的向量,那么具体计算过程如下图所示。


最后Decoder的输出应是一个和Decoder的输入大小一致的(3, 512)的tensor,而要想得到"I"的结果,Decoder的输出应该是一个(1, 512)的tensor。为此,针对Decoder输出的tensor,只会取其最后一个向量喂入到分类器中进行分类得到当前时刻的解码输出。
同理,在时间序列预测的任务中,我们想要预测2个未来时刻(t1、t2)的数据

完整流程如下:
第一个时刻:{t0时刻数据} ——>{t1时刻数据}
第二个时刻:{t0时刻数据,t1时刻数据} ——>{t2时刻数据}
在第二个时刻,最后Decoder的输出应是一个和Decoder的输入大小一致的(2, 512)的tensor,而要想得到t2时刻数据,Decoder的输出应该是一个(1, 512)的tensor。为此,针对Decoder输出的tensor,只会取其最后一个向量,得到t2时刻数据。

6.2 训练时
在介绍完测试时的解码过程后,下面就继续来看在网络在训练过程中是如何进行解码的。在真实预测时解码器需要将上一个时刻的输出作为下一个时刻解码的输入,然后一个时刻一个时刻的进行解码操作。显然,如果训练时也采用同样的方法那将是十分费时的。因此,在训练过程中,解码器也同编码器一样,一次接收解码时所有时刻的输入进行计算。这样做的好处,一是通过多样本并行计算能够加快网络的训练速度;二是在训练过程中直接喂入解码器正确的结果而不是上一时刻的预测值(因为训练时上一时刻的预测值可能是错误的),能够更好的训练网络。
还是以6.1中的NPL任务为例。编码器的输入便是{"我", "是", "谁"},而解码器的输入则是{<start>, who, am, I} ,对应的正确标签则是{who, am, I, <end>,} 。
假设现在解码器的输入{<start>, who, am, I} 在分别乘上一个矩阵进行线性变换后得到了Q、K、V,且Q与K作用后得到了注意力权重矩阵(此时还未进行softmax操作),如下图所示。

由第1行的权重向量可知,在解码第1个时刻时应该将2/9的注意力放到<start>上,1/3的注意力放到"who"上等等。不过此时有一个问题就是,模型在预测时是看不到当前时刻之后的信息。因此,Transformer中的Decoder通过加入注意力掩码机制来解决了这一问题。
如下图所示,左边依旧是通过Q和K计算得到了注意力权重矩阵(此时还未进行softmax操作),而中间的就是所谓的注意力掩码矩阵,两者在相加之后再乘上矩阵V便得到了整个自注意力机制的输出,也就是Decoder中的Masked Multi-Head Attention。

那为什么注意力权重矩阵加上这个注意力掩码矩阵就能够达到这样的效果呢?以图中第1行权重为例,当解码器对第1个时刻进行解码时其对应的输入只有<start>,因此这就意味着此时应该将所有的注意力放在第1个位置上(<start>位置上,尽管在训练时解码器一次喂入了所有的输入),换句话说也就是第1个位置上的权重应该是1,而其它位置则是0。从图中可以看出,第1行注意力向量在加上第1行注意力掩码,再经过softmax操作后便得到了一个类似[1,0,0,0,0]的向量。那么,通过这个向量就能够保证在解码第1个时刻时只能将注意力放在第1个位置上(<start>位置上)的特性。在解码后续的时刻也是类似的过程。此外,这个操作与6.1中提到的“只会取其最后一个向量”的操作吻合。
 

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/xxt228/article/details/128754364

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值