最近在看一些Event Extraction和Event Detection的论文,看到其中有些论文会用到Attention机制,在阅读Attention相关论文的时候,对于论文中的一些符号表示,钻了一些牛角尖,所幸最后还是理解了
关于Attention机制的论文:Effective Approaches to Attention-based Neural Machine Translation
全局注意力机制(Global Attention)模型如下:
先直接说明模型图中各个变量的含义,再慢慢分析Global Attention机制:
- h s h_{s} hs:表示LSTM中s时刻得到的hidden state
- h t h_{t} ht:表示LSTM得到的目标hidden state
- a t ( s ) a_{t}(s) at(s):表示s时刻的hidden state在所有hidden state中所占的权重, a t ( s ) a_{t}(s) at(s)是一个标量
- a t a_{t} at:将所有t个时刻的hidden state的权重组合起来,便得到了 a t a_{t} at, a t a_{t} at的长度与时间步长相同,即与一句话中的单词的个数相同
- c t ( s ) c_{t}(s) ct(s):将s时刻的hidden state h s h_{s} hs与其权重 a t ( s ) a_{t}(s) at(s)相乘,便得到s时刻(即第s个单词)的上下文向量 c t ( s ) c_{t}(s) ct(s)
- c t c_{t} ct:将全部单词的上下文向量,求平均值或者求和,便可以得到由输入的单词组成的一句话的句向量
在LSTM模型中,依次输入一句话中的各个单词的词向量,由LSTM的结构可知,每一个时刻s(每输入一个单词)都会得到一个hidden state h s h_{s} hs,当到达最后一个时刻t时,会得到target hidden state h t h_{t} ht。在之前的做法中,只会用到LSTM最终产生的 h t h_{t} ht,而LSTM中间产生的一系列 h s h_{s} hs并不会被用上。这就会产生一些问题:
- 模型对于一句话中的每个单词都是“一视同仁”的,但当人在读一句话的时候,往往对于某些关键的单词会给予更多的关注。
- LSTM是长短时记忆网络,其中包含的遗忘门,对于先进入网络的单词,忘记的程度更大,所以该网络更加倾向于记住后输入网络的单词,也就是说得到的向量 h t h_{t} ht会过多地关注一句话中结尾的单词
以上问题,可以使用全局注意力机制(Gobal Attention)来解决。
- Gobal Attention的目的:Gobal Attention的目的是为了在生成上下文向量(也可以认为是句向量) c t c_{t} ct时将所有的hidden state都考虑进去。Attention机制认为每个单词在一句话中的重要程度是不一样的,通过学习得到一句话中每个单词的权重。
- 如何衡量每个单词在一句话中的权重呢? 对于第s个单词,它在一句话中的权重,是根据s时刻的hidden state h s h_{s} hs与 h t h_{t} ht计算而得到的。第s个单词的权重记做 a t ( s ) a_{t}(s) at(s)
s时刻的单词的权重计算公式如下,其中
h
t
h_{t}
ht表示最终的hidden stste,而
h
s
h_{s}
hs表示s时刻的hidden state:
- 其中score打分函数有如下三种形式:
有了上面的基础,我们在重新梳理一下如何通过Global Attention获得每个单词的上下文向量,从而获得句向量:
- 将每个单词的词向量依输入LSTM中,s时刻获得hidden state的记为 h s h_{s} hs,最终获得的目标hidden state记为 h t h_{t} ht
- 使用打分函数score( h t h_{t} ht, h s h_{s} hs)获得每个时刻的得分
- 通过softmax()函数,将所有时刻的得分进行归一化,从而得到各个时刻权重 a t ( s ) a_{t}(s) at(s),每个时刻的权重都是一个标量
- 将各个时刻的权重 a t ( s ) a_{t}(s) at(s)与 h s h_{s} hs数乘计算,就得到该时刻添加了Global Attention之后的上下文向量 c t ( s ) c_{t}(s) ct(s)
- 将每个时刻的上下文向量 c t ( s ) c_{t}(s) ct(s)求均值或者求和之后,就得到整句话的上下文向量 c t c_{t} ct,可以认为 c t c_{t} ct就是这句话的句向量