Date: 2020/06/21
Author: CW
前言:
Decoder 的套路和 Encoder 差不多,只是某些输入以及注意力计算的时候有些许不同,因此,只要吃透了 Encoder 那部分,Decoder 就相对好理解了。
Outline
I. Multi-Head Attention with Mask
II. Encoder-Decoder Attetion
III. Output Generator
IV. Summary
Multi-Head Attention with Mask
这里补充下上一篇讲解多头自注意力时没有涉及到的一点:掩膜(mask)的使用,目的是忽略某些位置,不计算与其相关的注意力权重。
一种常见的场景是“防作弊”:
为何这么说?因为 Decoder 是要对序列进行解码预测,所以你不能提前看到要预测的内容,你应当根据当前及之前已解码/预测的内容来推算即将预测的内容。于是,这个mask就是用来遮住后面将要预测的部分。
举个例子,假设当前输入的是 "<Start> I have a dream" (0, 1, 2, 3, 4) 这五个单词组成的向量,那么mask 是一个 5×5 的和注意力权重相同shape的矩阵。但不同于注意力权重矩阵,mask是一个下三角矩阵,即矩阵对角线上方部分的值均为0,这样就使得单词 i 不计算与位于其后的单词 i+1, i+2,.. 的关系。

mask生成的代码如下:

至于mask如何使用,则如下:

mask等于0的部分就是被遮住的部分,那么这里赋值为-1e9是为何呢?
这里-1e9代表一个极小值,使得其经过softmax后生成的概率趋近于0,这样就相当于不计算这些位置的注意力权重了。
注:以上mask_fill()方法应为mask_fill_(),这样scores才会原地改变,否则是返回一个新的张量,而原张量不受影响。
还有一种场景是确实想要忽略序列中某些指定位置:
这是由于一个batch中各序列长度通常不一致,因此会进行padding,那么padding后的某些序列势必有些位置不属于原序列,因此我们想要忽略这些位置,相当于忽略无效值。
至于实现的方式,除了像上面那种二值mask以外,还可以将想要忽略的位置对应的值设置为极小值-inf,然后直接加在计算出的注意力系数矩阵上,这样在后续经过softmax时这些位置对应的权重就会趋于0。
Encoder-Decoder Attetion
别看这名字挺新颖,其实它就是多头自注意力,只不过 K 和 V 来自 Encoder 的输出,至于 Q:如果是 Decoder 的第一层,则使用(已解码的)输入序列(最开始则是起始字符);而对于后面的层,则是前面层的输出。
Output Generator
这部分实质就是个线性层,将解码的序列映射回原来的空间维度,然后经过softmax(或log-softmax)生成预测概率。

Summary
最后来看看 Decoder 及其内部每层封装的代码实现:

Decoder内部每个layer如下:

End
Decoder 这部分讲得相对简单,因为大部分实现与 Encoder 相同,如有不清楚的地方可以参考上一篇关于 Encoder 的解析: Transformer 修炼之道(二)、Encoder。
至此,Transformer 系列完结。该系列仅作为一个简单的学习参考,想要深入的话还需参考更多的资料以及亲自实践。CW写这个系列主要是为解析 DETR(End-to-End Object Detection with Transformers)而作铺垫,期望大家对 Transformer 有个基本的理解,这样在后续理解 DETR 的时候就可以“心领神会”了。
网友评论