美文网首页
循环神经网络系列

循环神经网络系列

作者: rogeroyer | 来源:发表于2019-05-26 10:50 被阅读0次

    前沿

    经验是智慧之父,记忆是智慧之母。        -谚语

      在前馈神经网络中,信息的传递是单向的,这种限制虽然使得网络变得更容易学习,但在一定程度上也减弱了神经网络模型的能力。在生物神经网络中,神经元之间的连接关系要复杂的多。前馈神经网络可以看作是一个复杂的函数,每次输入都是独立的,即网络的输出只依赖于当前的输入。但是在很多现实任务中,网络的输入不仅和当前时刻的输入相关,也和其过去一段时间的输出相关。比如一个有限状态自动机,其下一个时刻的状态(输出)不仅仅和当前输入相关,也和当前状态(上一个时刻的输出)相关。此外,前馈网络难以处理时序数据,比如视频、语音、文本等。时序数据的长度一般是不固定的,而前馈神经网络要求输入和输出的维数都是固定的,不能任意改变。因此,当处理这一类和时序相关的问题时,就需要一种能力更强的模型。

    循环神经网络

      循环神经网络(Recurrent Neural Network,RNN)是一类具有短期记忆能力的神经网络。在循环神经网络中,神经元不但可以接受其它神经元的信息,也可以接受自身的信息,形成具有环路的网络结构。和前馈神经网络相比,循环神经网络更加符合生物神经网络的结构。循环神经网络已经被广泛应用在语音识别、语言模型以及自然语言生成等任务上。循环神经网络的参数学习可以通过随时间反向传播算法[Werbos, 1990] 来学习。随时间反向传播算法即按照时间的逆序将错误信息一步步地往前传递。当输入序列比较长时,会存在梯度爆炸和消失问题[Bengio et al., 1994, Hochreiter and Schmidhuber, 1997, Hochreiteret al., 2001],也称为长期依赖问题。为了解决这个问题,人们对循环神经网络进行了很多的改进,其中最有效的改进方式引入门控机制。
      此外,循环神经网络可以很容易地扩展到两种更广义的记忆网络模型:递归神经网络和图网络。

    循环神经网络

    简单循环神经网络

    简单循环神经网络
    简单循环神经网络

    参数学习

    循环神经网络参数学习

    循环神经网络中的梯度计算方式

      在循环神经网络中主要有两种计算梯度的方式:随时间反向传播(BPTT)实时循环学习(RTRL)算法

    随时间反向传播算法
    随时间反向传播算法
    随时间反向传播算法
    实时循环学习算法
    实时循环学习算法
    实时循环学习算法

    长期依赖问题

    长期依赖问题
    长期依赖问题

    改进方案

    改进方案
    改进方案

    基于门控的循环神经网络

      为了改善循环神经网络的长期依赖问题,一种非常好的解决方案是在公式(6.50)的基础上,引入门控机制来控制信息的累积速度,包括有选择地加入新的信息,并有选择地遗忘之前累积的信息。这一类网络可以称为基于门控的循环神经网络(Gated RNN)。本节中,主要介绍两种基于门控的循环神经网络:长短期记忆网络门控循环单元网络

    长短期记忆网络(LSTM)

    长短期记忆网络
    长短期记忆网络
    长短期记忆网络

    门控循环单元网络(GRU)

    门控循环单元网络
    门控循环单元网络

    堆叠循环神经网络

    堆叠循环神经网络

    双向循环神经网络

    双向循环神经网络
    双向循环神经网络

    递归神经网络

    递归神经网络
    递归神经网络

    Text-RNN

      本文引用了论文《Recurrent Neural Network for Text Classification with Multi-Task Learning》。

      基于神经网络的方法在各种自然语言处理任务上取得了很大进展。 然而,在大多数先前的工作中,模型是基于单任务监督目标学习的,其通常受到训练数据不足的影响。 在本文中,我们使用多任务学习框架来共同学习多个相关任务。 基于递归神经网络,我们提出了三种不同的共享信息机制,以模拟具有任务特定和共享层的文本。 整个网络共同训练所有这些任务。 对四个基准文本分类任务的实验表明,我们提出的模型可以借助其他相关任务来提高任务的性能。

      TextRNN顾名思义,就是将循环神经网络用于文本文本相关任务 循环神经网络用于文本分类

    循环神经网络用于文本分类
      在单个特定任务中,一个简单的策略是使用一个RNN将输入序列映射到固定大小的矢量,然后将矢量馈送到softmax层以进行分类或其他任务。
      给定文本序列 = {,,...,},我们首先使用查找层来获得每个单词的向量表示(嵌入)。 最后时刻的输出可以被视为整个序列的表示,其具有一个全连接层,其后是softmax非线性层,其预测类上的概率分布。
      上图展示了用于文本分类的展开的RNN结构。
      最后训练网络的参数以最小化预测值和真实标签的交叉熵。
       =
      上式中, 表示真实标签, 是预测概率值,代表训练样本个数,是类别数量。

    keras 实现Text-RNN

    # coding=utf-8
    
    from keras import Input, Model
    from keras.layers import Embedding, Dense, Dropout, CuDNNLSTM
    
    
    class TextRNN(object):
        def __init__(self, maxlen, max_features, embedding_dims,
                     class_num=1,
                     last_activation='sigmoid'):
            self.maxlen = maxlen
            self.max_features = max_features
            self.embedding_dims = embedding_dims
            self.class_num = class_num
            self.last_activation = last_activation
    
        def get_model(self):
            input = Input((self.maxlen,))
    
            embedding = Embedding(self.max_features, self.embedding_dims, input_length=self.maxlen)(input)
            x = CuDNNLSTM(128)(embedding)  # LSTM or GRU
    
            output = Dense(self.class_num, activation=self.last_activation)(x)
            model = Model(inputs=input, outputs=output)
            return model
    

    RCNN

      Region CNN(RCNN)可以说是利用深度学习进行目标检测的开山之作。作者Ross Girshick多次在PASCAL VOC的目标检测竞赛中折桂,2010年更带领团队获得终身成就奖,如今供职于Facebook旗下的FAIR。 文本领域中的RCNN(Recurrent Convolutional Neural Networks)指的是将循环神经网络和卷积神经和网络结合起来用于解决文本相关任务。

    keras实现RCNN

    # coding=utf-8
    
    from keras import Input, Model
    from keras import backend as K
    from keras.layers import Embedding, Dense, SimpleRNN, Lambda, Concatenate, Conv1D, GlobalMaxPooling1D
    
    
    class RCNN(object):
        def __init__(self, maxlen, max_features, embedding_dims,
                     class_num=1,
                     last_activation='sigmoid'):
            self.maxlen = maxlen
            self.max_features = max_features
            self.embedding_dims = embedding_dims
            self.class_num = class_num
            self.last_activation = last_activation
    
        def get_model(self):
            input_current = Input((self.maxlen,))
            input_left = Input((self.maxlen,))
            input_right = Input((self.maxlen,))
    
            embedder = Embedding(self.max_features, self.embedding_dims, input_length=self.maxlen)
            embedding_current = embedder(input_current)
            embedding_left = embedder(input_left)
            embedding_right = embedder(input_right)
    
            x_left = SimpleRNN(128, return_sequences=True)(embedding_left)
            x_right = SimpleRNN(128, return_sequences=True, go_backwards=True)(embedding_right)
            x_right = Lambda(lambda x: K.reverse(x, axes=1))(x_right)
            x = Concatenate(axis=2)([x_left, embedding_current, x_right])
    
            x = Conv1D(64, kernel_size=1, activation='tanh')(x)
            x = GlobalMaxPooling1D()(x)
    
            output = Dense(self.class_num, activation=self.last_activation)(x)
            model = Model(inputs=[input_current, input_left, input_right], outputs=output)
            return model
    

    参考文献

    <kbd>《深度学习与神经网络》</kbd>
    <kbd>《Recurrent Neural Network for Text Classification with Multi-Task Learning》</kbd>

    相关文章

      网友评论

          本文标题:循环神经网络系列

          本文链接:https://www.haomeiwen.com/subject/yyjxtctx.html