1 基本概念
1.1 序列数据定义
序列数据指具有顺序依赖关系的数据样本,其中每个元素的出现顺序携带重要信息。常见的序列数据包括文本(字符或词的排列)、语音信号(时间帧序列)、股票价格(每日收盘价)、视频帧等。与独立同分布数据不同,序列数据的前后元素之间存在逻辑或时间上的关联。
1.2 循环结构原理
RNN通过在隐藏层中引入循环连接,使网络能够维护一个“状态”来捕捉历史信息。简单来说,网络不仅接收当前输入,还接收上一时刻的隐藏状态,从而在时间轴上形成一条信息传递的回路。
1.2.1 展开计算图
为了便于理解梯度计算,可以将RNN在时间维度上展开为深度前馈网络。展开后的计算图中,每个时间步对应一个网络层,且这些层共享参数。展开后的网络深度等于序列长度,这解释了为什么RNN能处理变长序列,但也暴露了深层次梯度传播的困难。
1.2.2 隐藏状态与记忆
隐藏状态是RNN的核心记忆单元,通常记为 \( h_t \)。它由当前输入 \( x_t \) 和上一隐藏状态 \( h_{t-1} \) 通过非线性变换得到。隐藏状态的维度由用户设定,决定了网络能记忆的信息量。由于每一时刻的隐藏状态都承载了从序列开头到当前的全部压缩信息,因此常被称为“短期记忆”与“长期记忆”的混合体。
1.3 前向传播过程
给定序列 \( x_1, x_2, \dots, x_T \),RNN在每个时间步 \( t \) 执行: \[ h_t = \tanh(W_{hh} h_{t-1} + W_{xh} x_t + b_h) \] \[ y_t = \text{softmax}(W_{hy} h_t + b_y) \] 其中 \( W \) 和 \( b \) 为共享参数。前向传播按照时间顺序依次计算,最终得到每个时间步的输出 \( y_t \)。
1.4 损失函数与目标
常见任务包括序列分类(如情感分类)和序列生成(如语言模型)。对于分类任务,损失函数通常取交叉熵;对于生成任务,通过最大化每一步输出与真实标签的似然来训练。整个序列的损失是各时间步损失之和。
2 训练方法
2.1 随时间反向传播(BPTT)
BPTT是训练RNN的标准算法,它将反向传播思想推广到展开后的时间维度上。梯度由损失函数逐层回传,最终计算每个参数对损失的偏导数。
2.1.1 链式法则与梯度计算
在展开后的计算图上应用链式法则。以隐藏状态为例,梯度从 \( t \) 时刻输出回传到 \( t-1 \) 时刻隐藏状态时,会涉及矩阵 \( W_{hh} \) 和激活函数导数的连乘。这种连乘正是梯度问题的根源。
2.1.2 截断BPTT
对于超长序列,完整BPTT会消耗大量内存和计算资源。截断BPTT将序列划分为固定长度的子段,在每个子段内执行BPTT,而忽略子段间的长程依赖。这是一种折衷方案,降低了训练复杂度,但也牺牲了对超长依赖的建模能力。
2.2 梯度问题
2.2.1 梯度消失
当序列较长时,链式法则中的矩阵连乘会导致梯度指数级衰减。最终,早期时间步的参数几乎得不到有效更新,使得RNN难以学习远距离依赖关系。这是标准RNN最严重的缺陷,在激活函数为 \(\tanh\) 或Sigmoid时尤为突出。
2.2.2 梯度爆炸
与梯度消失相反,当参数矩阵的谱半径大于1时,连乘可能导致梯度指数级增长,造成参数更新过大,训练过程发散。梯度爆炸通常表现为损失急剧跳变或出现NaN。
2.3 优化技巧
2.3.1 梯度裁剪
对抗梯度爆炸的常用方法。设置一个阈值 \( \theta \),如果梯度的范数超过 \( \theta \),则将其缩放至 \( \theta \) 大小。这种方法简单有效,在RNN训练中被广泛使用。
2.3.2 参数初始化
合理初始化可以缓解梯度消失/爆炸。例如使用正交初始化使 \( W_{hh} \) 保持正交矩阵的稳定性;或使用较小的高斯方差初始化。对于LSTM等门控网络,偏置初始化(如遗忘门偏置设为1)有助于在训练初期保留长期记忆。
3 主要变体
3.1 长短期记忆网络(LSTM)
LSTM于1997年提出,通过引入门控机制和细胞状态来选择性保留或遗忘信息,有效缓解了长程依赖问题。LSTM的核心是细胞状态 \( C_t \),它沿时间轴直线传递,很少受到非线性干扰。
3.1.1 遗忘门
遗忘门 \( f_t = \sigma(W_f \cdot [h_{t-1}, x_t] + b_f) \) 决定从上一细胞状态中丢弃哪些信息。取值接近0时完全遗忘,接近1时完全保留。
3.1.2 输入门与候选记忆
输入门 \( i_t = \sigma(W_i \cdot [h_{t-1}, x_t] + b_i) \) 控制哪些新信息将被写入细胞状态;候选记忆 \( \tilde{C}_t = \tanh(W_C \cdot [h_{t-1}, x_t] + b_C) \) 提供候选更新值。最终细胞状态更新为 \( C_t = f_t \odot C_{t-1} + i_t \odot \tilde{C}_t \)。
3.1.3 输出门与隐藏状态
输出门 \( o_t = \sigma(W_o \cdot [h_{t-1}, x_t] + b_o) \) 控制当前细胞状态哪些部分输出到隐藏状态:\( h_t = o_t \odot \tanh(C_t) \)。
3.2 门控循环单元(GRU)
GRU于2014年提出,是LSTM的简化版本,将遗忘门和输入门合并为更新门,并取消了单独的细胞状态,减少了参数数量。
3.2.1 重置门与更新门
重置门 \( r_t = \sigma(W_r \cdot [h_{t-1}, x_t]) \) 决定忽略多少历史信息;更新门 \( z_t = \sigma(W_z \cdot [h_{t-1}, x_t]) \) 决定保留多少旧状态并引入多少新信息。候选隐藏状态 \( \tilde{h}_t = \tanh(W \cdot [r_t \odot h_{t-1}, x_t]) \),最终隐藏状态 \( h_t = (1 - z_t) \odot h_{t-1} + z_t \odot \tilde{h}_t \)。
3.2.2 简化结构对比
GRU在性能上与LSTM相差不大,但参数量更少,训练效率更高。对于中小规模数据集,GRU往往收敛更快;而LSTM在处理超长序列时仍有一定优势。
3.3 双向RNN
标准RNN只能利用过去信息,而双向RNN使用两个独立的RNN层分别从正向和反向处理序列,然后将两个方向的特征拼接起来,使每个时间步的输出同时具有过去和未来的上下文。
3.3.1 前向与后向信息融合
正向RNN按时间顺序计算隐藏状态 \( \overrightarrow{h}_t \),反向RNN按逆序计算 \( \overleftarrow{h}_t \),最终输出 \( y_t \) 由两者拼接或加权得到。这种方法在自然语言处理中极为流行,因为许多任务(如命名实体识别)需要完整上下文。
3.4 深层RNN与堆叠RNN
深层RNN通过堆叠多个RNN层来增加模型容量,每层之间传递隐藏状态。顶层输出可保留更高层的抽象特征。
3.4.1 多层隐藏状态传递
设有 \( L \) 层,第 \( l \) 层在时间步 \( t \) 的隐藏状态 \( h_t^{(l)} \) 由前一层的隐藏状态 \( h_t^{(l-1)} \) 作为输入计算得到。最底层输入为序列数据,最顶层输出用于预测。堆叠RNN能捕捉更复杂的时序模式,但训练难度也随之增加,且更易出现梯度问题。
4 应用领域
4.1 自然语言处理
4.1.1 语言模型
语言模型的任务是预测给定词序列的下一个词的概率。RNN可以逐个输出每个位置的下一个词概率分布,通过最大化整个序列的似然进行训练。经典应用包括文本生成、拼写纠错。
4.1.2 机器翻译(Seq2Seq框架)
Seq2Seq模型使用编码器RNN将源语言句子编码为向量,再由解码器RNN逐步生成目标语言词。该框架曾主导早期神经机器翻译,后虽被Transformer取代,但其思想(编码-解码+注意力)至今影响深远。
4.1.3 情感分析
将文本序列输入RNN,取最后一个隐藏状态或所有隐藏状态的平均/最大池化作为文本表示,接上分类层输出情感标签。RNN能捕捉词序和上下文,在长文本情感分析中表现良好。
4.2 语音处理
4.2.1 语音识别
语音信号按时间帧输入RNN,输出为音素或字符的概率序列。结合CTC(连接时序分类)损失可处理输入输出长度不对齐的问题。传统语音识别系统常用双向LSTM。
4.2.2 语音合成
在文本到语音(TTS)系统中,RNN常用于建模声学特征(如梅尔频谱)的时序依赖。例如Tacotron系列模型使用双编码器和注意力机制的RNN解码器生成平滑的语音。
4.3 时间序列分析
4.3.1 股票预测
将历史股价、交易量等时间序列输入RNN,预测未来价格走势。由于金融市场存在噪声和随机性,纯RNN预测的可靠性有限,常与统计方法结合使用。
4.3.2 异常检测
在工业传感器数据或网络流量数据中,训练RNN学习正常序列模式,当新序列的预测误差较大时标记为异常。RNN可捕捉时间点之间的依赖关系,优于静态阈值方法。
4.4 计算机视觉中的序列任务
4.4.1 视频行为识别
将视频帧的特征序列输入RNN(或LSTM)来识别动作类别。结合CNN提取每帧空间特征,RNN建模时域动态。早期方法如C3D之后,LSTM被用于长视频行为分析。
4.4.2 图像描述生成
将图像通过CNN编码为特征向量,再输入RNN解码器逐个生成描述单词。该过程类似机器翻译的编码-解码,但输入端是静态图像而非序列。后来引入注意力机制使RNN能关注图像不同区域。
5 局限性与挑战
5.1 长程依赖难题
尽管LSTM和GRU显著缓解了梯度消失,但对超长序列(如数百时间步)的依赖建模仍然困难。理论上,细胞状态可以线性传递信息,但实际上门控机制仍会引入饱和或遗忘。极端长程(如文档级别)任务仍面临挑战。
5.2 并行化困难
RNN的顺序计算特性使其无法像Transformer那样对序列所有位置进行并行处理。训练时每个时间步必须等待前一步完成,导致训练速度慢,尤其在GPU上难以充分利用。这是RNN逐渐被Transformer替代的主要原因之一。
5.3 注意力机制的兴起
注意力机制让模型能够直接关注输入序列中的不同位置,而非仅依赖最后一个隐藏状态压缩信息。这打破了RNN的顺序瓶颈。
5.3.1 从RNN到Transformer的过渡
Transformer完全舍弃循环结构,采用自注意力机制实现全局依赖,同时支持并行计算。自2017年提出后,RNN在NLP领域的主导地位迅速被取代。当前Transformer家族的BERT、GPT等模型在几乎所有序列任务上超越了RNN。
5.4 实际部署中的计算开销
RNN在推理阶段仍需按时间步执行,不能并行生成输出(除非使用非自回归方法)。对于实时应用,如流式语音识别,RNN的低延迟优势仍在,但长序列下累计的计算量不容忽视。
6 扩展与前沿
6.1 RNN与注意力结合的模型
在Transformer兴起之前,注意力机制被加入RNN编码-解码框架,形成了经典的Bahdanau注意力(加性注意力)和Luong注意力(点积注意力)。这些混合模型在机器翻译和图像描述中取得了当时最好效果,如今仍作为教学案例存在。
6.2 神经图灵机
神经图灵机在RNN基础上引入外部可读写存储器,让网络能像图灵机一样执行算法(如复制、排序)。通过读头、写头与内存交互,模型理论上可模拟任意程序。不过实际训练困难,应用有限,更多作为理论探索。
6.3 循环世界模型
该概念源于Agent模型(如World Models 2018),使用RNN学习环境内部表示来预测未来帧或奖励。循环模型在部分可观测环境中充当“世界模型”,为强化学习提供规划能力。虽然已被更现代的Transformer和状态空间模型挑战,但RNN在计算效率和简洁性上仍有价值。