循环神经网络 RNN 深度解析
- [一、RNN 概述](#一、RNN 概述)
-
- [1. 传统神经网络存在的问题](#1. 传统神经网络存在的问题)
- [2. 什么是循环神经网络](#2. 什么是循环神经网络)
- [3. RNN 的核心特点](#3. RNN 的核心特点)
- [二、RNN 基本结构](#二、RNN 基本结构)
一、RNN 概述
1. 传统神经网络存在的问题
传统的前馈神经网络(如全连接网络、卷积神经网络)在处理数据时存在一个关键局限:无法有效建模序列数据。
具体表现为:
- 输入数据之间相互独立,没有考虑时序上的依赖关系
- 模型结构本身不具备"记忆"能力,无法利用上下文信息
- 对于文本、语音、时间序列等顺序数据,传统网络难以捕捉其中的动态变化规律
2. 什么是循环神经网络
RNN(Recurrent Neural Network,循环神经网络) 是一种专门用于处理序列数据 的神经网络架构。其核心特点是引入了隐状态(Hidden State) 的概念,使得网络在处理当前输入时能够保留之前时刻的信息。
直观理解
以句子"我要去打球"为例,将其分词为"我"、"要"、"去"、"打球"四个词:
- 第一个词"我"的词向量 x₁ 传入网络,结合初始隐状态 h₀,得到 h₁
- 第二个词"要"的词向量 x₂ 传入网络,结合 h₁,得到 h₂
- 依此类推,每个时间步的输出都融合了之前所有词的信息
- 最终 h₄ 包含了整个句子的完整语义信息

3. RNN 的核心特点
- 引入隐状态 h:隐状态可以理解为网络的"记忆单元",用于保存历史信息
- 参数共享:RNN 在每个时间步使用相同的权重矩阵(U、W、V),大大减少了参数量
- 处理变长序列:RNN 天然支持不同长度的序列输入
- 适用场景广泛:文本、语音、股票预测、时间序列分析等
二、RNN 基本结构
1. RNN 的核心结构
RNN 的核心是一个循环连接的隐藏层。在序列的每个时间步 t:
- 接收当前输入 xₜ
- 结合上一个时间步的隐状态 hₜ₋₁
- 输出当前隐状态 hₜ 和预测结果 yₜ
这种循环连接使得 RNN 能够保持对之前输入的记忆,并在处理后续输入时利用这些记忆。
2. 数学推导
隐状态更新公式
hₜ = f( W · hₜ₋₁ + U · xₜ + b )
其中:
- hₜ:当前时间步的隐状态
- hₜ₋₁:上一个时间步的隐状态
- xₜ:当前时间步的输入
- W:隐状态到隐状态的权重矩阵(记忆权重)
- U:输入到隐状态的权重矩阵
- b:偏置项
- f:激活函数(常用 Tanh 或 ReLU)
输出计算公式
yₜ = softmax( V · hₜ + c )
其中:
- V:隐状态到输出的权重矩阵
- c:输出偏置项

关键特点
参数共享:W、U、V、b、c 在所有时间步中是相同的,这大大减少了模型的参数量,也使 RNN 能够适应不同长度的序列。
3. 循环的由来
RNN 之所以称为"循环神经网络",是因为其隐状态在时间维度上形成了循环反馈:
h₀ → h₁ → h₂ → h₃ → ... → hₙ
每个时间步的输出 hₜ 既是当前时间步的结果,又是下一个时间步的输入之一。这种"输出反馈为输入"的结构形成了循环。

4. RNN 的局限性 ------ 长期依赖问题
问题描述
当序列中的相关信息和预测位置之间的间隔较大时,RNN 难以有效学习这种长期依赖关系。
示例:
"我的职业是程序员,......,我最擅长的是______"
要预测最后的词"电脑",需要利用前面"职业是程序员"这一远距离信息。这种长期依赖关系对 RNN 来说是一个巨大挑战。
根本原因 ------ 梯度消失与梯度爆炸
在反向传播过程中,梯度需要沿时间维度逐层传递。当序列较长时:
- 梯度消失:梯度在传递过程中不断衰减,最终趋近于零,导致早期时间步的参数几乎无法更新
- 梯度爆炸:梯度在传递过程中不断放大,导致参数更新剧烈,模型难以收敛
这就像"传声筒游戏"------信息在逐层传递中逐渐失真或丢失。


解决方案预告
为了解决长期依赖问题,后续提出了 LSTM(长短期记忆网络) 和 GRU(门控循环单元),通过引入门控机制来有效捕捉长期依赖关系。