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 的内存和输入是 相加 的,每个输入产生的影响会一直存在,不会突然消失 。
-
还有很多其他的方法,这里就不一一赘述。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:李宏毅机器学习笔记-12.2 循环神经网络(Recurrent Neural Network-RNN)- part 2 - Python技术站