自然语言处理基础 04|长短期记忆网络 LSTM

目录

摘要

[一、LSTM 解决什么问题?](#一、LSTM 解决什么问题?)

[二、LSTM 的结构与原理](#二、LSTM 的结构与原理)

[三、LSTM API 介绍](#三、LSTM API 介绍)

四、代码Demo

[五、LSTM 优点与缺点](#五、LSTM 优点与缺点)


摘要

基础 RNN 在处理长句子时,随着序列不断向后递推,早期的信息会慢慢丢失,发生梯度消失,无法记住远距离上下文。GRU 通过双门机制改善了这个问题,而 LSTM(Long Short-Term Memory,长短期记忆网络)进一步优化记忆保存机制,新增细胞状态专门用来长期存储信息,对长序列信息的保留能力更强。

LSTM 同样沿用 RNN 逐时间步读取序列、参数共享的基础框架,依靠三组门控,精细控制信息流入、流出细胞状态,解决长文本信息遗忘的问题。

**一、**LSTM 解决什么问题?

回顾基础 RNN 的痛点:当句子很长,前面的信息经过一次次传递,不断被覆盖,读到句子末尾时,很容易忘记句子开头的内容。

|---------------------------------------------------------------|
| "今天天气很好,阳光明媚,微风不燥,适合出门去公园散步,公园里花开了,五颜六色非常好看,我打算带上相机记录这美好的景色。" |

基础 RNN 读到最后 "记录这美好的景色" 时,很容易丢失开头「今天天气很好」的关键信息。GRU 有一定改善,但 LSTM 设计了独立的记忆通道,能把重要信息跨很多时间步传递下去,减少信息丢失。

LSTM 依靠输入门、遗忘门、输出门三个门控,搭配独立细胞状态,精细控制记忆的留存与丢弃。

**二、**LSTM 的结构与原理

LSTM 引入两条状态:

  1. 隐藏状态 :对外输出的短时记忆,用于当前时间步的预测;
  2. 细胞状态 :长记忆传送带,负责长期保存上下文信息,信息传递过程改动很小。

三个门控作用:

  • 遗忘门( Forget Gate ) :决定丢弃细胞状态里哪些旧记忆;
  • 输入门( Input Gate ) :决定哪些新信息存入细胞状态;
  • 输出门( Output Gate ) :决定细胞状态里哪些信息输出到隐藏状态。

**1.**逐时间步计算公式

输入:当前时间步词嵌入 ,上一步隐藏状态 ,上一步细胞状态 。  遗忘门

  输入门

  候选细胞状态

  更新细胞状态

  输出门

  当前隐藏状态

  • :sigmoid 激活,输出 0~1,1 代表开门保留信息,0 代表关门丢弃信息;
  • :哈达玛积,对应元素相乘。

门含义通俗解释

1. 遗忘门

控制旧记忆保留多少。ft 接近 0,丢弃上一步细胞状态里的信息;ft 接近 1,保留原有记忆。比如句子语义切换,就可以通过遗忘门清空过时信息。

2. 输入门

控制当前新信息多大程度写入细胞状态。it 接近 1,把候选状态 c ~t 的新内容存入长记忆。

3. 输出门

控制细胞状态的内容有多少输出到隐藏状态 ht ,决定这一步对外暴露哪些记忆。

|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 核心特性:所有时间步共享同一套权重 。权重是学习到的记忆控制规则;细胞状态 ct 、隐藏状态 ht 共同存储句子上下文。 |

2.**初始化 、**

和 RNN、GRU 保持一致:每个新句子都要单独初始化 h0 、 c0 (零向量),不同句子记忆互相隔离,互不干扰。

句子全部读取完成后,最后时间步隐藏状态 hT 压缩整句上下文信息,可以送入 MLP 完成分类任务。

**三、**LSTM API 介绍

完整构造签名:

python 复制代码
torch.nn.LSTM(input_size, hidden_size, num_layers=1, bias=True,
              batch_first=False, dropout=0.0, bidirectional=False)

|-------------------------|-------------------------------------------------|-------------------------|
| 参数 | 含义 | 文档例子取值 |
| input_size(embed_dim) | 每个时间步输入向量维度,词嵌入维度 | 8:单个词为 8 维向量 |
| hidden_size(hidden_dim) | 隐藏状态维度,记忆容量 | 16 |
| batch_first=True | 批量放第一维,输入 shape 变为 (batch, seq_len, input_size) | True,和 Embedding 输出直接对接 |

|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 输出说明: * output:(batch, seq_len, hidden_dim),保存每一个时间步的隐状态 * (h_n, c_n):元组,hn 是最后一层最后时间步隐藏状态,cn 是最后一层最后时间步细胞状态 |

每个时间步隐藏状态维度固定 = hidden_dim=16;输入词嵌入 xt 依旧是 8 维。

四、代码Demo

python 复制代码
import torch
import torch.nn as nn

class LSTMClassifier(nn.Module):
    def __init__(self, vocab_size, embed_dim, hidden_dim, num_classes):
        super().__init__()
        self.embedding = nn.Embedding(vocab_size, embed_dim)
        # LSTM 层
        self.lstm = nn.LSTM(embed_dim, hidden_dim, batch_first=True)
        self.fc = nn.Linear(hidden_dim, num_classes)

    def forward(self, x):
        # x: (batch, seq_len) 词索引
        emb = self.embedding(x)                # (batch, seq_len, embed_dim)
        output, (h_n, c_n) = self.lstm(emb)    # output: (batch, seq_len, hidden_dim)
        h_last = h_n[-1]                       # 取最后一层隐状态 (batch, hidden_dim)
        logits = self.fc(h_last)               # (batch, num_classes)
        return logits

# 测试
vocab_size, embed_dim, hidden_dim, num_classes = 20, 8, 16, 2
model = LSTMClassifier(vocab_size, embed_dim, hidden_dim, num_classes)
x = torch.tensor([[1, 2, 3, 4],
                  [5, 6, 7, 8]])
logits = model(x)
print(logits.shape)  # torch.Size([2, 2])

五、LSTM 优点与缺点

优点:

  1. 独立细胞状态作为长期记忆通道,大幅缓解基础 RNN 梯度消失问题,长序列场景保留远距离上下文的能力强很多;
  2. 三组门控精细管理记忆,信息的保留、丢弃、输出分开控制,记忆管理更灵活;
  3. 保留 RNN 核心特性:所有时间步参数共享,支持变长序列输入;
  4. 训练稳定性优于基础 RNN,长句子训练时梯度衰减更缓慢。

缺点:

  1. 和基础 RNN 一样,逐时间步串行计算,序列不能并行处理;
  2. 相比基础 RNN,门控数量更多,参数量更大,内存占用更高;
  3. 单时间步运算逻辑更复杂,前向计算耗时高于基础 RNN;
  4. 极长序列场景下,远距离信息仍会缓慢衰减,无法永久保存全部历史信息。

|-------------------------------------------------------------------|
| 对比小结:基础 RNN 最简单、参数量最小;LSTM 增加细胞状态与三组门控,以更高计算开销为代价,显著提升长距离上下文记忆能力。 |

**六、**LSTM 和基础 RNN 简单对比

|--------|--------------------------|----------|----------|-----|
| 模型 | 核心机制 | 长距离依赖 | 训练难度 | 参数量 |
| 基础 RNN | 直接递推更新隐状态 | 差,容易梯度消失 | 难,长序列不稳定 | 少 |
| LSTM | 遗忘门 + 输入门 + 输出门,细胞状态长期记忆 | 大幅改善 | 更稳定 | 较多 |

**七、**LSTM 和 GRU 的区别

|-----------------------------------------------|
| 两者都是带门控的循环模型,都解决基础 RNN 梯度消失问题,核心差异在记忆结构和门控设计。 |

**1.**记忆状态

  • LSTM :两套状态,细胞状态 (长期记忆传送带)+ 隐藏状态 (对外短时输出)。长期记忆单独一条通道,改动很小,远距离信息更容易保留。
  • GRU :只有一套隐藏状态 ,把 LSTM 的细胞状态合并进隐状态,不再单独维护长记忆通道。

**2.**门控数量与作用

  • LSTM:3 个门 ------ 遗忘门、输入门、输出门。遗忘门控制丢弃旧记忆,输入门控制写入新记忆,输出门控制记忆对外输出,记忆的删、写、读分开控制。
  • GRU:2 个门 ------ 重置门、更新门。更新门同时承担 LSTM 遗忘门 + 输入门的功能;重置门控制计算新候选状态时参考多少历史信息,没有单独的输出门。

**3.**参数量与计算

  • GRU 门更少、状态向量更少,参数量更少,训练速度更快,内存开销更小。
  • LSTM 门控更多、权重矩阵更多,参数量更大,单步计算更慢,但信息管控更精细。

**4.**效果与适用场景

  • 普通长度文本任务:两者效果很接近。
  • 很长的序列任务:LSTM 独立细胞状态的优势体现,更容易保留远距离上下文信息。
  • 算力有限、需要快速训练:优先 GRU,以更小开销拿到接近的效果。
相关推荐
2601_965305391 小时前
地质滑坡位移监测选GNSS还是裂缝计?从量程、精度到组网讲透
人工智能
武雄(小星Ai)1 小时前
端侧 Agent 模型新选择:LFM2.5-24B-A2B 上手实录,2B 激活参数凭什么打 35B
人工智能·深度学习·大模型
DongQiShanRen1 小时前
六根硬件映射(中):双站校验、生克闭环与驱动接口
数据库·人工智能·算法·rust·哈希算法·集成学习
飞猫的边缘AI1 小时前
京东工业发布,工业世界模型!
人工智能·边缘ai·工业ai·工业世界模型·工业边缘计算
lambo mercy1 小时前
Day4:流式传输
运维·服务器·网络
数据猿视觉1 小时前
苹果HomeView正式发布:面向全家的AI智能家居中控终端
人工智能·智能家居
wespaul1 小时前
VeapAI 自然语言操作实战|第 09 篇:收尾——六条原则与三条演进线
大数据·数据库·人工智能
HIT_Weston1 小时前
254、【AI】【模型部署】基座模型研究:对称性统一视角——等变、不变与归纳偏置
人工智能
Kainy1 小时前
Rust重写Photoshop开源项目PhotoCraft:无头命令行修图与AI Agent自动化实战
人工智能·rust·photoshop