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 大规模取代。
普通的前馈 Neural Network 可以理解为:
输入 → 网络 → 输出
每次输入之间通常没有直接的内部状态传递。
RNN 则加入了循环结构:
xₜ → hₜ → hₜ₊₁ → hₜ₊₂ → ...
因此:
x₁ → h₁
x₂ + h₁ → h₂
x₃ + h₂ → h₃
x₄ + h₃ → h₄
模型通过隐藏状态将过去的信息传递到未来。
RNN 在结构上存在循环:
hₜ₋₁ → hₜ → hₜ₊₁
为了训练,可以把循环沿时间方向展开:
x₁ → h₁ → h₂ → h₃ → ... → hₙ
其中每一个时间步使用相同的一组参数。
因此虽然展开后看起来有很多层,但这些时间步实际上共享参数。
这种结构称为:
参数共享(Parameter Sharing)
RNN 可以处理不同形式的输入输出关系。
Many-to-One
多个输入 → 一个输出
例如:
词₁ → 词₂ → 词₃ → 词₄ → 分类
可以用于文本情感分类。
One-to-Many
一个输入 → 多个输出
例如:
图像 → 单词序列
可以用于早期的图像描述生成。
Many-to-Many
多个输入 → 多个输出
例如:
词₁ → 标签₁ 词₂ → 标签₂ 词₃ → 标签₃
可以用于 Sequence Labeling。
Encoder-Decoder
输入序列 → 编码 → 输出序列
曾经广泛用于机器翻译等 NLP 任务。
RNN 特别适合具有时间或顺序关系的数据。
例如:
* 文本 * 语音 * 股票时间序列 * 传感器数据 * 用户行为序列 * 音乐 * 视频帧序列
对于:
我 → 喜欢 → 学习 → 人工智能
RNN 在处理“人工智能”时,可以通过隐藏状态间接获得之前词语的信息。
因此 RNN 的核心假设之一是:
当前信息与过去的信息存在关系。
这构成了 RNN 的一种 Inductive Bias。
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(梯度裁剪)
当梯度超过指定范围时限制其大小。
为了解决普通 RNN 难以学习长期依赖的问题,Hochreiter 和 Schmidhuber 在 1997 年提出了 LSTM。
LSTM 引入了:
* Cell State * Forget Gate * Input Gate * Output Gate
核心思想是让信息能够沿着 Cell State 更稳定地传播。
可以粗略表示为:
输入 → 门控机制 → 决定保留什么 / 删除什么 / 写入什么 → 新状态
因此 LSTM 能够比普通 RNN 更有效地处理长期依赖。
GRU 是另一种门控循环网络,由 Cho 等人在 2014 年提出。
相比 LSTM,GRU 的结构更加简单。
它主要通过:
* Update Gate * Reset Gate
控制历史信息和当前信息的组合。
因此:
RNN → 基础循环结构
LSTM / GRU → 加入门控机制的 RNN
Bidirectional RNN(双向循环神经网络) 同时从两个方向处理序列:
正向:
x₁ → x₂ → x₃ → ... → xₙ
反向:
xₙ → xₙ₋₁ → xₙ₋₂ → ... → x₁
最终将两个方向的隐藏状态结合起来。
这样模型可以同时利用:
过去信息 + 未来信息
因此特别适合需要利用完整上下文的序列任务。
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 的高并行性使其在现代大规模训练中更具优势。
2017 年 Transformer 提出后,RNN 在 NLP 中逐渐失去主流地位。
主要原因包括:
* RNN 难以进行大规模并行训练。 * 长距离依赖难以处理。 * BPTT 训练过程复杂。 * Transformer 可以利用 Attention 直接建立远距离依赖。 * Transformer 更适合现代 GPU / TPU 的大规模矩阵计算。
因此 NLP 的主流架构逐渐经历:
RNN → LSTM / GRU → Transformer
不过这并不意味着 RNN 已经没有价值。
RNN 的思想仍然影响着:
* 序列建模 * 状态空间模型 * 时间序列预测 * 流式推理 * 在线学习
近年来,一些新的序列模型也重新探索了“循环状态”的思想。
* 天然适合序列数据。 * 能够维护随时间变化的隐藏状态。 * 参数在不同时间步共享。 * 理论上可以处理任意长度的序列。 * 对于某些流式任务,可以逐步处理输入。 * 单步状态的计算和存储相对简单。
* 时间步之间存在顺序依赖。 * 难以充分利用 GPU 并行计算。 * 普通 RNN 容易出现梯度消失和梯度爆炸。 * 长期依赖难以学习。 * 长序列训练速度较慢。 * 在现代大规模 NLP 中通常不如 Transformer。
RNN 的重要思想是:
神经网络不仅可以处理独立的输入,还可以通过隐藏状态维护历史信息。
也就是说,模型不再只是:
y = f(x)
而是:
hₜ = f(xₜ, hₜ₋₁)
因此当前输出不仅取决于当前输入,也取决于过去的状态。
这一思想奠定了现代序列建模的重要基础。
从发展历史来看,可以理解为:
RNN → LSTM / GRU → Attention → Transformer → LLM
RNN 解决了“如何让神经网络记住序列历史”的问题,而 Transformer 则进一步改变了“如何在序列中建立依赖关系”的方式。
* Neural Network * Deep Learning * LSTM * GRU * Transformer * Attention * NLP * Backpropagation * Gradient Vanishing * Inductive Bias
* 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(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 大规模取代。
普通的前馈 Neural Network 可以理解为:
输入 → 网络 → 输出
每次输入之间通常没有直接的内部状态传递。
RNN 则加入了循环结构:
xₜ → hₜ → hₜ₊₁ → hₜ₊₂ → ...
因此:
x₁ → h₁
x₂ + h₁ → h₂
x₃ + h₂ → h₃
x₄ + h₃ → h₄
模型通过隐藏状态将过去的信息传递到未来。
RNN 在结构上存在循环:
hₜ₋₁ → hₜ → hₜ₊₁
为了训练,可以把循环沿时间方向展开:
x₁ → h₁ → h₂ → h₃ → ... → hₙ
其中每一个时间步使用相同的一组参数。
因此虽然展开后看起来有很多层,但这些时间步实际上共享参数。
这种结构称为:
参数共享(Parameter Sharing)
RNN 可以处理不同形式的输入输出关系。
Many-to-One
多个输入 → 一个输出
例如:
词₁ → 词₂ → 词₃ → 词₄ → 分类
可以用于文本情感分类。
One-to-Many
一个输入 → 多个输出
例如:
图像 → 单词序列
可以用于早期的图像描述生成。
Many-to-Many
多个输入 → 多个输出
例如:
词₁ → 标签₁ 词₂ → 标签₂ 词₃ → 标签₃
可以用于 Sequence Labeling。
Encoder-Decoder
输入序列 → 编码 → 输出序列
曾经广泛用于机器翻译等 NLP 任务。
RNN 特别适合具有时间或顺序关系的数据。
例如:
* 文本 * 语音 * 股票时间序列 * 传感器数据 * 用户行为序列 * 音乐 * 视频帧序列
对于:
我 → 喜欢 → 学习 → 人工智能
RNN 在处理“人工智能”时,可以通过隐藏状态间接获得之前词语的信息。
因此 RNN 的核心假设之一是:
当前信息与过去的信息存在关系。
这构成了 RNN 的一种 Inductive Bias。
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(梯度裁剪)
当梯度超过指定范围时限制其大小。
为了解决普通 RNN 难以学习长期依赖的问题,Hochreiter 和 Schmidhuber 在 1997 年提出了 LSTM。
LSTM 引入了:
* Cell State * Forget Gate * Input Gate * Output Gate
核心思想是让信息能够沿着 Cell State 更稳定地传播。
可以粗略表示为:
输入 → 门控机制 → 决定保留什么 / 删除什么 / 写入什么 → 新状态
因此 LSTM 能够比普通 RNN 更有效地处理长期依赖。
GRU 是另一种门控循环网络,由 Cho 等人在 2014 年提出。
相比 LSTM,GRU 的结构更加简单。
它主要通过:
* Update Gate * Reset Gate
控制历史信息和当前信息的组合。
因此:
RNN → 基础循环结构
LSTM / GRU → 加入门控机制的 RNN
Bidirectional RNN(双向循环神经网络) 同时从两个方向处理序列:
正向:
x₁ → x₂ → x₃ → ... → xₙ
反向:
xₙ → xₙ₋₁ → xₙ₋₂ → ... → x₁
最终将两个方向的隐藏状态结合起来。
这样模型可以同时利用:
过去信息 + 未来信息
因此特别适合需要利用完整上下文的序列任务。
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 的高并行性使其在现代大规模训练中更具优势。
2017 年 Transformer 提出后,RNN 在 NLP 中逐渐失去主流地位。
主要原因包括:
* RNN 难以进行大规模并行训练。 * 长距离依赖难以处理。 * BPTT 训练过程复杂。 * Transformer 可以利用 Attention 直接建立远距离依赖。 * Transformer 更适合现代 GPU / TPU 的大规模矩阵计算。
因此 NLP 的主流架构逐渐经历:
RNN → LSTM / GRU → Transformer
不过这并不意味着 RNN 已经没有价值。
RNN 的思想仍然影响着:
* 序列建模 * 状态空间模型 * 时间序列预测 * 流式推理 * 在线学习
近年来,一些新的序列模型也重新探索了“循环状态”的思想。
* 天然适合序列数据。 * 能够维护随时间变化的隐藏状态。 * 参数在不同时间步共享。 * 理论上可以处理任意长度的序列。 * 对于某些流式任务,可以逐步处理输入。 * 单步状态的计算和存储相对简单。
* 时间步之间存在顺序依赖。 * 难以充分利用 GPU 并行计算。 * 普通 RNN 容易出现梯度消失和梯度爆炸。 * 长期依赖难以学习。 * 长序列训练速度较慢。 * 在现代大规模 NLP 中通常不如 Transformer。
RNN 的重要思想是:
神经网络不仅可以处理独立的输入,还可以通过隐藏状态维护历史信息。
也就是说,模型不再只是:
y = f(x)
而是:
hₜ = f(xₜ, hₜ₋₁)
因此当前输出不仅取决于当前输入,也取决于过去的状态。
这一思想奠定了现代序列建模的重要基础。
从发展历史来看,可以理解为:
RNN → LSTM / GRU → Attention → Transformer → LLM
RNN 解决了“如何让神经网络记住序列历史”的问题,而 Transformer 则进一步改变了“如何在序列中建立依赖关系”的方式。
* Neural Network * Deep Learning * LSTM * GRU * Transformer * Attention * NLP * Backpropagation * Gradient Vanishing * Inductive Bias
* 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