如果您完成了第 9.5 节中的练习,您会发现梯度裁剪对于防止偶尔出现的大量梯度破坏训练稳定性至关重要。我们暗示爆炸梯度源于长序列的反向传播。在介绍大量现代 RNN 架构之前,让我们仔细看看反向传播在数学细节中是如何在序列模型中工作的。希望这个讨论能使梯度消失和爆炸的概念更加精确。如果你还记得我们在 5.3 节介绍 MLP 时通过计算图进行前向和反向传播的讨论,那么 RNN 中的前向传播应该相对简单。在 RNN 中应用反向传播称为 时间反向传播 ( Werbos, 1990 ). 此过程要求我们一次扩展(或展开)RNN 的计算图。展开的 RNN 本质上是一个前馈神经网络,具有相同的参数在整个展开的网络中重复出现的特殊属性,出现在每个时间步长。然后,就像在任何前馈神经网络中一样,我们可以应用链式法则,通过展开的网络反向传播梯度。每个参数的梯度必须在参数出现在展开网络中的所有位置上求和。从我们关于卷积神经网络的章节中应该熟悉处理这种权重绑定。
出现并发症是因为序列可能相当长。处理由超过一千个标记组成的文本序列并不罕见。请注意,从计算(太多内存)和优化(数值不稳定)的角度来看,这都会带来问题。第一步的输入在到达输出之前要经过 1000 多个矩阵乘积,还需要另外 1000 个矩阵乘积来计算梯度。我们现在分析可能出现的问题以及如何在实践中解决它。
9.7.1. RNN 中的梯度分析
我们从 RNN 工作原理的简化模型开始。该模型忽略了有关隐藏状态细节及其更新方式的细节。这里的数学符号没有明确区分标量、向量和矩阵。我们只是想培养一些直觉。在这个简化模型中,我们表示ht作为隐藏状态, xt作为输入,和ot作为时间步的输出t. 回忆一下我们在第 9.4.2 节中的讨论,输入和隐藏状态可以在乘以隐藏层中的一个权重变量之前连接起来。因此,我们使用 wh和wo分别表示隐藏层和输出层的权重。因此,每个时间步的隐藏状态和输出是
在哪里f和g分别是隐藏层和输出层的变换。因此,我们有一个价值链 {…,(xt−1,ht−1,ot−1),(xt,ht,ot),…} 通过循环计算相互依赖。前向传播相当简单。我们所需要的只是遍历(xt,ht,ot)一次三倍一个时间步长。输出之间的差异ot和想要的目标 yt然后通过所有的目标函数进行评估 T时间步长为
对于反向传播,事情有点棘手,尤其是当我们计算关于参数的梯度时wh目标函数的L. 具体来说,根据链式法则,