基于中断循环神经网络DRNN的文本分类

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的区别。

                                              

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值