Recurrent Neural Network(RNN) - 循环神经网络(part 2)
1 训练 RNN
1.1 定义 Loss
- 如上图中,每一个单词对应一个 Slot,将句子按顺序丢进 Network 中,产生一个输出 y,将每个 y 与预期的正确输出做 cross entropy,然后累加起来,就是最终的 Loss。(注意,顺序不能打乱)。
1.2 学习(learning)
定义完 Loss funtion 以后,就可以开始训练了,这次我们用的仍然是 Backpropagation ,但是做了一点改动,所以就叫做 Backpropagetion through time(BPTT),因为我们输入的是一个时间序列,所以 BPTT 考虑了时间的影响。
好的,那这个所谓的 BPTT 是怎么工作的呢?emmmm……….我也不知道,因为老师说这个不讲。反正就只要知道 RNN 是可以用 Gradient Descent 来训练就行了。
言归正传,我们开始去让 RNN 去学习,但是不幸的是,这个过程可能不会那么顺利。通常我们希望我们的学习 Loss 曲线是下面蓝色的那一条,即随着 Epoch 的增多,Total Loss 逐渐下降。然而事实是,我们现实中遇到的很有可能是绿色的那一条。
那为什么会产生上图的现象呢? 因为 RNN 某些地方的 error surface 非常的陡峭。所谓的 error surface 就是指 Total Loss 对参数变化的敏感程度。error sufface 过大就会导致在某些点上参数非常小的变化就会引起 Total Loss 的剧烈抖动。
下图就代表着参数 w1,w2 对 Total Loss 的影响,在大部分地方都是平坦的,但是一旦到了某些地方,影响就变得非常陡峭,这样子就很容易导致Loss 的剧烈抖动。
clipping: 用来解决上述问题的方法,非常简单粗暴。就是当 gradient 超过一定的阈值的时候,就令 gradient 等于阈值。结束。
出现这一切的根源是什么? 如下图,同一个weight 在不同的时间点会被反复利用 ,所以会出现爆炸。
1.3 解决方法
使用 LSTM: 可以解决 gradient vanishing 的问题。因为 LSTM 的内存和输入是 相加 的,每个输入产生的影响会一直存在,不会突然消失 。
还有很多其他的方法,这里就不一一赘述。