目录
注意力机制
引入:心理学两个概念
随意线索:我有意识地想去读书,然后开始找能读的书,这时候我注意到桌上有一本书,书是随意线索。
不随意线索:桌上放一堆东西,最大个最显眼的是一盏灯,我进房间一眼就看到最显眼的那个灯,灯不是我刻意去想去找才注意到的,灯是不随意线索。
注意力机制
全连接、卷积、池化层都只考虑不随意线索。注意力机制显式地考虑随意线索。
把心理学概念和注意力机制中的概念对应起来:自主性提示,即随意线索(我想要的)被称为查询query;每个输入是 感官输入value和不随意线索key的对,key和value可以一样也可以不一样;attention pooling注意力池化根据query来有偏向地选择key-value pair,它和别的池化层不一样的地方是多了query。
非参注意力池化层(不用学参数)
如果K为高斯核,f(x)如下:
参数化的注意力机制
这里的w是标量。
注意力分数
注意力机制可以写成:
x是query,xi是key,yi是value。 是注意力权重,这个东西如何求,也就是权重设计是接下来的重点。
是注意力权重,大于等于0,和为1。那什么是注意力分数?高斯核指数部分可以视为注意力分数,如
假设注意力机制这时具有如下形式:
该式子用图表示其过程如下,
接下来要把query,key,value拓展到高维度,不再像之前一样是一个值。
这里注意力分数是softmax的输入a(q, ki),a是标量。
2种常见的对分数a的计算:
1 additive attention
a是标量。计算a的式子相当于将向量k(key)和q(query)并成一个长为k+q的向量,放入隐藏大小为h输出大小为1的单隐藏层MLP。
好处:key value query可以任意长度,彼此不一样。
2 scaled dot-product attention
如果query和key长度一样,长为d,那就不用学参数,
除以根号d:就是scaled,为了减小对向量长度的敏感度,向量化版本如下:
Q有n个query向量,key-value有m对
总结:
使用注意力机制的seq2seq
动机
机器翻译中,每个生成的词可能 相关于 源句子中不同的词,但seq2seq模型不能对此直接建模。我们希望翻译某个词的时候把注意力放在源句子对应部分。
具体做法
解码器部分:原来的seq2seq把编码器最后一层最后一个时刻的隐藏层和embedding编码后的结果并在一起不合适。应该把编码器对每个词的RNN输出作为key和value,几个词就有几个key-value pair;query是解码器RNN对上一个词的预测输出(要RNN的输出,不是embedding的输入);把注意力输出和下一个词的词嵌入embedding合并。