====== 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 则进一步改变了“如何在序列中建立依赖关系”的方式。 ===== 相关条目 ===== * [[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 ====== **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 则进一步改变了“如何在序列中建立依赖关系”的方式。 ===== 相关条目 ===== * [[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*