news 2026/9/30 8:34:49

【老计带你懂AI算法】15:RNN与LSTM,让神经网络拥有记忆的序列高手

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【老计带你懂AI算法】15:RNN与LSTM,让神经网络拥有记忆的序列高手

【老计带你懂AI算法】15:RNN与LSTM,让神经网络拥有记忆的序列高手

开头:有些数据,顺序就是一切

上一篇的CNN擅长处理图像,图像的关键是空间结构。可还有一大类数据,它的关键不在空间,而在顺序和前后依赖。

一句话,“我今天没吃饭现在很饿”,词的顺序变了意思就乱了;一段语音,是一个接一个的声音片段;一串股价、一段传感器读数,前后紧密相关。这类数据叫序列数据,它的意义很大程度上藏在元素的先后顺序和前后关联里。处理它们,上一篇那种"一锤子买卖"的网络就不合适了,因为普通网络没有记忆,它处理当前输入时,完全不记得前面看过什么。

这一篇讲专门处理序列、天生带记忆的网络,RNN(循环神经网络)和它的两个重要升级版LSTM、GRU。第11篇讲时序时我们已经预告过它们,这篇把原理彻底讲透,也为下一个时代的主角埋好伏笔。

RNN:一个边读边记的网络

RNN的核心思想,用一句话概括:它一个一个地按顺序读入序列元素,每读一个,就更新一下自己脑子里的记忆,并把这份记忆带到下一步。

普通网络是输入进去、输出出来,中间没有记忆。RNN多了一样东西,叫隐藏状态,你可以把它理解成网络的"记忆"或"笔记本"。它的工作方式是:

  • 读入序列第一个元素,结合当前的记忆(一开始是空白),产生一个输出,同时更新记忆。
  • 读入第二个元素,结合刚才更新的记忆,再产生输出、再更新记忆。
  • 就这样一个接一个往下读,记忆像滚雪球一样,把前面看过的信息一路累积、传递下去。

打个比方:你读一本小说,读到第十章时脑子里记着前九章的剧情,正是这份记忆让你能读懂第十章。你不是孤立地看第十章的字,而是带着前面的记忆在理解。RNN就是模拟这种"边读边记、用记忆理解当下"的过程。

正因为有了这份能沿着序列传递的记忆,RNN天生适合处理语言、语音、时序这类前后有依赖的数据。这是它相比普通网络的根本突破。

RNN的毛病:记性太差,前面的忘光了

RNN听起来很美,但它有个严重的毛病,记性差,序列一长就把前面的信息忘光了。术语叫长期依赖问题。

为什么会健忘?因为记忆是一步步传递的,每传一步都会稀释一点。序列短还好,序列一长,等传到后面,最前面的信息早就被冲淡得几乎没了。

举个例子:“我在法国的乡下长大,那里的生活很惬意……(中间隔了一大段)……所以我能说一口流利的___。”要填"法语",得依赖开头"法国"这个信息。可这两处隔得太远,普通RNN传到填空处时,早把开头的"法国"忘了,只能瞎猜。这就是长期依赖没抓住。

这个健忘的毛病,让普通RNN在实际中用处大打折扣,尤其处理长序列时。于是有了它的升级版,LSTM。

LSTM:用几道门,学会该记什么该忘什么

LSTM(长短期记忆网络)是RNN的经典升级版,专门治健忘。它的核心创新,是给网络加了几道门,让网络能主动决定信息的去留,而不是被动地稀释记忆。

你不用记具体的数学,抓住这几道门在干嘛就行,它们特别符合直觉:

  • 遗忘门:决定把旧记忆里哪些该丢掉。(比如读到一个新句子的主语,可以把上个句子的主语忘了。)
  • 输入门:决定当前这个新信息里,哪些值得记进记忆。
  • 输出门:决定基于当前的记忆,输出什么。

除了这几道门,LSTM还维护了一条专门的记忆传送带(叫细胞状态),重要的信息可以在这条传送带上一路畅通地传很远,中途较少被稀释。这就是LSTM治健忘的关键,重要信息走专用传送带长距离保存,加上几道门精细地控制记什么忘什么,长期依赖问题就大大缓解了。

打个比方:普通RNN像一个记性差的人,听到啥都往脑子里塞、旧的很快被挤掉;LSTM像一个会记笔记的聪明人,他有个专门的笔记本(传送带)记关键信息,还会判断哪些新信息值得记下、哪些旧笔记可以划掉、当下该说什么参考哪些笔记,所以他能记住很久以前的关键内容。前面法语的例子,LSTM就能把"法国"这个关键信息记在传送带上,一直带到填空处。

还有个叫GRU的变体,思路和LSTM一样,但把门简化了(合并成两道门),更轻量、训练更快,效果和LSTM常常相当,实际中两者都常用。

从RNN到注意力:一个重要的过渡

这里插一段承前启后的内容,它是理解下一个时代的钥匙。用RNN做机器翻译这类"序列到序列"任务时,人们发现一个瓶颈。传统做法是,让一个RNN(编码器)把整个输入句子读完,压缩成一个固定长度的记忆向量,再让另一个RNN(解码器)根据这个向量吐出翻译。问题是,把一整句话的全部信息,硬塞进一个固定大小的向量里,句子一长就塞不下、信息严重损失,就像让你读完一整段话后只准记一句话的容量,再复述出来,长了肯定丢三落四。

为了解决这个瓶颈,研究者提出了一个绝妙的想法,注意力机制。它的思路是:解码器在生成每一个词的时候,不再只依赖那个被压缩的固定向量,而是可以回头去看输入句子的所有部分,并把注意力重点放在当前最相关的那几个词上。比如翻译到"苹果"时,注意力就聚焦在原文的apple那个词上。

打个比方,这就像你做翻译,不会读完全文后凭一个模糊印象硬翻,而是翻到哪句就回头看原文对应的那句,重点看、精准译。注意力机制让模型能动态地按需取用输入信息,一下子突破了固定向量的瓶颈,翻译质量大幅提升。而正是这个注意力机制,后来被发扬光大、单独拎出来当主角,催生了彻底改变AI的Transformer,这是后话,第20篇会重点讲。你现在只要记住,注意力这个革命性的想法,最初是为了给RNN解决记不住长句子的毛病而生的。

输入和输出长什么样

RNN家族的一个大优点是输入输出形式灵活,能应对多种序列任务:

  • 多对一:输入一个序列,输出一个结果。如情感分析(输入一句话,输出正面还是负面)。
  • 多对多(等长):输入序列,输出等长序列。如给每个词标注词性。
  • 多对多(不等长):输入一个序列,输出另一个序列。如机器翻译(输入中文句子,输出英文句子),这种叫序列到序列。

输入是按顺序排列的元素(词、字、时间点的数值等,词通常先转成向量),输出看具体任务。

上代码:用LSTM做一个序列分类

用PyTorch搭一个LSTM。输入:一段序列。输出:分类结果。这里演示判断一段数字序列整体是上升还是下降趋势。

# 依赖:pip install torchimporttorchimporttorch.nnasnn# 造数据:上升序列(标签1)和下降序列(标签0),每条长度10defmake_data(n=500):X,y=[],[]for_inrange(n):start=torch.rand(1).item()iftorch.rand(1).item()>0.5:seq=torch.linspace(start,start+1,10)+torch.randn(10)*0.05# 上升label=1else:seq=torch.linspace(start,start-1,10)+torch.randn(10)*0.05# 下降label=0X.append(seq);y.append(label)returntorch.stack(X).unsqueeze(-1),torch.tensor(y,dtype=torch.float32)# (n,10,1)X,y=make_data()classLSTMClassifier(nn.Module):def__init__(self):super().__init__()self.lstm=nn.LSTM(input_size=1,hidden_size=16,batch_first=True)# LSTM层self.fc=nn.Linear(16,1)defforward(self,x):out,(h,c)=self.lstm(x)# out是每一步的输出, h是最后的记忆returntorch.sigmoid(self.fc(h[-1]))# 用最后的记忆做分类model=LSTMClassifier()loss_fn=nn.BCELoss()optimizer=torch.optim.Adam(model.parameters(),lr=0.01)forepochinrange(30):pred=model(X).squeeze()loss=loss_fn(pred,y)optimizer.zero_grad();loss.backward();optimizer.step()# 反向传播四步if(epoch+1)%10==0:acc=((pred>0.5).float()==y).float().mean()print(f"第{epoch+1}轮 损失{loss.item():.3f}准确率{acc.item():.3f}")

运行输出(示例,训练有随机性,数值每次不同):

第10轮 损失0.412 准确率0.902 第20轮 损失0.198 准确率0.976 第30轮 损失0.107 准确率0.994

运行你会看到准确率快速升高。核心是nn.LSTM那一层,它按顺序读入序列的每个数值、维护记忆,最后用积累的记忆(h)判断整体趋势。训练还是熟悉的反向传播四步,说明LSTM也只是一种特殊的网络层,学习机制不变。

关键概念

  • hidden_size(隐藏状态大小):记忆的容量,越大能记的越多也越重。
  • 序列长度:一次处理多长的序列,太长普通RNN扛不住、LSTM也有极限。
  • 双向RNN:让网络既从前往后读、也从后往前读,综合两个方向的信息,很多任务上更强。
  • 梯度消失和梯度爆炸:RNN训练时容易出现的问题,LSTM的门机制正是为缓解梯度消失而设计。

优缺点与适用场景

优点:天生处理序列、有记忆、能捕捉前后依赖,LSTM/GRU还解决了长期依赖;输入输出形式灵活。缺点:必须一步步顺序计算,没法并行,训练慢;序列特别长时依然吃力;这两点正是后来Transformer要革它命的地方。

适合场景:中等长度的序列任务(文本分类、时序预测、语音识别、简单的翻译)、数据量和序列长度适中的场景。不适合:超长序列、追求极致效果和训练速度的大规模任务,那些如今是Transformer的天下。

要特别说明它今天的定位:在Transformer出现后,RNN/LSTM在很多前沿任务(尤其大规模的NLP)上已被取代。但它们作为序列建模的经典思想,是理解Transformer的重要台阶(Transformer正是为了解决RNN不能并行、长依赖难抓这两个痛点而生),而且在一些轻量、资源受限或序列不长的场景,LSTM/GRU依然实用。

小结与承上启下

  • RNN:边读边记,用能沿序列传递的隐藏状态(记忆)处理前后有依赖的序列数据。
  • 健忘毛病:记忆一步步传递会被稀释,序列长了忘掉前面的(长期依赖问题)。
  • LSTM/GRU:用遗忘门、输入门、输出门加一条记忆传送带,主动决定记什么忘什么,治好健忘。
  • 定位:序列建模经典,被Transformer取代但仍是理解它的重要台阶,轻量和资源受限场景仍然实用。

RNN家族有个绕不开的硬伤,必须一步步顺序算、没法并行,序列一长又慢又难。有没有办法让网络一眼看全整个序列、还能并行加速?这个问题的答案,掀起了整个AI的新时代。但在讲那个划时代的Transformer之前,我们先看一类处理特殊结构数据的网络。下一篇讲GNN图神经网络,看它怎么处理社交网络、分子结构这种网状数据。

我们下一篇见。

延伸阅读

  • PyTorch 官方文档:循环层(RNN、LSTM、GRU):https://pytorch.org/docs/stable/nn.html
  • 理解LSTM网络(Understanding LSTM Networks,Christopher Olah,经典图解博文):https://colah.github.io/posts/2015-08-Understanding-LSTMs/

(说明:以上为官方与经典公开资料地址,可能随版本调整,如打不开可用标题搜索。)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/30 8:34:11

DeepSeek-R1+LoRA微调实战:低成本构建智能病历分析系统

简介:这份PDF资料面向医疗AI工程师、数据工程师与技术决策者,围绕DeepSeek-R1在智能病历分析场景中的低成本落地路径展开。文档共27页,内容完整且目录清晰,从医疗行业智能病历分析的现状与挑战切入,系统讲解DeepSeek-R…

作者头像 李华
网站建设 2026/9/30 8:33:32

AI工程从零到一:完整链路实践与踩坑指南

1. 从零开始的定位:AI工程到底在解决什么问题很多人看到“AI工程”这四个字,第一反应是“搞算法的”,第二反应是“调模型参数的”。说实话,我两年前也这么想。但真正把一个AI系统从论文里的idea推到线上稳定跑起来之后&#xff0c…

作者头像 李华
网站建设 2026/9/30 8:33:12

花卉种类识别实战:基于ResNet18的迁移学习与训练避坑指南

简介:围绕深度学习模型在花卉种类识别中应用的期刊论文PDF,面向计算机视觉、机器学习方向的研究者、学生及竞赛团队,聚焦解决花卉这类非刚性物体因形态多样而难以自动分类的问题。论文基于ImageNet数据库中的花卉图像样本完成训练与测试&…

作者头像 李华
网站建设 2026/9/30 8:33:02

模型优化器实战:算子融合、量化与TensorRT部署调优指南

1. 模型优化器到底在解决什么问题 第一次接触 Model-Optimizer 这个概念,是在一个推荐系统的排序模型上。当时线上推理延迟卡在 120ms 下不去,GPU 利用率却只有 30% 出头,显存倒是先爆了。排查了一圈发现,模型本身参数量并不夸张&…

作者头像 李华
网站建设 2026/9/30 8:31:52

模板代码调试技巧:从双层结构到分层验证,快速定位渲染异常

搞模板渲染的开发,谁没被模板代码坑过?数据明明没问题,页面就是渲染不出来;语法看着没问题,编译就是报错;本地测得好好的,上了生产就白屏。很多朋友一遇到模板代码报错就开始慌,觉得…

作者头像 李华