查看全课大纲(第 42 / 69 节)
  1. 1.NLP 的研究领域、应用与学习路径
  2. 2.自然语言的基本术语
  3. 3.信息论基础:信息熵与交叉熵
  4. 4.语言的进化与语义变迁
  5. 5.主观概率、客观概率与条件概率
  6. 6.贝叶斯原理与推理
  7. 7.随机变量:二项式、期望方差与联合概率
  8. 8.常见概率分布
  9. 9.辛普森悖论与贝叶斯解题实例
  10. 10.语言模型:语言概率与词袋模型
  11. 11.n-gram 语言模型(二元 / 三元 / N-Gram)
  12. 12.语言模型评价:交叉熵、困惑度与插值
  13. 13.朴素贝叶斯文本分类:垃圾邮件
  14. 14.拼写检查
  15. 15.中文分词:构词法、最大匹配、最优路径与 Jieba
  16. 16.词表示问题与语义相似度
  17. 17.TF-IDF 权重处理
  18. 18.One-Hot 表达与词表示的局限
  19. 19.Word2Vec 核心思想
  20. 20.Word2Vec 训练过程
  21. 21.Skip-gram 模型详解
  22. 22.词性标注任务与标注方法(规则 + N-Gram)
  23. 23.EM 算法与混合模型
  24. 24.高斯混合模型 GMM
  25. 25.从混合模型到隐马尔可夫模型
  26. 26.隐马尔可夫模型(HMM)推导与维特比解码
  27. 27.线性链条件随机场 CRF
  28. 28.贝叶斯网络与图模型
  29. 29.隐马尔可夫链与 HMM 推导
  30. 30.PLSA 主题模型
  31. 31.LSI 与 SVD 向量表达
  32. 32.LDA 与狄利克雷分布
  33. 33.主题模型实验复现(困惑度 / 分类 / 相似度 / 延展)
  34. 34.上下文无关文法(CFG)与句法分析
  35. 35.概率上下文无关文法 PCFG
  36. 36.统计机器翻译:词对齐与翻译模型
  37. 37.统计机器翻译中的对齐模型与参数估计
  38. 38.从统计机器翻译到神经机器翻译
  39. 39.神经元与反向传播速览(指向深度学习课)
  40. 40.CNN 原理及其在 NLP 中的应用
  41. 41.循环神经网络的基本原理与 Elman / Jordan 网络
  42. 42.LSTM:长短期记忆网络的核心思想与分步实现
  43. 43.Encoder-Decoder 框架
  44. 44.Seq2Seq 与早期注意力机制
  45. 45.注意力机制的背景与动机
  46. 46.注意力模型实现原理与匹配函数
  47. 47.记忆网络:组成与计算
  48. 48.注意力机制的应用与历史延展
  49. 49.Transformer 结构:Encoder-Decoder 栈与 Self-Attention
  50. 50.Multi-Head Attention、FFNN 与位置编码
  51. 51.层归一化、损失函数与 Universal Transformer 延展
  52. 52.预训练范式:从 ELMo 到 BERT
  53. 53.BERT 与掩码语言模型
  54. 54.BERT 下游任务微调与 GLUE 口径
  55. 55.GPT 与自回归语言建模
  56. 56.GPT-1 到 GPT-4 的演进
  57. 57.指令微调与 RLHF
  58. 58.分词器:BPE、WordPiece 与中文词表
  59. 59.上下文窗口与长文本处理
  60. 60.能力边界、成本与适用场景
  61. 61.文本分类实战:从朴素贝叶斯到逻辑回归
  62. 62.命名实体识别实战
  63. 63.文本生成与摘要实战
  64. 64.语义检索与向量库实战
  65. 65.RAG 知识库问答
  66. 66.NLP 评估指标:BLEU / ROUGE / BERTScore 与人工评估
  67. 67.幻觉与事实性问题
  68. 68.文本与知识结合(知识图谱压缩)
  69. 69.跨媒体信息检索与未来展望

LSTM:长短期记忆网络的核心思想与分步实现

小象实战讲义 · 自然语言处理

在上一节中,我们学习了循环神经网络(RNN)的基本结构及其在序列建模中的应用。然而,标准的RNN在处理长序列时,会面临梯度消失或爆炸的难题,难以捕捉远距离的依赖关系。本节将深入探讨一种特殊的RNN变体——长短期记忆网络(LSTM)。LSTM通过精巧的“门控”机制,有效地解决了长期依赖问题,成为序列建模领域里程碑式的模型。理解LSTM不仅是掌握现代RNN架构的关键,也为后续学习更复杂的序列模型(如Transformer)奠定了重要基础。

💡 核心导读

  • 长期依赖问题:理解为何标准RNN难以捕捉序列中远距离信息之间的关联。
  • LSTM核心思想:掌握LSTM通过“细胞状态”和“门控”机制来选择性记忆和遗忘信息的设计哲学。
  • 门控机制详解:分步解析遗忘门、输入门、输出门的功能与数学实现。
  • 从LSTM到GRU:了解门控循环单元(GRU)作为LSTM的一种简化变体,如何通过合并门控来减少参数。
  • 应用与生成:认识LSTM作为语言模型在文本生成等任务中的应用方式。

长期依赖问题:为什么需要LSTM?

在标准的RNN中,每个时间步的隐藏状态 h_t 是当前输入 x_t 和上一时刻隐藏状态 h_{t-1} 的函数。信息通过隐藏状态链式传递。梯度消失/爆炸发生在训练的反向传播阶段:BPTT 把损失梯度沿时间步传回时,需要把各时间步的循环权重与局部导数连乘;当序列很长时,这个乘积可能指数级变小(梯度消失)或变大(梯度爆炸)。前向传播经过多次 tanh 只是把隐藏状态压到 (-1,1) 区间,本身并不直接导致梯度消失或爆炸。

考虑课件中的经典例子:

“I grew up in France… I speak fluent French.”

为了预测最后一个词“French”,模型需要利用到句子开头出现的“France”这一关键信息。在标准RNN或基于n-gram的语言模型中,最后一个词“French”主要受到其紧邻前词“fluent”甚至“speak”的影响。给定“I speak fluent”时,“Chinese”、“English”、“French”等词出现的概率可能相差不大。但当模型“看到”了更早的“France”时,“French”的概率应显著高于其他语言。这种跨越多个时间步的关联,就是长期依赖。

标准RNN的结构决定了信息必须按顺序、逐层传递,无法“跳过”中间不重要的时间步,直接建立远距离连接。LSTM的提出,正是为了优雅地解决这一问题。

LSTM的核心思想:细胞状态与门控

长短期记忆网络由 Sepp Hochreiter 和 Jürgen Schmidhuber 于1997年提出。它的核心创新在于引入了一个贯穿整个序列的细胞状态,以及围绕该状态设计的多个门控单元。

细胞状态:信息的“传送带”

LSTM的关键是细胞状态,通常用 C_t 表示。你可以将它想象成一个在时间轴上水平穿行的“传送带”。它从序列开始一直运行到结束,其设计目标是让信息能够几乎不变地流过这条传送带。

C_t 的更新不是简单的覆盖,而是通过一系列线性交互(主要是加法和乘法)来实现。这种设计使得信息(尤其是长期依赖信息)可以轻松地沿着细胞状态传递,而不受每个时间步非线性变换的过多干扰。

门控机制:信息的“守门人”

仅仅有传送带还不够,我们需要决定哪些信息应该被保留在传送带上,哪些应该被更新或丢弃。LSTM通过门控来实现这一精细控制。每个门实际上是一个全连接层,后接一个 sigmoid 激活函数。sigmoid 的输出值在0到1之间,可以理解为“通过比例”:

  • 0 表示“完全不让任何信息通过”。
  • 1 表示“让所有信息完全通过”。
  • 0到1之间 表示“让部分信息通过”。

LSTM单元通常包含三个这样的门:遗忘门、输入门和输出门。它们共同协作,管理细胞状态的更新和隐藏状态的输出。

LSTM的分步实现详解

下面,我们结合课件中的图示,分步拆解LSTM在一个时间步内的计算过程。我们将使用统一的数学符号进行说明。

首先,定义每个时间步的输入:

  • x_t: 当前时间步的输入向量。
  • h_{t-1}: 上一时间步的隐藏状态(也是上一时间步的输出)。
  • C_{t-1}: 上一时间步的细胞状态。

LSTM单元的第一步是将 h_{t-1} 和 x_t 连接(concatenate)成一个更大的向量,作为后续所有门和候选值计算的共同输入。

第一步:遗忘门(Forget Gate)

作用:决定我们需要从细胞状态 C_{t-1} 中丢弃(遗忘)哪些信息。

遗忘门查看 h_{t-1} 和 x_t,并为 C_{t-1} 中的每个数值输出一个0到1之间的数。

  • 输出1表示“完全保留这个信息”。
  • 输出0表示“完全丢弃这个信息”。

计算公式: f_t = σ(W_f · [h_{t-1}, x_t] + b_f) 其中:

  • σ 是sigmoid激活函数。
  • W_f 是遗忘门的权重矩阵。
  • b_f 是遗忘门的偏置向量。
  • [h_{t-1}, x_t] 表示将两个向量在特征维度上连接。
  • f_t 的输出维度与细胞状态 C_{t-1} 相同。

第二步:输入门(Input Gate)与候选值

作用:决定我们要将哪些新的信息存储到细胞状态中。这个过程分为两部分。

1. 输入门层:决定我们将更新细胞状态的哪些部分。 i_t = σ(W_i · [h_{t-1}, x_t] + b_i) i_t 同样是一个0到1之间的向量,决定了后续候选值中哪些部分会被纳入更新。

2. 候选细胞状态层:创建一个新的候选值向量 \tilde{C}_t,这些值可能会被加入到细胞状态中。 \tilde{C}_t = tanh(W_C · [h_{t-1}, x_t] + b_C) 这里使用 tanh 激活函数(输出范围-1到1)来生成候选值。

第三步:更新细胞状态

现在,我们可以将旧的细胞状态 C_{t-1} 更新为新的细胞状态 C_t。更新规则结合了遗忘门和输入门的结果:

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

这个公式是LSTM的核心:

  • f_t * C_{t-1}:我们选择性地遗忘旧状态的一部分。
  • i_t * \tilde{C}_t:我们选择性地添加候选状态的一部分。
  • 两者相加,实现了对细胞状态的有控制地更新。如果模型需要保留长期信息(如例子中的“France”),它可以通过学习使 f_t 接近1(完全保留旧状态),i_t 接近0(不添加新信息),从而让 C_t ≈ C_{t-1},信息无损传递。

第四步:输出门与当前隐藏状态

作用:基于更新后的细胞状态,决定当前时间步的输出(即隐藏状态 h_t)。

1. 输出门层:决定我们将输出细胞状态的哪些部分。 o_t = σ(W_o · [h_{t-1}, x_t] + b_o)

2. 计算当前隐藏状态:首先将细胞状态 C_t 通过 tanh 函数(将其值压到-1到1之间),然后与输出门相乘,得到最终的隐藏状态输出。 h_t = o_t * tanh(C_t)

这个 h_t 将作为当前时间步的输出,并传递到下一个时间步作为 h_{t-1}。

总结LSTM在一个时间步的完整流程:

  1. 计算遗忘门:f_t = σ(W_f·[h_{t-1}, x_t] + b_f)
  2. 计算输入门:i_t = σ(W_i·[h_{t-1}, x_t] + b_i)
  3. 计算候选值:\tilde{C}_t = tanh(W_C·[h_{t-1}, x_t] + b_C)
  4. 更新细胞状态:C_t = f_t * C_{t-1} + i_t * \tilde{C}_t
  5. 计算输出门:o_t = σ(W_o·[h_{t-1}, x_t] + b_o)
  6. 计算输出(隐藏状态):h_t = o_t * tanh(C_t)

从LSTM到GRU:一种简化变体

门控循环单元是LSTM的一种流行变体,由Cho等人在2014年提出。它通过合并门控来简化结构,减少了参数数量,同时在许多任务上保持了与LSTM相当的性能。

GRU的核心改动在于:

  1. 合并了细胞状态和隐藏状态。
  2. 将遗忘门和输入门合并为一个单一的“更新门”。

GRU的计算公式:

  • 更新门:z_t = σ(W_z·[h_{t-1}, x_t] + b_z)
  • 重置门:r_t = σ(W_r·[h_{t-1}, x_t] + b_r)
  • 候选隐藏状态:\tilde{h}_t = tanh(W·[r_t * h_{t-1}, x_t] + b)
  • 最终隐藏状态:h_t = (1 - z_t) * h_{t-1} + z_t * \tilde{h}_t

在GRU中:

  • 更新门 z_t 决定了有多少旧状态 h_{t-1} 被保留,以及有多少新候选状态 \tilde{h}_t 被加入。这相当于同时扮演了LSTM中遗忘门(保留旧信息)和输入门(加入新信息)的角色,并且强制两者互补(z_t 和 1-z_t)。
  • 重置门 r_t 决定了在计算候选状态时,如何结合旧状态 h_{t-1}。如果 r_t 接近0,则候选状态的计算几乎忽略 h_{t-1},只依赖于当前输入 x_t。

GRU由于参数更少,通常训练速度更快,在数据量不是特别大时是一个很好的选择。LSTM则因其更大的容量,在复杂任务上可能更具潜力。

LSTM作为语言模型与文本生成

LSTM本质上是一个强大的序列模型。当将其应用于自然语言时,它可以被训练成一个神经语言模型。给定一个词序列 w_1, w_2, ..., w_{t-1},LSTM的目标是预测下一个词 w_t 的概率分布 P(w_t | w_1, ..., w_{t-1})。

训练过程与n-gram语言模型的思想一致:最大化训练语料中真实序列的似然概率。但不同于n-gram的计数统计,LSTM通过反向传播算法优化其内部的权重参数(W_f, W_i, W_C, W_o 及对应的偏置)。

训练好的LSTM语言模型可以用于文本生成。生成过程通常是自回归的:

  1. 给定一个起始词或句子(如“I”)。
  2. 将当前序列输入LSTM,得到下一个词的概率分布。
  3. 从该分布中采样一个词(例如,选择概率最高的词,或按概率随机采样),并将其追加到序列末尾。
  4. 重复步骤2-3,直到生成一个特殊的句子结束符(如<EOS>)或达到预设长度。

例如,从“I”开始,模型可能依次生成“love”、“this”、“country”、“.”和<EOS>,从而得到完整的句子“I love this country.”。

📝 动手练一练

  1. 概念辨析:假设我们有一个训练好的LSTM语言模型。当它处理句子“The cat, which had been missing for two weeks, finally returned home.”时,为了正确预测最后一个词“home”,模型最需要依赖长期依赖信息(来自句子开头的“cat”)还是短期依赖信息(来自紧邻的“returned”)?请简述原因。
👉 点击查看参考答案

预测 home 主要依赖短期搭配:紧邻的 returned 与 home 构成很强的固定搭配(“returned home”),这是预测 home 的主要线索。cat 是 returned 的主语,理解这一主谓关系有助于判断动作执行者,但并不是预测 home 这个目的地词的必要条件;即便不知道主语是谁,“returned” 后接 “home” 的搭配概率仍然很高。因此不能把这句当作“必须靠长期依赖才能预测”的典型例子。真正需要长期依赖的情形,是目标词的选择取决于相隔很远、且无法由紧邻搭配推断的信息(如前面 France 决定后面 French)。

  1. 公式理解:回顾LSTM更新细胞状态的公式 C_t = f_t * C_{t-1} + i_t * \tilde{C}_t。假设在某时间步,模型学到 f_t 的所有元素都接近1,而 i_t 的所有元素都接近0。请问这个时间步的细胞状态 C_t 与上一时间步的细胞状态 C_{t-1} 关系如何?这对应了处理序列时的哪种情况?
👉 点击查看参考答案

当 f_t ≈ 1 且 i_t ≈ 0 时,代入公式可得: C_t ≈ 1 * C_{t-1} + 0 * \tilde{C}_t ≈ C_{t-1}。

这意味着细胞状态几乎没有任何更新,当前时间步的输入信息 x_t 和隐藏状态 h_{t-1} 对细胞状态的影响被最小化,C_{t-1} 中的信息被几乎原封不动地传递到了 C_t。

这对应了处理序列时的一种关键情况:模型认为当前时间步的信息不重要,但需要将更早时间步(存储在 C_{t-1} 中)的关键信息保留并传递下去,以用于预测未来更远时间步的输出。这正是LSTM解决长期依赖问题的核心体现——它可以通过门控机制,让信息在细胞状态这条“传送带”上跳过不相关的中间步骤,直达需要它的未来。

本章小结

本节我们深入剖析了长短期记忆网络。LSTM通过引入细胞状态和门控机制,巧妙地解决了标准RNN的长期依赖问题。遗忘门、输入门和输出门协同工作,实现了对信息流的精细化控制,使得模型能够自主决定记住什么、忘记什么以及输出什么。

📋 行动清单

  • 理解门控逻辑:能够不借助资料,口头解释LSTM中三个门(遗忘、输入、输出)各自的作用及它们如何协作更新细胞状态和隐藏状态。
  • 对比RNN变体:在脑海中梳理标准RNN、LSTM、GRU三者结构上的核心区别与联系,理解每种设计背后的动机。
  • 联想现代模型:思考LSTM的“选择性记忆”思想,与后续将学到的注意力机制中“选择性关注”的思想有何异曲同工之妙。

—— 小象教研组