TensorFlow 中的 RNN 工作原理

17 Mar 2025 | 5 分钟阅读

循环神经网络在图像分类和**视频识别、机器翻译**和**音乐创作**方面有广泛的应用。

考虑一个**图像分类**用例,我们已经**训练**了神经网络来**对**某些**动物**的图像进行**分类**。

因此,让我们输入一张猫或狗的图像;网络会提供一个输出,其中包含**猫或狗的图像的相应标签**。

请看下图

Working of RNN in TensorFlow

在这里,第一个输出(即猫)不会影响之前的输出(即狗)。这意味着在时间“t”的输出与**时间“t-1”**的输出是独立的。

考虑一下我们需要使用上一个**获得的**输出的场景

Working of RNN in TensorFlow

这个概念与阅读一本**书**相同。随着我们向前翻阅每一页,我们需要**理解**之前的页面才能完全理解**大多数情况下的信息**。

借助前馈网络,在**时间“t+1”**的新输出与时间 t、**t-1、t-2** 的输出没有任何关系。

因此,当预测句子中的一个单词时,不能使用前馈网络,因为它与之前的一组单词没有任何绝对关系。

但是,借助**循环神经网络,**可以克服这一挑战。

请看下图

Working of RNN in TensorFlow

在上图中,我们在时间“t-1”处有特定输入,输入到网络中。这些输入也将导致在时间“t-1”处产生并行输出。

在下一个时间戳中,来自上一个输入“t-1”的信息与输入 at't' 一起提供,最终在“t”处提供输出。

这个过程会重复进行,以确保最新的输入可以感知并使用来自上一个时间戳的信息。

**循环神经网络**是一种旨在识别数据序列中模式的**人工神经网络**。例如,**文本、基因组、手写**、口语、来自**传感器**、股票市场和**政府机构**的数值时间序列数据。

为了更好地理解,请考虑以下比较

我们定期去健身房,而且教练给了我们锻炼计划

Working of RNN in TensorFlow

请注意,所有练习都按正确的顺序每周重复一次。让我们使用一个前馈网络来尝试预测练习的类型。

Working of RNN in TensorFlow

输入是**日期、月份**和**健康状况**。一个神经网络已使用这些输入进行训练,以提供练习的预测。

但是,考虑到输入,这将不太准确。要解决此问题,我们使用循环神经网络的概念,如下所示

Working of RNN in TensorFlow

在这种情况下,将之前的锻炼作为输入。

因此,如果我们昨天进行了**肩部练习**,我们今天就可以进行**肱二头肌练习**,并且每周都会继续进行下去。

但是,如果我们碰巧有一天没有去健身房,则可以考虑上一个参加的时间戳中的数据。

Working of RNN in TensorFlow

如果模型是基于从上一个练习中获得的数据体验的,则该模型的输出将是准确的。

总而言之,让我们将数据转换为向量。

其中向量是输入到**模型**的数字,用于**表示**我们是否已经完成了练习。

Working of RNN in TensorFlow

因此,如果我们在进行肩部练习,则对应的节点将为“1”,其余的练习节点将映射为“0”。

我们必须检查神经网络工作原理背后的数学原理。

Working of RNN in TensorFlow

将 'w' 设为权重矩阵,将 'b' 设为偏差

在 t=0 时,输入为 'x0,任务是找出 'h0' 是什么。将 t=0 代入方程,并获取函数 h(t) 的值。通过将先前计算的值应用于新公式,找到 'y0' 的下一个值。

相同的过程会通过模型中的所有时间戳重复,以训练模型。

训练循环神经网络

循环神经网络使用**反向传播算法**进行训练,但它适用于每个时间戳。这通常被称为**按时间反向传播** (BTT)。

反向传播的一些问题,例如

  • 梯度消失
  • 梯度爆炸

梯度消失

在梯度消失中,使用反向传播,目标是计算误差,误差是通过找出实际输出和模型输出之间的差值并将其提高到 2 次方而得出的。

Working of RNN in TensorFlow

使用**计算出的误差**,将估算与权重差异相关的错误变化。但是,对于每个学习率,这可以与相同的模型相乘。

因此,学习率与**传递**给值的变化乘积,这是**权重**的确定变化。

在每次训练迭代中,**权重**的变化都会添加到旧的权重集中,如下图所示。这里的赋值是当权重变化相乘,然后**值**更**小**时。

梯度爆炸

梯度爆炸的工作方式类似,但是这里的权重变化很大,而不是微不足道的变化。注意这里的较小

Working of RNN in TensorFlow

我们必须克服这两者,这在开始时是一个挑战。

梯度爆炸梯度消失
  • **截断 BTT** 我们可以在最后一个时间戳而不是从反向传播开始,选择一个较小的时间戳,例如 10
  • ReLU 激活函数
    我们可以使用 ReLU 这样的激活,它在计算梯度时提供一个输出
  • 在阈值处裁剪梯度
    当梯度超过阈值时裁剪它
  • RMSprop
    当梯度高于阈值时裁剪它
  • RMSprop 用于调整学习率
  • LSTM、GRU
    已专门设计用于解决此问题的不同网络架构

什么是长期依赖?

很多时候,模型中只需要最近的数据即可执行操作。但是,可能需要从过去获得的信息片段中获得信息。


下一个主题RNN 中的时间序列