[NLP学习笔记-Task9] Attention原理 + HAN原理

RNN、CNN中获取全局信息的缺陷

在这里插入图片描述

Attention

Attention定义

Google 的一般化 Attention 思路也是一个编码序列的方案,因此我们也可以认为它跟 RNN、CNN 一样,都是一个序列编码的层。
[NLP学习笔记-Task9] Attention原理 + HAN原理_第1张图片
Google 给出的方案是很具体的。首先,它先把 Attention 的定义给了出来:
[NLP学习笔记-Task9] Attention原理 + HAN原理_第2张图片

Multi-Head Attention

[NLP学习笔记-Task9] Attention原理 + HAN原理_第3张图片
这个是 Google 提出的新概念,是 Attention 机制的完善。不过从形式上看,它其实就再简单不过了,就是把 Q, K, V 通过参数矩阵映射一下,然后再做 Attention,把这个过程重复做 h 次,结果拼接起来就行了,可谓“大道至简”了。具体来说:
[NLP学习笔记-Task9] Attention原理 + HAN原理_第4张图片

Self Attention

[NLP学习笔记-Task9] Attention原理 + HAN原理_第5张图片

Position Embedding(位置向量)

然而,只要稍微思考一下就会发现,这样的模型并不能捕捉序列的顺序!换句话说,如果将 K, V 按行打乱顺序(相当于句子中的词序打乱),那么 Attention 的结果还是一样的。这就表明了,到目前为止,Attention 模型顶多是一个非常精妙的“词袋模型”而已。

这问题就比较严重了,大家知道,对于时间序列来说,尤其是对于 NLP 中的任务来说,顺序是很重要的信息,它代表着局部甚至是全局的结构,学习不到顺序信息,那么效果将会大打折扣(比如机器翻译中,有可能只把每个词都翻译出来了,但是不能组织成合理的句子)。

于是 Google 再祭出了一招——Position Embedding,也就是“位置向量”,将每个位置编号,然后每个编号对应一个向量,通过结合位置向量和词向量,就给每个词都引入了一定的位置信息,这样 Attention 就可以分辨出不同位置的词了。

Position Embedding 并不算新鲜的玩意,在 FaceBook 的《Convolutional Sequence to Sequence Learning》也用到了这个东西。但在 Google 的这个作品中,它的 Position Embedding 有几点区别:
[NLP学习笔记-Task9] Attention原理 + HAN原理_第6张图片

HAN(Hierarchy Attention Network)

相较于TextCNN,HAN最大的进步在于完全保留了文章的结构信息,并且特别难能可贵的是,基于attention结构有很强的解释性。
[NLP学习笔记-Task9] Attention原理 + HAN原理_第7张图片
输入词向量序列后,通过词级别的Bi-GRU后,每个词都会有一个对应的Bi-GRU输出的隐向量h,再通过uw向量与每个时间步的h向量点积得到attention权重,然后把h序列做一个根据attention权重的加权和,得到句子summary向量s2,每个句子再通过同样的Bi-GRU结构再加attention得到最终输出的文档特征向量v向量,然后v向量通过后级dense层再加分类器得到最终的文本分类结果。模型结构非常符合人的从词->句子->再到篇章的理解过程。

最重要的是该模型在提供了更好的分类精度的情况下,可视化效果非常好。同时在调参过程中,我们发现attention部分对于模型的表达能力影响非常大,整个模型在所有位置调整L2-Loss对模型表达能力带来的影响远不如在两处attention的地方大,这同时也能解释为什么可视化效果比较好,因为attention对于模型的输出贡献很大,而attention又恰恰是可以可视化的。

下面我们来看一下他在法律领域罪名预测任务上的可视化效果。下面的可视化的结果并不是找了极少数效果好的,而是大部分情况下模型的可视化能够解释他的输出。需要注意的是,此处为了让不太重要句子中相对重要的词并不完全不可见,词的亮度=sqrt(句子权重) * 词权重。

参考资料

  • 《Attention is All You Need》浅读(简介 + 代码)
  • 达观数据曾彦能:如何用深度学习做好长文本分类与法律文书智能化处理
  • 【NLP】Attention原理和源码解析

你可能感兴趣的:(NLP)