美文网首页
Transformer 修炼之道(三)、Decoder

Transformer 修炼之道(三)、Decoder

作者: CW不要无聊的风格 | 来源:发表于2020-06-21 16:57 被阅读0次

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生成

至于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)生成预测概率。

Decoder生成输出

Summary

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

Decoder

Decoder内部每个layer如下:

DecoderLayer

End

Decoder 这部分讲得相对简单,因为大部分实现与 Encoder 相同,如有不清楚的地方可以参考上一篇关于 Encoder 的解析: Transformer 修炼之道(二)、Encoder

至此,Transformer 系列完结。该系列仅作为一个简单的学习参考,想要深入的话还需参考更多的资料以及亲自实践。CW写这个系列主要是为解析 DETR(End-to-End Object Detection with Transformers)而作铺垫,期望大家对 Transformer 有个基本的理解,这样在后续理解 DETR 的时候就可以“心领神会”了。

相关文章

网友评论

      本文标题:Transformer 修炼之道(三)、Decoder

      本文链接:https://www.haomeiwen.com/subject/mwraxktx.html