一、RNN概述(Recurrent Neural Network)

1.RNN怎么来的

对于一般神经网络、CNN(Convolutional Neural Networks)卷积神经网络,他们的输出都只是考虑了前一个输入的影响,而不考虑其他时刻输入的影响,比如简单的猫,狗,手写数字等单个物体的识别具有较好的效果。但是,对于一些与时间先后有关的,比如前后文内容预测等,这些算法表现就不尽人意,因此,RNN应运而生了。

2.RNN是什么

RNN是一种特殊的神经网络结构,它是根据"人的认知是基于过往的经验和记忆"来提出的,它不同于全连接神经网络、CNN卷积神经网络的地方在于,它不仅考虑当前时刻的输入,同时也赋予了网络对前面内容的一种“记忆”功能。

RNN之所以称为循环神经网络,即一个序列当前的输出与前面的输出也有关。具体表现形式为网络会对前面的信息进行记忆并应用于当前输出的计算中,即隐藏层之间的节点。

    如下是一个一般神经网络结构---全连接神经网络的结构:

rnn循环神经网络 java rnn循环神经网络结构_rnn循环神经网络 java

他们的前提假设都是:元素之间是相互独立的,输入与输出也是独立的,比如猫和狗。

但现实中,很多元素是相互连接的,比如股票随时间的变化,,一个人说:我喜欢旅游,其中最喜欢的地方是云南,以后有机会一定要去_______,这里天空,大家都知道是填"云南"。因为我们是根据上下文内容推断出来的,但机器要做到这一步就相当得难了。因此,就有了RNN,其本质是:像人一样拥有记忆的能力。因此,它的输出就依赖于当前的输入和记忆。

3.RNN的应用

RNN主要应用于NLP(自然语言处理),语音识别,机器翻译,文本相似度计算,音乐/视频推荐,商品推荐等

二、语言模型

语言模型就是这样的东西:给定一个一句话前面的部分,预测接下来最有可能的一个词是什么。

使用RNN之前,语言模型主要是采用N-Gram。N可以是一个自然数,比如2或者3。它的含义是,假设一个词出现的概率只与前面N个词相关。我们以2-Gram为例。首先,对前面的一句话进行切词:

我 昨天 上学 迟到 了 ,老师 批评 了 ____。

如果用2-Gram进行建模,那么电脑在预测的时候,只会看到前面的『了』,然后,电脑会在语料库中,搜索『了』后面最可能的一个词。不管最后电脑选的是不是『我』,我们都知道这个模型是不靠谱的,因为『了』前面说了那么一大堆实际上是没有用到的。如果是3-Gram模型呢,会搜索『批评了』后面最可能的词,感觉上比2-Gram靠谱了不少,但还是远远不够的。因为这句话最关键的信息『我』,远在9个词之前!

现在读者可能会想,可以提升继续提升N的值呀,比如4-Gram、5-Gram…….。实际上,这个想法是没有实用性的。因为我们想处理任意长度的句子,N设为多少都不合适;另外,模型的大小和N的关系是指数级的,4-Gram模型就会占用海量的存储空间。

所以,该轮到RNN出场了,RNN理论上可以往前看(往后看)任意多个词(单向)。

三、RNN结构

1.基本循环神经网络 

下图是一个简单的循环神经网络图,它由输入层、一个隐藏层和一个输出层组成:

rnn循环神经网络 java rnn循环神经网络结构_rnn循环神经网络 java_02

如果把上面有W的那个带箭头的圈去掉,它就变成了最普通的全连接神经网络。

各个符号含义如下:

x:一个向量,表示输入层的值(这里没有画出来表示神经元节点的圆圈);

U:输入层到隐藏层的权重矩阵;

s:一个向量,表示隐藏层的值(这里隐藏层只画了一个节点,你也可以想象这一层其实是多个节点,节点数与向量s的维度相同);

W:权重矩阵,循环神经网络的隐藏层的值s不仅仅取决于当前这次的输入x,还取决于上一次隐藏层的值s,权重矩阵W就是隐藏层上一次的值s(t-1),作为这次的输入时,要乘上的那个权重;

V:隐藏层到输出层的权重矩阵;

o:也是一个向量,表示输出层的值;

将上面的图展开,如下

rnn循环神经网络 java rnn循环神经网络结构_rnn循环神经网络 java_03

 

rnn循环神经网络 java rnn循环神经网络结构_循环神经网络_04

2.双向循环神经网络

对于语言模型来说。很多时候光看前面的 词是不够的,比如下面这句话:

我的手机坏了,我打算____一部新手机。

可以想象,如果只看横线前的词,收集坏了,那么我是打算修一修?换一部新的?还是大哭一场?这些都是无法确定的。但是如果我们也看到了横线后面的词是『一部新手机』,那么横线上的词填『买』的概率就大得多了。

在上述中的基本循环神经网络是无法对此进行建模的,因此,我们需要双向神经网络,如下图所示:

rnn循环神经网络 java rnn循环神经网络结构_循环神经网络_05

rnn循环神经网络 java rnn循环神经网络结构_循环神经网络_06

3.深度循环神经网络

上面介绍的循环神经网络只有一个隐藏层,我们当然可以堆叠两个以上的隐藏层,这样就得到了深度循环神经网络,如下图所示为一个有3个隐藏层的深度双向循环神经网络:

rnn循环神经网络 java rnn循环神经网络结构_神经网络_07

rnn循环神经网络 java rnn循环神经网络结构_rnn循环神经网络 java_08

四、循环神经网络的训练

循环神经网络的训练算法:BPTT

如上面所述,如果要预测t时刻的输出,我们必须先利用上一时刻(t-1)的记忆和当前时刻的输入,得到t时刻的记忆,如下式:

rnn循环神经网络 java rnn循环神经网络结构_权重_09

然后通过当前时刻的记忆St,通过softmax分类器输出每个词出现的概率

rnn循环神经网络 java rnn循环神经网络结构_rnn循环神经网络 java_10

为了找出模型最好的参数,U,W,V,我们就要知道当前参数得到的结果怎么样,因此就要定义我们的损失函数,用交叉熵损失函数:(交叉熵损失函数详见:)

rnn循环神经网络 java rnn循环神经网络结构_rnn循环神经网络 java_11

rnn循环神经网络 java rnn循环神经网络结构_权重_12

rnn循环神经网络 java rnn循环神经网络结构_神经网络_13

如图所示,你会发现每个cell都会有一个损失,我们已经定义好了损失函数,接下来就是熟悉的一步了,那就是根据损失函数利用SGD来求解最优参数,在CNN中使用反向传播BP算法来求解最优参数;

但在RNN就要用到BPTT,它和BP算法的本质区别,也是CNN和RNN的本质区别:CNN没有记忆功能,它的输出仅依赖与输入,但RNN有记忆功能,它的输出不仅依赖与当前输入,还依赖与当前的记忆。这个记忆是序列到序列的,也就是当前时刻收到上一时刻的影响,比如股市的变化。

rnn循环神经网络 java rnn循环神经网络结构_神经网络_14

rnn循环神经网络 java rnn循环神经网络结构_rnn循环神经网络 java_15

我们要把当前时刻造成的损失,和以往每个时刻造成的损失加起来,因为我们每一个时刻都用到了权重参数W。和以往的网络不同,一般的网络,比如人工神经网络,参数是不同享的,但在循环神经网络,和CNN一样,设立了参数共享机制,来降低模型的计算量。

五、改进算法

1.普通rnn的弊端

长时依赖问题 
        长时依赖是这样的一个问题,当预测点与依赖的相关信息距离比较远的时候,就难以学到该相关信息。例如在句子”我出生在法国,……,我会说法语“中,若要预测末尾”法语“,我们需要用到上下文”法国“。理论上,递归神经网络是可以处理这样的问题的,但是实际上,常规的递归神经网络并不能很好地解决长时依赖,好的是LSTMs可以很好地解决这个问题。

存在无可记忆(梯度消失)和久远记忆(梯度爆炸),由于BP算法和长时间依赖造成的。


梯度消失:权重值w过小,传到tn时记忆趋近于0;(注意: 这里的梯度消失和BP的不一样,这里主要指由于时间过长而造成记忆值较小的现象.)

梯度爆炸:权重值w过大,传到tn时记忆->无穷大

因此, 就出现了一系列的改进的算法, 这里介绍主要的两种算法: LSTM 和 GRU.

    LSTM 和 GRU对于梯度消失或者梯度爆炸的问题处理方法主要是:

    对于梯度消失: 由于它们都有特殊的方式存储”记忆”,那么以前梯度比较大的”记忆”不会像简单的RNN一样马上被抹除,因此可以一定程度上克服梯度消失问题。

    对于梯度爆炸:用来克服梯度爆炸的问题就是gradient clipping,也就是当你计算的梯度超过阈值c或者小于阈值-c的时候,便把此时的梯度设置成c或-c。 

2.LSTM算法(Long Short Term Memory, 长短期记忆网络)

2.1、与RNN结构的不同

一般RNN结构如下:ht表示当前t时刻的记忆

rnn循环神经网络 java rnn循环神经网络结构_神经网络_16

所有的递归神经网络都是由重复神经网络模块构成的一条链,可以看出它的处理层非常简单,通常是一个单tanh层,通过当前输入以上一个时刻的输出来得到当前输出。与神经网络相比,经过简单地改造,它已经可以利用上一时刻学习到的信息进行当前时刻的学习了。

2.2、LSTM结构

from 

,


rnn循环神经网络 java rnn循环神经网络结构_神经网络_17

LSTM是一种特殊的RNN,可以很好滴解决长时间依赖问题,如上图,一个模块里它有四层结构(上图黄色部分,即表示神经网络层)。从左到右,我们把第一个黄色层相关部分叫:遗忘门,第二三个黄色层相关部分叫:输入门(有的文献会分开分别叫做输入门和候选们),第四个黄色层相关部分叫:输出门,如下图所示,c表示一个状态(记忆)单元,st表示当前时刻的记忆

rnn循环神经网络 java rnn循环神经网络结构_神经网络_18

(1)遗忘门:用于计算信息的遗忘(保留)程度,通过sigmoid处理后为输出为一个介于0和1之间的数,表示遗忘(保留)信息的程度,1表示全部保留,0表示全部遗忘。公式如下:

rnn循环神经网络 java rnn循环神经网络结构_神经网络_19

rnn循环神经网络 java rnn循环神经网络结构_神经网络_20

表示遗忘门的输出,

rnn循环神经网络 java rnn循环神经网络结构_循环神经网络_21

表示t-1时刻的输出,rnn循环神经网络 java rnn循环神经网络结构_rnn循环神经网络 java_22表示t时刻输入的数据,rnn循环神经网络 java rnn循环神经网络结构_权重_23为sigmoid函数,

rnn循环神经网络 java rnn循环神经网络结构_rnn循环神经网络 java_24

表示遗忘门的权重矩阵

rnn循环神经网络 java rnn循环神经网络结构_rnn循环神经网络 java_25

(2)输入门:输入门用来计算哪些信息保存到状态单元C中,包括两部分,一部分是:

rnn循环神经网络 java rnn循环神经网络结构_循环神经网络_26

            (

rnn循环神经网络 java rnn循环神经网络结构_循环神经网络_21

表示t-1时刻的输出,rnn循环神经网络 java rnn循环神经网络结构_rnn循环神经网络 java_22表示t时刻输入的数据,rnn循环神经网络 java rnn循环神经网络结构_权重_23为sigmoid函数)

该部分可以看成当前输入有多少信息需要保存到单元状态。另一部分是:

rnn循环神经网络 java rnn循环神经网络结构_循环神经网络_30

该部分用来把当前输入产生的新信息添加到单元状态中,这两部分产生新的记忆状态。

rnn循环神经网络 java rnn循环神经网络结构_循环神经网络_31

因此,当前时刻的单元状态由遗忘门输入和上一时刻状态的积加上输入们两部分的积,即

rnn循环神经网络 java rnn循环神经网络结构_神经网络_32

rnn循环神经网络 java rnn循环神经网络结构_神经网络_33:遗忘门,

rnn循环神经网络 java rnn循环神经网络结构_rnn循环神经网络 java_34

:t-1时刻状态单元,很多文献把rnn循环神经网络 java rnn循环神经网络结构_神经网络_35称为输入门,rnn循环神经网络 java rnn循环神经网络结构_循环神经网络_36为候选门,本文把这两个都是为输入门

(3)输出门,用于计算当前时刻信息被输出的程度

rnn循环神经网络 java rnn循环神经网络结构_rnn循环神经网络 java_37

rnn循环神经网络 java rnn循环神经网络结构_循环神经网络_38

 

3.GRU算法(Gated Recurrent Unit:门控循环单元)

from:

3.1、GRU概述

GRU是LSTM网络的一种效果很好的变体(也许是最成功的一种),它较LSTM网络的结构更加简单,而且效果也很好,因此也是当前非常流行的一种网络。

循环神经网络中的梯度算法,在时间步数较大或时间步数较短时,容易出现梯度消失和梯度爆炸,虽然裁剪可以解决爆炸,但无法解决消失问题,因此为了能更好地捕捉时间序列中的时间步距离较大的依赖关系,提出了门控循环神经网络(gated recurrent neural network),GRU为一种常见的门控循环神经网络。

3.2、GRU结构

在LSTM中引入了三个函数:输入门,遗忘门,输出门来控制输入值、记忆值和输出值。而在GRU模型中只有两个门:分别是更新们和重置们,具体结构如下

rnn循环神经网络 java rnn循环神经网络结构_rnn循环神经网络 java_39

 图中的rt和zt分别表示重置门和更新门。

重置门:rt,决定了如何把新的输入与之前的记忆相结合,即reset门控制前一状态有多少信息被写入到当前新的候选集

rnn循环神经网络 java rnn循环神经网络结构_神经网络_40

上,reset门越小,前一状态的信息被写入的越少。

更新门:zt,将LSTM里面的遗忘门和输入门合并为更新门,更新门决定多少先前的记忆起作用,即控制前一时刻的状态信息被带入到当前状态中的程度,更新门值越大说明前一时刻的状态信息带入越多。

3.3、GRU网络的公式

rnn循环神经网络 java rnn循环神经网络结构_rnn循环神经网络 java_41

4、LSTM和GRU区别

from:

rnn循环神经网络 java rnn循环神经网络结构_神经网络_42

注意第三点中的hidden state即上述公式中的ht,memory cell对应LSTM式子中的ct

 

reference