用户工具

站点工具


rnn

RNN

RNN(Recurrent Neural Network,循环神经网络) 是一类专门用于处理序列数据(Sequential Data)的 Neural Network。

RNN 的核心思想是:模型在处理当前输入时,不仅考虑当前输入 xₜ,还利用前一个时间步产生的隐藏状态(Hidden State) hₜ₋₁,从而将过去的信息传递到当前计算中。

其核心计算可以表示为:

hₜ = f(Wₕₕhₜ₋₁ + Wₓₕxₜ + b)

yₜ = g(Wᵧₕhₜ + bᵧ)

其中:

* xₜ:当前时间步的输入。 * hₜ:当前隐藏状态。 * hₜ₋₁:前一个时间步的隐藏状态。 * yₜ:当前输出。 * Wₓₕ、Wₕₕ、Wᵧₕ:模型参数。 * f、g:激活函数或输出函数。

RNN 的关键特征是:

当前状态 = 当前输入 + 过去状态

因此它能够在处理序列时保留一定的历史信息。

提出与发展

RNN 并不存在一个唯一的发明者,其思想来自早期对反馈神经网络和动态系统的研究。

1980 年代,Jeffrey Elman 和 Michael Jordan 等人分别提出了具有代表性的简单循环网络。

1986 年

David E. Rumelhart、Geoffrey Hinton 和 Ronald Williams 提出了 Backpropagation 方法,为后来训练循环网络提供了重要基础。

1990 年

Jeffrey Elman 在论文 Finding Structure in Time 中提出著名的 Elman Network,通过隐藏状态保存序列历史信息,成为现代 RNN 的经典形式之一。

1997 年

LSTM(Long Short-Term Memory)由 Sepp Hochreiter 和 Jürgen Schmidhuber 提出,用于解决传统 RNN 难以学习长期依赖的问题。

2014 年

Kyunghyun Cho 等人提出 GRU(Gated Recurrent Unit),提供了一种结构更简单的门控循环网络。

RNN 在 2010 年代曾经是 NLP、语音识别和时间序列建模的重要基础架构,后来逐渐被 Transformer 大规模取代。

RNN 的核心结构

普通的前馈 Neural Network 可以理解为:

输入 → 网络 → 输出

每次输入之间通常没有直接的内部状态传递。

RNN 则加入了循环结构:

xₜ → hₜ → hₜ₊₁ → hₜ₊₂ → ...

因此:

x₁ → h₁

x₂ + h₁ → h₂

x₃ + h₂ → h₃

x₄ + h₃ → h₄

模型通过隐藏状态将过去的信息传递到未来。

展开后的 RNN

RNN 在结构上存在循环:

hₜ₋₁ → hₜ → hₜ₊₁

为了训练,可以把循环沿时间方向展开:

x₁ → h₁ → h₂ → h₃ → ... → hₙ

其中每一个时间步使用相同的一组参数。

因此虽然展开后看起来有很多层,但这些时间步实际上共享参数。

这种结构称为:

参数共享(Parameter Sharing)

RNN 的输入输出形式

RNN 可以处理不同形式的输入输出关系。

Many-to-One

多个输入 → 一个输出

例如:

词₁ → 词₂ → 词₃ → 词₄ → 分类

可以用于文本情感分类。

One-to-Many

一个输入 → 多个输出

例如:

图像 → 单词序列

可以用于早期的图像描述生成。

Many-to-Many

多个输入 → 多个输出

例如:

词₁ → 标签₁ 词₂ → 标签₂ 词₃ → 标签₃

可以用于 Sequence Labeling。

Encoder-Decoder

输入序列 → 编码 → 输出序列

曾经广泛用于机器翻译等 NLP 任务。

RNN 与序列数据

RNN 特别适合具有时间或顺序关系的数据。

例如:

* 文本 * 语音 * 股票时间序列 * 传感器数据 * 用户行为序列 * 音乐 * 视频帧序列

对于:

我 → 喜欢 → 学习 → 人工智能

RNN 在处理“人工智能”时,可以通过隐藏状态间接获得之前词语的信息。

因此 RNN 的核心假设之一是:

当前信息与过去的信息存在关系。

这构成了 RNN 的一种 Inductive Bias。

BPTT

RNN 通常使用 Backpropagation Through Time(BPTT,时间反向传播)进行训练。

首先将 RNN 沿时间展开:

x₁ → h₁ → h₂ → h₃ → ... → hₜ

然后像普通神经网络一样进行 Backpropagation,但梯度需要沿着时间方向传播。

因此:

Loss → hₜ → hₜ₋₁ → hₜ₋₂ → ... → h₁

这就是 BPTT。

梯度消失

普通 RNN 的主要问题之一是梯度消失(Vanishing Gradient)。

在 BPTT 中,梯度需要经过多个时间步传播。

如果每一步的梯度都乘以一个小于 1 的因子:

∂L/∂hₜ₋ₖ ≈ ∏ Jᵢ

随着时间步增加,这个乘积可能快速趋近于 0。

结果是:

距离当前很远的信息 → 梯度越来越小 → 很难学习长期依赖

例如:

“我小时候生活在法国……经过很多描述……我会说流利的 ___。”

模型需要记住很久以前的“法国”,但普通 RNN 很难稳定地保留这种长期信息。

梯度爆炸

RNN 还可能出现梯度爆炸(Exploding Gradient)。

如果反向传播过程中梯度不断放大:

∏ Jᵢ → 很大

就可能导致参数更新异常巨大,训练变得不稳定。

常见解决方法之一是:

Gradient Clipping(梯度裁剪)

当梯度超过指定范围时限制其大小。

LSTM

为了解决普通 RNN 难以学习长期依赖的问题,Hochreiter 和 Schmidhuber 在 1997 年提出了 LSTM。

LSTM 引入了:

* Cell State * Forget Gate * Input Gate * Output Gate

核心思想是让信息能够沿着 Cell State 更稳定地传播。

可以粗略表示为:

输入 → 门控机制 → 决定保留什么 / 删除什么 / 写入什么 → 新状态

因此 LSTM 能够比普通 RNN 更有效地处理长期依赖。

GRU

GRU 是另一种门控循环网络,由 Cho 等人在 2014 年提出。

相比 LSTM,GRU 的结构更加简单。

它主要通过:

* Update Gate * Reset Gate

控制历史信息和当前信息的组合。

因此:

RNN → 基础循环结构

LSTM / GRU → 加入门控机制的 RNN

双向 RNN

Bidirectional RNN(双向循环神经网络) 同时从两个方向处理序列:

正向:

x₁ → x₂ → x₃ → ... → xₙ

反向:

xₙ → xₙ₋₁ → xₙ₋₂ → ... → x₁

最终将两个方向的隐藏状态结合起来。

这样模型可以同时利用:

过去信息 + 未来信息

因此特别适合需要利用完整上下文的序列任务。

RNN 与 Transformer

RNN 和 Transformer 都可以处理序列数据,但基本机制不同。

RNN

x₁ → h₁ → h₂ → h₃ → ...

信息主要通过隐藏状态逐步传播。

Transformer

x₁ ↔ x₂ ↔ x₃ ↔ ...

通过 Attention 直接建立不同位置之间的关系。

因此二者有几个重要区别。

并行计算

RNN 的时间步存在依赖:

hₜ 必须等待 hₜ₋₁

因此训练时难以完全并行。

Transformer 可以同时计算多个位置的 Attention,因此更加适合 GPU 大规模并行训练。

长期依赖

RNN 需要通过多个时间步传递信息。

Transformer 可以通过 Attention 直接连接远距离 Token。

因此长距离依赖通常更加容易处理。

计算复杂度

标准 Self-Attention 的计算量通常随序列长度呈平方增长:

O(n²)

而 RNN 每个时间步处理固定维度状态,理论上通常可以达到:

O(n)

因此 RNN 在超长序列的理论计算复杂度方面存在优势。

不过 RNN 的顺序依赖限制了硬件并行能力,而 Transformer 的高并行性使其在现代大规模训练中更具优势。

RNN 为什么逐渐被 Transformer 取代

2017 年 Transformer 提出后,RNN 在 NLP 中逐渐失去主流地位。

主要原因包括:

* RNN 难以进行大规模并行训练。 * 长距离依赖难以处理。 * BPTT 训练过程复杂。 * Transformer 可以利用 Attention 直接建立远距离依赖。 * Transformer 更适合现代 GPU / TPU 的大规模矩阵计算。

因此 NLP 的主流架构逐渐经历:

RNN → LSTM / GRU → Transformer

不过这并不意味着 RNN 已经没有价值。

RNN 的思想仍然影响着:

* 序列建模 * 状态空间模型 * 时间序列预测 * 流式推理 * 在线学习

近年来,一些新的序列模型也重新探索了“循环状态”的思想。

RNN 的优点

* 天然适合序列数据。 * 能够维护随时间变化的隐藏状态。 * 参数在不同时间步共享。 * 理论上可以处理任意长度的序列。 * 对于某些流式任务,可以逐步处理输入。 * 单步状态的计算和存储相对简单。

RNN 的缺点

* 时间步之间存在顺序依赖。 * 难以充分利用 GPU 并行计算。 * 普通 RNN 容易出现梯度消失和梯度爆炸。 * 长期依赖难以学习。 * 长序列训练速度较慢。 * 在现代大规模 NLP 中通常不如 Transformer。

RNN 的核心意义

RNN 的重要思想是:

神经网络不仅可以处理独立的输入,还可以通过隐藏状态维护历史信息。

也就是说,模型不再只是:

y = f(x)

而是:

hₜ = f(xₜ, hₜ₋₁)

因此当前输出不仅取决于当前输入,也取决于过去的状态。

这一思想奠定了现代序列建模的重要基础。

从发展历史来看,可以理解为:

RNN → LSTM / GRU → Attention → Transformer → LLM

RNN 解决了“如何让神经网络记住序列历史”的问题,而 Transformer 则进一步改变了“如何在序列中建立依赖关系”的方式。

相关条目

参考资料

* Jeffrey L. Elman, 1990, Finding Structure in Time * Sepp Hochreiter and Jürgen Schmidhuber, 1997, Long Short-Term Memory * Kyunghyun Cho et al., 2014, Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation * Yoshua Bengio, Patrice Simard and Paolo Frasconi, 1994, Learning Long-Term Dependencies with Gradient Descent is Difficult * Ashish Vaswani et al., 2017, Attention Is All You Need

RNN

RNN(Recurrent Neural Network,循环神经网络) 是一类专门用于处理序列数据(Sequential Data)的 Neural Network。

RNN 的核心思想是:模型在处理当前输入时,不仅考虑当前输入 xₜ,还利用前一个时间步产生的隐藏状态(Hidden State) hₜ₋₁,从而将过去的信息传递到当前计算中。

其核心计算可以表示为:

hₜ = f(Wₕₕhₜ₋₁ + Wₓₕxₜ + b)

yₜ = g(Wᵧₕhₜ + bᵧ)

其中:

* xₜ:当前时间步的输入。 * hₜ:当前隐藏状态。 * hₜ₋₁:前一个时间步的隐藏状态。 * yₜ:当前输出。 * Wₓₕ、Wₕₕ、Wᵧₕ:模型参数。 * f、g:激活函数或输出函数。

RNN 的关键特征是:

当前状态 = 当前输入 + 过去状态

因此它能够在处理序列时保留一定的历史信息。

提出与发展

RNN 并不存在一个唯一的发明者,其思想来自早期对反馈神经网络和动态系统的研究。

1980 年代,Jeffrey Elman 和 Michael Jordan 等人分别提出了具有代表性的简单循环网络。

1986 年

David E. Rumelhart、Geoffrey Hinton 和 Ronald Williams 提出了 Backpropagation 方法,为后来训练循环网络提供了重要基础。

1990 年

Jeffrey Elman 在论文 Finding Structure in Time 中提出著名的 Elman Network,通过隐藏状态保存序列历史信息,成为现代 RNN 的经典形式之一。

1997 年

LSTM(Long Short-Term Memory)由 Sepp Hochreiter 和 Jürgen Schmidhuber 提出,用于解决传统 RNN 难以学习长期依赖的问题。

2014 年

Kyunghyun Cho 等人提出 GRU(Gated Recurrent Unit),提供了一种结构更简单的门控循环网络。

RNN 在 2010 年代曾经是 NLP、语音识别和时间序列建模的重要基础架构,后来逐渐被 Transformer 大规模取代。

RNN 的核心结构

普通的前馈 Neural Network 可以理解为:

输入 → 网络 → 输出

每次输入之间通常没有直接的内部状态传递。

RNN 则加入了循环结构:

xₜ → hₜ → hₜ₊₁ → hₜ₊₂ → ...

因此:

x₁ → h₁

x₂ + h₁ → h₂

x₃ + h₂ → h₃

x₄ + h₃ → h₄

模型通过隐藏状态将过去的信息传递到未来。

展开后的 RNN

RNN 在结构上存在循环:

hₜ₋₁ → hₜ → hₜ₊₁

为了训练,可以把循环沿时间方向展开:

x₁ → h₁ → h₂ → h₃ → ... → hₙ

其中每一个时间步使用相同的一组参数。

因此虽然展开后看起来有很多层,但这些时间步实际上共享参数。

这种结构称为:

参数共享(Parameter Sharing)

RNN 的输入输出形式

RNN 可以处理不同形式的输入输出关系。

Many-to-One

多个输入 → 一个输出

例如:

词₁ → 词₂ → 词₃ → 词₄ → 分类

可以用于文本情感分类。

One-to-Many

一个输入 → 多个输出

例如:

图像 → 单词序列

可以用于早期的图像描述生成。

Many-to-Many

多个输入 → 多个输出

例如:

词₁ → 标签₁ 词₂ → 标签₂ 词₃ → 标签₃

可以用于 Sequence Labeling。

Encoder-Decoder

输入序列 → 编码 → 输出序列

曾经广泛用于机器翻译等 NLP 任务。

RNN 与序列数据

RNN 特别适合具有时间或顺序关系的数据。

例如:

* 文本 * 语音 * 股票时间序列 * 传感器数据 * 用户行为序列 * 音乐 * 视频帧序列

对于:

我 → 喜欢 → 学习 → 人工智能

RNN 在处理“人工智能”时,可以通过隐藏状态间接获得之前词语的信息。

因此 RNN 的核心假设之一是:

当前信息与过去的信息存在关系。

这构成了 RNN 的一种 Inductive Bias。

BPTT

RNN 通常使用 Backpropagation Through Time(BPTT,时间反向传播)进行训练。

首先将 RNN 沿时间展开:

x₁ → h₁ → h₂ → h₃ → ... → hₜ

然后像普通神经网络一样进行 Backpropagation,但梯度需要沿着时间方向传播。

因此:

Loss → hₜ → hₜ₋₁ → hₜ₋₂ → ... → h₁

这就是 BPTT。

梯度消失

普通 RNN 的主要问题之一是梯度消失(Vanishing Gradient)。

在 BPTT 中,梯度需要经过多个时间步传播。

如果每一步的梯度都乘以一个小于 1 的因子:

∂L/∂hₜ₋ₖ ≈ ∏ Jᵢ

随着时间步增加,这个乘积可能快速趋近于 0。

结果是:

距离当前很远的信息 → 梯度越来越小 → 很难学习长期依赖

例如:

“我小时候生活在法国……经过很多描述……我会说流利的 ___。”

模型需要记住很久以前的“法国”,但普通 RNN 很难稳定地保留这种长期信息。

梯度爆炸

RNN 还可能出现梯度爆炸(Exploding Gradient)。

如果反向传播过程中梯度不断放大:

∏ Jᵢ → 很大

就可能导致参数更新异常巨大,训练变得不稳定。

常见解决方法之一是:

Gradient Clipping(梯度裁剪)

当梯度超过指定范围时限制其大小。

LSTM

为了解决普通 RNN 难以学习长期依赖的问题,Hochreiter 和 Schmidhuber 在 1997 年提出了 LSTM。

LSTM 引入了:

* Cell State * Forget Gate * Input Gate * Output Gate

核心思想是让信息能够沿着 Cell State 更稳定地传播。

可以粗略表示为:

输入 → 门控机制 → 决定保留什么 / 删除什么 / 写入什么 → 新状态

因此 LSTM 能够比普通 RNN 更有效地处理长期依赖。

GRU

GRU 是另一种门控循环网络,由 Cho 等人在 2014 年提出。

相比 LSTM,GRU 的结构更加简单。

它主要通过:

* Update Gate * Reset Gate

控制历史信息和当前信息的组合。

因此:

RNN → 基础循环结构

LSTM / GRU → 加入门控机制的 RNN

双向 RNN

Bidirectional RNN(双向循环神经网络) 同时从两个方向处理序列:

正向:

x₁ → x₂ → x₃ → ... → xₙ

反向:

xₙ → xₙ₋₁ → xₙ₋₂ → ... → x₁

最终将两个方向的隐藏状态结合起来。

这样模型可以同时利用:

过去信息 + 未来信息

因此特别适合需要利用完整上下文的序列任务。

RNN 与 Transformer

RNN 和 Transformer 都可以处理序列数据,但基本机制不同。

RNN

x₁ → h₁ → h₂ → h₃ → ...

信息主要通过隐藏状态逐步传播。

Transformer

x₁ ↔ x₂ ↔ x₃ ↔ ...

通过 Attention 直接建立不同位置之间的关系。

因此二者有几个重要区别。

并行计算

RNN 的时间步存在依赖:

hₜ 必须等待 hₜ₋₁

因此训练时难以完全并行。

Transformer 可以同时计算多个位置的 Attention,因此更加适合 GPU 大规模并行训练。

长期依赖

RNN 需要通过多个时间步传递信息。

Transformer 可以通过 Attention 直接连接远距离 Token。

因此长距离依赖通常更加容易处理。

计算复杂度

标准 Self-Attention 的计算量通常随序列长度呈平方增长:

O(n²)

而 RNN 每个时间步处理固定维度状态,理论上通常可以达到:

O(n)

因此 RNN 在超长序列的理论计算复杂度方面存在优势。

不过 RNN 的顺序依赖限制了硬件并行能力,而 Transformer 的高并行性使其在现代大规模训练中更具优势。

RNN 为什么逐渐被 Transformer 取代

2017 年 Transformer 提出后,RNN 在 NLP 中逐渐失去主流地位。

主要原因包括:

* RNN 难以进行大规模并行训练。 * 长距离依赖难以处理。 * BPTT 训练过程复杂。 * Transformer 可以利用 Attention 直接建立远距离依赖。 * Transformer 更适合现代 GPU / TPU 的大规模矩阵计算。

因此 NLP 的主流架构逐渐经历:

RNN → LSTM / GRU → Transformer

不过这并不意味着 RNN 已经没有价值。

RNN 的思想仍然影响着:

* 序列建模 * 状态空间模型 * 时间序列预测 * 流式推理 * 在线学习

近年来,一些新的序列模型也重新探索了“循环状态”的思想。

RNN 的优点

* 天然适合序列数据。 * 能够维护随时间变化的隐藏状态。 * 参数在不同时间步共享。 * 理论上可以处理任意长度的序列。 * 对于某些流式任务,可以逐步处理输入。 * 单步状态的计算和存储相对简单。

RNN 的缺点

* 时间步之间存在顺序依赖。 * 难以充分利用 GPU 并行计算。 * 普通 RNN 容易出现梯度消失和梯度爆炸。 * 长期依赖难以学习。 * 长序列训练速度较慢。 * 在现代大规模 NLP 中通常不如 Transformer。

RNN 的核心意义

RNN 的重要思想是:

神经网络不仅可以处理独立的输入,还可以通过隐藏状态维护历史信息。

也就是说,模型不再只是:

y = f(x)

而是:

hₜ = f(xₜ, hₜ₋₁)

因此当前输出不仅取决于当前输入,也取决于过去的状态。

这一思想奠定了现代序列建模的重要基础。

从发展历史来看,可以理解为:

RNN → LSTM / GRU → Attention → Transformer → LLM

RNN 解决了“如何让神经网络记住序列历史”的问题,而 Transformer 则进一步改变了“如何在序列中建立依赖关系”的方式。

相关条目

参考资料

* Jeffrey L. Elman, 1990, Finding Structure in Time * Sepp Hochreiter and Jürgen Schmidhuber, 1997, Long Short-Term Memory * Kyunghyun Cho et al., 2014, Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation * Yoshua Bengio, Patrice Simard and Paolo Frasconi, 1994, Learning Long-Term Dependencies with Gradient Descent is Difficult * Ashish Vaswani et al., 2017, Attention Is All You Need

rnn.txt · 最后更改: 由 holdsark