Attention
2017 年,Google 机器翻译团队发表的《Attention is All You Need》完全抛弃了RNN和CNN等网络结构,而仅仅采用Attention机制来完成机器翻译任务,并且取得了很好的效果,注意力机制也成为了研究热点。大多数竞争性神经序列转导模型都有一个编码器-解码器结构。编码器将输入的符号表示序列(x1, ..., xn)映射到连续表示的序列z=(z1, ..., zn)。给定z后,解码器每次生成一个元素的符号输出序列(y1, ..., ym)。在每个步骤中,该模型是自动回归的,在生成下一个符号时,将先前生成的符号作为额外的输入。Transformer遵循这一整体架构,在编码器和解码器中都使用了堆叠式自注意力和点式全连接层,分别在图8的左半部和右半部显示。
图8. Transformer架构
编码器
编码器是由N=6个相同的层堆叠而成。每层有两个子层。第一层是一个多头自注意力机制,第二层是一个简单的、按位置排列的全连接前馈网络。在两个子层的每一个周围采用了一个残差连接,然后进行层的归一化。也就是说,每个子层的输出是LayerNorm(x + Sublayer(x)),其中,Sublayer(x)是子层本身实现的函数。为了方便这些残差连接,模型中的所有子层以及嵌入层都会生成尺寸为dmodel=512的输出。
解码器
解码器也是由N=6个相同的层组成的堆栈。除了每个编码器层的两个子层之外,解码器还插入了第三个子层,它对编码器堆栈的输出进行多头注意力。与编码器类似,在每个子层周围采用残差连接,然后进行层归一化。进一步修改了解码器堆栈中的自注意力子层,以防止位置关注后续位置。这种masking,再加上输出嵌入偏移一个位置的事实,确保对位置i的预测只取决于小于i的位置的已知输出。
Attention。注意力函数可以描述为将一个查询和一组键值对映射到一个输出,其中,查询、键、值和输出都是向量。输出被计算为值的加权和,其中分配给每个值的权重是由查询与相应的键的兼容性函数计算的。在Transformer中使用的Attention是Scaled Dot-Product Attention, 是归一化的点乘Attention,假设输入的query q 、key维度为dk,value维度为dv , 那么就计算query和每个key的点乘操作,并除以dk ,然后应用Softmax函数计算权重。Scaled Dot-Product Attention的示意图如图9(左)。
图9. (左)按比例的点乘法注意力。(右)多头注意力由几个平行运行的注意力层组成
如果只对Q、K、V做一次这样的权重操作是不够的,这里提出了Multi-Head Attention,如图9(右)。具体操作包括:
- 首先对Q、K、V做一次线性映射,将输入维度均为dmodel 的Q、K、V 矩阵映射到Q∈Rm×dk,K∈Rm×dk,V∈Rm×dv;
- 然后在采用Scaled Dot-Product Attention计算出结果;
- 多次进行上述两步操作,然后将得到的结果进行合并;
- 将合并的结果进行线性变换。
在图8架构中,有三处Multi-head Attention模块,分别是:
- Encoder模块的Self-Attention,在Encoder中,每层的Self-Attention的输入Q=K=V , 都是上一层的输出。Encoder中的每个位置都能够获取到前一层的所有位置的输出。
- Decoder模块的Mask Self-Attention,在Decoder中,每个位置只能获取到之前位置的信息,因此需要做mask,其设置为−∞。
- Encoder-Decoder之间的Attention,其中Q 来自于之前的Decoder层输出,K、V 来自于encoder的输出,这样decoder的每个位置都能够获取到输入序列的所有位置信息。
在进行了Attention操作之后,encoder和decoder中的每一层都包含了一个全连接前向网络,对每个位置的向量分别进行相同的操作,包括两个线性变换和一个ReLU激活输出:
因为模型不包括recurrence/convolution,因此是无法捕捉到序列顺序信息的,例如将K、V按行进行打乱,那么Attention之后的结果是一样的。但是序列信息非常重要,代表着全局的结构,因此必须将序列的token相对或者绝对位置信息利用起来。这里每个token的position embedding 向量维度也是dmodel=512, 然后将原本的input embedding和position embedding加起来组成最终的embedding作为encoder/decoder的输入。其中,position embedding计算公式如下:
其中,pos表征位置,i表征维度。也就是说,位置编码的每个维度对应于一个正弦波。波长形成一个从2π到10000-2π的几何级数。选择这个函数是因为假设它可以让模型很容易地学会通过相对位置来参加,因为对于任何固定的偏移量k,PE_pos+k可以被表示为PE_pos的线性函数。
当前 SOTA!平台收录 Attention 共 4 个模型实现资源。
项目 | SOTA!平台项目详情页 |
Attention | 前往SOTA!模型平台获取实现资源:https://sota.jiqizhixin.com/project/attention-2 |
Value-network
Value-network的思路是:使用预测网络来改进波束搜索。将源句x、当前可用的解码输出y1,..., yt-1和步长t的候选词w作为输入,预测部分目标句的长期价值(例如BLEU分数),按照强化学习的惯例,把这个预测网络命名为价值网络(Value-network)。具体来说,为价值网络提出了一个循环结构,并通过双语数据训练其参数。在测试期间,当选择一个单词w进行解码时,同时考虑NMT模型给出的条件概率和价值网络预测的长期价值。
在传统的强化学习中,价值函数描述了遵循某种策略π可以从状态s中获得多少累积奖励。在机器翻译中,可以将任何输入句子x与部分输出句子y_<t配对视为状态,并将翻译模型π_Θ视为策略,可以在任何状态下生成一个词(动作)。给定策略π_Θ,价值函数的特点是,如果使用π_Θ来翻译x,前t-1个词是y_<t,那么预期的翻译性能(例如BLEU得分)是什么。将v(x, y_<t)表示为价值函数,y^∗(x)表示为基础ground-truth翻译,然后有:
其中Y是完整句子的空间。
第一个重要的问题是如何设计输入和价值函数的参数化形式。由于翻译模型是建立在编码器-解码器框架之上的,我们也在这个架构之上建立了价值网络。为了充分利用编码器-解码器框架中的信息,开发了一个带有两个新模块的价值网络,即语义匹配模块和上下文覆盖模块。
图10. Value-network架构
语义匹配(Semantic Matching,SM)模块。在语义匹配模块中,在时间步长t,在解码器RNN隐状态上使用均值池化法:
作为部分目标句的摘要句子。此外,使用上下文状态的平均集合法:
作为源语言中的上下文总结。把r¯t和c¯t连接起来,并使用一个如下的前馈网络评估源句和目标句之间的语义信息:
上下文覆盖(Context-Coverage,CC)模块。人们观察到,注意力模型中覆盖的上下文越多,翻译的结果就越好。因此,构建一个上下文覆盖模块来衡量编码器-解码器框架中使用的信息覆盖率。在上下文层和编码状态上使用均值池化能提供一些有效的知识。令:
我们使用另一个前馈网络来处理这些信息:
最后,将µSM和µCC串联起来,然后使用另一个带有sigmoid激活函数的全连接层来输出一个标量作为预测值。整个架构如图10所示。
项目 | SOTA!平台项目详情页 |
Value-Network | 前往SOTA!模型平台获取实现资源:https://sota.jiqizhixin.com/project/value-network |
前往 SOTA!模型资源站(sota.jiqizhixin.com)即可获取本文中包含的模型实现代码、预训练模型及API等资源。
网页端访问:在浏览器地址栏输入新版站点地址 sota.jiqizhixin.com ,即可前往「SOTA!模型」平台,查看关注的模型是否有新资源收录。
移动端访问:在微信移动端中搜索服务号名称「机器之心SOTA模型」或 ID 「sotaai」,关注 SOTA!模型服务号,即可通过服务号底部菜单栏使用平台功能,更有最新AI技术、开发资源及社区动态定期推送。