NLP-AHU-102

        在接触深度学习的过程中,我一直有一个疑问:为什么传统的神经网络无法处理自然语言?直到学习了循环神经网络(RNN)及其变体,我才明白问题的核心在于时序依赖
        我们人类理解一句话,是一个顺序的、上下文关联的过程。比如当你读到 “我昨天去了超市,买了牛奶和面包" 时,你会自动将 "买了" 和前面的 "超市" 联系起来。但传统的全连接神经网络和卷积神经网络,只能处理独立的输入,无法记住之前的信息。
        这篇博客是我学习 RNN、LSTM 和 BiLSTM 的笔记整理,我会尽量从设计动机出发,一步步推导每个模型的结构和数学公式,希望能帮助和我一样的初学者理解这些经典的时序模型。

一、RNN:循环神经网络的诞生与局限

1.1 设计灵感:模拟人类的短期记忆

        RNN 的全称是 Recurrent Neural Network,直译过来就是 "循环神经网络"。它的设计灵感非常朴素:既然数据是按顺序出现的,那么我们就按顺序处理它,并且让模型记住之前处理过的内容

        这就像我们读书一样,我们不会把每一页都当成独立的内容来读,而是会记住前面的情节,来理解后面的故事。RNN 通过一个循环连接来实现这个 "记忆" 功能。

1.2 网络结构与展开图

RNN 的核心是一个循环单元,它在每个时间步都会接收两个输入:

  • 当前时刻的输入 $x_t$
  • 上一时刻的隐藏状态 $h_{t-1}$

然后输出两个结果:

  • 当前时刻的隐藏状态 h_t(传递给下一个时间步)
  • 当前时刻的输出 y_t​(任务相关的输出)

图 1:RNN 循环结构与展开图

图 1 说明:左边是 RNN 的循环结构示意图,右边是将其按时间步展开后的结构。可以看到,RNN 在所有时间步共享同一套参数,这大大减少了模型的参数量。

1.3 详细数学推导

RNN 的计算过程可以用两个公式来表示:

  1. 隐藏状态更新公式

    h_t=tanh(W_{xh}x_t+W_{hh}h_{t-1}+b_h)

    这里我选择用 tanh 作为激活函数,这是最常用的选择。tanh 函数的取值范围是(−1,1),可以将输出归一化到这个区间内。

  2. 输出计算公式

    y_t=W_{hy}h_t+b_y

    输出层的激活函数取决于具体的任务:

    • 如果是分类任务,使用 softmax 激活函数
    • 如果是回归任务,不使用激活函数或使用线性激活函数

1.4 致命缺陷:梯度消失与梯度爆炸

        RNN 的设计看起来很完美,但在实际应用中却存在一个致命的问题:无法处理长序列。这是由反向传播算法的特性导致的。

         在训练 RNN 时,我们使用的是随时间反向传播(BPTT)算法。简单来说,就是将展开后的 RNN 看作一个深度神经网络,然后从最后一个时间步向前传播梯度。

        对于第 t 个时间步的隐藏状态ht​,它对第 1 个时间步的隐藏状态h1​的梯度为:

\frac{\partial h_t}{\partial h_1} = \prod_{k=2}^t W_{hh}^T \cdot \text{diag}(\sigma'(h_{k-1}))

这是一个连乘的形式!如果Whh​的最大特征值小于 1,那么多次连乘后梯度会趋近于 0,这就是梯度消失;如果最大特征值大于 1,梯度会趋近于无穷大,这就是梯度爆炸

图 2:RNN 梯度消失示意图

图 2 说明:图中展示了 RNN 按时间步展开后的时间反向传播(BPTT)梯度流:以最后一个时间步的损失为起点,梯度沿时间步从右向左指数级衰减。该现象导致 RNN 无法有效学习序列中的长距离依赖关系,即早期时间步的信息无法通过梯度更新传递到模型参数。

        举个例子,如果我们有一句话:"我出生在法国,……(中间隔了 50 个单词),我能流利地说____"。RNN 模型因为梯度消失,无法记住 50 个单词之前的 "法国",因此很难预测出空格处应该填 "法语"。


二、LSTM:长短期记忆网络的突破

2.1 设计动机:解决 RNN 的长距离依赖问题

        为了解决 RNN 的梯度消失问题,Hochreiter 和 Schmidhuber 在 1997 年提出了 LSTM(Long Short-Term Memory)网络。

        LSTM 的核心思想是:既然梯度消失是因为连乘导致的,那么我们就用加法来代替乘法。LSTM 引入了一个细胞状态(Cell State),它像一条传送带一样,在整个序列中线性地传递信息,只有少量的线性交互,从而避免了梯度的指数级衰减。同时,LSTM 设计了三个门控结构来控制细胞状态的信息流动:

  • 遗忘门:决定从细胞状态中丢弃哪些信息。
  • 输入门:决定哪些新信息存入细胞状态。
  • 输出门:决定细胞状态中哪些信息输出到隐藏状态。

2.2 LSTM 单元的详细结构

图 3:LSTM 单元内部结构图

图 3 说明:这是 LSTM 单元的标准内部结构图,清晰地展示了三个门和细胞状态的信息流动。这张图是理解 LSTM 的关键,建议大家多看几遍。

2.3 逐门数学推导

下面我将一步步推导 LSTM 每个门的计算过程,所有的公式都基于图 3 的结构。

2.3.1 遗忘门(Forget Gate)

        遗忘门的作用是决定从细胞状态中丢弃哪些信息。它接收上一时刻的隐藏状态 h_{t-1} ​和当前时刻的输入 x_t ,输出一个 0 到 1 之间的值ft​。

f_t = \sigma(W_f \cdot [h_{t-1}, x_t] + b_f)

其中:

  • σ是 sigmoid 激活函数,它将输出压缩到 [0,1] 区间。
  • [h_{t-1}, x_t] 表示将两个向量拼接在一起。
  • ft​的每个元素对应细胞状态 C_{t-1} 的一个元素,1 表示 "完全保留",0 表示 "完全丢弃"。
2.3.2 输入门(Input Gate)

输入门的作用是决定哪些新信息存入细胞状态。它分为两步:

  1. 首先,用一个 sigmoid 层生成输入门的值 i_t ,决定哪些信息需要更新  $ i_t = \sigma(W_i \cdot [h_{t-1}, x_t] + b_i) $
  2. 然后,用一个 tanh 层生成候选细胞状态 \tilde{C}_t ,这是待存入的新信息  $ \tilde{C}_t = \tanh(W_C \cdot [h_{t-1}, x_t] + b_C) $ 。
2.3.3 细胞状态更新(Cell State Update)

        这是 LSTM 最核心的一步,也是解决梯度消失问题的关键。我们用加法来更新细胞状态:

$ C_t = f_t \odot C_{t-1} + i_t \odot \tilde{C}_t $

其中⊙表示哈达玛积(对应元素相乘)。

2.3.4 输出门(Output Gate)

输出门的作用是决定细胞状态中哪些信息输出到隐藏状态。它也分为两步:

  1. 首先,用一个 sigmoid 层生成输出门的值  $ o_t = \sigma(W_o \cdot [h_{t-1}, x_t] + b_o) $
  2. 然后,将细胞状态通过 tanh 函数处理后,与输出门的值相乘,得到当前时刻的隐藏状态  $ h_t = o_t \odot \tanh(C_t) $

2.4 LSTM 为什么能解决梯度消失?

        很多教程只是说 LSTM 能解决梯度消失,但没有解释为什么。其实原因很简单。在反向传播时,细胞状态的梯度为:

\frac{\partial C_t}{\partial C_{t-1}} = f_t + others

遗忘门 $f_t$ ​的值通常接近 1,所以 \frac{\partial C_t}{\partial C_{t-1}} 的值也接近 1。这样,梯度在细胞状态这条路径上传播时,不会出现指数级衰减,从而可以学习到长距离的依赖关系。


三、BiLSTM:双向长短期记忆网络

3.1 设计动机:利用上下文双向信息

        无论是 RNN 还是 LSTM,都是单向模型。它们只能从左到右处理序列,只能利用 "前文信息",无法利用 "后文信息"。但在很多自然语言处理任务中,语义是双向依赖的。比如下面这个例子:

"他____了一个苹果。"

        如果只看前文 "他",我们无法预测空格处应该填什么。但如果看后文 "一个苹果",我们就可以推断出空格处可能是 "吃"、"买"、"拿" 等动词。再比如命名实体识别任务:

"乔布斯是苹果公司的创始人。"

        要识别 "苹果" 是一个公司名,不仅需要看前文 "乔布斯是",还需要看后文 "公司的创始人"。为了解决这个问题,人们提出了 BiLSTM(Bidirectional LSTM),即双向长短期记忆网络。

3.2 BiLSTM 的结构与原理

        BiLSTM 的结构非常简单:它由两个独立的 LSTM 层组成,一个正向 LSTM和一个反向 LSTM

图 4:BiLSTM 结构示意图

图 4 说明:展示了 BiLSTM 的结构。正向 LSTM 从左到右处理序列,反向 LSTM 从右到左处理序列,最后将两个方向的隐藏状态拼接在一起。

  • 正向 LSTM:按时间步1→t处理序列,学习前文到当前的依赖关系。
  • 反向 LSTM:按时间步t→1处理序列,学习后文到当前的依赖关系。

        对于每个时间步 t ,BiLSTM 的最终隐藏状态ht​是正向 LSTM 的隐藏状态htf​和反向 LSTM 的隐藏状态htb​的拼接:

h_t = \left[ h_t^f, h_t^b \right ]

这样,h_t 就同时包含了前文信息后文信息,能够更全面地表示当前词的语义。

3.3 BiLSTM 的数学表达

BiLSTM 的数学表达非常简洁:

h_t^f = \text {LSTM}_f(x_t, h_{t-1}^f)    h_t^b = \text {LSTM}_b(x_t, h_{t+1}^b)    y_t = W_y h_t + b_y

h_t = \left[ h_t^f, h_t^b \right ]

其中LSTMf​和LSTMb​是两个独立的 LSTM 层,它们有各自的参数,互不共享。


四、三者深度对比与应用场景

为了更清晰地对比这三个模型,我整理了下面的表格:

模型 核心机制 记忆能力 上下文利用 计算复杂度 典型应用场景
RNN 简单循环连接 只能记住最近几个时间步 只能利用前文 短序列预测、简单时序回归
LSTM 门控机制 + 细胞状态 可以记住几百个时间步 只能利用前文 长序列预测、语音识别、机器翻译
BiLSTM 双向 LSTM 拼接 同时利用前文和后文 是 LSTM 的 2 倍 命名实体识别、情感分析、文本分类、问答系统

4.1 为什么现在 Transformer 更流行?

        虽然 LSTM 和 BiLSTM 在很长一段时间内都是 NLP 任务的主流模型,但现在它们已经逐渐被 Transformer 架构所取代。主要原因有两个:

  1. 并行计算能力:LSTM 是顺序计算的,必须等前一个时间步计算完成后才能计算下一个时间步,无法并行。而 Transformer 的自注意力机制可以并行计算整个序列,大大提高了训练速度。
  2. 长距离依赖建模能力:虽然 LSTM 比 RNN 强,但它的长距离依赖能力仍然有限。而 Transformer 的自注意力机制可以直接计算序列中任意两个位置的依赖关系,建模能力更强。

        不过,LSTM 和 BiLSTM 依然是非常重要的基础模型。它们的设计思想(门控机制、记忆机制)对后来的深度学习模型产生了深远的影响。而且在一些小数据集、低资源的场景下,LSTM 和 BiLSTM 的表现依然很好。


五、学习感悟与总结

通过这次学习,我深刻体会到了深度学习模型的进化逻辑:发现问题→分析问题根源→针对性地改进模型

  • RNN 发现了传统神经网络无法处理时序数据的问题,提出了循环结构来模拟记忆。
  • LSTM 发现了 RNN 梯度消失的问题,提出了细胞状态和门控机制来解决。
  • BiLSTM 发现了单向模型无法利用后文信息的问题,提出了双向拼接的结构。

        这三个模型层层递进,每一个都解决了前一个模型的核心缺陷。这种 "问题驱动" 的研究思路,值得我们每一个学习者学习。当然,这篇博客只是对 RNN、LSTM 和 BiLSTM 的基础介绍。如果想要更深入地理解它们,还需要动手实现代码,在实际任务中体验它们的效果。

六、参考文献


[1] Hochreiter S, Schmidhuber J. Long short-term memory[J]. Neural computation, 1997, 9(8): 1735-1780.
[2] Graves A, Mohamed A R, Hinton G. Speech recognition with deep recurrent neural networks[C]//2013 IEEE international conference on acoustics, speech and signal processing. IEEE, 2013: 6645-6649.
[3] Schuster M, Paliwal K K. Bidirectional recurrent neural networks[J]. IEEE transactions on Signal Processing, 1997, 45(11): 2673-2681.
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐