MCM520 ← 资料站首页 循环神经网络 · 深度手册 打开交互阅读器 →

循环神经网络 · 深度手册

分类:深度学习 | 难度:★★★ 高阶 | 编号:rnn

一、这是什么(一句话用途)

序列建模:时间序列预测 / 语言模型 / 语音(处理变长有序数据)

二、核心思想

循环神经网络(RNN)专为序列而生。普通网络假设输入互相独立,而文本、语音、股价都是先后相关的。RNN 引入一个跨时间步传递的"隐状态" ht\mathbf{h}_t:每步读入当前输入 xt\mathbf{x}_t 和上一刻隐状态 ht−1\mathbf{h}_{t-1},更新出新的 ht\mathbf{h}_t,并据此输出。这样同一套参数沿时间复用,既能处理任意长度序列,又能把"前文信息"编码进状态。它的思想是"参数随时间共享 + 状态记忆",是语言模型、机器翻译的早期主力,但长序列下会梯度消失/爆炸,催生了 LSTM 与 Transformer。

三、数学原理与推导

时间步 tt 的更新(一个简单 RNN 单元):

ht=tanh⁡ ⁣(Wxhxt+Whhht−1+bh),y^t=Whyht+by \mathbf{h}_t=\tanh\!\big(\mathbf{W}_{xh}\mathbf{x}_t+\mathbf{W}_{hh}\mathbf{h}_{t-1}+\mathbf{b}_h\big),\qquad \hat{y}_t=\mathbf{W}_{hy}\mathbf{h}_t+\mathbf{b}_y

Whh\mathbf{W}_{hh} 把历史"搬运"到当前,是记忆来源。**沿时间的反向传播(BPTT)**把损失对权重的梯度沿时间展开累加:

∂E∂Whh=∑t∂Et∂ht∂ht∂Whh,∂ht∂hk=∏s=k+1t∂hs∂hs−1 \frac{\partial E}{\partial \mathbf{W}_{hh}}=\sum_{t}\frac{\partial E_t}{\partial \mathbf{h}_t}\frac{\partial \mathbf{h}_t}{\partial \mathbf{W}_{hh}},\qquad \frac{\partial \mathbf{h}_t}{\partial \mathbf{h}_{k}}=\prod_{s=k+1}^{t}\frac{\partial \mathbf{h}_s}{\partial \mathbf{h}_{s-1}}

连乘雅可比使长程梯度指数衰减(梯度消失)或膨胀(梯度爆炸),限制其记忆长度。

四、建模 / 求解步骤

  1. 序列预处理(分词/标准化/截断)
  2. 初始化隐状态
  3. 逐步读入 x_t 更新 h_t
  4. 每步输出或末步输出
  5. BPTT 训练(梯度裁剪防爆炸)

五、关键公式速查

h_t=tanh(W_xh·x_t+W_hh·h_{t-1}+b);BPTT 沿时间反传

六、典型示例

用前 10 天气温预测第 11 天;或字符级语言模型生成文本。

完整算例(数字演示,照着算一遍)

场景:输入 10 步温度序列 预测 下一步,隐状态 32 维。

演示:序列 (20,21,22,…,29)→预测 30.1°C,MSE=0.6。

结论:RNN 用隐状态记忆时序依赖,但长序列易梯度消失。

七、Python 实现示例

import os, numpy as np
import pandas as pd
HERE = os.path.dirname(os.path.abspath(__file__))
cols = ["t%d" % i for i in range(1,13)]
df = pd.read_csv(os.path.join(HERE,"..","datasets","rnn.csv"))
seq = df[cols].to_numpy(dtype=float); y = df["label"].to_numpy(dtype=float)
seq = (seq-seq.mean(0))/seq.std(0)
N, T = seq.shape
rng = np.random.default_rng(15)
# 固定随机递归核(回声状态思路) + 训练输出层
Wh = rng.normal(0,1,(8,8))*0.9; Wx = rng.normal(0,1,(8,1))
b = np.zeros(8); Wo = rng.normal(0,1,(8,1)); bo = 0
H = np.zeros((N,8))
for i in range(T):
    H = np.tanh(seq[:,i:i+1]@Wx.T + H@Wh.T + b)
out = H@Wo + bo
p = 1/(1+np.exp(-out)).ravel()
e = p - y
Wo -= 0.1*H.T@e.reshape(-1,1); bo -= 0.1*e.sum()
print("RNN(随机递归核+输出层) 分类准确率=%.3f" % (((H@Wo+bo).ravel()>0)==y).mean())

配套文件:py_rnn.py(需 numpy / pandas;与下方数据集配套练习)

八、MATLAB 实现示例

%% 循环神经网络示例(MATLAB/Octave,随机递归核+读out层训练)
df = readtable('..\datasets\rnn.csv');
cols = strcat('t',string(1:12));
seq = table2array(df(:,cols)); y = table2array(df(:,13));
seq = (seq-mean(seq,1))./std(seq,1); [N,T]=size(seq);
rng(15); Wh=randn(8,8)*0.9; Wx=randn(8,1); b=zeros(8,1); Wo=randn(8,1); bo=0;
H = zeros(N,8);
for i=1:T
  H = tanh(seq(:,i)*Wx' + H*Wh' + b');
end
out = H*Wo + bo;
p = 1./(1+exp(-out)); e = p - y;
Wo = Wo - 0.1*(H'*e); bo = bo - 0.1*sum(e);
pred = (H*Wo + bo)>0;
fprintf('RNN(随机递归核+输出层) 准确率=%.3f\n', mean(pred==y));

配套文件:m_rnn.m(基础 MATLAB / Octave 即可运行)

九、练手数据集(可下载)

12 步一维序列 + 二分类标签。用于循环神经网络(随机递归核+输出层)对序列建模。

  • 字段:t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, label
  • 行数:40 行
  • 下载:rnn.csv

十、常见误区与避坑清单

  • 长序列梯度消失
  • 需梯度裁剪
  • 训练慢且易忘长程

十一、结果怎么解读

看隐状态/注意力权重理解记住了什么。

十二、常与谁搭配

是长短期记忆(LSTM)的基础;与 Transformer 同处理序列。

十三、论文写作技巧(怎么把它写进论文)

把 循环神经网络 写进论文,核心不是堆公式,而是讲清「为什么用它、结果怎么呈现、如何对比」三件事。

1. 动机怎么写(为什么用它而不是别的)

强调端到端 / 表示学习优势:无需手工特征,循环神经网络 直接从数据学表征。交代输入形式、网络结构(层数 / 宽度 / 激活)与规模(参数量、FLOPs),并说明相比传统模型的增益。

2. 结果怎么写(图表与指标)

给训练 / 验证损失与指标曲线、混淆矩阵 / 预测对比图;若有可视化(特征图 / CAM / 注意力)必放;做消融实验(去掉某模块性能掉多少)最能服人。

3. 可直接套用的写作话术

  • 中文模板:针对<问题>,本文采用 循环神经网络 进行序列建模:时间序列预测 / 语言模型 / 语音(处理变长有序数据)。该方法能够自动刻画<优势>,在处理<场景>时相较<对比方法>更具<特点>。
  • 英文模板:To address , we adopt 循环神经网络 to 序列建模:时间序列预测 / 语言模型 / 语音(处理变长有序数据). Benefiting from its ability to , it outperforms on .

4. 同类易踩的写作坑

写明超参、优化器、随机种子与硬件,保证可复现;警惕数据泄漏与测试集调参;样本少时给出正则 / 数据增强策略。

5. 典型论文段落范例(可直接参考 / 改写)

下面是一段可直接套用的论文表述,已按本算法定制,填空处(…)替换成你的真实数值即可。

本文采用 循环神经网络 从原始图像端到端学习特征,在测试集上达到 94.3% 准确率,较 ResNet-18 基线提升 2.1 个百分点;Grad-CAM 可视化显示模型关注病灶区域,符合医学先验。

We employ 循环神经网络 to learn features end-to-end from raw images, reaching 94.3% test accuracy—a 2.1-point gain over the ResNet-18 baseline; Grad-CAM visualizations show the model attends to lesion regions, consistent with medical prior.

6. 消融实验怎么写(深度学习必备)

深度学习论文几乎必备消融实验(ablation study):逐次移除一个模块(如注意力、数据增强、预训练),报告性能变化,量化每个组件的贡献。写作范式:① 列出「完整模型」与若干「删减变体」的指标对照表;② 用一句话解释每项移除带来的下降(如「去掉注意力后 mAP 降 3.4,说明全局依赖建模关键」);③ 训练技巧(学习率预热、标签平滑)若有增益也单列。注意:消融必须控制变量——一次只动一处,避免把多个改动混在一起导致无法归因。

十四、相关手册(延伸阅读)

十五、本手册导航


本手册由「算法深度手册生成器」自动产出,配套提供 Python / MATLAB 双版本示例与可下载练手数据集。