【论文复现】Hierarchical Attention Networks for Document Classification

写在前面

最近在整理文本分类方面比较经典的模型,看到了“Hierarchical Attention Networks for Document Classification”这篇论文,还是蛮有意思的,作者的想法也非常有特色,然后就去网上找了一些参考资料博客辅助理解,整理一下思路记下来。

论文概述

近年来,在NLP领域,好像最流行的就是RNN、LSTM、GRU、Attention等及其变体的组合框架。这篇论文里作者就对文本的结构进行分析,使用了双向GRU的结构,并且对Attention进行调整:考虑了word层面的attention和sentence层面的attention,分别对单词在句子中和句子在文档中的重要性进行了建模。仔细一想确实是挺合理的,一片文档就是由无数句子构成的,而一个句子又是由无数单词构成的,充分考虑了文档的内部结构。

上图就是论文中文本分类模型的整体框架,可以看出主要分为四个部分:

word encoder  (BiGRU layer)

word attention (Attention layer)

sentence encoder  (BiGRU layer)

sentence attention (Attention layer)

首先回顾一下GRU的原理:
 

GRU是RNN的一个变种,使用门机制来记录当前序列的状态。在GRU中有两种类型的门(gate):reset gate和update gate。这两个门一起控制来决定当前状态有多少信息要更新。

reset gate是用于决定多少过去的信息被用于生成候选状态,如果Rt为0,表明忘记之前的所有状态:

\large r _ { t } = \sigma \left( W _ { r } x _ { t } + U _ { r } h _ { t - 1 } + b _ { r } \right)

根据reset gate的分数可以计算出候选状态:

\large \tilde { h _ { t } } = \tanh \left( W _ { h } x _ { t } + r _ { t } \odot \left( U _ { h } h _ { t - 1 } \right) + b _ { h } \right)

update gate是用来决定由多少过去的信息被保留,以及多少新信息被加进来:

\large z _ { t } = \sigma \left( W _ { z } x _ { t } + U _ { z } h _ { t - 1 } + b _ { z } \right)

最后,隐藏层状态的计算公式,有update gate、候选状态和之前的状态共同决定:

\large h _ { t } = \left( 1 - z _ { t } \right) \odot h _ { t - 1 } + z _ { t } \odot \tilde { h } _ { t }

接着来回顾一下Attention原理:

1、word encoder layer

首先,将每个句子中的单词做embedding转换成词向量,然后,输入到双向GRU网络中,结合上下文的信息,获得该单词对应的隐藏状态输出\large h _ { i t } = \left[ \vec { h _ { i t } } , \tilde { h _ { i t } } \right]

\large x _ { i t } = W _ { e } w _ { i t } , t \in [ 1 , T ]

\large \vec { h _ { i t } } = \vec { G R U } \left( x _ { i t } \right)

\large \stackrel { \leftarrow }{ h _ { i t } } = \stackrel { \leftarrow } { G R U } \left( x _ { i t } \right)

2、word attention layer

attention机制的目的就是要把一个句子中,对句子表达最重要的单词找出来,赋予一个更大的比重。

首先将word encoder那一步的输出得到的\large h_{it_{}}输入到一个单层的感知机中得到结果\large u_{it_{}}作为其隐含表示

\large u _ { i t } = \tanh \left( W _ { w } h _ { i t } + b _ { w } \right)

接着为了衡量单词的重要性,定义了一个随机初始化的单词层面上下文向量\large u _ { w },计算其与句子中每个单词的相似度,然后经过一个softmax操作获得了一个归一化的attention权重矩阵\large \alpha _ { i t },代表句子i中第t个单词的权重:

\large \alpha _ { i t } = \frac { \exp \left( u _ { i t } ^ { \top } u _ { w } \right) } { \sum _ { t } \exp \left( u _ { i t } ^ { \top } u _ { w } \right) }

于是,句子的向量Si就可以看做是句子中单词的向量的加权求和。这里的单词层面上下文向量\large u _ { w }是随机初始化并且可以在训练的过程中学习得到的,我们可以把它看成是一种query的高级表示:“句子中哪些词含有比较重要的信息?”

\large s _ { i } = \sum _ { t } \alpha _ { i t } h _ { i t }

3、sentence encoder

通过上述步骤我们得到了每个句子的向量表示,然后可以用相似的方法得到文档向量\large h _ { i } = \left[ \vec { h _ { i } } , \stackrel { \leftarrow } { h _ { i } } \right]

\large \vec { h } _ { i } = \vec { \mathrm { GRU } } \left( s _ { i } \right) , i \in [ 1 , L ]

\large \stackrel { \leftarrow } { h _ { i } } = \stackrel { \leftarrow } { G R U } \left( s _ { i } \right) , i \in [ L , 1 ]

4、sentence attention

和词级别的attention类似,我们也提出了一个句子级别的上下文向量u_{s},来衡量一个句子在整篇文本的重要性。

\large u _ { i } = \tanh \left( W _ { s } h _ { i } + b _ { s } \right)

\large \alpha _ { i } = \frac { \exp \left( u _ { i } ^ { \top } u _ { s } \right) } { \sum _ { t } \exp \left( u _ { t } ^ { \top } u _ { s } \right) }

\large v = \sum _ { i } \alpha _ { i } h _ { i }

5、softmax

上面的v向量就是我们的到的最后的文档表示,然后输入一个全连接的softmax层进行分类就ok了。

模型效果

代码实现

https://github.com/KaiyuanGao/text_claasification/tree/master/han_classification

以上~

猜你喜欢

转载自blog.csdn.net/Kaiyuan_sjtu/article/details/85065962