RNN引言
如果需要对一句话中的每个单词做slot filling(槽位填充),eg: I will arrive Taipei on November。
此时训练样本中,
Taipei 对应 目的地,
November 对应 到达时间
但是如果变成了另一句话:I will leave Taipei on November。
此时训练样本中,
Taipei 对应 离开地点。
但是在普通的神经网络中,一个训练样本X无法对应多个label Y。因此,我们希望神经网络是有记忆的。这种有记忆的神经网络就是RNN。
RNN就是在DNN的基础上加上了记忆单元memory cell。记忆单元会保存上一时刻中隐藏单元的值,并作为输入来起作用。
下图中每次按顺序输入句子中的一个词时,用来预测的神经网络都是相同的。但是由于memory单元a的存在,句子中词的顺序对预测结果会产生影响。
LSTM原理
为了解决梯度消失的问题,而引出的LSTM。
LSTM有4个输入:输入x,input gate参数,forget gate的参数,output gate参数。
LSTM是如何存在于神经网络中的呢?实际上就是使用每一个LSTM单元替换原来的隐藏单元,此时对于每一个隐藏单元有4个输入,每个输入都是由上一层的输出线性组合得来的。因此在训练时的参数量也是很大的。(是一般神经网络参数的4倍)
图中的
z
f
,
z
i
,
z
,
z
o
z^f,z^i,z,z^o
zf,zi,z,zo分别表示输入
x
t
x^t
xt经过参数线性变换(wx+b)后的vector值。vector中的每一个值对一个隐藏单元起作用。
有时候,会将输出+memory当前值+下一次的输入一起作为输入进入下一次训练,那么:
RNN的训练
在这种情况下,RNN的训练变得十分复杂,在训练时,可能会出现损失函数时大时小的情况,这是因为RNN下的损失函数的曲线要不十分平坦,要不非常陡峭,在进行梯度训练时一不小心梯度就可能上一个陡峰,因此需要进行clipping在梯度到达一定值的时候及时停止对梯度的训练。
那为什么梯度的会时大时小呢?这是因为RNN的结构是被循环利用的,因此传播参数也经常是被循环利用多次的,当一个参数w>1时容易发生梯度爆炸,w<1时容易出现梯度消失,因此梯度在1左右会形成一个陡峰。
而LSTM就可以解决梯度消失的问题
为什么?
传统的RNN每一次memory会被覆盖掉,而LSTM是在原来的基础上加上输入,因此就算是小的影响也不会被去除。
但是LSTM并不能解决梯度爆炸的问题,所以我们在训练的时候需要使用较小的learning_rate。
GRU是将LSTM中的input gate 和 forget gate互异,因此只需要两个门进行训练,总体来说训练模型会简单的多。
激活函数:一般情况下使用sigmoid效果会好,但是在参数使用identity matrix的时候,使用Relu会好一些。
应用:
1.输入为一个矢量,输出为一个标量sequence to vector
实例:语义分析
比如输入为:好看的电影; 输出为:正类
2.输入为一个矢量,输出为一个比输入短的矢量
比如语音识别
输入的语音在很短的时间内转换为一个输入元素,有可能几个输入元素指的是同一个意思,这时候采用CTC网络去重,且加入一个Null的输出表示两个词语之间的空白。
3.输入与输出不确定长短sequence to sequence
实例:翻译
翻译时并不知道哪种语言会比较长,因此在输出时是将上一次的输出作为下一次的输入来不断训练,再加入一个字符“断”表示停止。