AI基础概念之十二:RNN算法的基本原理
核心特征:隐藏层自循环 + 时间步权重共享,实现时序记忆;三层结构:输入层(接收序列)→ 隐藏层(存储记忆)→ 输出层(任务输出);关键公式:隐藏状态 ht 是连接历史与当前的核心,决定了 RNN 的记忆能力;变体延伸:LSTM/GRU 是基础 RNN 的隐藏层增强版,结构框架完全兼容。
一、 RNN 的诞生时间
RNN 的核心思想最早可追溯至 20 世纪 80 年代,但真正形成标准化架构并被广泛研究的标志是:
-
1982 年:物理学家 John Hopfield 提出 Hopfield 网络,这是一种循环神经网络的雏形,证明了循环结构可以存储和处理时序信息,但并非现代意义上的 RNN。
-
1986 年:学者 Rumelhart、Hinton 和 Williams 在论文《Learning representations by back-propagating errors》中,首次提出反向传播算法在循环结构中的应用,奠定了现代 RNN 的理论基础。
-
1990 年:Sepp Hochreiter 等人进一步完善了 RNN 的训练方法,解决了部分梯度问题,现代 RNN 的架构才正式确立。
而 RNN 的核心变体 LSTM 则是在 1997 年由 Hochreiter & Schmidhuber 提出,2014 年后才大规模应用于 NLP 任务。
二、 RNN 与 CNN 的差异点
RNN 和 CNN 均属于深度学习的经典架构,但设计目标、核心逻辑完全不同,是针对不同数据类型的并行发展路线。两者的后期发展都借鉴了注意力机制,弥补自身缺陷。
-
RNN + 注意力:解决长序列依赖的遗忘问题(如 Transformer 出现前的机器翻译模型);
-
CNN + 注意力:解决局部特征无法建模全局关联的问题(如 SENet、CBAM)。
核心差异:解决的问题与设计逻辑不同
| 维度 | RNN | CNN |
|---|---|---|
|
目标 数据 |
序列数据(文本、语音、时间序列),数据具有时序依赖(前一时刻影响后一时刻) | 网格数据(图像、视频),数据具有空间局部性(相邻像素关联性强) |
|
核心 归纳偏置 |
时序记忆性:通过隐藏状态迭代,利用历史信息 | 空间局部性 + 平移不变性:通过卷积核局部滑动,提取局部特征 |
|
计算 方式 |
串行计算:按时间步顺序更新,无法并行 | 并行计算:卷积核可同时作用于输入的所有局部区域 |
| 参数共享逻辑 | 时间步共享:同一套权重在所有时刻复用 | 空间位置共享:同一卷积核在图像所有位置复用 |
三、 RNN算法的核心
1、 基础 RNN 的结构
一个基础 RNN 模型的核心是循环结构,通过隐藏状态的迭代更新来捕捉序列数据的时序依赖,其基本结构可以拆解为 输入层、隐藏层、输出层 三部分。RNN 的本质是 “同一网络结构在不同时间步的重复”,不同的语料数据依次传递经过RNN的输入层、隐藏层和输出层。
核心特点:
-
所有时间步共享同一套权重(输入-隐藏层权重Wxh、隐藏-隐藏层权重Whh、隐藏-输出层权重Why),大幅减少参数数量;Whh 是隐藏层到隐藏层的权重,它的作用是把上一个时间步的隐藏状态传递到当前步,当隐藏层不止一层时,也会涉及上一个隐藏层往下一个隐藏层传递的需求。
-
隐藏层的输出 ht 会作为下一时刻的输入之一,实现历史信息的传递。
2、简化版 RNN 示例
我们以 输入 “我喜欢”,生成后续词(苹果 / 香蕉 / 橙子) 为例,核心步骤如下。前提设定:
-
输入维度 = 3:每个词用 3 个数字表示(比如 “我”=[1,0,0],“喜欢”=[0,1,0])
-
隐藏层维度 = 2:隐藏状态用 2 个数字表示(相当于 RNN 的 “短期记忆容量”)
-
输出候选词:苹果、香蕉、橙子(输出维度 = 3,对应 3 个词的概率)
-
RNN 的核心规则:每一步都带着上一步的记忆,处理当前的词
步骤 1:初始化 —— 没有记忆时,隐藏状态为 0
处理第一个词 “我” 之前,RNN 没有任何历史信息,所以初始隐藏状态 h0 = [0,0](2 个 0,对应隐藏层维度 = 2)。
步骤 2:处理第一个词 “我” —— 第一次产生记忆
| 过程 | 通俗理解 |
|---|---|
| 输入 | “我” → 转化为向量 [1,0,0](输入维度 = 3) |
| 计算隐藏状态 h1 | RNN 把输入向量 [1,0,0] 和初始记忆 [0,0] 结合,得到新的记忆 h1 = [0.1, 0.3] 这个记忆里只存了 “我” 的信息 |
| 输出预测y1 | 基于记忆 h1,预测下一个词的概率:苹果 29%、香蕉 31%、橙子 40% 此时预测不准,因为只有 “我” 一个词的信息 |
步骤 3:处理第二个词 “喜欢” —— 记忆叠加,语义整合
这是 RNN 的核心!处理 “喜欢” 时,会带着 “我” 的记忆一起计算
| 过程 | 通俗理解 |
|---|---|
| 输入 | “喜欢” → 转化为向量 [0,1,0](输入维度 = 3) |
| 计算隐藏状态 h2 | RNN 把输入向量 [0,1,0] 和上一步的记忆 h1=[0.1,0.3] 结合,得到新的记忆 h2 = [0.24, 0.44] 这个记忆里信息同时存了 “我” 和 “喜欢” 的组合 |
| 输出预测y2 | 基于组合记忆 h2,预测下一个词的概率:苹果 28%、香蕉 32%、橙子 40% 这次预测比上次更贴合 “我喜欢 XX” 的语义 |
步骤 4:反向传播,梯度更新。
梯度更新的核心目标通过计算预测值与真实值的误差,反向传播误差得到权重的梯度,再用梯度下降调整权重,让预测越来越准。
损失函数:交叉熵损失 ![]()
RNN 的反向传播称为BPTT(时间反向传播),核心是从最后一个时间步倒着算梯度,因为每个时间步的隐藏状态都依赖前一个时间步,误差需要从后往前传递。
我们以更新 Whh 为例,在 RNN 中,Whh 是隐藏层到隐藏层的权重,它的作用是把上一个时间步的隐藏状态传递到当前步。对于两步序列,依赖链是:Whh→h1→h2→y2→Loss。
-
h1 虽然在计算时,h0 是初始零向量(看似和 Whh 无关),但 Whh 是 h1 计算式的固有部分;
-
h2 直接依赖 h1 和 Whh;
-
最终损失 Loss 来自 y2,而 y2 依赖 h2—— 因此,Loss 对 Whh 的梯度,必须包含 Whh 对 h1、h2 的所有贡献。
3、RNN 激活函数的搭配方案
RNN 选择激活函数的核心原则是 适配时序信号的传递与梯度稳定性,不同位置(隐藏层 / 输出层)会搭配不同的激活函数,其中隐藏层的激活函数是关键,直接影响模型的记忆能力和训练效率。
| 模型位置 | 主流激活函数 | 核心作用 |
|---|---|---|
| 基础 RNN 隐藏层 | tanh(首选)/ ReLU(长序列) | 捕捉时序依赖,保证梯度传递 |
| LSTM/GRU 隐藏层 | tanh + Sigmoid | 门控机制控制信息的遗忘与保留 |
| 输出层 | Softmax(多分类)/ Sigmoid(二分类)/ 线性(回归) | 匹配任务输出形态 |
四、 基础 RNN 的局限性
基础 RNN 的结构简单,但存在梯度消失 / 爆炸问题 —— 当序列较长时,早期时间步的梯度会随反向传播指数级衰减,导致模型无法学习长距离依赖。
因此,后续衍生出了 LSTM、GRU 等带门控机制的变体,它们的核心是在隐藏层中加入门控单元(遗忘门、输入门、输出门等),精准控制历史信息的传递和遗忘,本质是对基础 RNN 隐藏层的改进,整体三层结构保持不变。
五、 基础 RNN 结构的核心总结
-
核心特征:隐藏层自循环 + 时间步权重共享,实现时序记忆;
-
三层结构:输入层(接收序列)→ 隐藏层(存储记忆)→ 输出层(任务输出);
-
关键公式:隐藏状态 ht 是连接历史与当前的核心,决定了 RNN 的记忆能力;
-
变体延伸:LSTM/GRU 是基础 RNN 的隐藏层增强版,结构框架完全兼容。
更多推荐


所有评论(0)