LSTM 学习理解

一年前看LSTM,感觉非常复杂难理解,如今再看,感觉似乎简单清晰了许多,此处做个简单记录。

LSTM来自一篇论文:

github链接如下:

https://colah.github.io/posts/2015-08-Understanding-LSTMs/

其实,说白了,LSTM就是一个复杂点的RNN,把RNN中的cell做了替换,就成了LSTM。之所以要替换cell,是因为RNN不能解决长期依赖问题,简单说,就是循环迭代次数太多,导致RNN忘了太久之前的信息,而LSTM对之前的信息进行了选择性记忆,相比于RNN更有效。以下是相关介绍:

  1. RNN

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

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

RNN 解决了这个问题。RNN 是包含循环的网络,允许信息的持久化。如下图:

在上面的示例图中,神经网络的模块,A,正在读取某个输入 xi,并输出一个值 hi。循环可以使得信息可以从当前步传递到下一步。这些循环使得 RNN 看起来非常神秘。然而,如果你仔细想想,这样也不比一个正常的神经网络难于理解。RNN 可以被看做是同一神经网络的多次赋值,每个神经网络模块会把消息传递给下一个。所以,如果我们将这个循环展开,则如下图:

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

 

  1. 长期依赖(Long-Term Dependencies)问题

RNN 的关键点之一就是他们可以用来连接先前的信息到当前的任务上,例如使用过去的视频段来推测对当前段的理解。如果 RNN 可以做到这个,他们就变得非常有用。但是真的可以么?答案是:还有很多依赖因素。有时候,我们仅仅需要知道先前的信息来执行当前的任务。例如,我们有一个 语言模型用来基于先前的词来预测下一个词。如果我们试着预测 “the clouds are in the sky” 最后的词,我们并不需要任何其他的上下文 —— 因此下一个词很显然就应该是 sky。在这样的场景中,相关的信息和预测的词位置之间的间隔是非常小的,RNN 可以学会使用先前的信息。相关信息间隔不太长,如下图:

但是同样会有一些更加复杂的场景。假设我们试着去预测“I grew up in France… I speak fluent French”最后的词。当前的信息建议下一个词可能是一种语言的名字,但是如果我们需要弄清楚是什么语言,我们是需要先前提到的离当前位置很远的 France 的上下文的。这说明相关信息和当前预测位置之间的间隔就肯定变得相当的大。不幸的是,在这个间隔不断增大时,RNN 会丧失学习到连接如此远的信息的能力。如信息间隔相当长时,如下

然而,LSTM不存在这个问题。

  1. LSTM

LSTM 通过刻意的设计来避免长期依赖问题。记住长期的信息在实践中是 LSTM 的默认行为,而非需要付出很大代价才能获得的能力!

 

所有 RNN 都具有一种重复神经网络模块的链式的形式。在标准的 RNN 中,这个重复的模块只有一个非常简单的结构,例如一个 tanh 层。

LSTM 同样是这样的结构,但是重复的模块拥有一个不同的结构。不同于 单一神经网络层,这里是有四个,以一种非常特殊的方式进行交互。

 

核心思想

LSTM 的关键就是细胞状态,水平线在图上方贯穿运行。细胞状态类似于传送带。直接在整个链上运行,只有一些少量的线性交互。信息在上面流传保持不变会很容易。

LSTM 有通过精心设计的称作为“”的结构来去除或者增加信息到细胞状态的能力。门是一种让信息选择式通过的方法。他们包含一个 sigmoid 神经网络层和一个 pointwise 乘法操作。Sigmoid 层输出 0 到 1 之间的数值,描述每个部分有多少量可以通过。0 代表“不许任何量通过”,1 就指“允许任意量通过”。

 

LSTM 拥有三个门,对个三个阶段,来保护和控制细胞状态,如下:

  1. 忘记阶段

这个阶段主要是对上一个节点传进来的输入进行选择性忘记。简单来说就是会 “忘记不重要的,记住重要的”。

具体来说是通过计算得到的zf(f表示forget)来作为忘记门控,来控制上一个状态的ct-1哪些需要留哪些需要忘。

  1. 2.选择记忆阶段

这个阶段将这个阶段的输入有选择性地进行“记忆”。主要是会对输入 xt进行选择记忆。哪些重要则着重记录下来,哪些不重要,则少记一些。当前的输入内容由前面计算得到的 z表示。而选择的门控信号则是由zi(i代表information)来进行控制。

 

3. 输出阶段

这个阶段将决定哪些将会被当成当前状态的输出。主要是通过z0来进行控制的。并且还对上一阶段得到的 c0进行了放缩(通过一个tanh激活函数进行变化)

当然LSTM还有很多变体,可以参考论文原文介绍,此处不详细解释了。

 

参考:

https://blog.csdn.net/lyc_yongcai/article/details/73201446

https://zhuanlan.zhihu.com/p/32085405

猜你喜欢

转载自blog.csdn.net/IT_flying625/article/details/106296217
今日推荐