参考文献:Hierarchical Attention Networks for Document Classification
文献中主要讨论了层次的注意力机制在文本分类中的应用,这里的两层神经网络模型结构基本相同
首先通过word_embedding将每一个句子的单词映射成embedding向量,输入到神经网络当中,
此处为双向GRU网络,然后加入attention机制,实际上就是添加两层网络,一层大小为attention_size,每一次的输入为
h
i
t
h_{it}
hit,输出为,然后利用softmax函数获取每一次输出的权重,最终加权每一次输出获得句子的表示。文中attention_size层激活函数为tanh。公式如下:
u
i
t
=
t
a
n
h
(
W
w
h
i
t
+
b
w
)
.
.
.
.
.
.
.
.
1
u_{it}=tanh(W_wh_{it}+b_w)........1
uit=tanh(Wwhit+bw)........1
α
i
t
=
exp
(
u
i
t
T
u
w
)
∑
t
exp
(
u
i
t
T
u
w
)
.
.
.
.
.
.
.
.
2
\alpha_{it} =\frac {\exp(u_{it}^Tu_w)}{\sum_t \exp(u_{it}^Tu_w)}........2
αit=∑texp(uitTuw)exp(uitTuw)........2
s
i
=
∑
t
α
i
t
h
i
t
.
.
.
.
.
.
.
.
3
s_i =\sum_t \alpha_{it}h{it}........3
si=t∑αithit........3
h i t h_it hit为每一次的输出信息, W w W_w Ww大小为attention_size × \times × 2*T , u i t u_it uit为接入attention层以后的输出信息, u i t T u w u_{it}^Tu_w uitTuw为attention输出信息的加权和, u w u_w uw为attention向量。然后运用softmax函数获得每一次输出权重,最终加权和输出获取最终的文本表示方法。文本到类别的训练方法类似。
tensorflow实现:
定义attention layer
attention_size = attn_size
with tf.name_scope('attention'), tf.variable_scope('attention'):
#定义W_w
attention_w = tf.Variable(tf.truncated_normal([2*rnn_size, attention_size], stddev=0.1), name='attention_w') #W_w
#定义b_w
attention_b = tf.Variable(tf.constant(0.1, shape=[attention_size]), name='attention_b')# b_w
u_list = []
for t in xrange(sequence_length):
#公式1
u_t = tf.tanh(tf.matmul(outputs[t], attention_w) + attention_b) #
u_list.append(u_t)
#定义u_w
u_w = tf.Variable(tf.truncated_normal([attention_size, 1], stddev=0.1), name='attention_uw')
attn_z = []
for t in xrange(sequence_length):
#公式2括号里面的内容
z_t = tf.matmul(u_list[t], u_w)
attn_z.append(z_t)
# transform to batch_size * sequence_length
attn_zconcat = tf.concat(attn_z, axis=1)
#运用softmax函数
self.alpha = tf.nn.softmax(attn_zconcat)
# transform to sequence_length * batch_size * 1 , same rank as outputs
alpha_trans = tf.reshape(tf.transpose(self.alpha, [1,0]), [sequence_length, -1, 1])
#公式3
self.final_output = tf.reduce_sum(outputs * alpha_trans, 0)