CNN擅长处理图像——二维的空间数据。但语言、音频、股票价格这类数据有不同的特点:时序性。“我爱深度学习”和“深度学习我爱”包含相同的词,但意义完全不同,因为顺序变了。 标准的全连接网络和CNN无法处理这种时序依赖,我们需要新的架构:循环神经网络(Recurrent Neural Network, RNN)。
RNN的核心思想优雅而简单:网络有“记忆”。处理序列时,它不仅看当前输入,还记得之前看到的内容。这种记忆机制让RNN能够捕捉时序模式,理解上下文。

想象你要构建一个命名实体识别系统,输入句子“Harry Potter是一位巫师”,输出标注每个词是不是人名:
输入:["Harry", "Potter", "是", "一位", "巫师"]
输出:[1, 1, 0, 0, 0](1表示人名,0表示非人名)
用全连接网络有几个问题:
RNN解决了这些问题。
RNN的关键是隐藏状态 ,它在每个时间步更新,融合当前输入和历史信息:
这里 是时刻 的输入, 是前一时刻的隐藏状态, 是当前输出。
注意每个时间步使用相同的权重 ——这就是参数共享,让RNN能处理任意长度的序列。
|def rnn_cell_forward(x_t, h_prev, parameters): """ RNN单元的前向传播 x_t: 当前输入,shape (n_x, m) h_prev: 前一时刻隐藏状态,shape (n_h, m) """ Wh = parameters['Wh'] # (n_h, n_h) Wx = parameters['Wx'] # (n_h, n_x) Wy = parameters['Wy'] # (n_y, n_h) bh = parameters['bh'] by = parameters['by']
训练RNN使用通过时间的反向传播(Backpropagation Through Time, BPTT)。把RNN展开成一个深层网络,然后用标准反向传播。
关键是梯度需要从最后一个时间步传回第一个时间步。如果序列很长(如100个词的句子),梯度需要经过100次矩阵乘法。这导致梯度消失问题——早期时间步的梯度可能变得极小,网络无法学习长期依赖。
这是标准RNN的致命弱点。对于短序列(如10个时间步),RNN工作良好。但处理几十上百步的序列,就力不从心了。

LSTM(Long Short-Term Memory)通过精巧的门控机制解决了梯度消失问题,能记住几十甚至上百步之前的信息。
LSTM单元有三个门:
还有一个记忆单元 ,存储长期信息。
GRU(Gated Recurrent Unit)是LSTM的简化版,只有两个门:
GRU参数更少,训练更快,但LSTM通常效果略好。实践中都有人用。
|class LSTMCell: def forward(self, x_t, h_prev, c_prev): """ LSTM单元前向传播 x_t: (n_x, m) h_prev: (n_h, m) c_prev: (n_h, m) """ # 拼接输入 concat = np.vstack([h_prev, x_t]) # 三个门 f_t = sigmoid(np.dot(self.Wf, concat) + self.bf) i_t = sigmoid(np.dot(self.Wi, concat) + self.bi) o_t
有些任务需要看完整个序列才能做决策。比如命名实体识别,判断“Teddy”是人名还是泰迪熊,需要看后面的上下文。
双向RNN(Bidirectional RNN)同时从前往后和从后往前处理序列,然后结合两个方向的隐藏状态:
前向:
后向:
输出:
双向RNN在很多NLP任务上是标准配置,但缺点是必须看到整个序列才能输出,无法用于实时任务(如实时语音识别)。
RNN也可以堆叠多层,但通常不像CNN那样深(152层)。因为RNN在时间维度已经很“深”了——一个100步的RNN相当于100层的网络。实践中,3-4层RNN已经很深,6层以上很少见。
|# PyTorch中的多层双向LSTM model = nn.LSTM( input_size=embedding_dim, hidden_size=256, num_layers=3, # 3层堆叠 bidirectional=True, # 双向 dropout=0.2 # 层间Dropout )
RNN的时代与局限
2013-2017年,RNN/LSTM是NLP的主流。但2017年Transformer出现后,RNN逐渐被取代。Transformer通过自注意力机制,不仅能并行处理(RNN必须顺序处理),还能更好地捕捉长距离依赖。
2020年后,BERT、GPT这类基于Transformer的模型主导了NLP。但RNN仍在时序预测、音乐生成等领域有应用。理解RNN对理解Transformer也有帮助——注意力机制可以看作RNN的改进。
在下一节,我们将学习词嵌入——将词表示为连续向量的技术。Word2Vec、GloVe等方法能捕捉词的语义关系,是现代NLP的基础。虽然现在有更强大的BERT等上下文嵌入,但理解Word2Vec仍然重要。