注意力(Attention)机制是应用在深度学习模型中的一种方法,主要就是通过分配概率分布值来赛选被测对象中的重要信息。
通俗一点的说就是人的注意力是有限的,比如你看到一句话“小明在做作业”,如果你的关注重点是人的话,你就更加注意是“小明”这个人在做某件事,而如果你的关注重点是事的话,你就会更加注意是“做作业”这个动作。因此注意力机制,就是提取出对你的目标而言,更加重要的特征。
注意力(Attention)机制其实很早就被提出来了。但是在NLP领域中,开始大火的原因是谷歌发布的《Attention Is All You Need 》。论文中提出来一种encoder+decoder+slef attention机制的模型,为机器翻译做出了很大的贡献。
Encoder and Decoder
上图是一个典型的Encoder-Decoder的模型。前面的{x1,…,x4}是输入,{y1,…,y3}是输出。如以英翻汉为例,前者是被翻译的英语,后者是翻译的中文。
上述模型并没有带有注意力机制,因此称其为分心模型。
其中目标句子中yi的计算公式如下:
公式中的C是图中的语义编码。我们可以看到C是一直不变的,也就是说C对每个yi的作用都是相同。在短句子中这样的影响不大,但是在长句子中这样就不能够把握住重要特征。
接下来,由我们来为其分配概率分布值。
加入Attention的Encoder-Decoder
引入注意力机制后,我们能够看到图中将上文的语义编码C分成了动态的ci,不同的ci的概率分布值也就不相同。
现在目标句子中yi的计算公式如下:
如此,我们能为不同的预测单词分配不同的注意力了。例如,“Tom chase Jerry”,翻译的结果应该是:“汤姆”,“追逐”,“杰瑞”。“Tom”应该翻译为“汤姆”,故在翻译Tom时,c(汤姆)的值就应该比后两者大。如c(汤姆)=0.6,c(追逐)=0.1,c(杰瑞)=0.3.
看到这里,我估计你已经有了一个疑惑,那就是这个注意力概率分布值要怎么计算呢?
对于采用RNN的Decoder来说,在时刻i,如果要生成yi单词,我们是可以知道目标句子
隐层节点i-1时刻的输出值Hi-1的,而我们的目的是要计算生成Yi时输入句子中的单词“Tom”、“Chase”、“Jerry”对Yi来说的注意力分配概率分布,那么可以用目标输出句子隐层节点状态Hi-1与输入句子在RNN中的隐层节点状态hj进行对比,即通过函数F(hj,Hi-1)来获得目标单词yi和每个输入单词对应的对齐可能性,这个F函数在不同论文里可能会采取不同的方法,然后函数F的输出经过Softmax进行归一化就得到了符合概率分布取值区间的注意力分配概率分布数值。
本文借鉴文献如下:
作者:张俊林
链接:https://www.zhihu.com/question/68482809/answer/264632289
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。