Coursera 笔记

Module 01 · Recurrent Neural Networks

Vanishing Gradients with RNNsRNN 的梯度消失

Coursera ↗

在之前的学习中,我们已经了解了 RNN(循环神经网络) 的基本原理以及它在 命名实体识别(NER) 和 语言建模 中的应用。你也看到了如何通过 反向传播(Backpropagation) 来训练一个 RNN。然而,基本的 RNN 算法存在一个重要问题:梯度消失(Vanishing Gradient) 问题。今天,我们将讨论这个问题,并在接下来的几个视频中介绍一些解决方案。


1.长距离依赖问题

1.1语言建模中的长距离依赖

假设我们有这样一个句子:

"The cat, which already ate and maybe already ate a bunch of food that was delicious, ... was full."

为了保证语法的一致性,在这个句子中:

  • 由于“the cat”是单数,后面应该使用 "was"。
  • 如果是复数形式的“cats”,则应使用 "were"。

这就是 长距离依赖(Long-Term Dependencies) 的一个例子,意思是句子早期的词语可能会影响句子后面的部分。在这个句子中,“the cat” 是单数,后面的动词形式(was/were)依赖于它。

但 基本 RNN 并不擅长处理这样的长距离依赖问题。


1.2梯度消失的原因

我们可以通过比较 深度神经网络 和 RNN 来理解梯度消失的问题。

深度神经网络中的梯度消失:

在训练一个非常深的神经网络时(例如 100 层或更多),我们在 前向传播 和 反向传播 过程中,梯度往往会迅速消失,特别是当层数很多时。这样,最后输出的梯度难以传递回去,更新早期层的权重变得非常困难。

RNN 中的梯度消失:

对于 RNN,我们同样会遇到类似的情况。虽然我们有前向传播(从左到右),和反向传播(从右到左),但是由于 梯度消失问题,后期的错误输出难以影响到前期的计算,尤其是当序列很长时,模型很难记住序列最开始的信息。


2.梯度消失的影响

2.1难以记住信息

由于 梯度消失,RNN 在处理长序列时会遇到困难。例如,模型需要记住单数或复数的名词,以便在后续生成 "was" 或 "were",但由于梯度无法有效地传递到序列的起始部分,模型往往无法学习到这些重要的上下文信息。

2.2局部影响

在基本的 RNN 模型中,某个时刻的输出(例如 y^3\hat{y}_3)主要受到其前一个时刻的影响。换句话说,输出 y₃ 很难受到序列较早部分的强烈影响。这是因为,梯度从错误输出 y₃ 反向传播时,无法有效地影响到序列开头的计算。

引用:在基本的 RNN 中,误差和梯度传播的困难使得模型无法捕捉长时间跨度的信息。


3.梯度爆炸与梯度消失

除了梯度消失问题,我们还需要注意 梯度爆炸(Exploding Gradient) 问题。梯度爆炸问题指的是,当反向传播过程中,梯度随着网络层数增加呈指数级增长,可能导致参数过大,网络计算结果会出现 NaN(非数字) 错误,甚至出现数值溢出。

梯度爆炸的解决方案

当梯度爆炸发生时,可以使用 梯度裁剪(Gradient Clipping) 来限制梯度的最大值。如果某个梯度的值超过设定阈值,就会将其缩放到该阈值,以避免梯度过大。梯度裁剪是一个 鲁棒的解决方案,可以有效解决梯度爆炸问题。


4.RNN 长时间序列问题总结

问题 梯度消失(Vanishing Gradient) 梯度爆炸(Exploding Gradient)
描述 梯度随着时间步数增加逐渐消失,导致早期时刻的计算难以影响后期输出。 梯度随着时间步数增加呈指数级增长,可能导致网络参数过大。
解决方法 需要更复杂的解决方案,如 GRU 或 LSTM。 可以通过 梯度裁剪(Gradient Clipping)来限制梯度。
影响 导致无法捕捉 长距离依赖,如语言模型中的时态一致性。 导致网络参数数值爆炸,计算中出现 NaN 错误。

5.解决梯度消失问题的解决方案:GRU 和 LSTM

5.1GRU(门控循环单元)

在接下来的几个视频中,我们将详细探讨 GRU(门控循环单元) 和 LSTM(长短期记忆网络),这两种模型是为了解决 梯度消失问题 而设计的,它们能帮助神经网络捕捉 更长范围的依赖。

通过引入 门控机制(Gating Mechanisms),这些模型可以控制哪些信息需要被记住,哪些信息可以被遗忘,从而克服传统 RNN 在处理长时间序列时的困难。


小结

总结一下,训练 深度神经网络 时,我们会遇到 梯度消失 和 梯度爆炸 两个主要问题。对于 RNN 来说,尤其是处理长时间步的序列时,它也会遭遇类似的问题:

  • 梯度消失:使得 RNN 难以捕捉长距离依赖。
  • 梯度爆炸:导致参数过大,计算出现溢出。

虽然 梯度爆炸 可以通过 梯度裁剪 来解决,但 梯度消失问题 更为棘手,需要采用 GRU 或 LSTM 等模型来解决。

在接下来的内容中,我们将详细讲解 GRU 和 LSTM,这将是我们解决 梯度消失问题 的关键一步。让我们继续学习吧! 🚀