Disconnected Recurrent Neural Networks for Text Categorization github code
1 引言
RNN模型擅长对整个句子进行建模,捕捉长距离依赖信息。然而研究表明,RNN对整个句子建模有时会成为一种负担,使模型忽略了关键的短语信息。CNN模型则正相反,更擅长抽取局部的位置不变特征,而不擅长捕捉长距离依赖信息。为此,我们提出了DRNN模型,通过限制RNN模型信息的流动,将位置不变性引入RNN模型中。这使得DRNN模型既能捕捉长距离依赖信息,又可以很好地抽取关键短语信息。
DRNN阻断循环神经网路代码:
with tf.name_scope("DGRU_MLP"):
self.hidden = []
print(self.embedding_chars_dropout.shape)
self.input = tf.pad(self.embedding_chars_dropout, [[0, 0], [num_k-1, 0], [0, 0]])
print(self.input.shape)
start = 0
end = start + num_k - 1
while end < (sequence_length+num_k-1):
input_k = self.input[:, start:end, :]
with tf.name_scope("gru"), tf.variable_scope('rnn') as scope:
cell = tf.contrib.rnn.GRUCell(hidden_size)
if start != 0:
scope.reuse_variables()
enconder_outputs, state = tf.nn.dynamic_rnn(cell, input_k, dtype=tf.float32)
with tf.name_scope("dropout"):
state_dropout = tf.nn.dropout(state, self.dropout_keep_prob)
with tf.name_scope("mlp"), tf.variable_scope('mlp') as scope:
if start != 0:
scope.reuse_variables()
W = tf.get_variable("W", shape=[hidden_size, 200],
initializer=tf.contrib.layers.xavier_initializer())
b = tf.Variable(tf.constant(0.1, shape=[200]), name="b")
mlp_output = tf.nn.relu(tf.nn.xw_plus_b(state_dropout, W, b), name='output')
self.hidden.append(mlp_output)
self.hidden_concat = tf.concat(self.hidden, 1)
start += 1
end += 1
2 模型介绍
表1是一个主题分类的例子,我们可以看到两句话表意基本相同,都应该被分类到科技类。其中决定分类的关键短语是“unsolved mysteries of mathematics”,对于一个窗口大小为4的CNN模型来说,两个句子中的该短语表示完全相同。然而,当我们把两句话送入RNN模型的时候,因为RNN模型中,每一个时刻的隐层状态都和前面所有词语相关,所以这两个短语的表示是完全不同的。这增大了模型捕捉关键短语的难度,使得RNN模型有时会忽视一些关键信息。
为了解决上述问题,我们希望通过将位置不变性引入RNN模型中,使得RNN模型既可以捕捉长距离依赖信息,又可以更好地抽取位置不变的局部特征。具体来说,我们会阻断RNN模型的信息流动,使其最多只能传递固定的步长k。这样的话,每个时刻的隐层状态就只和当前词以及前k-1个词相关。
图1是RNN模型、DRNN模型和CNN模型的一个对比图。如图所示,对于RNN来说,隐层状态h与前面所有的词都相关,而对于DRNN,则只与当前词及之前的k-1个词相关。DRNN模型也可以被认为是一种特殊的CNN模型,只是将CNN模型中的卷积核替换成了RNN。显然,DRNN和CNN一样,对于长度为k的短语,无论它在文本中的什么位置,都具有相同的表示。DRNN模型t时刻的隐藏层输出可以表示成如下形式:
这里k是窗口大小,RNN可以是naive RNN, LSTM 、GRU或任何其他类别的递归神经单元。
DRNN是一种通用的模型框架,可以应用在很多任务中,我们主要将其应用在文本分类任务中,对应的模型结构见图2。我们采用GRU作为DRNN的循环单元,得到Disconnected Gated Recurrent Unit模型。我们首先将DGRU的每个隐层表示送入MLP中,来抽取更高层的特征信息。然后再通过Max Pooling来抽取整个文本中最重要的信息,最后再通过一层MLP,然后送入softmax中进行分类。
为了缓解过拟合问题,我们将dropout正则化应用于DRNN模型。Dropout通常应用于输入和输出层,而不是隐藏状态,因为之前状态的数量是可变的。相比之下,我们的DRNN模型每一步的输出窗口大小是固定的,所以我们也在隐藏状态下应用dropout。在本文中,我们将dropout应用于输入层、输出层和隐藏状态。图3显示了应用dropout的区别。