RNN(Recurrent Neural Network,循环神经网络)是一种用于处理序列数据的神经网络。它的核心特点是能够利用前一时刻的隐藏状态来影响当前时刻的输出,从而捕捉序列中的时间依赖关系。
RNN有两大关键特点:
时间依赖性:RNN通过隐藏状态(hidden state)传递历史信息,使当前输出不仅依赖于当前输入,还依赖于之前的输入。
循环结构:RNN在每个时间步共享相同的权重参数,通过循环结构处理任意长度的序列。如下图所示。

W表示在每个时间点上输入到输出之间的权重矩阵,W一直不会变。特别需要强调的一点是,在整个训练过程中,每一时刻所用的都是同样的W。
RNN之所以可以解决序列问题,是因为它可以记住每一时刻的信息,每一时刻的隐藏层不仅由该时刻的输入层决定,还由上一时刻的隐藏层决定,公式如下所示,其中$O_t$代表时刻的输出,$S_t$代表时刻的隐藏层的值:
$$ O_t = g(V \cdot S_t) $$
$$ S_t = f(U \cdot X_t + W \cdot S_{t-1}) $$
import torch
import torch.nn as nn
rnn = nn.RNN(10, 20, 2)
input = torch.randn(5, 3, 10)
h0 = torch.randn(2, 3, 20)
output, hn = rnn(input, h0)
print(output, hn)
尽管 torch.nn.RNN 是基础的 RNN 实现,但在实际应用中较少使用,原因如下:
梯度消失/爆炸问题。基础 RNN 在处理长序列时容易出现梯度消失或爆炸问题,难以捕捉长期依赖。
表达能力有限。基础 RNN 的结构简单,难以建模复杂的时间依赖关系。
更强大的替代模型。LSTM 和 GRU 通过门控机制缓解了梯度消失问题,能够更好地捕捉长期依赖,因此在大多数任务中取代了基础 RNN。另外,Transformer 通过自注意力机制进一步提升了序列建模能力,成为当前的主流选择。