# RNN-BPTT ###### tags: `學習紀錄` [toc] --- ## Before Meeting :::success ::: [refer](https://github.com/carefree0910/MachineLearning/blob/master/h_RNN/Playground.py) [refer](https://zhuanlan.zhihu.com/p/26892413) [refer]() --- ## Recent Paper --- ### RNN-BPTT :::success #### Abstracion ::: :::info #### Detail - RNN 的“前向传导算法” - 在说明如何进行训练之前,我们先来回顾一下 RNN 的“前向传导算法。在上一章中曾经给过一个没有激活函数和变换函数的公式: - ![](https://i.imgur.com/WKD8W4L.png) - 可以用上一章说过的那个小栗子来测试一下: - 假设现在U, V是单位阵,W是单位阵的两倍 - 假设输入序列为: - ![](https://i.imgur.com/9YxL6sw.png) - RNN 的“反向传播算法” - ![](https://i.imgur.com/fosVbCa.png) - ![](https://i.imgur.com/S2c2Qrp.png) - ![](https://i.imgur.com/xYGo6TM.png) - ![](https://i.imgur.com/FWqXElo.png) - ![](https://i.imgur.com/BWuXtpR.png) - ![](https://i.imgur.com/mKEXcVz.png) ::: :::warning #### Conclusion - 指数级梯度所带来的问题 - 注意到由于 RNN 需要沿时间通道进行反向传播,其相应的“局部梯度”为: - ![](https://i.imgur.com/xPoXmh1.png) - 第二点是 LSTMs 等特殊 RNN 的做法,这里就主要说说第一点——如何选用更好的激活函数。由 NN、CNN 处的讨论不难想到,用 ReLU 作为激活函数很有可能是个不错的选择;不过由于梯度是指数级的这一点不会改变,此时我们可能就会面临另一个问题:“梯度爆炸(The Exploding Gradient)”(注:不是说 Sigmoid 系函数就不会引发梯度爆炸、因为当矩阵[公式]的元素很大时同样会爆炸,只是相对而言更容易引发梯度消失而已)。不过相比起梯度消失问题来讲,梯度爆炸相对而言要显得更“友好”一些,这是因为: - 梯度爆炸一旦发生,是会迅速反映到结果上来的(比如一堆数变成了 NaN) - 梯度爆炸可以通过简单的设定阈值来得到改善 - 而梯度消失相比之下,既难以直接从结果看出、又没有特别平凡的解决方案。现有的较常用的方法为调整参数的初值、进行适当的正则化、使用 ReLU(需要小心梯度爆炸)等等 - 关于为何 LSTMs 能够解决梯度消失,直观上来说就是上方时间通道是简单的线性组合、从而使得梯度不再是指数级的。详细的推导可以参见各种论文(比如说这篇),我就不在这里献丑了 ( σ'ω')σ - 以上就大致地说了说 RNN 的 BPTT 算法,主要要注意的其实就是时间通道上的 BP 算法。如果把时间通道看成一个神经网络的话,运用局部梯度来反向传播其实相当自然 ::: [refer]() --- :::success #### Abstracion ::: :::info #### Detail ::: :::warning #### Conclusion ::: [refer]() ---