LSTM学习

学习LSTM需要通过五大问题来全面的理解:为什么会出现LSTM?LSTM是怎么解决RNN梯度消失的问题的?LSTM的主要内容是什么?LSTM如何代码实现?LSTM现在发展到什么地步(即有哪些变体)?通过这五个问题,了解LSTM的前世今生。

一 为什么会出现LSTM?

这个问题其实就是LSTM的产生背景。我们知道随着对数据处理更高的要求,从感知机慢慢发展到循环神经网络(Recurrent Neural Network, RNN),而这个发展的过程实际上就是在面对不同的待处理问题时,对原有的模型提出了新的挑战,这时就要在原有模型的基础上进行创新改进。实际上,LSTM是一种改进的RNN,LSTM的产生背景主要是为了解决RNN长序列训练过程中的梯度消失和梯度爆炸问题。简单来说就是比普通RNN在更长的序列中有更好的表现。

1.1 梯度消失和梯度爆炸简介

既然说了是解决梯度消失和梯度爆炸的问题,那接下来看看梯度消失(gradient vanishing problem)和梯度爆炸(gradient exploding problem)问题是怎么产生的?
让我们以一个很简单的例子分析一下,这样便于理解。
在这里插入图片描述
如上图,是一个每层只有一个神经元的神经网络,且每一层的激活函数为sigmoid,则有:
在这里插入图片描述
( σ 是sigmoid函数)。
我们根据反向传播算法有:
在这里插入图片描述
而sigmoid函数的导数公式为:
在这里插入图片描述
它的图形曲线为:
在这里插入图片描述
由上可见,sigmoid函数的导数的最大值为1/4 ,通常我们会将权重初始值|ω|初始化为为小于1的随机值,因此我们可以得到| σ ′ σ^{'} σ ( z 4 z_4 z4) ω 4 ω_4 ω4|<1/4 ,随着层数的增多,那么求导结果 δ C δ b 1 \frac{δC}{δb1} δb1δC越小,这也就导致了梯度消失问题。
那么如果我们设置初始权重|ω|较大,那么会有| σ ′ σ^{'} σ ( z 4 z_4 z4) ω 4 ω_4 ω4|>1 ,造成梯度太大(也就是下降的步伐太大),这也是造成梯度爆炸的原因。
总之,无论是梯度消失还是梯度爆炸,都是源于网络结构太深,造成网络权重不稳定,从本质上来讲是因为梯度反向传播中的连乘效应。

1.2 RNN产生GVP和GEP问题

接下来看一下,RNN是如何出现梯度消失和梯度爆炸的问题的。
经典的RNN结构如下图所示:
在这里插入图片描述
假设我们的时间序列只有三段, S 0 S_0 S0为给定值,神经元没有激活函数,则RNN最简单的前向传播过程如下:
在这里插入图片描述
假设在t=3时刻,损失函数为
在这里插入图片描述
则对于一次训练任务的损失函数为 ∑ t = 0 T L t \sum_{t=0}^T L_t t=0TLt ,即每一时刻损失值的累加。使用随机梯度下降法训练RNN其实就是对Wx、Ws、Wo以及b1 b2求偏导,并不断调整它们以使L尽可能达到最小的过程。
现在假设我们我们的时间序列只有三段,t1,t2,t3。我们只对t3时刻的Wx、Ws、Wo求偏导(其他时刻类似):
在这里插入图片描述
可以看出对于W0求偏导并没有长期依赖,但是对于Wx、Ws求偏导,会随着时间序列产生长期依赖。因St随着时间序列向前传播,而St又是Wx、Ws的函数。根据上述求偏导的过程,我们可以得出任意时刻对Wx、Ws求偏导的公式:
在这里插入图片描述
任意时刻对Ws求偏导的公式同上。
如果加上激活函数:
在这里插入图片描述
则:
在这里插入图片描述
激活函数tanh和它的导数图像如下。
在这里插入图片描述
由上图可以看出 t a n h ′ tanh^{'} tanh≤1,对于训练过程大部分情况下tanh的导数是小于1的,因为很少情况下会出现WxXj+WsSj-1+b1 = 0,如果Ws也是一个大于0小于1的值,则当t很大时 ∑ j = k + 1 t t a n h ′ w s \sum_{j=k+1}^t tanh^{'}w_s j=k+1ttanhws ,就会趋近于0,和 〖0.01〗^50趋近与0是一个道理。同理当Ws很大时 ∑ j = k + 1 t t a n h ′ w s \sum_{j=k+1}^t tanh^{'}w_s j=k+1ttanhws 。就会趋近于无穷,这就是RNN中梯度消失和爆炸的原因。
至于怎么避免这种现象,还是先看看这个求偏导的公式:
在这里插入图片描述
梯度消失和爆炸的根本原因就是 ∏ j = k + 1 t ∂ s j ∂ s j − 1 \prod_{j=k+1}^t \frac{\partial s_j}{\partial s_{j-1}} j=k+1tsj1sj 。要消除这种情况就需要把它在求偏导的过程中去掉,至于怎么去掉,这个问题困扰了研究学者很长的时间,都没有很好的解决。直到Sepp Hochreiter 和 Jürgen Schmidhuber在他们的论文提出了Long Short Term Memory的模型才解决了这个问题。

二LSTM是怎么解决CNN梯度消失的问题的

2.1 naïve 方法

Sepp Hochreiter 和 Jürgen Schmidhuber在他们提出 Long Short Term Memory 的文章里讲到,为了避免梯度弥散和梯度爆炸,一个 naive 的方法就是强行让 error flow 变成一个常数: ∣ y j j ( t ) ’ w j j ∣ |y_{jj}(t)’ w_{jj}| yjj(t)wjj=1.0。
wjj就是RNN里自己到自己的连接。他们把这样得到的模块叫做CEC(constant error carrousel),很显然由于上面那个约束条件的存在,这个CEC模块是线性的。这就是LSTM处理梯度消失的问题的动机。通俗地讲:RNN中,每个记忆单元 h t − 1 h_{t-1} ht1都会乘上一个W和激活函数的导数,这种连乘使得记忆衰减的很快,而LSTM是通过记忆和当前输入"相加",使得之前的记忆会继续存在而不是受到乘法的影响而部分“消失”,因此不会衰减。但是这种naive的做法太直白了,实际上就是个线性模型,在学习效果上不够好。

2.2 LSTM解决梯度消失问题

首先放上一副LSTM的经典结构图:
在这里插入图片描述
对于每个LSTM单元它可以抽象为如下:
在这里插入图片描述
三个×分别代表的就是forget gate,input gate,output gate,而我认为LSTM最关键的就是forget gate这个部件。这三个gate是如何控制流入流出的呢,其实就是通过下面 ∣ f t , i t , o t ∣ |f_t,i_t,o_t| ft,it,ot三个函数来控制,因为σ(x)(代表sigmoid函数)的值是介于0到1之间的,刚好用趋近于0时表示流入不能通过gate,趋近于1时表示流入可以通过gate。
在这里插入图片描述
当前的状态St = ftSt-1+itXt类似于传统RNN St=WsSt-1+WxXt+b1。将LSTM的状态表达式展开后得:
在这里插入图片描述
如果加上激活函数:
在这里插入图片描述
通过上面的介绍,我们知道了RNN梯度消失的原因是:
在这里插入图片描述
对于LSTM同样也包含这样的一项,但是在LSTM中:
在这里插入图片描述
假设 Z= t a n h ′ tanh^{'} tanhσ(y),则Z的函数图像如下图所示:
在这里插入图片描述
可以看到该函数值基本上不是0就是1。
上文中传统RNN的求偏导过程:
在这里插入图片描述
如果在LSTM中上式可能就会变成:
在这里插入图片描述
因为:
在这里插入图片描述
这样就解决了传统RNN中梯度消失的问题。

三 LSTM详细内容

Sepp Hochreiter 和 Jürgen Schmidhuber 在文章中提到“gradient based”的方法在权重更新都会遇到两个问题:input weight conflict 和 output weight conflict。大意就是对于神经元的权重ω,不同的数据(xi,yi)所带来的更新是不同的,这样可能会引起冲突(比如有些输入想让权重变小,有些想让它变大)。网络可能需要选择性地“忘记”某些输入,以及“屏蔽”某些输出以免影响下一层的权重更新。为了解决这些问题就提出了“门”。
举个例子:在英文短语中,主语对谓语的状态具有影响,而如果之前同时出现过第一人称和第三人称,那么这两个记忆对当前谓语就会有不同的影响,为了避免这种矛盾,我们希望网络可以忘记一些记忆来屏蔽某些不需要的影响。因为Naïve LSTM对记忆的操作是相加的,线性的,使得不同时序的记忆对当前的影响相同,为了让不同时序的记忆对当前影响变得可控,LSTM引入了输入门和输出门,之后又有人对LSTM进行了扩展,引入了遗忘门。
标椎的RNN结构,所有的RNN都具有神经网络的一系列重复模块的形式。在标准RNN中,这个重复模块将有一个非常简单的结构,比如一个单一的tanh层。
在这里插入图片描述
lstms也有这种链式结构,但是重复模块有不同的结构。与单一的神经网络层不同,这里有四层,以一种非常特殊的方式相互作用。
在这里插入图片描述
上面的门结构看起来很复杂,不过没关系,我们一步一步的来,首先来看一下门结构中用到的结构符号:
在这里插入图片描述
在上图中,每一行携带一个完整的向量,从一个节点的输出到其他节点的输入。粉红色的圆圈表示点式操作,如向量加法、向量乘法,而黄色的盒子是学习神经网络层。行合并表示连接,而行分叉表示其内容被复制,并且复制到不同的位置。

3.1 LSTM核心结构Cell State

接下来就逐一看一看LSTM的门结构,其中cell state(即穿过图顶部的水平线)是LSTM的核心结构,实际上就是LSTM的Memory State,由它来记录LSTM的信息。Cell State有点像传送带。它沿着整个链一直走,只有一些微小的线性相互作用。信息很容易在不改变的情况下流动。
在这里插入图片描述
LSTM确实有能力将信息移除或添加到cell State,并由称为gates的结构(门结构)小心地调节。门是一种选择性地让信息通过的方式。它们由一个sigmoid神经网络层和一个逐点乘法运算组成。
在这里插入图片描述
sigmoid层输出0到1之间的数字,描述每个成分应通过的量。值为0表示“不让任何东西通过”,值为1表示“让所有东西通过!” 一个lstm单元有三个这样的门,用来保护和控制Cell State。

3.2 LSTM的门结构
3.2.1遗忘门:决定应丢弃或保留哪些信息

LSTM的第一步是决定我们将从细胞状态中丢弃哪些信息。这个决定是由一个称为“遗忘门层”的sigmoid层做出的。它输入是ht-1和xt组成的矩阵,并为Cell State中的 ct-1输出一个0到1之间的数字。1表示“完全保留此项”,0表示“完全删除此项”。
用一个语言模型的例子来反映这块结构的作用。加入试图根据前面的所有单词预测下一个单词。在这样一个问题中,Cell State中可能包含了当前主语的性别,因此可以使用正确的代词。当我们看到一个新的主题,我们想忘记旧主题的性别。这就是这个门结构的使用背景。
在这里插入图片描述
在这里插入图片描述

3.2.2 输入门:输入门用于更新细胞状态。

LSTM的下一步是决定我们将在Cell State下存储哪些新信息。这有两部分:首先,一个称为“输入门层”的sigmoid层决定我们要更新哪些值。接下来,tanh层创建一个新的候选值向量C ̃t,可以添加到状态中。在下一步中,我们将结合这两个步骤来创建状态更新。
在我们的语言模型的例子中,我们希望将新主题的性别添加到细胞状态中,以取代我们忘记的旧主题。现在是时候将旧的细胞状态Ct-1更新为新的细胞状态Ct了。前面的步骤已经决定了要做什么,现在就是把它实现。
在这里插入图片描述
在这里插入图片描述

3.2.3 更新状态:计算细胞状态

我们把旧状态乘以ft,忘记了之前决定忘记的元素。然后我们把它加上
it∗C ̃t。这是新的候选值,根据我们决定更新每个状态值的程度进行缩放。
在语言模型的例子中,这是我们实际删除旧主题的性别信息并添加新信息的地方,正如我们在前面的步骤中所决定的那样。
在这里插入图片描述
在这里插入图片描述

3.2.4 输出门:输出门用来确定下一个隐藏状态的值

最后,我们需要决定我们要输出什么。此输出将基于cell State,此时的Cell State的状态是Ct而不是Ct-1了。首先,我们运行一个sigmoid层,它决定了我们要输出的细胞状态的哪些部分。然后,我们通过tanh(将值推到-1和1之间)将细胞状态乘以sigmoid门的输出,这样我们只输出我们决定的部分。
对于语言模型示例,因为模型只是看到了一个主题,所以它可能希望输出与动词相关的信息,以防接下里动词会有什么样的变化。例如,它可能会输出主语是单数还是复数,这样我们就知道如果下一个主语是单数或复数,那么动词应该以什么形式。
在这里插入图片描述
在这里插入图片描述

四 代码实现

LSTM神经网络用于时间序列预测
代码链接:https://github.com/jaungiers/LSTM-Neural-Network-for-Time-Series-Prediction

实验结果:
正弦波顺序预测的输出:
在这里插入图片描述
股票市场多维多序列预测的输出:
在这里插入图片描述

BP神经网络
代码链接:https://blog.csdn.net/huakai16/article/details/77479127
代码简介:一个图片上数字的识别功能
1.数据集
在这里插入图片描述
这个数据集大小为(1797,64),表示的是有1797张图片样本,其中的64,表示的是每一个样本包含64个特征,也就是上述图片所示,将8*8的矩阵排成一行,即64列。
实验结果:
在这里插入图片描述
CNN卷积神经网络
代码链接:https://blog.csdn.net/kun1280437633/article/details/80817129
代码简介:机器一开始并不知道要识别的部分具有哪些特征,是通过与不同的卷积核相作用得到的输出值,相互比较来判断哪一个卷积核最能表现该图片的特征——比如我们要识别图像中的某种特征(比如曲线),也就是说,这个卷积核要对这种曲线有很高的输出值,对其他形状(比如三角形)则输出较低。卷积层输出值越高,就说明匹配程度越高,越能表现该图片的特征。
在这里插入图片描述
实验结果:

在这里插入图片描述

五 LSTM发展(变体)

一种比较流行的LSTM变种如下图所示,最早由Gers & Schmidhuber[1]在2000年提出。这种方法增加了“peephole connections”,即每个门都可以“窥探”到单元状态。这里,遗忘门和输入门是与上一单元状态建立连接,而输出门是与当前单元状态建立连接。
在这里插入图片描述
有一个变种取消了输入门,将新信息加入的多少与旧状态保留的多少设为互补的两个值(和为1),即:只有当需要加入新信息时,我们才会去遗忘;只有当需要遗忘时,我们才会加入新信息。
在这里插入图片描述
另外一个值得关注的变种,叫做Gated Recurrent Unit(GRU),最早由Cho, et al.[2]在2014年提出。这种方法将遗忘门和输入门连入了一个“更新门”(update gate),同时也合并了隐藏状态,最终的结果比标准LSTM简单一些,并且越来越受欢迎。
在这里插入图片描述
这些只是一些最著名的lstm变体。还有很多其他的,比如姚等人提出了Depth Gated RNNs [3](2015)。还有一些完全不同的方法来处理长期依赖关系,比如 Koutnik, et al. (2014)[4] 提出的Clockwork RNNs。文章LSTM: A Search Space Odyssey[5]也给出了一些变体LSTM的对比。

参考文章:

1 Understanding LSTM Networks-colah’s blog
http://colah.github.io/posts/2015-08-Understanding-LSTMs/
2 LSTM入门https://www.jianshu.com/p/d0a65e806696
3 LSTM模型理论总结(产生、发展和性能等)
https://blog.csdn.net/shincling/article/details/49362161#0-tsina-1-98891-397232819ff9a47a7b7e80a40613cfe1
4 LSTM如何解决梯度消失或爆炸的?
https://www.cnblogs.com/bonelee/p/10475453.html
5 RNN梯度消失和爆炸的原因
https://zhuanlan.zhihu.com/p/28687529
6 Nico’s blog Simple LSTM
http://nicodjimenez.github.io/2014/08/08/lstm.html
7 LSTM如何解决梯度消失问题 https://zhuanlan.zhihu.com/p/28749444
8 长短记忆神经网络LSTM https://www.cnblogs.com/wzdLY/p/10097113.html
9 深度学习实战教程(六):长短时记忆网络(LSTM) https://cuijiahua.com/blog/2019/01/dl-12.html
10 LSTM模型理论总结(产生、发展和性能等)
https://blog.csdn.net/shincling/article/details/49362161
11 动图形象理解
LSTM https://baijiahao.baidu.com/s?id=1615277690985871241&wfr=spider&for=pc
【1】 Recurrent Nets that Time and Count
【2】Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation
【3】Depth-Gated Recurrent Neural Networks
【4】A Clockwork RNN
【5】LSTM: A Search Space Odyssey

  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值