注意力机制
RNN编码-解码模型
论文[1]中,从RNN编码-解码模型演进出注意力机制。RNN编码-解码模型中,编码器输入序列,是编码器RNN在时刻的隐状态(hidden state),
隐状态序列的生成向量(编码)
其中和都是非线性函数。
解码器用来预测下一个,定义了一个条件概率
其中解码器输出,对RNN有
其中是解码器RNN在时刻的隐状态。
注意力机制
定义(3)中的条件概率为
是RNN在时刻的隐状态。
这里条件概率依赖的是上下文向量(context vector),在每个是不同的。
权重
其中
这种调整模型(alignment model)对输入在位置和输出在位置的匹配程度进行打分。
查询-键-值
RNN编解码结构的例子
根据(8)注意力的权重分数(attention scores)取决于编码RNN状态和解码RNN状态。则获取attention scores需要计算这个网络次,其中编码序列长度,解码序列长度。
可以考虑把和先投影到同一个空间,再定义个这个空间内的测度(如点乘)来计算attention scores[2]。除了用“Dot-Product Attention”,也可以用其他测度,如“additive attention”。其他形式的可以参考[3]。
这样只要计算次,次,再矩阵乘法即可。这两个投影就是[4][5]里面提到的查询(query)和键(key)。
公式(10)来自论文[4],是缩放因子,所以这种注意力称之为“Scaled Dot-Product Attention”。容易看出,值对应的是,(对解码器)查询对应,(对编码器的)键对应。键就是值在某个空间上的投影。可以参考论文[6]的中2.2节Self-Attention,写的很明确。论文中提出“Relative Position Representations”,相等于限定了attention的“感受视野”。
Self-Attention
论文[4]中,没有用RNN的编码-解码结构,而是“self-attention”,和的获取更直接:对每个不同的输入元素(单词)都对应一个Query向量,一个Key向量,一个Value向量。这三个向量都是输入单词的embedding向量乘以投影矩阵,,得到的[5]。
写成矩阵的形式[5]。
所以公式(10)的形式如下。
这样,一个单词的attention包含了来自其他单词的编码。
Multi-Headed Attention
论文[4]提出的“multi-headed” attention是对“self-attention layer”的扩展。self-attention中可能把大部分权重集中到一个输入单词上,而事实上可能有多个关联的单词。Multi-headed attention采用多组矩阵独立计算,得到多组,然后把多组联接起来组成一个矩阵,方便前向-后向传递(详见[5])。只有第一个“head”需要输入embeddings,后面的输入上一个的输出即可[5]。
如下表对“it”进行编码时,一个attention head焦点在“the anima”,另一个attention head在“tired”。采用多个attention head更容易表示某个输入单词。
2 single self-attention layer | Multi-headed attention |
---|---|
总结
序列到序列的编码-解码结构中,引入注意力机制来建立对某一个输出和一系列输入(的编码)直接的关系。查询和键分别对应两个张量(tensor),可以看作是输入的数据/编码/状态序列和输出的数据/编码/状态序列在某个空间上的投影。值对应输入的数据/编码/状态序列,键可以看作是值的投影。键和值可以完全相等[7],也可以是同源对不同空间的投影张量。查询对应输出,对应target,对应解码器;键和值对应输入,对应source,对应编码器。对于self-attention特例,查询也对应输入,来获取输入序列(可以是数据/编码/状态)的某个输入元素和序列中相邻其他元素的关系。
附录
其他例子
Image Transformer
把用注意力机制来生成文本的方法应用到生成图像[8](提高分辨率、修复、补足)。生成的像素点对应的某个通道的数值取决于原始像素点数据、前后生成的数据和位置编码
从公式可以看出构成了self-attention。因为是图像处理,文中还介绍了1D attention和2D attention。
并行计算
前面提到过,用“Dot-Product Attention”可以减少计算量、增加并行度。由于序列的相关性,生成前需要生成,这不利于并行计算。训练时候因为标记已知,根据前面符号的条件概率可以并行计算,但解码时只能顺序计算。
为了解决这个问题,[9]提出用一组离散的隐变量(discrete latent variables):来综合的相对信息,,通常。目标是可以独立地由来重构的每个元素,实现并行计算。这需要一个自编码(autoencode)把编码为。隐变量通常是连续的,期望是离散的,通常有三种方法来使用这些离散隐变量
- Gumbel-Softmax
- VQ-VAE
- Improved semantic hashing
作者比较验证了这几种方法,还提出了decomposed vector quantization (DVQ),比VQ-VAE好[9]。
论文[10]中,通过使用“memory-compressed attention”减少了和参与计算的参数简化了计算(下图中间)。使用“local attention”,把长序列分成几个短的子序列,并行运算后再融合(下图最右)。
Reference
-
Neural Machine Translation by Jointly Learning to Align and Translate ↩
-
what-exactly-are-keys-queries-and-values-in-attention-mechanisms ↩
-
Effective Approaches to Attention-based Neural Machine Translation.pdf ↩
-
Self-Attention with Relative Position Representations ↩
-
Depthwise Separable Convolutions for Neural Machine Translation ↩
-
Image Transformer ↩
-
Fast Decoding in Sequence Models using Discrete Latent Variables ↩ ↩
-
Generating Wikipedia by Summarizing Long Sequences ↩