深入理解NLP中的self-attention机制

https://zhuanlan.zhihu.com/p/96680586
https://towardsdatascience.com/illustrated-self-attention-2d627e33b20a
https://mp.weixin.qq.com/s?__biz=MzIwMTc4ODE0Mw==&mid=2247486960&idx=1&sn=1b4b9d7ec7a9f40fa8a9df6b6f53bbfb&chksm=96e9d270a19e5b668875392da1d1aaa28ffd0af17d44f7ee81c2754c78cc35edf2e35be2c6a1&scene=21#wechat_redirect
https://blog.csdn.net/weixin_42060232/article/details/107475662

对应于seq2seq + attention 模型:

  • decoder hidden state : (query)
  • encoder hidden states: (values) + keys

其实seq2seq中的 attention是self-attention的 特殊版。即v和K都是同一值。Q和K做点乘,softmax后得到权重,再和V相乘获得最终合并后的context vector。而self-attention中,QKV都是不同的,且是根据input做一个线性变换得到的,参数可训练。即每个单词的Q是自己,算他的新向量的时候需要把他自己作为Q,和自己的K和其他单词的K做点乘算score,之后 和V相乘相加,获得新的embedding。


image.png
image.png

https://zhuanlan.zhihu.com/p/47282410
seq2seq + attention 模型已经考虑到了 encoder和decoder之间的词的关系,但是没考虑到 输入句子,词和词之间本身就是有关联性的。

self-attention中encoder读入输入数据,利用层层叠加的Self-Attention机制对每一个词得到新的考虑了上下文信息的表征。Decoder也利用类似的Self-Attention机制,但它不仅仅看之前产生的输出的文字,而且还要attend encoder的输出。同时,每个词可以并行计算,不需要之前那样有时间步的概念,因此大大提速了。

https://vdn1.vzuu.com/SD/feb4e6b8-2397-11eb-9748-0eb20c5883f6.mp4?disable_local_cache=1&auth_key=1626514649-0-0-bd220acb0821e8796b3ae79ab420bf9f&f=mp4&bu=pico&expiration=1626514649&v=hw

https://zhuanlan.zhihu.com/p/137578323

这种命名的方式来源于搜索领域,假设我们有一个key-value形式的数据集,就比如说是我们知乎的文章,key就是文章的标题,value就是我们文章的内容,那这个搜索系统就是希望,能够在我们输入一个query的时候,能够唯一返回一篇最我们最想要的文章。那在self-attention中其实是对这个task做了一些退化的处理,我们优化并不是返回一篇文章,而是返回所有的文章value,并且使用key和query计算出来的相关权重,来找到一篇得分最高的文章。


  因此,self -Attention比传统的Attention mechanism效果要好,主要原因之一是,传统的Attention机制忽略了源端或目标端句子中词与词之间的依赖关系,相对比,self Attention可以不仅可以得到源端与目标端词与词之间的依赖关系,同时还可以有效获取源端或目标端自身词与词之间的依赖关系。

推荐阅读更多精彩内容