天天看点

李宏毅深度学习笔记(五)——循环神经网络(RNN)

RNN处理的主要是有序序列。比如在一个订票系统中,需要从用户的一句话中提取出出发地,目的地和交通方式等信息,实现智能订票。在这种情况下,词语之间顺序的改变可能会带来不一样的结果。RNN可以实现通过上下文推断该词语属于何种信息。

1.RNN的基本架构

RNN的基本思想就是在处理一个新的输入的同时,考虑之前结果的影响。如图是一个简单的RNN,图中的x1和x2是输入,绿色的圆圈代表hidden layer,橙色的圆圈代表output layer,y1和y2代表输出,而蓝色方框中的a1和a2是hidden layer的运算结果。

整个运算过程为:首先给a1和a2附初始值,然后把a1,a2,x1,x2一起作为hidden layer的输入,并把hidden layer的运算结果存到a1和a2中。在处理下一个输入(比如x3,x4)时,把a1,a2,x3,x4作为hidden layer的输入,如此循环往复。

李宏毅深度学习笔记(五)——循环神经网络(RNN)

2.不同类型的RNN

当然,RNN中的hidden layer可以有多层,根据不同的存储方法可以把RNN分为Elman Network和Jordan Network。它们的区别在于一个存储了所有hidden layer的结果,一个只存储了整个神经网络的输出。

李宏毅深度学习笔记(五)——循环神经网络(RNN)

 同时,RNN也可以是双向的(Bidirectional RNN)。如图,训练两个RNN,分别使用正序和逆序的输入,并把两个神经网络得到的结果提供给output layer。这样的好处是某次的结果不仅考虑了之前数据的影响,还考虑了之后数据的影响。

李宏毅深度学习笔记(五)——循环神经网络(RNN)

 3.LSTM

LSTM是一种针对存储方式进行的优化。简单的RNN只需要将结果存入,需要的时候读出,而LSTM每次存储需要输入三个额外的信号来控制input gate,output gate和forget gate。

李宏毅深度学习笔记(五)——循环神经网络(RNN)

具体来说,如下图所示,假设四个输入分别是z,zf,zi,zo。存储在memory cell里的值为c。f,g,h为激活函数,则更新后的值为

李宏毅深度学习笔记(五)——循环神经网络(RNN)

输出的值为

李宏毅深度学习笔记(五)——循环神经网络(RNN)

函数f通常取sigmoid函数,函数值在0到1之间,因此它们好像三道闸门,分别表示输入的程度,(没有被)遗忘的程度和输出的程度。在具体操作时,三个gate的输入等于一个向量w与输入向量某几维的内积,w可以视为参数并通过梯度下降的方法被训练出来。

李宏毅深度学习笔记(五)——循环神经网络(RNN)

4.RNN训练的问题

如图所示,横轴代表RNN训练次数,纵轴代表误差。一般来说,随着训练次数增加,训练集上的误差会逐渐减小,但是RNN的误差有时会剧烈地上下波动。

李宏毅深度学习笔记(五)——循环神经网络(RNN)

这是因为RNN对于参数的变化在一些地方是十分敏感的。如图所示是RNN误差随参数的的变化趋势,在梯度较小的地方,学习率可能会被调的很大,但是如果这时突然碰到梯度特别大的地方,那下一次的参数就会跑到不知道什么地方去了。

李宏毅深度学习笔记(五)——循环神经网络(RNN)

这个问题可以使用LSTM或者GRU解决。它们可以让整个error surface变得几乎没有十分平坦的地方,这样反而可以得到更好的结果。

继续阅读