1.传统的encode-decode模型
输入序列:
输出序列:
中间语义变量
所以对于,也就是
这就表明输入序列的每一个元素对于输出序列的每一个元素的作用是等价的,这显然是不合理的。比如机器翻译中,中文“我爱你”,对应英语中“I love you”。其中“我”对于“I”和“love”的翻译作用力显然不同。为了解决这个问题,我们希望每一个输出序列的元素具有“个性化”地中间语义向量C,也就是对于输出序列中的每个元素,输入序列的每个元素作用力度不同。因此,针对输出序列中的任意元素yi的个性化中间语义向量Ci的计算为,这就是注意力机制。
2.注意力机制
Google给出注意力机制的定义为,给定一个Query和一系列的key-value对一起映射出一个输出。
- 将Query与key进行相似性度量(类似于上述的权重wij)
- 将求得的相似性度量进行缩放标准化
- 将权重与value进行加权
self-attention
attention机制通常用在encode与decode之间,但是self-attention则是输入序列与输出序列相同,寻找序列内部元素的关系即 K=V=Q。l例如《Attention Is All You Need》在编码器中使用self-attention,利用上一步的input值计算当前该位置input的值。如下图:
3.《Attention Is All You Need》
- 在“编码-解码器注意”层中,query来自之前的的解码器层,而key和value来自编码器的输出。这使得decode中的每个位置都可以处理输入序列中所有位置。这模拟了seq2seq模型中典型的encode-decode注意机制
- encode包含self-attention。在一个self-attention中,所有的value、key和query都来自encode中前一层的输出。encode中的每个位置都可以处理encode的前一层中的所有位置。
- 类似地,解码器中的self-attention允许解码器中的当前位置之前的所有位置。我们需要防止解码器中的左向信息流动,以保护自动回归特性(阻止利用当前位置后面的信息)
其中, MultiHead attention 是将Q,K,V进行h次线性变换,然后进行attention,并将h次得到的结果进行拼接,进行一个线性变换。
由于编码器中用到的self-attention,没有考虑到输入序列中各元素的位置关系,因此需要将位置信息输入到模型中,因此加入了position encoding。文章采用的是如下方式。文章假设它可以让模型很容易地通过相对位置来学习,因为对于任何固定的偏置k,PEpos+k都可以表示成一个线性函数PE pos。
4.《Self-Attention with Relative Position Representations》
在《Attention Is All You Need》基础上,对position encodeing进行了优化。在《Attention Is All You Need》中采用的position encoding的方式,没有考虑到词与词之间的距离。因此本文提出一个位置向量表示与
,分别表示输入序列第i个元素与第j个元素的Key和Value对应的位置向量。因此,输出元素zi的计算为:
对于现行序列,本文边可以捕获输入元素之间相对位置的差异性。因为本文假设一定距离之外精确的相对位置信息在是无用的,所以只考虑最大相对位置为k的情况。这种使用j-i的形式,可以处理在训练集中没有见过的序列长度。(之前的方法应该存在这个问题,不能处理比训练数据更长的数据)
而 与
的计算如下:
参考文献:
- 《Attention Is All You Need》---> https://arxiv.org/abs/1706.03762
- 《Self-Attention with Relative Position Representations》--->https://arxiv.org/abs/1803.02155
- https://www.sohu.com/a/226596189_500659