Hierarchical Attention Networks for Document Classification的代码

概述:HAN有两层attention,一层用来捕获词级信息,一层用来捕获文档级信息。结构如图所示

Hierarchical Attention Networks for Document Classification的代码_第1张图片

  • 第一层是embedding层(像大多数nlp网络一样);
  • 第二层是双向GRU,拼接输出,然后attention(这个attention和BiLSTM+attention里面的attetion有点不同)
  • 第三层是句子的attention跟词语attention结构相同
  • 最后就是常用的softmax层。

论文中的损失用的是负对数似然。

详细记录一下这里的attention。

公式比较简单了,但是实现起来有点问题,看了几个源码,竟然不一样。

公式:

H = 双向GRU的输出结果

u = tanh(w*H+b)

a = softmax(u)

r = a*H

最基本的实现方法(与论文相同):

u = tf.nn.tanh(tf.matmul(H,w)+b)
h_similarity = tf.multiply(u,context_vector)
a = softmax(h_similarity)
r = tf.reduce_sum(tf.multiply(a,H))

另一种方法:

u = tf.nn.tanh(tf.matmul(H,w)+b)
h_similarity = tf.multiply(u,context_vector)
logits = tf.reduce_sum(h_similarity,axis = 2)
logits_max = tf.reduce_max(logits,axis = 1, keepdims = True)
a = softmax(logits - logits_max)
r = tf.reduce_sum(tf.multiply(a,H))

就是softmax里面加了个max和sum,搞不懂这是为什么,跪求大佬指导。代码的注释里面说减去max是为了保证numerical stability(为了防止上/下溢出),因为softmax具有平移不变性,所以对结果不影响。但不只这个方法里面有reduce_sum很多代码在实现这一块的功能时都有reduce_sum,还是没有想通,为什么会加reduce_sum。

这里补充说一下gru,先说前向gru,关键代码是:

z = tf.nn.sigmoid(tf.matmul(x,w_z) + tf.matmul(ht_1,h_z) + b_z)
r = tf.nn.sigmoid(tf.matmul(x,w_r) + tf.matmul(ht_1,h_r) + b_r)
h_condidate = tf.tanh(tf.matmul(x,w_h)+ r*tf.matmul(ht_1,h_h) + b_h)
h = z*h_condidate + (1-z)*ht_1

后向gru的核心代码加了两层reverse,第一次是将输入进行逆转(比较好理解,毕竟是后向gru),第二次是对得出的隐藏状态进行逆转,这样可以将每个词语的向量对应起来。

你可能感兴趣的:(Hierarchical Attention Networks for Document Classification的代码)