【Python · PyTorch】循环神经网络 RNN(基础概念)

【Python · PyTorch】循环神经网络 RNN(基础概念)

  • [0. 生物学相似性](#0. 生物学相似性)
  • [1. 概念](#1. 概念)
  • [2. 延时神经网络(TDNN)](#2. 延时神经网络(TDNN))
  • [3. 简单循环神经网络(Simple RNN)](#3. 简单循环神经网络(Simple RNN))
    • [3.1 BiRNN 双向循环神经网络](#3.1 BiRNN 双向循环神经网络)
    • [3.2 特点](#3.2 特点)
    • [3.3 网络结构](#3.3 网络结构)
    • [3.4 随时间反向传播](#3.4 随时间反向传播)
  • [4. 基于门控的循环神经网络](#4. 基于门控的循环神经网络)
    • [4.1 长短期记忆网络(Long Short-Term Memory, LSTM)](#4.1 长短期记忆网络(Long Short-Term Memory, LSTM))
      • [4.1.1 LSTM 基本组合方式](#4.1.1 LSTM 基本组合方式)
      • [4.1.2 LSTM 门控机制理解](#4.1.2 LSTM 门控机制理解)
        • [① 输入门](#① 输入门)
        • [② 遗忘门](#② 遗忘门)
        • [③ 输出门](#③ 输出门)
      • [4.1.3 BiLSTM 双向长短期记忆网络](#4.1.3 BiLSTM 双向长短期记忆网络)
    • [4.2 门控循环单元网络(Gated Recurrent Units, GRU)](#4.2 门控循环单元网络(Gated Recurrent Units, GRU))
      • [4.2.1 GRU 基本组合方式](#4.2.1 GRU 基本组合方式)
      • [4.2.2 GRU 门控机制理解](#4.2.2 GRU 门控机制理解)
        • [① 更新门](#① 更新门)
        • [② 重置门](#② 重置门)
      • [4.2.3 BiGRU 双向门控循环单元网络](#4.2.3 BiGRU 双向门控循环单元网络)
  • [5. 其他循环神经网络](#5. 其他循环神经网络)
    • [5.1 回声状态网络(Echo State Network, ESN)](#5.1 回声状态网络(Echo State Network, ESN))
    • [5.2 霍普菲尔德网络(Hopfield Network)](#5.2 霍普菲尔德网络(Hopfield Network))

0. 生物学相似性

1933年,西班牙神经生物学家Rafael Lorente de Nó发现大脑皮层 (cerebral cortex) 的解剖结构允许刺激在神经回路中循环传递,并由此提出反响回路假设 (reverberating circuit hypothesis)。该假说在同时期的一系列研究中得到认可,被认为是生物拥有短期记忆的原因。随后神经生物学的进一步研究发现,反响回路的兴奋和抑制受大脑阿尔法节律 (α-rhythm) 调控,并在α-运动神经 (α-motoneurones) 中形成循环反馈系统 (recurrent feedback system)。在二十世纪70-80年代,为模拟循环反馈系统而建立的一些数学模型为RNN带来了启发。

1. 概念

循环神经网络(Recurrent Neural Network, RNN)是一类以序列(sequence)数据为输入,在序列的演进方向进行递归(recursion)且所有节点(循环单元)按链式连接的递归神经网络(recursive neural network)。

应用领域

  • 自然语言处理:文本生成、情感分析、机器翻译
  • 音频处理:声学模型构建、语音识别
  • 时间序列预测:预测股价、气象数据、交通流量

2. 延时神经网络(TDNN)

延时神经网络 (Time Delay Neural Network, TDNN) :在ANN的 非输出层 添加 延时器 → 记录最近几次活性值

第 t t t 时刻,第 l l l 层神经元 活性值 取决于 第 l − 1 l-1 l−1 层神经网络 最近 K K K 个时刻的活性值:
h t ( l ) = f ( h t ( l − 1 ) , h t − 1 ( l − 1 ) , ⋯   , h t − K ( l − 1 ) ) \boldsymbol{h}^{(l)}{t}=f(\boldsymbol{h}^{(l-1)}{t},\boldsymbol{h}^{(l-1)}{t-1},\cdots,\boldsymbol{h}^{(l-1)}{t-K}) ht(l)=f(ht(l−1),ht−1(l−1),⋯,ht−K(l−1))

其中: h t ( l ) ∈ R M l \boldsymbol{h}^{(l)}_{t} \in \mathbb{R}^{M_l} ht(l)∈RMl 表示第 l l l 层神经网络在时刻 t t t 的活性值, M l M_l Ml 为第 l l l 层神经元的数量。

通过延时器,前馈神经网络具有了短期记忆的能力。

3. 简单循环神经网络(Simple RNN)

简单循环神经网络 (Simple Recurrent Neural Network, SRNN):一种简单的循环神经网络,仅有一个隐藏层夹在浅层ANN中,负责连接相邻的层与层。

令向量 x t ∈ R M \boldsymbol{x}_t \in \mathbb{R}^{M} xt∈RM 表示在时刻 t t t 网络的输入, h t ∈ R D \boldsymbol{h}_t\in\mathbb{R}^D ht∈RD 表示隐藏层状态 (即隐藏层神经元活性值),则 h t \boldsymbol{h}_t ht 不仅和当前时刻的输入 x t \boldsymbol{x}t xt相关,也和上一个时刻的隐藏层状态 h t − 1 h{t-1} ht−1相关。

简单循环神经网络的两种表现形式(未展开 & 展开):

简单循环神经网络 时刻 t t t 更新公式为:
z t = U h t − 1 + w x t + b h t = f ( z t ) \boldsymbol{z}t=Uh{t-1} + wx_t+b \\ h_t=f(z_t) zt=Uht−1+wxt+bht=f(zt)

3.1 BiRNN 双向循环神经网络

双向循环神经网络 (‌BiRNN):一种特殊的RNN,能够同时处理输入序列的前后文信息,从而提高模型的表达能力和准确度。

优点‌:

  • 捕捉前后文信息‌:BiRNN能够同时利用输入序列的前后文信息,这在理解自然语言时非常重要。
  • 提高精度‌:在处理某些序列数据时,BiRNN能够更全面地捕捉整个序列中的重要信息,从而提高模型的表达能力和准确度‌。

缺点‌:

  • 计算成本较高‌:由于需要同时处理前后文信息,BiRNN的计算成本比单向RNN更高。
  • 梯度消失问题‌:在长序列处理中,BiRNN也可能遇到梯度消失问题,影响模型性能‌。

3.2 特点

记忆性

TDNN SRNN LSTM GRU ESN Hopfield - 记忆功能

网络类型 记忆期限 实现方式 特性
延时神经网络 (TDNN) 短期 延时器
普通循环神经网络 (SRNN) 短期 延时器 / 隐状态 / 细胞雏形
长短期记忆网络 (LSTM) 长短期 隐状态 / 细胞结构
门控循环单元网络 (GRU) 长短期 隐状态 / 细胞结构
回声状态网络 (ESN) 动态 储备池 动态
霍普菲尔德网络 (Hopfield) 大约单元数15%左右 统计力学特性 / 热力学特性 联想

参数共享

RNN 参数共享:在每个时间步中,使用的权重矩阵是共享的‌。

图灵完备

图灵机 (Turing Machine):一种抽象的信息处理装置,具有无限存储能力,可以用来解决所有可计算问题。

图灵完备 (Turing Completeness):一种数据操作规则,比如一种计算机编程语言,可以实现图灵机所有功能,解决所有可计算问题。

不严谨的理解:只要顺序想好 啥可计算的问题都能计算,只要存储空间给够 啥五花八门结构的用于计算的信息/数据都能存储。

与 RNN 的关系:所有图灵机都可被一个有Sigmoid型激活函数的神经元构成的全连接循环神经网络组成。

3.3 网络结构

① 一对一(One to One)

  • 输入:单变量
  • 输出:单变量

② 一对多(One to Many)

  • 输入:单变量
  • 输出:序列

③ 多对一(Many to One)

  • 输入:序列
  • 输出:单变量

④ 多对多(Many to Many)

  • 输入:序列
  • 输出:序列

⑤ 同步多对多

  • 输入:序列(与输出对应)
  • 输出:序列(与输入对应)

3.4 随时间反向传播

RNN的训练采用时间反向传播(Backpropagation Through Time, BPTT),该算法通过在时间序列的每个时间步上计算梯度,逐步更新网络的参数。BPTT的核心思想是在展开的时间图上对整个序列进行梯度计算,并逐时间步向前反向传播梯度。

4. 基于门控的循环神经网络

门控循环神经网络 (Gated Recurrent Neural Network):为更好地捕捉时间序列中时间步距离较大的依赖关系。它通过可以学习的门来控制信息的流动

4.1 长短期记忆网络(Long Short-Term Memory, LSTM)

长短期记忆网络 (LSTM,Long Short-Term Memory):一种特殊的循环神经网络,用于处理和建模具有时间依赖性的序列数据。与传统RNN相比,LSTM引入了一种称为"门控机制"的结构,有效地解决了传统RNN在长序列训练中容易出现的 梯度消失梯度爆炸 问题。

标志:为RNN设计细胞 → 解决 无法捕捉"长期"关联/依赖关系 的问题

LSTM可解决RNN在处理长序列数据时的 梯度消失梯度爆炸 问题。

LSTM可捕捉序列中的长期依赖关系,因此适合时序处理、自然语言处理、音频处理等领域的序列数据。

关键思想:通过门控机制控制信息的流动,使网络能够更好地捕捉和记忆长期依赖关系,从而适用于处理时间序列数据,如语音识别、文本生成、机器翻译等任务。通过引入LSTM结构,模型能够更好地处理长期依赖关系,避免了传统RNN中信息衰减或失去的问题,提高了模型对序列数据的建模能力。

相较于RNN优势

  • 缓解RNN "梯度消失" 问题
  • 缓解RNN "长期" 依赖问题

LSTM 单元/细胞 基本结构

LSTM 门控机制 (Gating Mechanism) 公式及其作用

输入门𝒊𝑡:控制当前时刻的候选状态𝒄̃𝑡 有多少信息需要保存.
i t = σ ( W i x t + U i h t − 1 + b i ) \boldsymbol{i}_t=\sigma(\boldsymbol{W}_i\boldsymbol{x}_t+\boldsymbol{U}i\boldsymbol{h}{t-1}+\boldsymbol{b}_i) it=σ(Wixt+Uiht−1+bi)

遗忘门𝒇𝑡 :控制上一个时刻的内部状态𝒄𝑡−1 需要遗忘多少信息.
f t = σ ( W f x t + U f h t − 1 + b f ) \boldsymbol{f}_t=\sigma(\boldsymbol{W}_f\boldsymbol{x}_t+\boldsymbol{U}f\boldsymbol{h}{t-1}+\boldsymbol{b}_f) ft=σ(Wfxt+Ufht−1+bf)

输出门 𝒐𝑡:控制当前时刻的内部状态 𝒄𝑡 有多少信息需要输出给外部状态𝒉𝑡.

o t = σ ( W o x t + U o h t − 1 + b o ) \boldsymbol{o}_t=\sigma(\boldsymbol{W}_o\boldsymbol{x}_t+\boldsymbol{U}o\boldsymbol{h}{t-1}+\boldsymbol{b}_o) ot=σ(Woxt+Uoht−1+bo)

4.1.1 LSTM 基本组合方式

前后串行相继关系

在PyTorch中的体现:torch.nn.LSTM()hidden_size参数。

两层并行层叠关系

在PyTorch中的体现:torch.nn.LSTM()num_layers参数。

4.1.2 LSTM 门控机制理解

LSTM通过以下步骤在每个时间步处理输入序列:

  • 输入序列的当前时间步 t 的输入与上一个时间步 t-1的隐藏状态传递给LSTM单元。
  • 遗忘门决定哪些信息应该从单元状态中遗忘,输入门决定哪些新信息应该存储在单元状态中。
  • 更新单元状态,将遗忘门的输出与输入门的输出相乘,然后加上一个候选值,以更新单元的状态。
  • 输出门决定了当前时间步的隐藏状态。
  • 新的隐藏状态和单元状态传递到下一个时间步,同时输出用于预测或其他任务。
① 输入门

输入门 (Input Gate):帮助模型确定需要将多少过去的信息 (来自之前的时间步骤) 传递到未来,取值介于0~1。

② 遗忘门

遗忘门 (Forget Gate):对于上一时刻LSTM中的单元状态来说,一些"信息"可能会随着时间的流逝而"过时"。为了不让过多记忆影响神经网络对现在输入的处理,我们应该选择性遗忘一些在之前单元状态中的分量这个工作就交给了"遗忘门",取值介于0~1。

③ 输出门

输出门 (Output Gate):包含一个Sigmoid激活函数和一个点乘运算。Sigmoid函数的输出在0到1之间,它可以决定哪些信息需要保留,哪些信息需要丢弃,取值介于0~1。

4.1.3 BiLSTM 双向长短期记忆网络

双向长短期记忆网络 (LSTM):一种改进LSTM,专门设计用于处理序列数据。BiLSTM通过结合前向和后向两个LSTM网络的输出来捕捉序列中的双向依赖关系,从而能够同时考虑序列的前后文信息‌。

BiLSTM由前向LSTM和后向LSTM组成。前向LSTM处理输入序列从开始到结束,而后向LSTM则从结束到开始处理。

两向LSTM的输出结合在一起,形成最终的输出结果。

每个时刻的输出是前向与后向LSTM的隐状态的连接,亦可使用其他方式连接。

优势

  1. 捕捉双向依赖关系‌:BiLSTM能够同时考虑到序列的前后文信息,对于需要了解全局上下文的任务 (如命名实体识别、机器翻译等) 非常有利‌。
  2. 改善性能‌:在许多自然语言处理 (NLP) 任务中,BiLSTM通常比LSTM具有更好的表现‌。

应用场景‌:

  • 情感分析‌:通过获取文本的上下文信息,判断情感倾向。
  • 机器翻译‌:在翻译过程中,考虑上下文的双向信息,提高翻译质量。
  • 语音识别‌:处理语音信号时,利用双向信息提高识别准确率‌3。

4.2 门控循环单元网络(Gated Recurrent Units, GRU)

门控循环单元(gated recurrentunit,GRU):一种循环神经网络,可解决一般的RNN存在的长期依赖问题,且相较于LSTM具有更少的计算量。

标志:简化LSTM细胞结构 + 保持其基本效能 → 减时提速

GRU相较于LSTM结构更简单 (参数较少),即在训练过程中 GRU需要的 计算资源和训练时间更少

在特定情况下,GRU可能会比LSTM更有效率,尤其是在对训练速度有较高要求的应用场景中‌。

相较于LSTM优势

  • 缓解LSTM 计算训练速度慢的问题
  • 降低过拟合风险

GRU 单元/细胞 基本结构

4.2.1 GRU 基本组合方式

基本组合方式与LSTM类似:前后串行相继关系、两层并行层叠关系

在PyTorch中torch.nn.GRU()的体现参数也与torch.nn.LSTM()类似。

GRU 门控机制 (Gating Mechanism) 公式及其作用

更新门𝒛𝑡:权衡新旧信息保留与遗忘。
z t = σ ( W z x t + U z h t − 1 + b z ) \boldsymbol{z}_t=\sigma(\boldsymbol{W}_z\boldsymbol{x}_t+\boldsymbol{U}z\boldsymbol{h}{t-1}+\boldsymbol{b}_z) zt=σ(Wzxt+Uzht−1+bz)

重置门𝒓𝑡:确定过去信息的遗忘比例。
r t = σ ( W r x t + U r h t − 1 + b r ) \boldsymbol{r}_t=\sigma(\boldsymbol{W}_r\boldsymbol{x}_t+\boldsymbol{U}r\boldsymbol{h}{t-1}+\boldsymbol{b}_r) rt=σ(Wrxt+Urht−1+br)

4.2.2 GRU 门控机制理解

① 更新门

更新门:帮助模型确定当前单元新信息与上个单元传递旧信息的考虑比例,取值介于0~1。

② 重置门

重置门:帮助模型确定过去信息的遗忘比例,取值介于0~1。

4.2.3 BiGRU 双向门控循环单元网络

双向门控循环单元网络 (BiGRU):一种改进GRU,专门设计用于处理序列数据。BiGRU通过结合前向和后向两个GRU网络的输出来捕捉序列中的双向依赖关系,从而能够同时考虑序列的前后文信息‌。

5. 其他循环神经网络

由于篇幅有限,这里对ESN和Hopfield网络仅作简单描述,后续章节可能会补齐相关内容。

5.1 回声状态网络(Echo State Network, ESN)

回声状态网络 (ESN):一种循环神经网络。ESN 训练方式与传统 RNN 不同。

矩阵谱半径 (Matrix Spectral Radius):‌矩阵绝对值最大的特征值。

设矩阵 A ∈ C n × n A \in C^{n \times n} A∈Cn×n,其特征值为 λ 1 , λ 2 , ⋯   , λ n \lambda_1, \lambda_2, \cdots, \lambda_n λ1,λ2,⋯,λn,则矩阵 A A A 的谱半径 ρ ( A ) \rho(A) ρ(A) 定义为:
ρ ( A ) = max ⁡ 1 ≤ i ≤ n ∣ λ i ∣ \rho(A)=\max_{1 \le i \le n}|\lambda_i| ρ(A)=1≤i≤nmax∣λi∣

网络结构及特点

  1. 储层 (Reservoir):中文翻译有叫储备池、储层、储蓄池等等各种名称。ESN 中的储层是互连神经元的集合,其中连接及其权重是随机初始化和固定的。该储层充当动态储层,其目的是将输入数据转换到更高维的空间,它充当动态存储器,捕获输入数据中的时间依赖性。储层中的神经元可以表现出复杂的动力学,包括振荡和混沌,这可以帮助捕获输入数据中的时间模式。
  2. 输出层:经过储层后,转换后的数据仅用于训练输出层。这通常是使用线性回归方法完成的,使得训练过程相对快速和高效。
  3. 回声状态属性:为了使ESN有效工作,它必须具有"回声状态属性"。这意味着网络的内部状态应该是最近输入历史的函数,并且应该淡出或"回显"旧的输入。此属性确保网络对先前的输入有一定的记忆,但不会陷入重复它们的循环中。调整储层权重矩阵的谱半径是确保这一特性的一种方法。
  4. 储层计算: 储层计算是一个包含 Echo State Networks 的框架。在 ESN 中,储层是随机初始化的循环神经元的动态存储器,用于捕获顺序数据中的时间模式。

优点

  1. 时间序列预测: ESN 擅长预测时间序列中的未来值。在处理具有复杂模式和依赖性的数据序列时,它们特别有效。
  2. 训练高效: ESN 拥有独特的训练方法。虽然存储库是随机生成和固定的,但仅训练输出权重。与传统的循环神经网络 (RNN) 相比,训练计算效率更高,并且允许 ESN 在较小的数据集上进行训练。
  3. 非线性映射:ESN 中的储层给模型带来了非线性。这有助于捕获和建模线性模型可能难以处理的数据中的复杂关系。
  4. 对噪声的鲁棒性:ESN 对输入数据中的噪声具有鲁棒性。储层的动态特性使其能够过滤掉不相关的信息并专注于基本模式。
  5. 易于实施:与训练传统RNN相比, ESN实现更简单。固定随机库和输出权重的直接训练使 ESN 更易于实际使用。
  6. 记忆 & 学习: ESN 中的存储库充当存储器,从输入序列中捕获相关信息。这种记忆使网络能够根据学习的模式进行概括并做出准确的预测。

缺点

  1. 对储层动力学的有限控制:储层是随机初始化的,这种缺乏对其动力学的直接控制。虽然这种随机性可能是有益的,针对特定任务精确定制网络比较困难。
  2. 超参数灵敏度:ESN 通常依赖于调整超参数(储层大小、谱半径、激活函数和输入缩放)。
  3. 缺乏理论理解:与其他一些神经网络架构相比,ESN 的理论理解并不完善。对于一些情况难以解释。
  4. 表达能力有限:在某些任务下会不如更复杂的循环神经网络。难以完成需要捕获非常复杂的模式的任务。
  5. 过度拟合的可能性:根据任务的复杂性和存储库的大小,ESN 可能容易过拟合,尤其是训练数据有限的情况下。

5.2 霍普菲尔德网络(Hopfield Network)

Hopfield神经网络:一种递归神经网络,由约翰·霍普菲尔德在1982年发明。

Hopfield网络是一种结合存储系统和二元系统的神经网络。它保证了向局部极小的收敛,但收敛到错误的局部极小值(local minimum),而非全局极小(global minimum)的情况也可能发生。Hopfield网络也提供了模拟人类记忆的模型。

离散Hopfield网络:一个单层网络,有n个神经元节点,每个神经元的输出均接到其它神经元的输入。各节点没有自反馈。每个节点都可处于一种可能的状态(1 或-1),即当该神经元所受的刺激超过其阀值时,神经元就处于一种状态(比如1),否则神经元就始终处于另一状态(比如-1)。 整个网络有两种工作方式:即异步方式和同步方式。


联想记忆功能是离散Hopfield网络的一个重要应用范围。要想实现联想记忆,反馈网络必须具有两个基本条件:

  1. 网络能收敛到稳定的平衡状态,并以其作为样本的记忆信息;
  2. 具有回忆能力,能够从某一残缺的信息回忆起所属的完整的记忆信息。 离散Hopfield网络实现联想记忆的过程分为两个阶段:学习记忆阶段和联想回忆阶段。在学习记忆阶段中,设计者通过某一设计方法确定一组合适的权值,使网络记忆期望的稳定平衡点。联想回忆阶段则是网络的工作过程。

离散Hopfield网络用于联想记忆有两个突出的特点:即记忆是分布式的,而联想是动态的。

离散Hopfield网络局限性,主要表现在以下几点:

  1. 记忆容量的有限性;
  2. 伪稳定点的联想与记忆;
  3. 当记忆样本较接近时,网络不能始终回忆出正确的记忆等。另外网络的平衡稳定点并不可以任意设置的,也没有一个通用的方式来事先知道平衡稳定点。
相关推荐
易风有点疯11 分钟前
Python:序列化
开发语言·python
亚图跨际19 分钟前
Python和R统计检验比较各组之间的免疫浸润
python·r语言·统计检验
Promising_GEO27 分钟前
使用R语言绘制简单地图的教程
开发语言·python·r语言
湫ccc1 小时前
《Python基础》之函数的用法
开发语言·python
测试老哥1 小时前
pytest之收集用例规则与运行指定用例
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·pytest
庄毕楠2 小时前
金铲铲S13双城之战自动拿牌助手
python·pyautogui·金铲铲·金铲铲游戏助手·金铲铲助手
菜鸟小贤贤2 小时前
pyhton+yaml+pytest+allure框架封装-全局变量接口关联
开发语言·python·macos·自动化·pytest
南东山人2 小时前
python问题解决-外部模块明明安装了,却总是无法找到
开发语言·python
Adolf_19933 小时前
Django 自定义路由转换器
后端·python·django
B站计算机毕业设计超人3 小时前
计算机毕业设计Python+大模型美食推荐系统 美食可视化 美食数据分析大屏 美食爬虫 美团爬虫 机器学习 大数据毕业设计 Django Vue.js
大数据·爬虫·python·深度学习·机器学习·课程设计·推荐算法