深入理解 NLP中的attention机制

参考文档:

这三篇足够了。

个人理解:
为何需要attention机制?因为我们需要知道推理下一个词的时候,原来的input句子里哪些词最相关,帮助推理。因此需要输入一个向量,该向量维度固定,且蕴含了输入句子的信息,且是和该输出词最相关的输入词的信息,是有侧重的一个向量,不是整个输入句子的向量。整个句子的向量就是encoder output。

image.png

上图所示,context vector即一般公式里的c就是我们想要的这个向量,额外蕴含了encoder词的信息,关键的地方在于如何计算该c。这个c应该是由上一个decoder的隐藏向量(图中红色),以及encoder的hidden向量(淡绿色)算出来的。

简单来说就是: 红色和淡绿色向量哪个最相关性,就用哪个作为最终的c(深绿色)。更进一步,是淡绿色向量的线性加权,越相关则权重越大,权重就是这里的score。

怎么算score,即相关性?可以用MLP,或者简单的 dot product。即下图中黄线部分。算出来的权重需要归一化,否则过大。之后就是权重和输入向量相乘(即上图中的普通绿色向量),累加的过程,获得最终的输出向量c。

decoder_hidden = [10, 5, 10]
encoder_hidden  score
---------------------
     [0, 1, 1]     15 (= 10×0 + 5×1 + 10×1, the dot product)
     [5, 0, 1]     60
     [1, 1, 0]     15
     [0, 5, 1]     35

此处说明第二 第四个 hidden state更加重要,需要重点关注,因此最终context里的权重占比更大。

image.png

我们希望RNN中,hidden state输出是有意义和相关性的,有表征能力,且这种attention机制被模型学习到了,假设一个翻译的case,I love you,模型翻译输出了 “我”+“爱”,通过attention的机制,知道后面的词 , 和you最相关,有更大概率输出 “你”,而非“情”。

因为在原来的seq2seq里,信息都蕴含在一个encoder的输出向量里,若decoder只在初始处输入一个encoder向量,则 you这个特征可能被丢失掉,从而推理错误。若将encoder输出向量输入到每个decoder时间步里,那么该时间步的decoder也不知道输入句子哪个词更重要。加入了attention机制后,就解决了这些问题。decoder知道了下一个时间步中,最相关的输入词的特征是什么,是“you”。

https://towardsdatascience.com/attn-illustrated-attention-5ec4ad276ee3

推荐阅读更多精彩内容