一、传统RNN的反向传播
隐藏层:
输出层:
假设网络结构如上图所示,神经元没有激活函数,当
时,初始值
给定,则
时刻,损失函数
训练的目标就是采用梯度下降法更新、
、
、
、
使
达到最小,
。
这里需要说明一下,更新参数是以每个时刻t为单位的,根据输出与label计算偏导更新参数;而
用来评判训练完一次后模型的效果,比如是否准确率增加、是否过拟合等等
接下来开始计算梯度:
根据上式,可以求的任意时刻对
和
的偏导
如果神经元经过激活函数,,那么上式中
其中,
的函数图像如下
接下来就是RNN的两个劣势,梯度消失和梯度爆炸the image of tanh', from [2]
二、RNN的梯度消失和梯度爆炸💥
通过的函数图像可知,
,如果
,那么随着网络深度的不断加深,
会趋于零,即前层的梯度趋于零,那么浅层网络对左右参数的更新能力较弱,这就是(浅层)梯度消失。
同样的道理,如果,直观表现为
,那么随着网络深度的不断加深,
会趋于无穷大,即梯度趋于无穷大,即梯度爆炸💥。
常用解决方案:
梯度消失:尝试其他网络结构,e.g. LSTM
梯度爆炸:梯度剪裁
三、长期依赖的问题
长期依赖是指当前系统的状态,可能受很长时间之前系统状态的影响,是RNN中无法解决的一个问题。
如果从“这块冰糖味道真?”来预测下一个词,是很容易得出“甜”结果的。但是如果有这么一句话,“他吃了一口菜,被辣的流出了眼泪,满脸通红。旁边的人赶紧给他倒了一杯凉水,他咕咚咕咚喝了两口,才逐渐恢复正常。他气愤地说道:这个菜味道真?”,让你从这句话来预测下一个词,确实很难预测的。因为出现了长期依赖,预测结果要依赖于很长时间之前的信息。
理论上,通过调整参数,RNN是可以学习到时间久远的信息的。但是,实践中的结论是,RNN很难学习到这种信息的。RNN 会丧失学习时间价格较大的信息的能力,导致长期记忆失效。
长期记忆失效的原因
RNN中,,如果用
来表示
,那么
前的系数为
,如果
,那么经过多次传递之后,
变得非常小,可以认为
对于
几乎不产生任何影响,也就是随着时间的推移,浅层信息机会被遗忘,这也就导致了长期记忆失效。
可以用LSTM来解决长期依赖问题。
循环神经网络(RNN)的长期依赖问题——曲曲菜
四、Long Short-Term Memory (LSTM)
传统RNN:
门:
门实际上就是一层全连接层,它的输入是一个向量或多个向量,输出是一个0到1之间的数字。
我们可以这样理解,如果门的输出是0, 就表示将门紧紧关闭,为1则表示将门完全打开,而位于0-1之间的实数表示将门半开,至于开的幅度跟这个数的大小有关。
理解 LSTM 网络——朱小虎XiaohuZhu
遗忘门:遗忘门决定了上一时刻的单元状态
有多少保留到当前时刻
。
image from [4]:当前遗忘门输出
: 激活函数 sigmoid
: 遗忘门的权重矩阵
: 上一时刻LSTM隐层输出值。
: 当前时刻输入
: 遗忘门偏置
:矩阵连接
还需要指明一下各个维度:
:输入数据维度
:隐藏层维度
:细胞状态维度,通常
:维度为
,对应输入为
:维度为
,对应输入为
:由
和
拼接而成,维度为
,对应输入为
![]()
输入门:输入门决定了当前时刻网络的输入
有多少保存到单元状态
image from [4]: 输入门的输出值,是一个0 - 1 之间的实数,决定了当前时刻网络的输入
有多少保存到单元状态
: 输入门的权重矩阵
:此时的细胞状态,不包含前期细胞状态
:激活函数,它输出一个(-1, 1) 的实数值
: 权重矩阵
: 偏置
更新细胞状态将当前的记忆image from [4]和长期的记忆
组合在一起,形成新的单元状态
。由于遗忘门的控制,它可以保存很久很久之前的信息,由于输入门的控制,它又可以避免当前无关紧要的内容进入记忆。
输出门:控制单元状态
有多少输入到LSTM的当前输出值
image from [4]: 一个位于(0,1) 之间的实数值,用来控制单元状态
有多少独处到 LSTM 的当前输出值
![]()
五、LSTM的应用
- handwriting recognition
- time series prediction, e.g. financial data
- speech recognition
- language modelling
- language translation
参考资料: