随时间反向传播 - RNN

2025年6月21日 | 阅读 4 分钟

引言

循环神经网络(Recurrent Neural Networks)是处理序列数据的网络。它们不仅可以根据当前输入预测输出,还可以考虑在此之前生成的输入。当前的输出取决于当前的输出和记忆元素(包括先前的输入)。

为了训练这些网络,我们使用传统的反向传播并增加一些变化。我们不是在确切的时间“t”上训练系统。我们根据特定的时间“t”以及在时间“t”之前发生的一切进行训练,例如:t-1、t-2、t-3。

请看下面的 RNN 图示

Back Propagation through time - RNN

S1、S2 和 S3 分别是时间 t1、t2 和 t3 时的隐藏状态或记忆单元,而 Ws 代表与之相伴的权重矩阵。

X1、X2 和 X3 分别是时间 t1、t2 和 t3 的输入,而 Wx 代表与之相伴的加权矩阵。

Y1、Y2 和 Y3 分别是 t1、t2 和 t3 的输出,而 Wy 是与之相伴的加权矩阵。

对于任何时间 t,我们有以下两个方程

St = g1 (Wx xt + Ws St-1)
Yt = g2 (WY St )

其中 g1 和 g2 是激活函数。

我们现在将在时间 t = 3 时执行反向传播。

设误差函数为

Et=(dt-Yt )2

这里,我们使用平方误差,其中 D3 是在时间 t = 3 时的期望输出。

为了进行反向传播,必须更改与输入、记忆单元和输出相关联的权重。

调整 Wy

为了更好地理解,我们可以看下图

Back Propagation through time - RNN
Back Propagation through time - RNN

说明

E3 是 Y3 的函数。因此,我们将 E3 对 Y3 求导。

Y3 是 W3 的函数。因此,我们将 Y3 对 W3 求导。

调整 Ws

为了更好地理解,我们可以看下图

Back Propagation through time - RNN
Back Propagation through time - RNN

说明

E3 是 Y3 的函数。因此,我们将 E3 对 Y3 求导。Y3 是 S3 的函数。因此,我们将 Y3 对 S3 求导。

S3 是 Ws 中的一个元素。因此,我们将 S3 对 Ws 求导。

但这还不够,因此我们必须考虑之前的时间步。我们还必须考虑权重矩阵 Ws,对误差函数关于记忆单元 S2 和 S1 进行(偏)微分。

必须要注意的是,一个记忆单元,如 St,是其前一个记忆单元 St-1 的结果。

因此,我们将 S3 对 S2 求导,S2 对 S1 求导。

通常,我们可以用以下公式来描述

Back Propagation through time - RNN

调整 WX

为了更好地理解,我们可以看下图

Back Propagation through time - RNN
Back Propagation through time - RNN

说明

E3 是 Y3 的一个结果。因此,我们将 E3 对 Y3 求导。Y3 是 S3 的一个函数结果。因此,我们将 Y3 对 S3 求导。

S3 是 WX 中的一个元素。因此,我们可以将 S3 对 WX 求导。

我们不能止步于此,因此我们还需要考虑之前的时间步。因此,我们考虑 WX 权重矩阵,将误差函数对记忆单元 S2 和 S1 进行(偏)微分。

通常,我们可以用以下公式来定义

Back Propagation through time - RNN

局限性

这种使用随时间反向传播(BPTT)的技术是一种可用于有限时间间隔的方法,例如 8 或 10 个时间步。如果我们继续反向传播,梯度会变得太小。这被称为“梯度消失”问题。这是因为信息的价值随时间呈几何级数递减。因此,如果时间步数大于 10(比如说),数据实际上就被丢弃了。

超越 RNNs

解决这个问题最著名的方案之一是使用所谓的长短期记忆(LSTM)单元来代替传统的 RNN 单元。然而,可能会出现另一个问题,称为梯度爆炸问题,即梯度变得不可控地高。

解决方案

一个著名的方法叫做梯度裁剪,即在每个时间步,我们确定梯度 δ 是否大于阈值。如果是,那么我们应该将其归一化。