1. 前言
按照顺序将要介绍Layer Normalization,谈起这个模块,就会想起CV领域比较重要BN层 ,被称为批归一化,它具有加快训练速度、防止过拟合等优点。可是,在NLP领域应用更为广泛的是Layer Normalization。在最后我们介绍Encoder和Deconder的整体结构。
2. Layer Normalization
上图是Transformer的经典视图,我们标注出了Layer Normalization中的具体位置。我们从模型输入输出出发介绍是 Layer Normalization如何运算的。假设句子有一个有个句子,句子最长单词数为,嵌入维度为,则组成的3位张量为, 如下图所示:
计算时我们按照N通道进行,计算形式如下所示:
在实现归一化之后,在将得到的值与输入值的对应项相加得到一个self-attention最终输出,流程如下图所示:
3. Enconder的整体结构
总结来讲,他主要有5个步骤,主要包括上文所讲述的Positional encoding,Self-attention和Layer Normalization,和Feed forward。
1)字向量和位置编码
2)自注意机制
3)self-attention 残差连接与 Layer Normalization
4). 下面进行 Encoder block 结构图中的第 4 部分,也就是 FeedForward(前向传播),其实就是两层线性映射并用激活函数激活,比如说Relu。
5). FeedForward 残差连接与 Layer Normalization
4. Deconder的整体结构
接下来将介绍Deconder的整体结构,从流程图可以看出,Deconder模型采用的单元与Enconder基本相同,主要也是Positional encoding,Self-attention和Layer Normalization等,所以不做介绍。
在字向量和位置编码经过结合后,送入Enconder和Deconder,他们经过的Self-attention是不一样的,前者叫做Muti-head Attention后者叫做Masked Muti-head Attention。关于前者已经在这篇文章做了详细介绍,下面就着重说明解码器为什么要采用Masked Muti-head Attention。
RNN在进行解码时,是按照时间顺序输出的,在知道前一个词之后,才能推理出后一个词,也就是说在进行推理的时候,我们不可能暴露后面的句子信息是什么的。但是Self-attention却不是这样的,它需要计算当前词,与其他任一个词之间的相关性,这显然是不科学的,所用我们需要对 Muti-head Attention做一些特别的处理,即掩码操作(MASK)。
为了简答表达,下文仅仅以Self-attention为例子进行介绍。我们先做出假设,经过字向量和位置编码的输出为(其实是,,;三个值都为),可学习的3个矩阵分别是为、和,输出(Layer Normalization之前)。,和的计算如下:
然后求得相关分数矩阵,一共有16项,即,,和…计算如图13所示:
上文是最原始的Self-attention,那如何在此基础上引入MASK呢?我们以 I am fine这句话为例,假设我们得到了上文的相关性矩阵。以单词I为例,它的相关性只与和有关系,与和无关,所以我们可以构造一个下三角形掩码进行表达,具体如下所示,首先生成一个下三角全 0,上三角全为负无穷的矩阵,然后将其与相关分数矩阵(scaled scores)相加即可
之后再做 softmax,就能将 - inf 变为 0,得到的这个矩阵即为每个字之间的权重
这样在进行后续计算即可。
需要强调的是,在经过第一个Masked Muti-head Attention后,后续的Blocked三个输入中的和来源于Enconder的输出。
参考
https://wmathor.com/index.php/archives/1438/