为什么要引入注意力机制?
- 计算能力的限制
当要记住更多的“信息”时,模型变得更复杂,然而目前计算能力依然是限制神经网络发展的瓶颈。
- 优化算法的限制
虽然局部连接,权重共享以及池化等优化操作可以让神经网络变得简单一些,有效缓解模型复杂度和表达能力之间的矛盾;但是,如循环神经网络(RNN)中的长距离依赖问题,信息“记忆”能力并不高。
因此,人们参照人脑处理信息过载的方式 ,例如注意力机制可以提高神经网络处理信息的能力。
关于人脑处理信息:
对于一张图片,我们人眼对整张图片不会全面观察,只会观察集中的一部分 ,然后再依次向外逐渐发散观察;对于几行字,加入我们要对这几行字进行翻译,如果是机器,它就会全面的进行扫描,而这增大了任务难度或者说降低了效果,参照我们人类的习惯,我们将会对几行字,逐行进行观察 ,这就可以有效的优化我们的机器模型。
![JsYfYT.png](https://i-blog.csdnimg.cn/blog_migrate/d22146d05568486cefacbb587c071171.png)
注意力机制有哪些?
当用神经网络来处理大量的输入信息时,也可以借鉴人脑的注意力机制,只选择一些关键的信息输入进行处理,来提高神经网络的效率。按照认知神经学中的注意力,可以总体上分为两类:
- 聚焦式(focus)注意力 :自上而下的有意识的注意力,主动注意–是指有预定目的的、依赖任务的、主动有意识的聚焦于某一对象的注意力;
- 显著性(saliency-based)注意力 :自下而上的有意识的注意力,被动注意–基于显著性的注意力是由外界刺激驱动的注意,不需要主动干预,也和任务无关;可以将最大池化和门控(gating)机制 来近似看作是自下而上的基于显著性的注意力机制。
在人工神经网络中,注意力机制一般就特指聚焦式注意力 。
无注意力机制
普通的Encoder-Decoder(seq2seq)
结构:(基于RNN
)
![JsDuTJ.jpg](https://i-blog.csdnimg.cn/blog_migrate/bfa8e423822b7988dd50b76df6e665bf.jpeg)
x
是输入序列Encoder
是编码器;Decoder
是解码器- 语义编码C是对输入的高度概括,是输入的核心总结
y
是输出
其概括形式:
![JsrCnO.jpg](https://i-blog.csdnimg.cn/blog_migrate/5c55b72ef2a34b0e89d9faff732a3f5e.jpeg)
在这个过程当中,我们的语义编码使用的是相同的值。那么,所有的预测输出 y 1 y_{1} y1 、 y 2 y_{2} y2 、 y 3 y_{3} y3 …都完全依赖于同一个语义编码C来决定,真的科学吗?
注意力机制
以机器翻译为例:
![JsybB8.png](https://i-blog.csdnimg.cn/blog_migrate/b92949e9c43acd86760a994d6beb8acb.png)
- 在翻译“汤姆”时,原句中的三个词对其贡献度不同,关联度最高的应该是“Tom”。同样,于“追逐”关联度最高的是“chase”,与“杰瑞”关联度最高的是“Jerry”。
- 在C中,所有词的对应权重是相同 的。并且固定编码C能表示的信息有限 ,尤其是在长句子中。
- 提出注意力机制 ,使得在翻译时不同词时,注意到各个词的贡献(相关性)。
![Js6TPJ.jpg](https://i-blog.csdnimg.cn/blog_migrate/a094aac485c13208f26285a11629369a.jpeg)
很明显,这里我们就会冒出一个问题:权重如何计算?
![JsgocR.jpg](https://i-blog.csdnimg.cn/blog_migrate/4718454527da62d7c9a287a111cf6578.jpeg)
- 在计算中,如果 h 1 h_{1} h1 与 H 1 H_{1} H1 的相似度值越大,那么赋予的权值越大。
在赋予权值之前,我们需要用
Softmax
进行归一化处理
例子
Tom chase Jerry => 汤姆 追逐 杰瑞
假设汤姆对应的隐藏层向量:[10,5,10]
![Js2BVK.jpg](https://i-blog.csdnimg.cn/blog_migrate/218841fc8a9254e76f9cb7b0af3bd82d.jpeg)
import numpy as np
tom_init = np.array([10,5,10])
tom_hidden = np.array([5,0,1])
chase_hidden = np.array([0,1,1])
jerry_hidden = np.array([1,1,0])
print("score:")
print(np.multiply(tom_init, tom_hidden))
print(np.multiply(tom_init, chase_hidden))
print(np.multiply(tom_init, jerry_hidden))
在翻译“汤姆”时的注意力权重分布矩阵为:[3.15,0.3,0.75]
总结
注意力机制就是通过学习得到一个权重分布,再把这个权重分布施加到原来的特征上面。以获取更多所需要关注目标的细节信息,而抑制其他无用信息。是一种资源分配方式。