Hierarchical Attention Networks for Document Classification的代码

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

  • 第一层是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),第二次是对得出的隐藏状态进行逆转,这样可以将每个词语的向量对应起来。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值