Recurrent Neural Network(RNN)

在进行普通的NN训练时,对于相同的输入会得到相同的输出。但是对于一些自然语言处理的任务中,相同的词汇在不同的句子中的含义可能是不同的,因此有时需要结合上下文进行辅助分析。这就是RNN的主要思想。

例如arrive和leave后面所接的地名表示的分别是deat和departure。

RNN的基本结构

一个基础的结构如下图所示,每一个红绿黄是相同的网络结构,是不同输入在相同网络的表现。利用store模块存储前一次迭代的hidden layer中内容以达到上下文分析的效果。

Elman Network就是刚刚的思路,而Jordan Network是将前一次的输出放入store中。由于Jordan有目标,所以一般会有更好的效果。

Bidirectional RNN有正向与反向两个网络,然后将其结合进行输出,可以实现上文与下文同时分析。

Bidirectional RNN

RNN的复杂演变

LSTM(Long Short-term Memory)是在普通的存储结构基础上增加了Input,output,forget三个开关,通过模型自主学习实现开关的控制。在正常的一个输入内容,一个输入内容基础上增加了操控三个gate的信号输入。是一个较长的短记忆,可以暂时不洗上一轮的数据。具体模型如下

LSTM

激活函数使用sigmoid,对于开关,输出越接近1表明越打开以模仿真实的开关。从公式可以发现,Forget gate打开时表明记得,关闭时表示忘记。

运行流程
简单的LSTM模型

\(c^{t-1}\)是将所有的cell(是标量)接起来形成的向量。\(z^{f}\)等是由\(x^{t}\)乘一个矩阵得到。\(z^{f}\)的不同维喂给不同的cell。

LSTM的复杂模型

真正的输入会同时考虑\(c^{t-1}\),\(h^{t-1}\)这个是前一个的输出],\(x^{t}\)。

如何训练

定义损失函数为RNN输出与真实的向量之间的交叉熵,可以使用Backpropagation through time计算梯度,使用梯度下降即可。

但是在训练的过程之中会发现损失函数跳跃变化,难以收敛。这是因为RNN可能在某些地方梯度过大,一些地方梯度又太小。

例如一个简单的RNN模型,第一个输入为1,每一个传递的参数都是w,并且使用y=x的激活函数,那么会发现在1000此运算后结果为\(w^{999}\)次方,在x=1这个点处左右的梯度差距过大,如下图。

梯度变化过大

一个解决办法就是使用LSTM,可以解决梯度消失(gradient vanishing),但是不能解决梯度多大的问题,所以学习率需要比较小。这是因为LSTM可以保证前值的影响一直存在。

还有一个较为简单的模型Gate Recurrent Unit(GRU),如果LSTM过拟合问题严重,可以使用GRU。Input gate打开时,output gate就是自动关闭,反之同理。

random+sigmoid/identity matrix initialization+Relu效果会更好。

留下评论