惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

美团技术团队
D
DataBreaches.Net
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
D
Docker
N
Netflix TechBlog - Medium
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
C
Check Point Blog
腾讯CDC
Stack Overflow Blog
Stack Overflow Blog
V
Visual Studio Blog
IT之家
IT之家
月光博客
月光博客
U
Unit 42
K
Kaspersky official blog
T
Threatpost
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
GbyAI
GbyAI
P
Proofpoint News Feed
Last Week in AI
Last Week in AI
云风的 BLOG
云风的 BLOG
酷 壳 – CoolShell
酷 壳 – CoolShell
I
InfoQ
Engineering at Meta
Engineering at Meta
Recorded Future
Recorded Future
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
S
Security @ Cisco Blogs
MyScale Blog
MyScale Blog
大猫的无限游戏
大猫的无限游戏
Security Archives - TechRepublic
Security Archives - TechRepublic
Webroot Blog
Webroot Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Hacker News - Newest:
Hacker News - Newest: "LLM"
S
Schneier on Security
S
Secure Thoughts
The Register - Security
The Register - Security
B
Blog RSS Feed
The Last Watchdog
The Last Watchdog
P
Palo Alto Networks Blog
爱范儿
爱范儿
B
Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
N
News and Events Feed by Topic
阮一峰的网络日志
阮一峰的网络日志
L
LINUX DO - 热门话题
C
Cisco Blogs
Spread Privacy
Spread Privacy
F
Full Disclosure
博客园 - 聂微东
T
The Blog of Author Tim Ferriss

Longlong's Blog

由Sinusoidal位置编码到RoPE - Longlong's Blog LoRA小结 - Longlong's Blog GPT3与ChatGPT有什么不同?——RLHF技术小结 - Longlong's Blog Bert源码解读(HuggingFace Transformers源码) - Longlong's Blog The Annotated Transformer学习笔记(Transformer的pytorch实现)(下) - Longlong's Blog The Annotated Transformer学习笔记(Transformer的pytorch实现)(上) - Longlong's Blog Transformer小结 - Longlong's Blog 基于encoder-decoder架构的注意力机制 - Longlong's Blog Seq2Seq模型与encoder-decoder架构(附代码实现一个小小demo) - Longlong's Blog
LSTM小结 - Longlong's Blog
Longlong · 2025-09-04 · via Longlong's Blog

本文最后更新于 284 天前,其中的信息可能已经有所发展或是发生改变。

    LSTM的全名是:Long Short-term Memory(LSTM),即长 短时记忆神经网络。我们知道LSTM是一种特殊的RNN,那他相较于RNN改进在哪里?
首先从名字开始剖析:什么是什么记忆?,实际上就是我们RNN中的隐藏层,隐藏层的值是会随着时间不断更新的,隐层当前时刻的值会根据当前时刻的输入和上一时刻的隐层值进行更新,也就是考虑了上一时刻的"记忆"。那么到最后的时刻时,隐藏层就已经存储了从第一个时刻开始到最后时刻的所有记忆,所以RNN就是一个Long term Memory,他是一个长时网络,也就是长期依赖的关系。理论上任何一个时刻的隐层都与他之前所有时刻的隐层相关。都能包含前面的信息,那这样的话,RNN是有能力处理一个非常长的序列的,但事实真是如此吗?事实上,RNN在处理一个长序列问题时,这时隐层非常长的时候,RNN的效果是非常差的,实验表明,RNN很难学习到序列中两个相差较远的元素的关系。即无法处理长期依赖关系。导致RNN无法处理长期依赖关系的主要原因(还有其他原因)就是因为RNN很容易就梯度消失了。因为随着时刻的增长,在反向传播过程中,后面时刻的参数的偏导式会越来越长。除了容易梯度消失,RNN也容易梯度爆炸。

RNN的梯度——消失?还是爆炸?

20250803213141


    对于如上网络结构,RNN的各个参数梯度通项式如下:
90af091eec7797e29beaf95b863dbc5

    我们会发现有一个随着t增加,连乘项会不断增多的式子,当该连乘项小于一时,远距离的梯度就会容易消失,导致梯度被近距离梯度主导,导致模型难以学到远距离的依赖关系,当该连乘项大于一时,当步数多了,就会导致梯度爆炸。
如何缓解这些问题?LSTM就登场了

LSTM的网络结构

20250806222851
20250806222851

    其中函数。

    他相比传统RNN多了一条线路,隐藏层中除了原本的,还多了一个,叫做cell state,即细胞态,是用来保存跨越了很长时间的一依赖关系。而对记忆细胞修改操作是通过**门(gates)**来控制的。门就像一个水阀,来控制着信息怎么流过细胞,怎么流到下一个隐藏层.
    LSTM中引入了三个门,分别是输入门、遗忘门、输出门,来决定新输入中有多少信息应该被写入记忆细胞、以及当前记忆细胞中应该有多少内容被遗忘掉。
    首先遗忘门、输入门、输出门的定义方式都是一样的,和RNN中的那个式子相同,都是当前时刻的输入与上一时刻的线性相加,只是外边套着一层函数有所不同,使用了函数
三个门的定义如下:

为啥要用函数?
    这就要讲到门的作用了。上边说到,门就像一个水阀,用来控制信息的流动,那么最主要的就是控制信息流过去多少,那么就需要将这个值映射到(0,1)之间,之后这些门会和上一时刻中的细胞去处理,表示多少信息通过,接近1就是完全放行,接近0表示几乎关掉这条通路

    而这三个门的定义方式一样,但名字不同是因为控制的信息流动方向和作用不同,而且这三个门的权重矩阵也是不共享的,在反向传播更新权重的时候,他们的权重值都是独立更新的。

遗忘门

    这里是将两个线性变换的参数矩阵拼接到了一起,然后将拼接到了一起,再进行相乘。和上边的分别线性变换再相加本质上是一样的,之前在RNN的文章中也推导了这个拼接与不拼接,结果是一样的。

    我们先追踪遗忘门在定义之后,去干了什么。他向上走,与上一时刻的细胞进行了一个相乘。上边我们知道,遗忘门是被映射到(0,1)的,所以他与上一时刻中的细胞相乘,就可以决定上一时刻的细胞信息()有多少可以流动过来,也就是决定了上一时刻的信息遗忘了多少。

输入门

    接着追踪输入门去干什么了。可以看到,输入门是和另一个叫做候选记忆的输入相乘,这个候选记忆是什么呢?

这不就是之前我们RNN中的那个信息传递公式嘛。
在RNN中:

    可以说是一模一样了。在RNN中,下一层的隐藏层的信息就直接等于这个上一层的与当前输入的线性变换。就是下一时刻的新信息,而在LSTM中,我们不想这么草率,所以先将这个新信息先存起来,叫做,之后它与输入门相乘,得到一个值。
    之后这个值会和经过遗忘门的的细胞进行直接的一个相加,得到一个值,这个值后边有一个分支是直接成为了下一时刻的细胞
    此时,输入门的作用就很明显了。决定原本的输入的信息有多少写入到记忆细胞中。记忆细胞经过遗忘、以及写入新的信息,得到了下一时刻的记忆细胞

记忆细胞的更新

即:

    上边也刚讲到了。就是上一时刻的记忆细胞经过遗忘门。再与原本输入信息经过输出门的信息相加,即下一时刻的细胞信息

输出门

    顺着输出门走,他去干什么了?他去和原本的输出细胞进行相乘,但是这个输出细胞还套了一个函数。之后就得到下一时刻的隐藏状态输出了。

所以输出门的作用就是:输出门控制着需要从记忆细胞中提取多少内容来输出到下一时刻的隐藏状态

关于tanh函数的使用(缓解梯度爆炸)

    在生成候选细胞的时候,使用的是函数,而候选细胞的意义我们可以理解为原本的输出信息(因为RNN中候选细胞即是下一时刻的输出)。然后再生成真正下一时刻隐藏状态的时候也使用了函数。
函数的公式如下:

他的作用是将数据压缩到(-1,1),更适合表达有方向的数值信息(正负含义,比如“增加”或“减少”记忆)。能够代表输入和之前状态组合的各种可能性
如果候选记忆和隐藏状态也用 ,所有值都只能是正的,信息表示能力会受限。

这里还有个问题
输入门和输出门的作用对象,他们在通过输入门和输出门之前,都要加一个tanh,为啥遗忘门的作用对象通过遗忘门之前不用加?
输入门的作用对象是候选细胞,而候选细胞的定义就带有,输出门的作用对象是,他在经过输出门的时候,也需要套一个函数。
但为什么遗忘门的作用对象,,他在经过遗忘门的时候,就直接和遗忘门相乘,而不是先套一个tanh函数。对此问题,目前还是有些不太拿得准。 问了GPT,他的回答有一定道理:
20250809135032

20250809135102
20250809135102

以上是多个维度的解读,我还有一种理解为,tanh函数是继承于RNN的,在RNN中,是由上一时刻的以及当前时刻的的线性组合,再套了一个函数组成的。RNN中为什么要用这个函数而不是

文章开头提到:

20250803213141


    对于如上网络结构,RNN的各个参数梯度通项式如下:

90af091eec7797e29beaf95b863dbc5


梯度消失或者爆炸主要取决于这个连乘项,而对于每一时刻,该连乘项的每一项即为:

又因为:

其中是sigmoid函数
推导如下:

8fb83bdb5aa68ab9177b4956a9023967


5a2c59130210235710b55587c4c1315f

所以

很大的时候,会接近于1或者-1(因为,那么就会接近0,他与相乘,反而就没那么大。事实上可以证明:不管取什么值,都不超过一个固定的常数。

所以这就是为什么用而不用的原因,本身就是可以缓解梯度爆炸的。

LSTM是如何缓解RNN的梯度消失问题的?

    上文提到,在RNN中,主要引起梯度爆炸或者消失的就是。而在LSTM中,我们可以看到是由决定的,而是由决定的,但是也是由决定的,所以,我们可以将转换为分析


因为

注意到:第二项:

推导如下:
cba307c469d1c89503cd1f9871f0804c

    又因为都介于(0,1)之间,并且我们可以证明(具体怎么证明这里就不说了) 总之这三个值都肯定小于1。那么经过这么三个介于(0,1)的值的相乘,那么他最终一定是非常非常小了,直逼近0(前提是初始化的不太糟糕。)
那么第二项就基本为0了。

同理。第三项,第四项,也是一样:

    具体推导过程和上边一样,也是将代入之后求导。
所以第二项、第三项、第四项都是一个很小的数,接近于0。
    哪的到这个结论可以干什么呢?

得到这个结论,我们就可以认为近似等于,他的值由决定。当接近1时,那也就接近1,那么就不容易梯度消失,正符合我们意。当接近0时候,那也就接近0,但是遗忘门,含义是决定上一时刻的细胞信息()有多少可以流动过来,也就是决定了上一时刻的信息遗忘了多少。接近0时,那就说明几乎没怎么遗忘。那我们就不依赖于历史的信息,那梯度消失也没有关系了。因为RNN的梯度消失是指远距离的梯度容易消失,导致梯度被近距离梯度主导,导致模型难以学到远距离的依赖关系。所以当我们的细胞几乎没有遗忘信息,那么也不用在意远距离的梯度会不会消失了。这就很妙了,不管是接近于1还是接近于0,我们都不会太怕了。

关于LSTM是如何缓解RNN的,找了很多文章以及视频,最终有一篇文章我认为逻辑非常好,并且我这个博客的这个部分也是参考他的:
https://kexue.fm/archives/7888

torch.nn.LSTM

通读官方文档

20250904181040


通俗易懂,不在逐字翻译
    需要注意的是⊙表示Hadamard product,表示矩阵每一项对应相乘,而不是矩阵乘法。因为三个门的作用就是控制信息流动多少过去。

20250904181414


    关于proj_size参数,该参数是唯一比RNN多的一个参数。果不其然,他是2014年的一篇论文提出来的,叫做LSTMP,是:带投影层的LSTM。论文名称为:Long Short-Term Memory Recurrent Neural Network Architectures for Large Scale Acoustic Modeling。
首先翻译一下官方文档:
    如果,proj_size>0,(specified指明确的),带有投影的LSTM将会被使用(projections指投影),这将会使LSTM的cell遵从接下来的规则. 首先,的维度会被改变,从hidden_size变成:proj_size(的维度也会随着它改变)。其次,每一层的隐藏层输出会被乘以一个可学习的投影矩阵:,注意,LSTM的output会因此变的不一样,请参阅以下的输入输出变量来获取所有变量的确切维度。你可以从此篇论文中看到更多细节:https://arxiv.org/abs/1402.1128.
    这个参数主要就是对每一层的进行了一些加工,每一层的输出之后会乘以一个可学习的投影矩阵,该矩阵会将压缩到proj_size大小。再传给下一层。
至于为什么要这么压缩一下,ChatGPT的回答是这样的:

20250904200728


20250904202011

然后LSTM的其他参数和RNN的就都一样了。

LSTM的输入输出。

20250904202850
20250904202850

20250904202953


20250904203005

其实就是比RNN多了一个cell的输入。 其他基本都一样。

总结

    本文主要先从RNN开始,叙述了RNN的缺陷,为什么RNN会容易梯度消失?之后引出LSTM,介绍了LSTM的网络结构,之后就LSTM是如何缓解RNN的缺陷的进行了叙述,最终读了一下pytorch的官方文档。了解了一下每个参数,由于LSTM是RNN的变种,所以基本都一样。本文仅是作者在学习过程中的学记笔记,如有错误,请多多包涵。