Attention
最后更新于
attention创造之初,是为了翻译任务(Seq2Seq)而生的,但最后又不局限于翻译任务。
Seq2Seq模型存在的缺点:
所有的输入都编码成一个固定长度的context vector,而固定长度的vector并不能很好的编码所有的上下文信息,导致长距离依赖关系信息都消失了
很难对输入和输出序列之间的词语对齐进行建模,这是结构化输出任务(如翻译或摘要)的重要任务之一
从传统经验来看,Seq2Seq任务的输出会受到输入的某些特定部分影响,显然Seq2Seq模型并没有建模
因此,最早是由Bahdanau[2014])在做机器翻译时提出的在Encoder和Decoder之间,增加追加attention block,最主要就是解决编/解码器之间匹配问题。
参考资料:https://cloud.tencent.com/developer/article/1143127
把Attention机制从上文讲述例子中的Encoder-Decoder框架中剥离,并进一步做抽象,可以更容易看懂Attention机制的本质思想。
将Source中的构成元素想象成是由一系列的数据对构成。
给定Target中的某个元素Query,通过计算Query和各个Key的相似性或者相关性,得到每个Key对应Value的权重系数,然后对Value进行加权求和,即得到了最终的Attention数值。
所以本质上Attention机制是对Source中元素的Value值进行加权求和,而Query和Key用来计算对应Value的权重系数。
其中Lx代表Source的长度。
听起来简单,实现起来其实也简单,我认为对于Attention可以有三种理解:
首先,从数学公式上和代码实现上Attention可以理解为加权求和。
其次,从形式上Attention可以理解为键值查询。
最后,从物理意义上Attention可以理解为相似性度量。
对应到具体任务上,可能会更加清晰一点:
在机器翻译任务中,Query可以定义成decoder中某一步的hidden state,Key是encoder中每一步的hidden state,我们用每一个Query对所有Key都做一个对齐,decoder每一步都会得到一个不一样的对齐向量。
在文本分类任务中,Query可以定义成一个可学的随机变量(参数),Key就是输入文本每一步的hidden state,通过加权求和得到句向量,再进行分类。
PS:一般情况下,K和V是相同的。。
在做attention的时候,我们需要计算query和某个key的分数(相似度),常用方法有:
1)点乘:最简单的方法:
2)矩阵相乘:
3)cos相似度:
5)用多层感知机:
参考资料: Chaudhari, S., An attentive survey of attention models, 2019 (非常精彩的一篇综述)