NLP 入门:RNN、LSTM、BiLSTM 从设计初衷到公式细节梳理

张开发
2026/4/18 21:31:55 15 分钟阅读

分享文章

NLP 入门:RNN、LSTM、BiLSTM 从设计初衷到公式细节梳理
本文摘要本文为 NLP 专业课程的学习总结从设计启发、核心结构、算法细节、数学表达四个维度梳理了 RNN、LSTM、BiLSTM 三个经典序列模型的核心逻辑。作为一名正在啃 NLP 专业课的大三学生最近我算是被序列模型狠狠 “上了一课”。最开始接触的时候我始终搞不懂处理文本句子为什么不能直接用全连接网络直到一点点啃完 RNN、LSTM、BiLSTM 的设计逻辑、算法细节和数学公式才终于把这三个 NLP 领域最经典的序列模型的来龙去脉理清楚。这篇博客既是我的课程作业也是给同样入门的同学做的分享全程只有最实在的设计初衷、核心逻辑、算法细节和数学表达。一、RNN循环神经网络序列模型的起点1.1 设计启发解决传统网络的序列处理痛点在 RNN 出现之前我们常用的全连接网络DNN、卷积神经网络CNN处理文本、语音这类序列数据时有三个完全绕不开的致命问题无法捕捉时序依赖我们读句子是一个字一个字读会带着前面的内容理解后面的文本比如 “我今天吃了个苹果它很甜” 里的 “它”必须结合前文的 “苹果” 才能理解。但传统网络的输入是相互独立的根本没法传递这种上下文信息。无法处理可变长度输入不同句子的长度天差地别可传统网络要求输入维度必须固定总不能把所有句子都硬凑成一样的长度既浪费算力又丢失信息。参数无法共享如果用传统网络处理序列每个位置的输入都要学一套独立的参数序列一长参数量会直接爆炸根本没法训练。而 RNN 的设计就是完全针对这三个痛点模仿人脑处理序列信息的逻辑 —— 带着前文的 “记忆” 处理当前的内容并且整个序列共享同一套参数完美适配序列数据的特性。1.2 核心设计思路RNN 的全称是循环神经网络核心就在于 “循环” 二字。它的核心设计是每个时间步的输入不仅包含当前时刻的输入数据还包含上一个时刻的隐藏状态也就是前文的 “记忆”。整个序列的处理过程中所有时间步共享同一套权重参数既解决了可变长度输入的问题也避免了参数量爆炸。简单来说RNN 就像一个人读句子每读一个词就把这个词的信息和之前记住的内容结合起来更新自己的记忆再用这个新的记忆去理解下一个词。1.3 算法细节与数学表达先统一所有符号定义避免混淆所有符号的维度和含义如下表RNN 的前向传播过程核心只有两步公式完全对应 “更新记忆” 和 “生成输出” 两个动作隐藏状态更新记忆传递核心公式这是 RNN 的核心把当前输入和上一时刻的记忆结合生成当前时刻的新记忆这里的tanh是双曲正切激活函数会把数值压缩到 (-1,1) 之间避免训练过程中数值爆炸。公式里的h_(t−1)​就是上一时刻的隐藏状态也就是前文的所有记忆通过这一步每个时刻的记忆都包含了之前所有时刻的输入信息。输出计算用当前时刻的隐藏状态生成当前时刻的输出如果是分类任务我们还会在y_t​后面接 softmax 激活函数把输出转换成每个类别的概率。1.4 原生 RNN 的致命缺陷学会 RNN 的公式之后我本来以为这就搞定了序列问题结果很快就发现了它的硬伤 ——长程依赖问题。当序列很长的时候比如几百个词的长句子RNN 在反向传播更新参数时梯度需要一步步从最后一个时刻传回第一个时刻每一步都要乘以权重矩阵Whh​的转置。如果Whh​的特征值小于 1梯度会指数级衰减也就是梯度消失如果特征值大于 1又会出现梯度爆炸。这就导致 RNN 根本记不住很久以前的信息比如长句子里开头的主语到句子结尾就完全 “忘了”只能处理很短的序列。而这个缺陷也正是 LSTM 被设计出来的核心原因。二、LSTM长短期记忆网络解决长程依赖的核心方案2.1 设计启发针对性解决 RNN 的记忆缺陷LSTM 由 Hochreiter Schmidhuber 在 1997 年提出全称是长短期记忆网络它的设计初衷就是彻底解决 RNN 的长程依赖问题。我当时反复琢磨RNN 的问题到底出在哪后来发现RNN 的隐藏状态是 “一股脑” 更新的每一步都会把整个记忆覆盖一遍既没法选择忘记哪些没用的信息也没法选择记住哪些重要的信息长序列里的关键信息很容易就被覆盖掉了。而 LSTM 的核心设计灵感就是模仿人脑的记忆机制 —— 我们有长期记忆和短期记忆会选择性地忘记无关信息保留重要的长期信息需要的时候再把长期记忆提取出来使用。基于这个思路LSTM 设计了门控机制还新增了一条专门用来传递长期记忆的 “细胞状态”从根本上解决了梯度消失的问题。2.2 核心设计思路与结构LSTM 的核心是一条贯穿始终的细胞状态Cell State和三个控制信息流动的门控。细胞状态就像一条传送带整个序列的处理过程中只有少量的线性交互信息可以几乎无损耗地在上面传递很远完美解决了 RNN 里长期信息丢失的问题。而三个门控分别是遗忘门、输入门、输出门全部使用 sigmoid 激活函数输出 0 到 1 之间的数值0 代表完全关闭不让任何信息通过1 代表完全打开让所有信息通过。通过这三个门LSTM 就能精准控制 “忘记什么旧信息、记住什么新信息、输出什么内容”。2.3 算法细节与数学表达和 RNN 相比LSTM 的公式多了一些但只要顺着 “先忘旧的→再记新的→更新长期记忆→最后输出” 这个逻辑走就完全不会乱。先补充 LSTM 新增的符号定义LSTM 的前向传播分为四个核心步骤每一步都有对应的数学公式遗忘门决定要从长期记忆里丢弃什么信息这是 LSTM 的第一步先判断上一时刻的长期记忆里哪些内容没用了可以丢掉。比如句子里出现了新的主语就可以把之前的主语信息忘记。这里的σ是 sigmoid 激活函数输出 0-1 的数值控制每个位置的信息保留多少。输入门决定哪些新信息要存入长期记忆这一步分为两部分先判断哪些新信息重要再生成当前时刻的新记忆内容输入门本身控制哪些新信息需要被记住候选细胞状态生成当前时刻的新记忆内容用 tanh 激活输出 (-1,1) 的数值对应信息的增强和减弱细胞状态更新长期记忆的核心更新步骤这是 LSTM 最核心的一步也是解决梯度消失的关键。它是完全线性的更新梯度可以在这条线上无损传递不会像 RNN 那样指数级衰减。这里的⊙是哈达玛积也就是两个向量对应元素相乘。公式的逻辑很清晰先把上一时刻的长期记忆C_(t−1)​乘以遗忘门的输出丢掉没用的信息再加上输入门控制的新记忆内容把重要的新信息存入长期记忆里。输出门决定当前时刻输出什么隐藏状态最后一步决定当前时刻要把哪些长期记忆拿出来作为当前的隐藏状态输出同时传给下一个时刻输出门本身控制长期记忆的哪些部分要输出当前时刻的隐藏状态把细胞状态用 tanh 压缩到 (-1,1)再乘以输出门的结果最终的输出yt​和 RNN 的计算逻辑一致​根据任务需求接对应的激活函数即可。三、BiLSTM双向长短期记忆网络补全上下文信息的优化方案3.1 设计启发单向 LSTM 的信息缺失问题学会 LSTM 之后我本来以为这就是序列模型的最终形态了结果做命名实体识别作业的时候发现单向 LSTM 的效果总是差一点。后来才发现问题所在单向的 LSTM只能从左到右处理序列只能利用上文的信息没法利用下文的信息。举个很简单的例子完形填空 “我___苹果因为它很甜”要填出 “喜欢” 这个词不仅要看前面的 “我”更要看后面的 “因为它很甜”。但单向 LSTM 处理到横线这个位置的时候根本看不到后面的内容自然没法做出最准确的判断。而 BiLSTM 的设计启发就是针对这个痛点 ——让模型同时看到序列的正向和反向内容同时捕捉上文和下文的信息让模型对当前词的理解更全面。3.2 核心设计思路与结构BiLSTM 的全称是双向长短期记忆网络它的结构其实特别简单就是把两个方向完全相反的 LSTM 拼接在一起一个是正向 LSTM和普通 LSTM 一样从序列的第一个词处理到最后一个词捕捉上文的信息一个是反向 LSTM反过来从序列的最后一个词处理到第一个词捕捉下文的信息。每个时刻的最终隐藏状态就是正向 LSTM 的隐藏状态和反向 LSTM 的隐藏状态拼接在一起的结果这样一来这个隐藏状态就同时包含了当前词的上文和下文信息对文本的理解自然更精准。3.3 算法细节与数学表达BiLSTM 的核心计算逻辑和 LSTM 完全一致只是多了反向的计算最终做了一次拼接公式非常简洁正向 LSTM 计算输入序列x1​,x2​,...,xT​得到每个时刻的正向隐藏状态正向h_t​​计算方式和上文的 LSTM 完全一致反向 LSTM 计算输入序列xT​,xT−1​,...,x1​得到每个时刻的反向隐藏状态反向h_t​​计算逻辑和 LSTM 一致只是输入顺序反过来最终隐藏状态拼接BiLSTM 在 t 时刻的最终隐藏状态是两个方向的隐藏状态在维度上拼接拼接之后隐藏状态的维度变成了 2hh 是单个 LSTM 的隐藏层维度对应的输出权重矩阵W_hy​的维度也会变成o×2h输出计算逻辑保持不变。这里也要提醒一下BiLSTM 不是万能的它有明确的适用场景如果是能拿到完整序列的任务比如文本分类、命名实体识别、机器翻译、关系抽取用 BiLSTM 的效果会远好于单向 LSTM但如果是实时任务比如实时语音识别、流式文本生成没法提前拿到完整的序列就不能用 BiLSTM只能用单向的 LSTM。四、模型总结与学习感悟啃完这三个模型我最大的感受就是深度学习的模型设计从来都不是凭空造出来的都是针对上一代模型的痛点一步步优化、迭代出来的每一步设计都有明确的目的搞懂 “为什么这么设计”远比死记硬背公式有用得多。最后我也用最简单的话把三个模型的核心定位和适用场景做个总结帮大家理清它们的关系RNN序列模型的基础解决了传统网络无法处理序列数据的核心问题但存在长程依赖缺陷仅适合短序列任务LSTM通过门控机制和细胞状态彻底解决了 RNN 的长程依赖问题是处理长序列任务的核心模型适配文本生成、长文本分类等场景BiLSTM在 LSTM 的基础上补充了反向序列的信息能同时捕捉上下文语义是绝大多数 NLP 理解类任务的首选基础模型。这篇博客里的内容都是我翻教材、查看论文、推导公式之后的理解。如果有哪里理解得不对也欢迎大家在评论区指正交流。

更多文章