LSTM 网络 (Understanding LSTM Networks by colah)

原文链接: Understanding LSTM Networks

1. 循环神经网络(RNNs)

人们思考问题往往不是从零开始的。就好像你现在阅读这篇文章一样,你对每个词的理解都会依赖于你前面看到的一些词,而不是把你前面看的内容全部抛弃了,忘记了,再去理解这个单词。也就是说,人们的思维总是会有延续性的。

传统的神经网络是做不到这样的延续性(它们没办法保留对前文的理解),这似乎成了它们一个巨大的缺陷。举个例子,在观看影片中,你想办法去对每一帧画面上正在发生的事情做一个分类理解。目前还没有明确的办法利用传统的网络把对影片中前面发生的事件添加进来帮助理解后面的画面。

但是,循环神经网络可以做到。在RNNs的网络中,有一个循环的操作,使得它们能够保留之前学习到的内容为了建模序列问题,RNN引入了隐状态h(hidden state)的概念,隐状态h可以对序列形的数据提取特征,接着再转换为输出

 Fig1. RNNs 网络结构

在上图网络结构中,对于矩形块 A 的那部分,通过输入X_t(t时刻的特征向量),它会输出一个结果h_t(t时刻的状态或者输出)。网络中的循环结构使得某个时刻的状态能够传到下一个时刻。(译者注:因为当前时刻的状态会作为下一时刻输入的一部分)

这些循环的结构让 RNNs 看起来有些难以理解。但是,你稍微想一下就会发现,这似乎和普通的神经网络有不少相似之处呀。我们可以把 RNNs 看成是一个普通的网络做了多次复制后叠加在一起组成的。每一网络会把它的输出传递到下一个网络中。我们可以把 RNNs 在时间步上进行展开,就得到下图这样,X_0 的输出h_0 和 X_1 一起作为第二个时刻的输入

 fig2. RNNs 展开网络结构(A既是下图中的hi,hi既是下图中的yi)

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

从 RNNs 链状的结构很容易理解到它是和序列信息相关的。这种结构似乎生来就是为了解决序列相关问题的。

而且,它们的的确确非常管用!在最近的几年中,人们利用 RNNs 不可思议地解决了各种各样的问题:语音识别,语言模型,翻译,图像(添加)字幕,等等。关于RNNs在这些方面取得的惊人成功,我们可以看 Andrej Karpathy 的博客: The Unreasonable Effectiveness of Recurrent Neural Networks.

RNNs 能够取得这样的成功,主要还是 LSTMs 的使用。这是一种比较特殊的 RNNs,而且对于很多任务,它比普通的 RNNs 效果要好很多很多!基本上现在所使用的循环神经网络用的都是 LSTMs,这也正是本文后面所要解释的网络。

2. 长时期依赖存在的问题

RNNs 的出现,主要是因为它们能够把以前的信息联系到现在,从而解决现在的问题。比如,利用前面的画面,能够帮助我们理解当前画面的内容。如果 RNNs 真的可以做到这个,那么它肯定是对我们的任务有帮助的。但是它真的可以 做到吗,恐怕还得看实际情况呀!

有时候,我们在处理当前任务的时候,只需要看一下比较近的一些信息。比如在一个语言模型中,我们要通过上文来预测一下个词可能会是什么,那么当我们看到“ the clouds are in the ?”时,不需要更多的信息,我们就能够自然而然的想到下一个词应该是“sky”。在这样的情况下,我们所要预测的内容和相关信息之间的间隔很小,这种情况下 RNNs 就能够利用过去的信息, 很容易的实现。

 fig2. 短期依赖

但是,有些情况是需要更多的上下文信息。比如我们要预测“I grew up in France … (此处省略1万字)… I speak ?”这个预测的词应该是 Franch,但是我们是要通过很长很长之前提到的信息,才能做出这个正确的预测的呀,普通的 RNNs 很难做到这个。

随着预测信息和相关信息间的间隔增大, RNNs 很难去把它们关联起来了。

 fig3. 长期依赖

从理论上来讲,通过选择合适的参数,RNNs 确实是可以把这种长时期的依赖关系(“long-term dependencies”) 联系起来,并解决这类问题的。但遗憾的是在实际中, RNNs 无法解决这个问题。 Hochreiter (1991) [German] 和 Bengio, et al. (1994) 曾经对这个问题进行过深入的研究,发现 RNNs 的确很难解决这个问题。

RNN 的局限性:

1、梯度消失:(反向传播是一个很重要的核心议题,本质是通过不断缩小误差去更新权值(新的权值 = 旧权值 - 学习率*梯度),从而不断去修正拟合的函数

        在递归神经网络进行反向传播时,梯度会随着时间的推移不断下降减少,而当梯度值变得非常小时,在递归神经网络中,获得小梯度更新的层会停止学习—— 那些通常是较早的层(梯度消失),由于这些层不学习,RNN会忘记它在较长序列中以前看到的内容,因此RNN只具有短时记忆。

2、梯度爆炸:

        简单说,权重参数小于1,会出现衰减,大于1,会出现爆炸。梯度消失和梯度爆炸本质上是一样的,都是因为网络层数太深而引发的梯度反向传播中的连乘效应。

但是非常幸运,LSTMs 能够帮我们解决这个问题。

3. LSTM 网络

长短期记忆网络(Long Short Term Memory networks) - 通常叫做 “LSTMs” —— 是 RNN 中一个特殊的类型。由Hochreiter & Schmidhuber (1997)提出,广受欢迎,之后也得到了很多人们的改进调整。LSTMs 被广泛地用于解决各类问题,并都取得了非常棒的效果。

明确来说,设计 LSTMs 主要是为了避免前面提到的长时期依赖(long-term dependency )的问题。LSTMs的本质就是能够记住很长时期内的信息,而且非常轻松就能做到。

所有循环神经网络结构都是由完全相同结构的(神经网络)模块进行复制而成的。在普通的RNNs 中,这个模块结构非常简单,比如仅是一个单一的 tanh 层。

 fig4. 普通 RNNs 内部结构

LSTMs 也有类似的结构(译者注:唯一的区别就是中间部分)。但是它们不再只是用一个单一的 tanh 层,而是用了四个相互作用的层。

 fig5. LSTM 内部结构

别担心,别让这个结构给吓着了,下面根据这个结构,我们把它解剖开,一步一步地来理解它(耐心看下去,你一定可以理解的)。现在,我们先来定义一下用到的符号:

 fig6. 符号说明

在网络结构图中,每条线都传递着一个向量,从一个节点中输出,然后输入到另一个节点中。粉红色的圆圈表示逐点操作,比如向量相加;黄色的矩形框表示的是一个神经网络层(就是很多个神经节点);合并的线表示把两条线上所携带的向量进行合并拼接(比如一个带 h_{t-1},另一个带 x_t​ , 那么合并后的输出就是$[h_{t-1}, x_t] $); 分开的线表示将线上传递的向量复制一份,传给两个地方。

3.1 LSTMs 的核心思想

LSTMs 最关键的地方在于 cell(整个绿色的框就是一个 cell) 的状态和结构图上面的那条横穿的水平线

cell 状态的传输就像一条传送带,向量从整个cell中穿过,只是做了少量的线性操作。这种结构能够很轻松地实现信息从整个cell中穿过而不做改变。(译者注:这样我们就可以实现了长时期的记忆保留了

 fig7. 传送带结构

若只有上面的那条水平线是没办法实现添加或者删除信息的。而是通过一种叫做 门(gates) 的结构来实现的。

 可以实现选择性地让信息通过,主要是通过一个 sigmoid 的神经层 和一个逐点相乘的操作来实现的。

sigmoid 层输出(是一个向量)的每个元素都是一个在 0 和 1 之间的实数,表示让对应信息通过的权重(或者占比)。比如, 0 表示“不让任何信息通过”, 1 表示“让所有信息通过”。

每个 LSTM 有三个这样的门结构,来实现保护和控制信息。(译者注:分别是 “forget gate layer”, 遗忘门; “input gate layer”,传入门; “output gate layer”, 输出门)

3.2 逐步理解 LSTM

(好了,终于来到最激动的时刻了)

3.2.1 遗忘门

首先是 LSTM 要决定让那些信息继续通过这个 cell,这是通过一个叫做“forget gate layer ”的sigmoid 神经层来实现的。它的输入是$ h_{t-1} 和 $x_t ,输出是一个数值都在 0,1 之间的向量(向量长度和 cell 的状态 $ C_{t-1} $ 一样),表示让 $C_{t-1} $ 的各部分信息通过的比重。 0 表示“不让任何信息通过”, 1 表示“让所有信息通过”。

回到我们上面提到的语言模型中,我们要根据所有的上文信息来预测下一个词。这种情况下,每个 cell 的状态中都应该包含了当前主语的性别信息(保留信息),这样接下来我们才能够正确地使用代词。但是当我们又开始描述一个新的主语时,就应该把上文中的主语性别给忘了才对(忘记信息)

 fig9. 遗忘门 (forget gates)

3.2.2 传入门

下一步是决定让多少新的信息加入到 cell 状态 中来。实现这个需要包括两个 步骤:首先,一个叫做“input gate layer ”的 sigmoid 层决定哪些信息需要更新;一个 tanh 层生成一个向量,也就是备选的用来更新的内容,\tilde{C_{t}} 。在下一步,我们把这两部分联合起来,对 cell 的状态进行一个更新。

 fig10. 传入门 (input gates)

在我们的语言模型的例子中,我们想把新的主语性别信息添加到 cell 状态中,来替换掉老的状态信息。
有了上述的结构,我们就能够更新 cell 状态了, 即把C_{t-1}更新为 C_{t}。 从结构图中应该能一目了然, 首先我们把旧的状态C_{t-1}和 f_t相乘,把一些不想保留的信息忘掉。然后加上 i_{t}*\tilde{C_{t}}。这部分信息就是我们要添加的新内容。

 fig11. 更新 cell 状态

3.2.3 输出门

最后,我们需要来决定输出什么值了。这个输出主要是依赖于 cell 的状态C_{t},但是又不仅仅依赖于 C_{t} ,而是需要经过一个过滤的处理。首先,我们还是使用一个sigmoid层来(计算出)决定C_{t}中的哪部分信息会被输出。接着,我们把 C_{t}通过一个 tanh 层(把数值都归到 -1 和 1 之间),然后把 tanh 层的输出和 sigmoid 层计算出来的权重相乘,这样就得到了最后输出的结果。

在语言模型例子中,假设我们的模型刚刚接触了一个代词,接下来可能要输出一个动词,这个输出可能就和代词的信息相关了。比如说,这个动词应该采用单数形式还是复数的形式,那么我们就得把刚学到的和代词相关的信息都加入到 cell 状态中来,才能够进行正确的预测。

 fig12. cell 输出

4. LSTM 的变种 GRU

原文这部分介绍了 LSTM 的几个变种,还有这些变形的作用。在这里我就不再写了。有兴趣的可以直接阅读原文。

下面主要讲一下其中比较著名的变种 GRU(Gated Recurrent Unit ),这是由 Cho, et al. (2014) 提出。在 GRU 中,如 fig.13 所示,只有两个门:重置门(reset gate)和更新门(update gate)。同时在这个结构中,把细胞状态和隐藏状态进行了合并。最后模型比标准的 LSTM 结构要简单,而且这个结构后来也非常流行。

 fig13. GRU结构

其中,r_t表示重置门,z_t表示更新门。重置门决定是否将之前的状态忘记。r_t 趋于 0 的时候,前一个时刻的状态信息h_{t-1}会被忘掉,隐藏状态 \tilde{h_t} 会被重置为当前输入的信息。更新门决定是否要将隐藏状态更新为新的状态\tilde{h_t}(作用相当于合并了 LSTM 中的遗忘门和传入门)。

和 LSTM 比较一下:

  • (1) GRU 少一个门,同时少了细胞状态C_{t} 
  • (2) 在 LSTM 中,通过遗忘门和传入门控制信息的保留和传入;GRU 则通过重置门来控制是否要保留原来隐藏状态的信息,但是不再限制当前信息的传入。
  • (3) 在 LSTM 中,虽然得到了新的细胞状态 C_{t} ,但是还不能直接输出,而是需要经过一个过滤的处理:; 同样,在 GRU 中, 虽然 (2) 中我们也得到了新的隐藏状态\tilde{h_t}, 但是还不能直接输出,而是通过更新门来控制最后的输出:  。

后记:好了,到这里对一般形式的 LSTM 的结构讲解已经结束了,原文后面对 LSTM 的各种变形讲解也比较简单,在这里我就不再写了,有兴趣的可以直接阅读原文。上面我结合了原论文比较详细地介绍了一下 GRU,个人水平有限,难免也会出错。其实英语理解能力还行的话建议还是阅读原文比较好,有些东西翻译过来连我自己都不知道该怎么表达了,如果您觉得有什么地方不对,欢迎指出。翻译完后才发现网上已经有很多翻译的版本了,所以参考那些版本又做了一些调整,主要是参考了[译] 理解 LSTM 网络这篇文章。后面如果有时间的话,我应该会写个用 TensorFlow 来实现 LSTM 的例子,敬请期待,哈哈哈!

(LSTM 的例子还真写好了,欢迎戳: TensorFlow入门(五)多层 LSTM 通俗易懂版

LSTM相关面试题

 1、RNN的梯度消失和梯度爆炸:

梯度消失:一句话,RNN梯度消失是因为激活函数tanh函数的导数在0到1之间,反向传播时更新前面时刻的参数时,当参数W初始化为小于1的数,则多个(tanh函数的导数* W)相乘,将导致求得的偏导极小(小于1的数连乘),从而导致梯度消失。

梯度爆炸:当参数初始化为足够大,使得tanh函数的倒数乘以W大于1,则将导致偏导极大(大于1的数连乘),从而导致梯度爆炸。

RNN的前向传播可以表示为下式。其中f(x) 就是tanh(x)。

 2. RNN与LSTM的区别   

LSTM结构推导,为什么比RNN好?   RNN与LSTM的区别_rnn和lstm区别_hfutdog的博客-CSDN博客

  • (1)RNN只能够处理短期依赖问题;LSTM既能够处理短期依赖问题,又能够处理长期依赖问题。
  • (2)RNN没有细胞状态;LSTM通过细胞状态记忆信息。
  • (3)RNN激活函数只有tanh;LSTM通过输入门、遗忘门、输出门引入sigmoid函数并结合tanh函数,添加求和操作,减少梯度消失和梯度爆炸的可能性。

3.介绍一下LSTM

核心:LSTM的关键就是细胞状态,细胞状态类似于传送带。信息在上面传递,保持不变会很容易。利用门结构来对细胞传输的信息进行去除或增加。
第一步:忘记门:读取当前状态的输入和上一状态的输出,输出一个0到1之间的数值,来决定从细胞状态中哪些信息会被遗忘。
第二步:输入门:决定什么样的信息被存放在细胞状态中,包含两个部分:

  • 1)sigmoid“输入门层”,决定什么值将要更新。
  • 2)tanh层,创建一个新的候选值向量。会被加到状态中。

第三步:输出门:基于细胞状态确定输出什么值

4.为什么LSTM用到了两种激活函数

sigmoid 用在了各种gate上,产生0~1之间的值,这个一般只有sigmoid最直接了,相当于要么是1则记住,要么是0则忘掉。 tanh 用在了状态和输出上,是对数据的处理,这个用其他激活函数或许也可以。

2​​​​为什么LSTM模型中既存在sigmoid又存在tanh两种激活函数,而不是选择统一一种sigmoid或者tanh?这样做的目的是什么?

4.LSTM防止梯度弥散和爆炸 -- 导数

        LSTM通过引入三个门控单元:输入门、遗忘门和输出门,通过这些门控机制可以选择性地更新和遗忘信息,不涉及梯度连乘累积的出现,从而缓解梯度消失问题更具体的是

  • (1) LSTM之所可以缓解梯度问题是因为它避免了无休止的连乘,而是边加边乘,
  • (2) 而且LSTM的导数项中起到决定作用遗忘门的输出ft,
    • ft介于0~1之间,不会发生梯度爆炸;
    • ft 接近于0时说明不需要依赖该历史信息,梯度接近于0;ft接近于1时,表示需要依赖该历史信息,梯度也接近于1。既保证需要的信息得到保留,不需要的信息不再更新梯度。

通俗易懂理解梯度消失/爆炸,及LSTM的有效原因 - 知乎

5.LSTM 存在的问题:

  • 计算资源消耗。每一个LSTM的cell里面都意味着有4个全连接层(MLP),如果LSTM的时间跨度很大,并且网络又很深,这个计算量会很大,很耗时。
  • 无法并行化: lstm在训练和推理过程中无法进行有效的并行化,这也导致了计算效率低下和训练时间较大的问题。

  • RNN的梯度问题在LSTM及其变种里面得到了一定程度的解决,但还是不够。它可以处理100个量级的序列,而对于1000个量级,或者更长的序列则依然会显得很棘手。

6. GRU与LSTM的对比:

  • GRU只有两个门(update和reset),LSTM有三个门(forget,input,output)
  • GRU参数相对少、模型复杂度低、更容易收敛,提高训练效率。
  • 两者的性能在很多任务上不分伯仲,在数据集较大的情况下,LSTM性能更好。

LSTM优势:三个门控机制,遗忘门,输入门,输出门,各自独立决定语义信息的取舍和输出,模型参数更多,具备更强表现力;

LSTM劣势:模型比GRU复杂,模型参数多,训练时间长,成本高,预测速度慢;





Ref:(译)理解 LSTM 网络 (Understanding LSTM Networks by colah)_永永夜的博客-CSDN博客

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值