有关在循环神经网中损失函数以及优化方法并没有什么特别的。
在RNN中训练的问题
lstm_012.png在循环神经网络中,我们训练是在早期是一个比较困难事情,因为损失函数很不稳定。在上图中,横轴为 epoch 也就是训练迭代的次数,而纵轴为损失函数值,我们希望训练随着迭代迭代次数增加,趋于下降,蓝色线是我们理想的损失函数下降曲线。而在早期RNN学习曲线通常是上面绿色曲线的形状。
lstm_011.jpeg我们看了error 曲面对于这个问题就清楚了,看懂这个需要你对梯度下降有一定的了解。如果你还不了解什么是梯度下降,就去找一些资料来了解一下。这里 error 也就是我们 loss 函数的值,w 和 b 分别是函数参数,也就是我们学习到参数,通过不断更新他们来找到 error 最小值。
我们梯度下降,就是沿着梯度下降方向移动,根据 error 下降程度来决定下一步移动的步进,不过当我们移动这个陡立 error 前问题就来了。因为之前梯度下降比较小,所以我们将学习率会调很高,但是移动到悬崖上,也就是梯度暴增,这样两个很大数相乘就会出现梯度爆炸。也就是图中蓝色实线表示这样我们梯度就飞出去了。
这样我们可以通过梯度阈值(clipping),通过梯度阈值来对梯度进行裁剪,保持梯度不会爆炸,如图中的蓝色虚线所表示。
这件事我尝试解释一下,我们要看参数 w 对 loss 影响,w 变换影响输出 y ,y 影响 loss 输出。那么我们通过调整 w 让他发生变化来观察 y 变换。在循环神经网中因为序列中存储单元参数会反复使用所有就有 出现如果 n 取一个很大数这问题就很明显,当 w 小于 0 时候,即使 w 在一个跨度很大范围变换从 0.01 到 0.99 时候 也不会受到 w 什么影响,所以这是就是梯度消失,反过来梯度爆炸我就不解释了。
这里多说依据感觉 w 有点像 HMM 转移概率,呵呵。
我们现在说一件比较有趣的事,就是 LSTM 可以避免发生梯度消失问题。我们接下来就是看一看 LSTM 是怎么来解决梯度消失这个问题的。这也就是我们为什么用 LSTM 的真正原因。这就需要我们来看一看 LSTM 和 RNN 对于处理存储单元问题不同策略。
- 在 RNN 中,每一个时刻存储单元数据都会被洗掉更新
- 而在 LSTM 中,每一个时刻存储单元数据不是被洗掉而是添加新的值。这件事我们这么来看,在 RNN 每一次洗掉数据,存储单元影响也就随之消失,而在 LSTM 则不同,因为每一次都是在原来的基础上添加输入所以除非触发遗忘门,每一个时刻的存储都会影响到输出而不会消失。
最后希望大家关注我们微信公众号
wechat.jpeg
网友评论