LSTM网络学习笔记

声明:本篇博客转载于https://blog.csdn.net/v_JULY_v/article/details/89894058用于学习笔记,谢谢大佬的解读,使我受益匪浅

一、RNN

1.1 RNN(递归神经网络)

  • RNN顾名思义,递归神经网络或者循环神经网络,这种网络结构可以使用先前的事件推断后续的事件。
    序列形的数据不好用原始的神经网络处理,为了建模序列问题,RNN引入了隐状态h(hidden
    state)的概念,隐状态h可以对序列形的数据提取特征,接着再转换为输出。

(1)h1计算过程:
转载于https://blog.csdn.net/v_JULY_v/article/details/89894058

  • h1基于上一个隐藏层的状态h0和当前输入x1计算得来,ftanh、sigmoid、ReLU等非线性的激活函数,h0包含前面若干步的隐藏状态,不是之前所有。

    (2)h2计算过程:转载于https://blog.csdn.net/v_JULY_v/article/details/89894058

  • **所有RNN共有特点:**每一步的参数U、W、b都是一样的共享数据。 依次计算:

转载于https://blog.csdn.net/v_JULY_v/article/details/89894058
(3)计算输出,只通过当前隐藏层计算得出(当前隐藏层包含了之前若干层的序列输入,和之前的隐含层)。
转载于https://blog.csdn.net/v_JULY_v/article/details/89894058

  • Softmax激活函数,他把一些输入映射为0-1之间的实数,并且归一化保证和为1,因此多分类的概率之和也刚好为1。所以y1相当于输出了概率值。

    转载于https://blog.csdn.net/v_JULY_v/article/details/89894058

  • 以上就是最经典的RNN结构,是x1, x2, …xn,输出为y1, y2, …yn,输入和输出序列必须要是等长的。

1.2 RNN整体结构

  • 上面阐述RNN结构时,我们将RNN的每一步线性的连接起来,这样容易理解。由于RNN每个参数都是通用的(U、W、b),所以,线性结构可以由一个循环结构代替。如下图所示。

转载于https://blog.csdn.net/v_JULY_v/article/details/89894058

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

  • 通过上述学习,我们可以发现RNN预测相邻序列的效果可能会好于间隔序列的预测效果。如何理解呢?例如,如果我们试着预测这句话中“the clouds are in the sky”最后的这个词“sky”,我们并不再需要其他的信息,因为很显然下一个词应该是sky。在这样的场景中,相关的信息和预测的词位置之间的间隔是非常小的,RNN可以学会使用先前的信息。例如下图。

转载于https://blog.csdn.net/v_JULY_v/article/details/89894058

  • 然而,如果间隔太大,比如我们试着去预测“I grew up in France…I speak fluent French”最后的词“French”。这说明相关信息和当前预测位置之间的间隔就肯定变得相当的大。非常不幸,在这个间隔不断增大时,RNN会丧失学习到连接如此远的信息的能力。

转载于https://blog.csdn.net/v_JULY_v/article/details/89894058

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

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

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

  • 详细理解一下为什么前面的梯度下降的快,以至于序列前部分停止学习。因为RNN的隐藏层相当于层层嵌套,最初的输入x进入f中后误差是最小的,随着序列变长,f嵌套层数变多,误差会累积更多,所以会继续学习,而前部分序列恰恰相反,所以前部分的序列会产生梯度消失的问题。

  • 至于为什么会忘记前部分的内容,我想是RNN的规则决定的,由于前面提到RNN不是包含前面所有序列的信息,而是包含部分序列**(猜测便于理解:可能是前多少个还在学习更新的层继续作为输入,丢弃了梯度很小,停止学习的层)**

  • 因此,如果你正在尝试处理一段文本进行预测,RNN 可能从一开始就会遗漏重要信息。在反向传播期间,RNN
    会面临梯度消失的问题。而梯度爆炸则是因为计算的难度越来越复杂导致。

  • 由于,RNN存在上述问题,就产生了RNN的变体——LSTM,可以在一定程度上解决梯度消失和梯度爆炸这两个问题!

二、LSTM 网络

  • Long ShortTerm网络——一般就叫做LSTM——是一种RNN特殊的类型,可以学习长期依赖信息。当然,LSTM和基线RNN并没有特别大的结构不同,但是它们用了不同的函数来计算隐状态。
  • LSTM可以智能的决定哪些之前的信息和状态需要保留/记住,而哪些要被抹去。实际的应用中发现,这种方式可以有效地保存很长时间之前的关联信息。

2.1 RNN 与LSTM对比

  • RNN是简单的链式结构,重复的模块中只有一个激活函数,例如tanh层。

转载于https://blog.csdn.net/v_JULY_v/article/details/89894058

  • 激活函数 Tanh 作用在于帮助调节流经网络的值,使得数值始终限制在 -1 和 1 之间。
  • LSTM同样是这样的结构,但是重复的模块拥有一个不同的结构。具体来说,RNN是重复单一的神经网络层,LSTM中的重复模块则包含四个交互的层,三个Sigmoid和一个tanh层,并以一种非常特殊的方式进行交互。

转载于https://blog.csdn.net/v_JULY_v/article/details/89894058

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

  • 因为任何数乘以 0 都得 0,这部分信息就会剔除掉; 同样的,任何数乘以 1 都得到它本身,这部分信息就会完美地保存下来
    因记忆能力有限,记住重要的,忘记无关紧要的。

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

    转载于https://blog.csdn.net/v_JULY_v/article/details/89894058

2.2 LSTM的“记忆门”原理

  • 学过数电模电的哥们儿们可能对于这些好理解,相当于逻辑门电路,可以产生记忆功能。只不过一个是硬件实现,一个是由数学实现的。

  • LSTM的关键就是细胞状态,水平线在图上方贯穿运行。LSTM中的第一步是决定我们会从细胞状态中丢弃什么信息。LSTM有通过精心设计的称作为“门”的结构来去除或者增加信息到细胞状态的能力


转载于https://blog.csdn.net/v_JULY_v/article/details/89894058

2.2.1忘记门

  • 该忘记门会读取上一个输出h_{t-1}和当前输入x_{t},做一个Sigmoid的非线性映射,然后输出一个向量f_{t}(该向量每一个维度的值都在0到1之间,1表示完全保留,0表示完全舍弃,相当于记住了重要的,忘记了无关紧要的),最后与细胞状态C_{t-1}相乘。

转载于https://blog.csdn.net/v_JULY_v/article/details/89894058

  • f_{t} = \sigma (W_{fh}h_{t-1} + W_{fx} x_{t} + b_{f})

    转载于https://blog.csdn.net/v_JULY_v/article/details/89894058

2.2.2输入门

  • 下一步是确定什么样的新信息被存放在细胞状态中。这里包含两个部分:
  • 第一,sigmoid层称“输入门层”决定什么值我们将要更新;
  • 第二,一个tanh层创建一个新的候选值向量\tilde{C}_{t},会被加入到状态中。
  • 下一步,我们会讲这两个信息来产生对状态的更新。
  • RNN 说过是用tanh(类似的)激活函数进行循环运算的,那么输入门就要用sigmoid与tanh的结果相乘。

转载于https://blog.csdn.net/v_JULY_v/article/details/89894058

  • 首先,为便于理解图中右侧的两个公式,我们展开下计算过程,即
    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})
    转载于https://blog.csdn.net/v_JULY_v/article/details/89894058
    由输入门的输出结果以及忘记门的输出结果更新细胞状态,C_{t-1}更新为C_{t},把旧状态与f_{t}相乘,丢弃掉我们确定需要丢弃的信息,接着加上i_{t} * \tilde{C}_{t}。这就是新的候选值,根据我们决定更新每个状态的程度进行变化。

  • 忘记门和输入门控制着是否还需要将历史信息加入到细胞状态中去,每一时刻的细胞状态由前一时刻的细胞状态和当前输入序列的当前值有关系。

  • 输出门控制这一时刻的细胞状态是否输出到下一时刻。

    转载于https://blog.csdn.net/v_JULY_v/article/details/89894058 转载于https://blog.csdn.net/v_JULY_v/article/details/89894058

2.2.3 输出门

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

首先,我们运行一个sigmoid层来确定细胞状态的哪个部分将输出出去。
接着,我们把细胞状态通过tanh进行处理(得到一个在-1到1之间的值)并将它和sigmoid门的输出相乘,最终我们仅仅会输出我们确定输出的那部分。
转载于https://blog.csdn.net/v_JULY_v/article/details/89894058
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值