什么是神经网络-循环神经网络RNN各层详解及实例展示

发布于 2025-3-21 07:37
浏览
0收藏

 循环神经网络(RNN)是一类能够处理序列数据的神经网络,它在处理自然语言处理、语音识别、时间序列分析等任务中表现出色。RNN的独特之处在于它能够捕捉序列中的时间依赖关系,这使得它与传统的前馈神经网络(如MLP)有着显著的不同。

RNN的基本原理

在标准的前馈神经网络中,输入和输出之间的映射是静态的:输入通过一组层的线性变换和非线性激活函数,然后生成输出。而RNN引入了循环的概念:在处理序列数据时,RNN不仅考虑当前时间步的输入,还会考虑之前所有时间步的信息。这种“记忆”机制通过隐藏状态(hidden state)来实现。

隐藏状态的循环关系

RNN通过一个隐藏状态(hidden state)来记住先前的时间步的信息。隐藏状态会在每一个时间步进行更新,并传递到下一个时间步。这一过程可以用以下公式表示:

ht=σ(Wxhxt+Whhht−1+bh)

其中:

  • ht 是时间步 t
  • xt 是时间步 t
  • ht−1是前一个时间步的隐藏状态。
  • Wxh
  • Whh
  • bh
  • σ 是激活函数(如​​tanh​​ 或​​ReLU​​)。

这个公式表示了RNN的核心思想:当前隐藏状态 ht 是当前输入 xt 和前一个隐藏状态 ht−1

输出层

在RNN的每一个时间步,隐藏状态会被用来生成输出。输出通常是当前时间步的隐藏状态通过某种变换得到的结果:

yt=σ(Whyht+by)

其中:

  • yt 是时间步 t
  • Why
  • by
  • σ

输出层的形式和目的可以根据具体任务进行调整。例如,在分类任务中,输出层可能是一个 ​​softmax​​ 函数,用于生成类别概率分布;在回归任务中,输出层可能是一个线性函数。

下面让我们分解RNN的每一层,深入理解其工作原理。

输入层

RNN的输入层用于接收序列数据。每个时间步的输入数据可以是一个向量 xt,表示一个时间点的特征。在自然语言处理中,xt 通常是词向量(word embedding);在时间序列分析中,xt

  • 向量化处理:通常,输入数据首先会被向量化。例如,文本数据中的单词会被转换为一个词向量;音频数据会被转换为频谱特征。这个向量化的过程是必要的,因为神经网络只能处理数值数据。
  • 时间步:RNN的输入是一个序列数据,这意味着输入数据是按时间顺序排列的一组向量。输入序列的长度可以是固定的,也可以是可变的。

隐藏层

隐藏层是RNN的核心部分,它负责处理输入序列中的时间依赖关系。每个时间步的隐藏状态 ht 不仅依赖于当前时间步的输入 xt,还依赖于前一个时间步的隐藏状态 ht−1。

  • 记忆机制:RNN的隐藏层通过反馈机制将前一个时间步的信息传递到当前时间步。这种机制使得RNN能够“记住”之前的信息,并用这些信息来影响当前时间步的输出。
  • 激活函数:为了引入非线性,隐藏层通常会应用一个激活函数,如​​tanh​​ 或​​ReLU​​。​​tanh​​ 函数是RNN中常用的激活函数,因为它的输出范围在 [-1, 1] 之间,适合处理序列数据中的正负信息。
  • 参数共享:在RNN中,不同时间步之间共享相同的参数(即权重矩阵和偏置项)。这减少了模型的复杂度,并确保模型能够处理不同长度的序列。

输出层

输出层用于生成最终的输出。在每一个时间步,RNN的隐藏状态会被用来计算当前时间步的输出。

  • 输出形式:输出可以是每个时间步的预测值(如时间序列预测),也可以是整个序列的分类结果(如情感分析)。输出层的设计通常与具体任务密切相关。

激活函数:输出层可以使用各种激活函数,视任务而定。例如,分类任务中使用​​softmax​​ 函数,而回归任务中则可能使用线性激活函数。什么是神经网络-循环神经网络RNN各层详解及实例展示-AI.x社区那么RNN的训练过程是什么样的呢?

RNN的训练过程与传统神经网络类似,但由于其循环结构,存在一些特殊的挑战。训练RNN的主要方法是反向传播通过时间(Backpropagation Through Time, BPTT)。

反向传播通过时间(BPTT)

BPTT是一种扩展的反向传播算法,适用于RNN。它通过展开RNN,将循环结构转换为一个展开的链式结构,从而可以应用标准的反向传播算法。展开后,RNN的每个时间步都被视为一个独立的神经网络层,这些层之间共享参数。

  • 展开过程:在时间序列上展开RNN,就像将整个网络“铺开”,每一个时间步的隐藏状态都变成一个独立的节点,与其他节点通过共享的权重相连。这个展开的过程使得RNN的时间依赖性可以通过标准的反向传播算法进行处理。
  • 梯度计算:通过BPTT,RNN可以计算损失函数相对于每个参数的梯度,从而更新权重。这一过程包括前向传播(计算输出和损失)以及反向传播(计算梯度并更新参数)。‍

梯度消失与梯度爆炸

由于RNN的循环结构,BPTT在处理长序列时,可能会遇到梯度消失或梯度爆炸的问题。这些问题使得训练深层RNN或长序列RNN变得困难。

  • 梯度消失:在长序列中,梯度在反向传播的过程中可能会逐渐减小,导致模型的参数更新变得极其缓慢,甚至无法更新。这使得RNN难以捕捉长时间依赖关系。
  • 梯度爆炸:相反,梯度也可能在反向传播过程中急剧增大,导致模型的参数更新过大,模型发散。


接下来进行实例讲解:

假设我们有三天的天气数据,每天的数据包括:

  • 温度:使用一个实数表示,例如 xt1‍
  • 湿度:使用一个实数表示,例如 xt2‍

我们将这些数据组织成一个向量输入RNN,例如: xt=[xt1,xt2]

我们需要预测第4天的天气,并通过前3天的天气数据进行训练。

输入数据

第1天到第3天的天气数据表示为三个输入向量:

  • 第1天: x1=[15°C,60%]
  • 第2天: x2=[16°C,65%]
  • 第3天: x3=[18°C,70%]

RNN的工作过程

RNN的核心是它的隐藏状态,用向量表示为 ht,它包含了之前时间步的信息。RNN通过递归计算,将当前的输入 xt 和前一时刻的隐藏状态 ht−1结合起来,生成当前时刻的隐藏状态 ht。

公式如下: ht=σ(Wh⋅ht−1+Wx⋅xt+bh)

 其中:

  • Wh
  • Wx
  • bh
  • σ

实例讲解:

假设我们有一个简单的RNN,初始隐藏状态 h0

第1天:

输入 x1=[15,60],初始隐藏状态 h0=[0,0]。RNN根据权重矩阵和偏置项计算新的隐藏状态: h1=σ(Wh⋅h0+Wx⋅x1+bh)假设结果是 h1=[0.5,0.8],这表示RNN通过第1天的天气数据学习到了一些信息,并存储在隐藏状态中。

第2天:

输入 x2=[16,65],现在RNN使用 h1 和 x2 计算新的隐藏状态: h2=σ(Wh⋅h1+Wx⋅x2+bh) 假设结果是 h2=[0.7,1.1],这表示RNN结合了第1天和第2天的数据更新了记忆。

第3天:

输入 x3=[18,70],RNN根据 h2 和 x3 计算出新的隐藏状态: h3=σ(Wh⋅h2+Wx⋅x3+bh) 假设结果是 h3=[1.0,1.5],现在隐藏状态包含了前3天的天气信息。

输出预测

最后,RNN使用第3天的隐藏状态 h3 来预测第4天的天气。输出层通过以下公式计算预测结果: y4=σ(Wy⋅h3+by)假设输出结果 y4=[20,72],这意味着RNN预测第4天的温度为20°C,湿度为72%。

这个例子展示了RNN如何使用向量来逐步处理输入数据并更新隐藏状态。RNN通过当前的输入 xt 和之前的隐藏状态 ht−1,递归地更新隐藏状态 ht,从而对下一个时间步进行预测。在这个过程中,RNN的隐藏状态是关键,它可以“记住”之前时间步的信息并结合当前输入做出合理的预测。

本文转载自 人工智能训练营,作者: 小A学习

收藏
回复
举报


回复
相关推荐