Attention机制 -- 潘登同学的深度学习笔记
Encoder-Decode框架
要了解深度学习中的注意力模型,就不得不先谈 Encoder-Decoder 框架,因为目前大多数注意力模型附着在 Encoder-Decoder 框架下,当然,其实注意力模型可以看作一种通用的思想,本身并不依赖于特定框架,这点需要注意。
Encoder-Decoder 框架可以看作是一种深度学习领域的研究模式,应用场景异常广泛。下图是文本处理领域里常用的 Encoder-Decoder 框架最抽象的一种表示
文本处理领域的 Encoder-Decoder 框架可以这么直观地去理解:可以把它看作适合处理由一个句子(或篇章)生成另外一个句子(或篇章)的通用处理模型。对于句子对$
$$ Source = (x_1,x_2,\ldots,x_m) \ Target = (y_1,y_2,\ldots,y_n) \ $$ Encoder 顾名思义就是对输入句子 Source 进行编码,将输入句子通过非线性变换转化为中间语义表示 C $$ C = F(x_1,x_2,\ldots,x_m) $$ 对于解码器 Decoder 来说,其任务是根据句子 Source 的中间语义表示 C 和之前已经生成的历史信息$y_1,y_2,\ldots,y_{i-1}$来生成i时刻要生成的单词 $$ y_i = G(C,y_1,y_2,\ldots,y_{i-1}) $$
- 每个 yi 都依次这么产生,那么看起来就是整个系统根据输入句子 Source 生成了目标句子 Target。如果 Source 是中文句子,Target 是英文句子,那么这就是解决机器翻译问题的 Encoder-Decoder 框架;
- 如果 Source 是一篇文章,Target 是概括性的几句描述语句,那么这是文本摘要的 Encoder-Decoder 框架;
- 如果 Source 是一句问句,Target 是一句回答,那么这时问答系统或者对话机器人的 Encoder-Decoder 框架。由此可见,在文本处理领域,Encoder-Decoder 的应用领域相当广泛。
- Encoder-Decoder 框架不仅仅在文本领域广泛使用,在语音识别、图像处理等领域也经常使用。比如对于语音识别来说,上图所示的框架完全适用,区别无非是 Encoder 部分的输入是语音流,输出是对应的文本信息;
Encoder-Decode应用于聊天机器人
聊天机器人是一种many to many的网络拓扑结构,核心还是用Encoder-Decoder对不同长度的序列进行处理
数据预处理
训练模型
模型应用
Attention机制
注意力模型最近几年在深度学习各个领域被广泛使用,无论是图像处理、语音识别还是自然语言处理的各种不同类型的任务中,都很容易遇到注意力模型的身影。
觉注意力机制是人类视觉所特有的大脑信号处理机制。人类视觉通过快速扫描全局图像,获得需要重点关注的目标区域,也就是一般所说的注意力焦点,而后对这一区域投入更多注意力资源,以获取更多所需要关注目标的细节信息,而抑制其他无用信息。这是人类利用有限的注意力资源从大量信息中快速筛选出高价值信息的手段,是人类在长期进化中形成的一种生存机制,人类视觉注意力机制极大地提高了视觉信息处理的效率与准确性。
简单的描述一下上图,Attention机制主要是在Decoder的地方加了一层Attention Layer,以往Decoder从Encoder中获取的信息只有Encoder最后的隐状态,包含的信息量不够,或者说在做翻译任务的时候,我们拿笼统的一句话去做翻译是效率比较低的,要关注不同语言相同语义的词语的位置信息,如中文: 你好吗? 英文: How are you? 你
的位置不同,吗
的位置也不同,Attention机制就是解决这种问题的;
所以在每个Dncoder隐状态$S_i$向下一时刻传递的时候,会将$S_i$与Encoder的每一时刻的隐状态$h_1, \ldots, h_n$计算相似度, 再将相似度进行softmax归一化操作,得到权重(使得权重之和为1), 再用权重与各个隐状态相乘相加得到$C_i$, 这个$C_i$就是Attention Layer的产物,最后将$S_i,C_i,Output_{i-1}$(上一时刻的输出,这一时刻的输入)进行拼接,再计算得到结果(Encoder的隐状态不会受$C_i$的影响,只是最终经过FC的时候,拼接了一个$C_i$)
注意
这里说的下标,与上图标注的有一些偏差,以上图来说,就是$S_i,C_{i-1},S_{i-1}$进行拼接;(具体要看S与C从几开始数,如果都是从0开始数的话,上图就是正确的,如果S从0开始数,C从1开始说,那么上文就是正确的,理解即可)
计算相似度矩阵的方式
论文提出的方法
以$S_0$去计算权重为例
其中$V^T,W$都是要计算的矩阵,然后对每个计算出的$\tilde{\alpha_i}$进行softmax变换,得到$\alpha_i$
更常用的方法
其中$W_K,W_Q$都是要计算的矩阵
Self-Attention机制
前面说的Attention机制是在Encoder与Decoder之间计算相似性的一种方式,关注的点在于两种不同序列的相关关系,而Self-Attention则是在Encoder或Decoder中,取代RNN或者LSTM层的一种机制,因为RNN不能很好的做到并行计算,总是会有序列依赖,导致计算只能串行
上图就是Self-Attention计算第一个时刻的上下文向量的过程,计算的$b_i$都不依赖于序列信息,可以并行计算
Multi head
Self-Attention的作者认为一组$W^q,W^k,W^v$矩阵还不够爽,于是拿了$j$组$W^q,W^k,W^v$,计算$b_{i,j}$,最后将$j$组b拼接起来,再乘上矩阵$W^O$得到一个时刻的上下文向量$b_i$
Attention与Self-Attention的区别
如下图所示,线越深表示两者关系越紧密,在英语中的area
与在法语中的zone
的意思是相同的,只是两种语言之间的语法有区别(我猜的...),所以Attention是用于解决Decoder应该侧重学习Encoder的哪些方面的问题
如下图所示,线越深表示两者关系越紧密,Self-attention的作用可以总结为指代消歧
,能得出某一个序列内部词语的相关性,将一些指代不明的词转换成有意义的词语,或者能记住一些固定搭配...