习题6-1P 推导RNN反向传播算法BPTT.
习题6-2 推导公式(6.40)和公式(6.41)中的梯度.
习题6-3 当使用公式(6.50)作为循环神经网络的状态更新公式时, 分析其可能存在梯度爆炸的原因并给出解决方法.
解决方法:
循环神经网络RNN;
在上面的示例图中,神经网络的模块A,正在读取某个输入xi ,并输出一个值 hi。循环可以使得信息可以从当前步传递到下一步。RNN 的关键点之一就是他们可以用来连接先前的信息到当前的任务上,例如使用过去的视频段来推测对当前段的理解。在间隔不断增大时,RNN 会丧失学习到连接如此远的信息的能力。所有 RNN 都具有一种重复神经网络模块的链式的形式。在标准的 RNN 中,这个重复的模块只有一个非常简单的结构,例如一个 tanh 层。
LSTM 通过刻意的设计来避免长期依赖问题。LSTM 不同于RNN单一神经网络层,这里是有四个,以一种非常特殊的方式进行交互。
图中使用的各种元素的图标
LSTM 的关键就是细胞状态,水平线在图上方贯穿运行。
细胞状态类似于传送带。直接在整个链上运行,只有一些少量的线性交互。信息在上面流传保持不变会很容易。
LSTM 有通过精心设计的称作为“门”的结构来去除或者增加信息到细胞状态的能力。门是一种让信息选择式通过的方法。他们包含一个 sigmoid 神经网络层和一个按位的乘法操作。
Sigmoid 层输出 0 到 1之间的数值,描述每个部分有多少量可以通过。 0代表“不许任何量通过”,1 就指“允许任意量通过”!
使用一个合适激活函数,它的梯度在一个合理的范围。LSTM使用gate function,有选择的让一部分信息通过。gate是由一个sigmoid单元和一个逐点乘积操作组成,sigmoid单元输出1或0,用来判断通过还是阻止,然后训练这些gate的组合。所以,当gate是打开的(梯度接近于1),梯度就不会vanish。并且sigmoid不超过1,那么梯度也不会explode。
除此之外针对梯度爆炸问题,还可以引入Gradient Clipping(梯度裁剪)。通过Gradient Clipping,将梯度约束在一个范围内,这样不会使得梯度过大。
常会使用一种叫”clip gradients “的方法. 它能有效地权重控制在一定范围之内.
算法步骤如下:
- 首先设置一个梯度阈值:clip_gradient
- 在后向传播中求出个参数的梯度,这里我们不直接使用梯度进行参数更新,我们求这些梯度的2范数
- 然后比较梯度的l2范数||g||与clip_gradient的大小
- 如果前者大,求缩放因子clip_gradient/||g||, 由缩放因子可以看出梯度越大,则缩放因子越小,这样便很好地控制了梯度的范围
- 最后将梯度乘上缩放因子便得到最后所需的梯度
习题6-2P 设计简单RNN模型,分别用Numpy、Pytorch实现反向传播算子,并代入数值测试.
根据提供的输出结果,我们可以看到使用Numpy和PyTorch实现的反向传播算子得到了相同的结果。这表明两者在计算梯度时是一致的,这也证实了PyTorch作为深度学习框架的稳定性和准确性。