最近在读一篇关于视听语音识别的论文,论文中对于音频和图像的处理是基于Transformer的模式,Tansformer可以说是当前NLP领域最强的特征提取模型,但在语音和图像领域我还没有接触到过,因此有很多不理解的地方,趁着这篇论文的学习,对这个模型好好了解了一下,在此做个记录。

Transformer由google在2017年发表的论文《Attention is All You Need》中提出。由于在NLP领域对序列结构有着较强的依赖性,因此长期以来,RNN一直在NLP中占领着主导地位,成也萧何败也萧何,就是因为这种序列结构的依赖性,使得RNN无法进行并行计算,而Transformer是若干"Self Attention"叠加而成的深度网络,因此可以在这些attention上做并行计算。近几年,Transformer更是因其强大的特征提取能力而大放异彩。

Transformer的总体结构图如下:在这里插入图片描述
乍一看,Transformer的结构很复杂,其实将其一分为二,左半边是encoder部分,右半边是decoder部分。

encoder部分由N个相同的层堆叠而成,文中N=6,每层又包括两个子层,一个是多头自注意机制(Multi-head self-attention mechanism),另一个是简单的、位置上全连接的前馈网络。在两个子层的之间采用残差连接,随后采用层标准化。也就是说,每个子层的输出是LayerNorm(x + Sublayer(x)),其中Sublayer(x)是子层本身实现的函数。为了方便这些残差连接,模型中的所有子层以及嵌入层都会产生尺寸dmodel= 512的输出。

decoder部分同样是由N个相同的层堆叠而成,每层除了多头自注意机制前馈网络两个子层以外,还有一个子层对编码器堆栈的输出执行多头注意,被称为编码-解码自注意力机制。同样在每个子层的之间采用残差连接,随后采用层标准化。另外,对多头自注意机制进行修改,确保了对位置 i 的预测只能依赖于小于 i 的已知输出,文中记为Masking multi-head self-attention mechanism。

自注意力机制

第一步:用每个编码器的输入向量,即每个单词的词嵌入,分别乘以三个权重矩阵WQ、Wk、Wv,生成一个查询向量(Query)、一个键向量(Key)和一个值向量(Value)。(在本文的讨论范围内,及目前实际中绝大多数讨论中一个词的键向量等于值向量)。
在这里插入图片描述
第二步: 为句子中的每个单词计算得分。使用句子中所有单词(n个)的键向量分别和该单词的查询向量进行点积计算,得到n个得分,这些分数决定了句子中每个单词对编码当前位置的贡献。
在这里插入图片描述

第三步: 对每个得分除以键向量的维数 d k \sqrt {d_k} dk ,这里是64的平方根8,这会让梯度更稳定。也可以使用其它值,8只是默认值)。

第四步: softmax归一化。使用softmax将所有分数归一化到0-1之间,所有分数之和为1,这也是每个单词对当前便那位置的权重。

第五步: 将softmax权重与值向量相乘,这是为了强化关注语义之间相关的单词,弱化语义之间不相关的单词。然后将各加权向量相加,得到自注意力机制对当前单词的一个输出结果。

多头自注意力机制

自注意力机制的输出进一步传递给前馈神经网络,以上是以单个自注意力机制为例说明其计算过程,实际过程中,查询向量、键向量和值向量会组成查询矩阵(Query)、键矩阵(Key)和值矩阵(Value)。为此,我们将输入句子的词嵌入装进矩阵X中,将其乘以权重矩阵(WQ、WK、WV)。
其计算过程可用一个公式表述如下:
在这里插入图片描述
我们对每一个查询、键和值的投影并行执行注意力函数,生成dv维的输出值,然后它们被连接起来并再次投影,产生最终的值,其计算方式如下:
在这里插入图片描述
在这里插入图片描述
模型中在编码注意力机制、解码注意力机制和编码-解码注意力机制三部分都用到了注意力层。
在编码部分和解码部分的自注意层,所有的键、值和查询都来自同一个地方,编码器中的每个位置都可以关注到所述编码器的前一层中的所有位置。解码器中的每个位置关注解码器中的所有位置,直到并包括该位置。
编码-解码注意力机制中的查询来自前一个解码器层,键和值来自编码器的输出。顶端编码器的输出之后会变转化为一个包含向量K(键向量)和V(值向量)的注意力向量集 。这些向量将被每个解码器用于自身的“编码-解码注意力层”,而这些层可以帮助解码器关注输入序列哪些位置合适。这允许解码器中的每个位置都参与输入序列中的所有位置。

前馈网络

除了注意力机制子层之外,我们的编码器和解码器的每一层都包含一个完全连接的前馈网络,分别相同地应用于每个位置,含两个带有ReLU激活的线性转换。
在这里插入图片描述

位置编码

上述还缺少理解输入单词顺序的方法,Transformer为每个输入的词嵌入添加位置编码。

Transformer为每个输入的词嵌入添加了一个向量,这些向量遵循模型学习到的特定模式,这有助于确定每个单词的位置,或序列中不同单词之间的距离。

作者设置的位置编码规则为:
在这里插入图片描述

作者这么设计编码规则的原因是考虑到在NLP任务中,除了单词的绝对位置,单词的相对位置也很重要。根据公式和,表明位置的位置向量可以表示为位置的特征向量的线性变化,这为模型捕捉单词之间的相对位置关系提供了非常大的便利。

线性变化和softmax

解码器输出后的线性变换层是一个简单的全连接神经网络,它可以把解码器产生的向量投射到一个比它大得多的(字典维度),被称作对数几率(logits)的向量里。
Softmax 把分数归一化到0-1之间,并以概率最高的单元格对应的单词被作为这个时间步的输出。

参考列表:

  1. Transformer再记(编码器)
  2. Transformer再记(解码器)
  3. Transformer
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐