个人理解Attention就是加权。样本生而不平等,所以催生出各种样本加权的方法,比如对完播率高的样本加权,对时长长的样本加权;样本内特征也是生而不平等的,也可以加权,比如用户最近点击文章关键词,最近点击比稍远一点时间点击的更为重要,可以加权,而在历史长期点击序列中,出现频率更高的可能权重应该更大。这就像NLP领域有词语级别的加权,也有句子级别的加权。我们把这种直观的感受转化为程序语言,这就是Attention机制。
几乎所有的attention方法都可以归纳为:给定很多组key和value,以及一个目标向量query,通过计算query与每一组key的相似性,得到每个key的权重系数,然后通过对value进行加权求和,得到最终的attention数值。图和公式如下:
很多场景没有显式的Query,Key和Value,这个时候就需要根据实际情况进行构造了。比如在Self-Attention当中,Q、K、V都来自同一个输入。多个Self-Attention assemble到一起就变成了所谓的Multi-Head Attention。典型的Self-Attention的计算过程如下:
放大一下
其中d是Key的embedding长度。为什么要用 来归一化 ,论文的解释是当d变大时, 的方差也比较大,不同的Key与同一个Query算出的分数差异会比较大,这样在Softmaxt梯度回传时容易造成died gradient, 而归一化后的 方差可以有效缩小。关于Q和K相似度的计算方法,下面有一份总结:
https://nlp.seas.harvard.edu/2018/04/03/attention.html
https://lilianweng.github.io/lil-log/2018/06/24/attention-attention.html#summary