如何从RNN起步,一步一步通俗理解LSTM

如何从RNN起步,一步一步通俗理解LSTM如何从 RNN 起步 一步一步通俗理解 LSTM 前言提到 LSTM 之前学过的同学可能最先想到的是 ChristopherO 的博文 理解 LSTM 网络 这篇文章确实厉害 网上流传也相当之广 而且当你看过了网上很多关于 LSTM 的文章之后 你会发现这篇文章确实经典 不过呢 如果你是第一次看 LSTM 则原文可能会给你带来不少障碍

                             如何从RNN起步,一步一步通俗理解LSTM

前言

提到LSTM,之前学过的同学可能最先想到的是ChristopherOlah的博文《理解LSTM网络》,这篇文章确实厉害,网上流传也相当之广,而且当你看过了网上很多关于LSTM的文章之后,你会发现这篇文章确实经典。不过呢,如果你是第一次看LSTM,则原文可能会给你带来不少障碍:

而我自己就是这么经历过来的,虽然学过了不少模型/算法,但此前对LSTM依然很多不懂,包括一开始反复看ChristopherOlah博文《理解LSTM网络》,好在和我司AI Lab陈博士反复讨论之后,终于通了!

侧面说明,当一个人冥思苦想想不通时,十之八九是因为看的资料不够通俗,如果还是不行,则问人,结果可能瞬间领悟,这便是教育的意义,也是我们做七月在线的巨大价值。

众所周知,我们已经把SVM、CNN、xgboost、LSTM等很多技术,写的/讲的国内最通俗易懂了,接下来,我们要把BERT等技术也写的/讲的国内最通俗易懂,成为入门标准,而且不单单是从NNLM \rightarrow Word2Vec \rightarrow Seq2Seq \rightarrow Seq2Seq with Attention \rightarrow Transformer \rightarrow Elmo \rightarrow GPT \rightarrow BERT,我们希望给所有AI初学者铺路:一步一个台阶,而不是出现理解断层。

本文在ChristopherOlah的博文及@Not_GOD 翻译的译文等文末参考文献的基础上做了大量便于理解的说明/注解(这些说明/注解是在其他文章里不轻易看到的),一切为更好懂。

一、RNN

1.1 从单层网络到经典的RNN结构
在学习LSTM之前,得先学习RNN,而在学习RNN之前,首先要了解一下最基本的单层网络,它的结构如下图所示:

如何从RNN起步,一步一步通俗理解LSTM

如何从RNN起步,一步一步通俗理解LSTM

  1. 自然语言处理问题。x1可以看做是第一个单词,x2可以看做是第二个单词,依次类推。
  2. 语音处理。此时,x1、x2、x3……是每帧的声音信号。
  3. 时间序列问题。例如每天的股票价格等等。

而其中,序列形的数据就不太好用原始的神经网络处理了。

如何从RNN起步,一步一步通俗理解LSTM

  1. 在计算时,每一步使用的参数U、W、b都是一样的,也就是说每个步骤的参数都是共享的,这是RNN的重要特点,一定要牢记;
  2. 而下文马上要看到的LSTM中的权值则不共享,因为它是在两个不同的向量中。而RNN的权值为何共享呢?很简单,因为RNN的权值是在同一个向量中,只是不同时刻而已。

如何从RNN起步,一步一步通俗理解LSTM

如何从RNN起步,一步一步通俗理解LSTM

如何从RNN起步,一步一步通俗理解LSTM

如何从RNN起步,一步一步通俗理解LSTM

OK!大功告成!这就是最经典的RNN结构,是x1, x2, …..xn,输出为y1, y2, …yn,也就是说,输入和输出序列必须要是等长的。

1.2 RNN的应用
人类并不是每时每刻都从一片空白的大脑开始他们的思考。在你阅读这篇文章时候,你都是基于自己已经拥有的对先前所见词的理解来推断当前词的真实含义。我们不会将所有的东西都全部丢弃,然后用空白的大脑进行思考。我们的思想拥有持久性。

传统的神经网络并不能做到这点,看起来也像是一种巨大的弊端。例如,假设你希望对电影中的每个时间点的时间类型进行分类。传统的神经网络应该很难来处理这个问题:使用电影中先前的事件推断后续的事件。循环神经网络RNN解决了这个问题。


通过上文第一节我们已经知道,RNN是包含循环的网络,在这个循环的结构中,每个神经网络的模块如何从RNN起步,一步一步通俗理解LSTM,读取某个输入如何从RNN起步,一步一步通俗理解LSTM,并输出一个值如何从RNN起步,一步一步通俗理解LSTM(注:输出之前由y表示,从此处起,改为隐层输出h表示),然后不断循环。循环可以使得信息可以从当前步传递到下一步。

如何从RNN起步,一步一步通俗理解LSTM

这些循环使得RNN看起来非常神秘。然而,如果你仔细想想,这样也不比一个正常的神经网络难于理解。RNN可以被看做是同一神经网络的多次复制,每个神经网络模块会把消息传递给下一个。所以,如果我们将这个循环展开:

如何从RNN起步,一步一步通俗理解LSTM

链式的特征揭示了RNN本质上是与序列和列表相关的。他们是对于这类数据的最自然的神经网络架构。

1.3 RNN的局限:长期依赖(Long-TermDependencies)问题

如何从RNN起步,一步一步通俗理解LSTM

如何从RNN起步,一步一步通俗理解LSTM

换句话说, RNN 会受到短时记忆的影响。如果一条序列足够长,那它们将很难将信息从较早的时间步传送到后面的时间步。

因此,如果你正在尝试处理一段文本进行预测,RNN 可能从一开始就会遗漏重要信息。在反向传播期间(反向传播是一个很重要的核心议题,本质是通过不断缩小误差去更新权值,从而不断去修正拟合的函数),RNN 会面临梯度消失的问题。

因为梯度是用于更新神经网络的权重值(新的权值 = 旧权值 – 学习率*梯度),梯度会随着时间的推移不断下降减少,而当梯度值变得非常小时,就不会继续学习。​

如何从RNN起步,一步一步通俗理解LSTM

换言之,在递归神经网络中,获得小梯度更新的层会停止学习—— 那些通常是较早的层。 由于这些层不学习,RNN 可以忘记它在较长序列中看到的内容,因此具有短时记忆。

而梯度爆炸则是因为计算的难度越来越复杂导致。

然而,幸运的是,有个RNN的变体——LSTM,可以在一定程度上解决梯度消失和梯度爆炸这两个问题!

二、LSTM网络
Long ShortTerm 网络——一般就叫做LSTM——是一种RNN特殊的类型,可以学习长期依赖信息。当然,LSTM和基线RNN并没有特别大的结构不同,但是它们用了不同的函数来计算隐状态。LSTM的“记忆”我们叫做细胞/cells,你可以直接把它们想做黑盒,这个黑盒的输入为前状态

如何从RNN起步,一步一步通俗理解LSTM

和当前输入

如何从RNN起步,一步一步通俗理解LSTM

。这些“细胞”会决定哪些之前的信息和状态需要保留/记住,而哪些要被抹去。实际的应用中发现,这种方式可以有效地保存很长时间之前的关联信息。

2.1 什么是LSTM网络

举个例子,当你想在网上购买生活用品时,一般都会查看一下此前已购买该商品用户的评价。

如何从RNN起步,一步一步通俗理解LSTM

如何从RNN起步,一步一步通俗理解LSTM

而这基本上就像是 LSTM 或 GRU 所做的那样,它们可以学习只保留相关信息来进行预测,并忘记不相关的数据。简单说,因记忆能力有限,记住重要的,忘记无关紧要的。

如何从RNN起步,一步一步通俗理解LSTM

激活函数 Tanh 作用在于帮助调节流经网络的值,使得数值始终限制在 -1 和 1 之间。

如何从RNN起步,一步一步通俗理解LSTM

如何从RNN起步,一步一步通俗理解LSTM

上图中,σ表示的Sigmoid 激活函数与 tanh 函数类似,不同之处在于 sigmoid 是把值压缩到0~1 之间而不是 -1~1 之间。这样的设置有助于更新或忘记信息:

  • 因为任何数乘以 0 都得 0,这部分信息就会剔除掉;
  • 同样的,任何数乘以 1 都得到它本身,这部分信息就会完美地保存下来。

相当于要么是1则记住,要么是0则忘掉,所以还是这个原则:因记忆能力有限,记住重要的,忘记无关紧要的

如何从RNN起步,一步一步通俗理解LSTM

此外,对于图中使用的各种元素的图标中,每一条黑线传输着一整个向量,从一个节点的输出到其他节点的输入。粉色的圈代表pointwise的操作,诸如向量的和,而黄色的矩阵就是学习到的神经网络层。合在一起的线表示向量的连接,分开的线表示内容被复制,然后分发到不同的位置。

如何从RNN起步,一步一步通俗理解LSTM

如何从RNN起步,一步一步通俗理解LSTM

LSTM有通过精心设计的称作为“门”的结构来去除或者增加信息到细胞状态的能力。门是一种让信息选择式通过的方法。他们包含一个sigmoid神经网络层和一个pointwise乘法的非线性操作。

如此,0代表“不许任何量通过”,1就指“允许任意量通过”!从而使得网络就能了解哪些数据是需要遗忘,哪些数据是需要保存。

如何从RNN起步,一步一步通俗理解LSTM

LSTM拥有三种类型的门结构:遗忘门/忘记门、输入门和输出门,来保护和控制细胞状态。下面,我们来介绍这三个门。

如何从RNN起步,一步一步通俗理解LSTM

大部分初学的读者看到这,可能会有所懵逼,没关系,我们分以下两个步骤理解:

  1. 对于上图右侧公式中的权值W_{f},准确的说其实是不共享,即是不一样的。有的同学可能第一反应是what?别急,我展开下你可能就瞬间清晰了,即:f_{t} = \sigma (W_{fh}h_{t-1} + W_{fx} x_{t} + b_{f})
  2. 至于右侧公式和左侧的图是怎样的一个一一对应关系呢?如果是用有方向的水流表示计算过程则将一目了然,上动图!红圈表示Sigmoid 激活函数,篮圈表示tanh 函数:

如何从RNN起步,一步一步通俗理解LSTM

3.2 输入门
下一步是确定什么样的新信息被存放在细胞状态中。这里包含两个部分:
第一,sigmoid层称“输入门层”决定什么值我们将要更新;
第二,一个tanh层创建一个新的候选值向量如何从RNN起步,一步一步通俗理解LSTM,会被加入到状态中。
下一步,我们会讲这两个信息来产生对状态的更新。

在我们语言模型的例子中,我们希望增加新的主语的性别到细胞状态中,来替代旧的需要忘记的主语,进而确定更新的信息。





如何从RNN起步,一步一步通俗理解LSTM

继续分两个步骤来理解:

  1. 首先,为便于理解图中右侧的两个公式,我们展开下计算过程,即i_{t} = \sigma (W_{ih}h_{t-1} + W_{ix}x_{t} + b_{i})\tilde{C_{t}} = tanh(W_{Ch}h_{t-1} + W_{Cx}x_{t} + b_{C})
  2. 其次,上动图!

如何从RNN起步,一步一步通俗理解LSTM

3.3 细胞状态
现在是更新旧细胞状态的时间了,如何从RNN起步,一步一步通俗理解LSTM更新为如何从RNN起步,一步一步通俗理解LSTM。前面的步骤已经决定了将会做什么,我们现在就是实际去完成。
我们把旧状态与如何从RNN起步,一步一步通俗理解LSTM相乘,丢弃掉我们确定需要丢弃的信息。接着加上如何从RNN起步,一步一步通俗理解LSTM。这就是新的候选值,根据我们决定更新每个状态的程度进行变化。
在语言模型的例子中,这就是我们实际根据前面确定的目标,丢弃旧代词的性别信息并添加新的信息的地方,类似更新细胞状态。


如何从RNN起步,一步一步通俗理解LSTM

再次动图!

如何从RNN起步,一步一步通俗理解LSTM

3.4 输出门
最终,我们需要确定输出什么值。这个输出将会基于我们的细胞状态,但是也是一个过滤后的版本。

首先,我们运行一个sigmoid层来确定细胞状态的哪个部分将输出出去。
接着,我们把细胞状态通过tanh进行处理(得到一个在-1到1之间的值)并将它和sigmoid门的输出相乘,最终我们仅仅会输出我们确定输出的那部分。

在语言模型的例子中,因为他就看到了一个代词,可能需要输出与一个动词相关的信息。例如,可能输出是否代词是单数还是负数,这样如果是动词的话,我们也知道动词需要进行的词形变化,进而输出信息。





如何从RNN起步,一步一步通俗理解LSTM

依然分两个步骤来理解:

  1. 展开图中右侧第一个公式,o_{t} = \sigma (W_{oh}h_{t-1} + W_{ox}x_{t} + b_{o})
  2. 最后一个动图:

如何从RNN起步,一步一步通俗理解LSTM

如何从RNN起步,一步一步通俗理解LSTM

如何从RNN起步,一步一步通俗理解LSTM

4.2 GRU
另一个改动较大的变体是GatedRecurrentUnit(GRU),这是由Cho,etal.(2014)提出。它将忘记门和输入门合成了一个单一的更新门。同样还混合了细胞状态和隐藏状态,和其他一些改动。最终的模型比标准的LSTM模型要简单,也是非常流行的变体。

如何从RNN起步,一步一步通俗理解LSTM

为了便于理解,我把上图右侧中的前三个公式展开一下

  1. z_{t} = \sigma (W_{zh}h_{t-1} + W_{zx}x_{t})
  2. r_{t} = \sigma (W_{rh}h_{t-1} + W_{rx}x_{t})
  3. \tilde{h} = tanh(W_{rh}(r_{t}h_{t-1}) + W_{x}x_{t})

这里面有个小问题,眼尖的同学可能看到了,z_{t}r_{t}都是对h_{t-1}x_{t}做的Sigmoid非线性映射,那区别在哪呢?原因在于GRU把忘记门和输入门合二为一了,而z_{t}是属于要记住的,反过来1- z_{t}则是属于忘记的,相当于对输入h_{t-1}x_{t}做了一些更改/变化,而r_{t}则相当于先见之明的把输入h_{t-1}x_{t}z_{t}/1- z_{t}对其做更改/变化之前,先事先存一份原始的,最终在\tilde{h}那做一个tanh变化。

五、LSTM相关面试题

为帮助大家巩固以上的所学,且助力找AI工作的朋友,特从七月在线AI题库里抽取以下关于LSTM的典型面试题,更具体的答案参见:七月在线 – 智能时代在线职教平台(打开链接后,勾选“面试题”的tab)。

  1. LSTM结构推导,为什么比RNN好?
  2. GRU是什么?GRU对LSTM做了哪些改动?
  3. LSTM神经网络输入输出究竟是怎样的?
  4. 为什么LSTM模型中既存在sigmoid又存在tanh两种激活函数,而不是选择统一一种sigmoid或者tanh?这样做的目的是什么?
  5. 如何修复梯度爆炸问题?
  6. 如何解决RNN梯度爆炸和弥散的问题?

六、参考文献

  1. ChristopherOlah的博文《理解LSTM网络》
  2. @Not_GOD 翻译ChristopherOlah的博文《理解LSTM网络》
  3. RNN是怎么从单层网络一步一步构造的?
  4. 通过一张张动图形象的理解LSTM
  5. 如何理解LSTM网络(超经典的Christopher Olah的博文之July注解版)
  6. LSTM相关的典型面试题:七月在线 – 智能时代在线职教平台(打开链接后,勾选“面试题”的tab)
  7. 如何理解反向传播算法BackPropagation
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/175734.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午11:33
下一篇 2026年3月26日 下午11:33


相关推荐

  • Java输入输出流详解

    Java输入输出流详解通过数据流、序列化和文件系统提供系统输入和输出。Java把这些不同来源和目标的数据都统一抽象为数据流。Java语言的输入输出功能是十分强大而灵活的,美中不足的是看上去输入输出的代码并不是很简洁,因为你往往需要包装许多不同的对象。在Java类库中,IO部分的内容是很庞大的,因为它涉及的领域很广泛:标准输入输出,文件的操作,网络上的数据流,字符串流,对象流,zip文件流。1.1、Java流

    2022年5月26日
    57
  • 产品密钥无法激活成功,最后使用visio2013激活软件激活成功。「建议收藏」

    产品密钥无法激活成功,最后使用visio2013激活软件激活成功。「建议收藏」装了visio2013,使用网上搜索的产品密钥,没有一个能够激活成功。最后发现了visio的一个激活软件KMSpico,成功激活。激活成功教程工具KMSpico_setup.exe下载地址:https://pan.baidu.com/s/1wElfmRaufSpQGloLgQC64g提取码:kv2h安装后,从开始->程序->KMSpico->启动KMSpic…

    2022年6月24日
    66
  • windows 10 install oracle 12c error:[ INS-30131 ]

    windows 10 install oracle 12c error:[ INS-30131 ]

    2022年1月9日
    60
  • 传感器低功耗设计_压力传感器

    传感器低功耗设计_压力传感器无线温度传感器是常见的传感器,广泛用于各种需要温度检测的场合。对于有线供电的传感器而言,可以实时监测来保证温度在限定范围内。而对于电池供电的温度传感器而言,如果过于频繁的读取传感器,则显然会消耗很多电

    2022年8月5日
    6
  • 使用阿里巴巴矢量库

    使用阿里巴巴矢量库iconfont 阿里巴巴矢量图标库 1 先进去注册账号 2 进去后选好图标添加到购物车 3 点击右上角的购物车得到如下界面可添加至项目 4 添加成功后 在 fontclass 处会产生一个链接 5 接着在项目中引入这个链接 linkrel stylesheet href http at alicdn com t font 2652961 v9dc31q8yt css 6 在要用的地方通过类似 linkrel stylesheet href http

    2026年3月16日
    2
  • vue axios跨域问题的三种解决方案_vue如何实现跨域

    vue axios跨域问题的三种解决方案_vue如何实现跨域vue3项目,axios跨域处理,代理

    2025年9月6日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号