学习笔记第一篇之RNN

 引言

   递归神经网络(Recurrent Neural Network, RNN)是神经网络家族的重要成员,而且也是深度学习领域中的得力干将,因为深度学习广泛应用的领域如语音识别,机器翻译等都有RNN的身影。与经典的神经网络不同,RNN主要解决的是样本数据为序列的建模问题,如语音序列,语言序列。因为对于序列数据来说,大部分情况下序列的每个元素并不是相互独立,其存在依赖关系,而RNN特别适合这类建模问题。本文会介绍RNN的原理及应用,并动手实现一个RNN预测模型。

   原理

    RNN处理的是序列建模问题。给定一个长度为T输入序列{x0,x1...,xt,....,xT},这里 表示的是序列在t时刻的输入特征向量,这里的t时刻并不一定真的指的是时间,只是用来表明这是一个序列输入问题。现在要得到每个时刻的隐含特征{h0,h1...,ht,....,hT} ,这些隐含特征用于后面层的特征输入。如采用传统的神经网络模型,只需要计算:

                                                                                   

其中f为非线性激活函数。但是这样明显忽略了这是一个序列输入问题,即丢失了序列中各个元素的依赖关系。对于RNN模型来说,其在计算t时刻的特征时,不仅考虑当前时刻的输入特征xT ,而且引入前一个时刻的隐含特征ht-1 ,其计算过程如下:

                                                                          

    显然这样可以捕捉到序列中依赖关系,可以认为是一个ht-1记忆特征,其提取了前面t-1个时刻的输入特征,有时候又称ht-1为旧状态,而ht为新状态。因此,RNN模型特别适合序列问题。从结构上看,RNN可以看成有环的神经网络模型,如图1所示。不过可以将其展开成普通的神经网络模型,准确地说展开成T个普通的神经网络模型。但是这T个神经网络不是割立的,其所使用参数是一样的,即权重共享。这样每一个时刻,RNN执行的是相同的计算过程,只不过其输入不一样而已。所以本质上,RNN也只不过多个普通的神经网络通过权值共享连接而成。

    还有一点,RNN可以提取一组特征{h0,h1...,ht,....,hT},但是并不是所有的特征都会送入后面的层,如果你只是需要根据输入序列进行分类,可能你仅需要最后时刻的特征hT。这和具体的应用场景相关。

 训练

    RNN模型像其他神经网络模型一样也是采用梯度下降法训练,相应的也需要计算梯度。计算梯度也是采用BP算法,但是由于RNN的特殊性,其对应的BP算法又称为BPTT(Backpropagation Through Time)。BPTT的背后含义是梯度还要在时间层进行反向传播,这很好理解,比如ht的梯度ht-1,....,h0还要对做贡献。这从数学公式上可以看出来的,本质上还是链式规则。但是你可能知道梯度消失的问题,在RNN模型中其同样存在。梯度消失的问题在RNN上表现为ht的梯度传播距离可能有限,这带来的一个直接后果是:RNN对长依赖序列问题(long-term dependencies)无效。这使得经典的RNN模型的应用很受限,所以才会出现RNN的变种如LSTM,它们可以很好地解决这类问题。

 应用

    RNN主要应用在输入为序列数据的业务场景。其中一个很重要的领域是自然语言处理,如语言模型及机器翻译等。RNN还可以对具有周期性特征的数据建立预测模型。对于序列问题,可以用下图来说明RNN的应用。

                    

   其中one to one是典型的神经网络的应用,给定一个输入,预测一个输出。而其他的情形都需要应用RNN模型。one to many的一个例子是图像(Image Captioning),输入一个图片,得到对图片的语言描述,这是一个序列输出。对于many to one,其应用实例如情感分类(Sentiment Classification),给定一句话判断其情感,其中输入是序列。第一种Many to many的典型应用场景是机器翻译,比如一句英文,输出一句中文,这时输入与输出都是序列。第二种many to many可以应用在视频分类问题(Video classification on frame level),输入一段视频,对每一帧图片分类。见RNN模型广泛应用在各种业务场景中。

猜你喜欢

转载自blog.csdn.net/zhangye_2017/article/details/78669932