为何要引入Attention机制
由于RNN具有长梯度消失的问题,对于很长的句子,仅仅通过输出序列转化成定长的隐状态向量,难以保存完整的信息。肯定会有损失,造成效果下降。这样的话,我们就引入了Attention机制。
Attention机制的引入
为了解决由输入长序列转化成定长向量,中间造成的信息损失,Attention注意力机制被引入了。
__Attention会将注意力只集中到 当前 “ 翻译 ” 部分相关的上下文。而不仅局限于原来模型中定长的隐藏向量,并且不会丧失长程的信息。
数学表达
image.png如上图所示:
RNN结构得到encoder中的hidden state(h1, h2,...,hT)
decoder中的hidden state(s1, s2,...,sT)
假设当前decoder的hidden state是 st-1, 那么:
1. 我们如何获得下一个decode state的st呢?
2. 又如何获得st对应的输出yt呢?
3. 其中的Q 、K、V又都是什么呢?
在Attention中也是由Q,K,V的,分别指代什么呢?
- Q 就是 st-1
- K 就是各隐层状态 h1, h2,...,hT
- V 就是各隐层状态 h1, h2,...,hT
Q * K = ( st-1 * h1,st-1 * h2, ..., st-1 * ht-1,)
Ct = Σi sortmax(Q * K)i * Vi
- st = f (st-1, yt-1, Ct)
- yt = p ( yt/ yt,..., yt, X) = g (yt-1, st, Ct)
Ct是通过Q,K,V混合计算来的,这部分很关键,通过此可以得到encoder与decoder之间的关联性的权重,进而得到Attention分布,进而得到对于当前输出位置比如重要的输入权重自然就会大,不重要的权重自然也会小。个人理解不希勿喷,Q,K就是看不同词embedding向量相似度,相近的,有关系的词,自然权重就高点,没关系的就低点。
网友评论