注意力机制如何起源的 神经网络中的注意力机制启发自人类的视觉注意力机制,能够(高分辨率地)聚焦于图像中需要重点关注的目标区域(节省大脑资源),同时(低分辨率地)感知周围的图像,然后随着时间的推移调整焦点(状态调整)。
在神经网路中,注意力机制是为了解决什么问题?
在深度学习还没流行的时候, 传统的算法早已应用了注意力机制的思想.
比如一个非线性回归问题,对于代表位置的输入变量${x_1, …, x_m}$ 和 代表位置对应的输出值${y_1, …, y_m}$, 如何预测新的$x_n$对应的输出? Baseline 就是求均值, $$\frac{1}{m} \sum_{i=1}^{m} y_i$$ 当然更好的方案(Watson, Nadaraya, 1964)是根据不同的输入$x_i$给与$y_i$不同的权重, $$y = \sum_{i=1}^{m} \alpha(x, x_i) y_i $$
这里$x$代表一个新的输入(作为query), 根据$x$和已有的位置$x_i$(作为key)进行某种运算, 得到$x_i$对应的输出$y_i$(作为value)的权重. 如果每一个权重都是一个Guassians分布, 并正则化, 则一个加权的回归预测模型就是:$$f(x) = \sum_i y_i \frac{k(x_i, x)}{\sum_j k(x_j, x)}$$
这个算法的"深度学习"版本, 就是其权重是通过优化器(如sgd)学习得来, 并且把平均运算改为加权池化(weighted pooling).
如何简单直观地理解注意力机制 虽然注意力机制一开始被应用于图像识别领域,但是后来推广到神经机器翻译(NMT)中(Seq2Seq for Machine Translation, Sutskever, Vinyals, Le ‘14). NMT也是注意力机制在NLP领域最早最成功的应用之一.
在上图中,Echt,Dicke和Kiste词被送到编码器中,并且在特殊信号(未显示)之后,解码器开始生成翻译后的句子。解码器不断生成单词,直到产生特殊的句子结尾标记(如<eos>)。也就是说解码器仅根据最后一个隐含状态$h_3$来生成序列. 假如这个句子很短, 那么效果其实是很好的.
不过对于比较长的句子, 那么这个架构的弱点就暴露无疑了.
首先, 编码器能否把句子的所有信息(语言学上的和常识等知识)都理解/捕捉到? 其次, 受限于目前的实现技术(主要是硬件), 单个隐含状态(如$h_3$这个向量)的维度大小是有限的, 而句子长度以及语言的组合情况是无限的, 单靠$h_3$自身是存储信息能力是有限的. 再者, 解码器是否有足够的解码能力从一个隐含状态中解码出所有的信息? 虽然大部分句子是相对紧凑的, 但语言有个特点, 就是一个词有可能和前面好几步之外的词有联系, 比如一些指代词用于指代文本最开头出现的名词; 语义上, 某个句子的理解, 可能依赖于前面多个句子; 当然往大了说, 要理解一篇文章或一本书, 我们通常需要理解并联系多个段落, 多个章节....