RNN&&LSTM学习总结

RNN总结


前言

该篇博客是笔者学习李宏毅老师课程后所写的学习笔记,如文中有错误,感谢大家指正

一、解决的问题

  我们以前学过的一些神经网络如CNN、全连接神经网络,虽然能完成特征提取、分类预测的任务,但是它在work的过程中并不能记住前文,例如在下面翻译句子这个例子中,两个对应位置除动词外其他完全相同,但语义完全相反的句子,普通的网络不能识别出他们的区别,为了解决这个问题,我们引入Recurrent Neural Networks——RNN
在这里插入图片描述

二、RNN基本模型

1.基本神经元

  RNN的一个基本神经元不仅由输入、输出、隐藏层组成,它还有一个存储单元,用来存储前一个神经元计算后传输进来的值,这样就使得一个输出不是仅仅与对应的单输入有关,而是它前面的神经元输入都能对它产生影响(单向传播的RNN)。
下面我们通过一个样例来具体说明RNN的存储单元是如何工作的:
参数说明:在这个神经元中所有的权重都是1,没有修正项,所有的激活函数都是线性函数,存储单元的初始值是0。
(1)第一次两个输入为1,通过线性激活函数,得到隐藏层中两个值为2
(2)将存储单元中的值0,更新为隐藏层中的值2
(3)两个隐藏层中的值通过线性函数计算,两个输出值为4
(4)第二次两个输入为1,通过线性激活函数,将值2传入隐藏层
(5)存储单元中的两个2一起两个隐藏层,与新传入的2相加,得到隐藏层中的值为6
(6)将存储单元中的值更新为6
(7)通过线性激活函数,得到输出为12
在这里插入图片描述
在这里插入图片描述
  由上例我们可以发现,两次同样的输入,因为存储单元的存在,两个输出完全不同,由此可以看出,对于RNN序列输入的顺序很重要,对一个输入序列的内部顺序做出微调,输出的结果可能大相径庭。

2.RNN整体结构

  通过上文对一个神经元如何工作做分析后,我们对RNN一个神经元的存储记忆功能有了初步的了解,下面我们简单介绍RNN网络如果工作(一个局部)

2.1将隐藏层中的值传入

  以一个五单词输入的序列为例,将 X 1 X^1 X1输入后计算出隐藏层的值 a 1 a^1 a1 y 1 y^1 y1,并将 a 1 a^1 a1的值放入存储单元,在计算 X 2 X^2 X2时将存储单元中的值一起传入 a 2 a^2 a2中计算,这样就是一个输入不仅对它对应的输出有影响,对它后面的输出都会产生影响。
在这里插入图片描述

2.2将输出的值传入

  上文介绍的Elman Network在工作过程中将隐藏层中的值记忆并传播,二Jordan Network将上一层的输出记忆,并在矩阵运算后传入下一层的隐藏层中

在这里插入图片描述

2. 3双向传播

  前面介绍的两种RNN网络虽然有记忆功能,但是只能是前面的输入对后面的输出造成影响,而后面的输入无法对前面的输出造成影响,为了解决这个问题,也可以使用双向传播的方式。在双向传播的网络中,让正向传播和反向传播的隐藏共同作用,一起得到输出 y y y
在这里插入图片描述

三、 Long Short-Term Memory 长短期记忆 LSTM

  LSTM是普通RNN的一个进阶版,对存储单元进行改进。
在这里插入图片描述  LSTM的一个存储单元有四个输入和一个输出,在单输出单输出的基础上,添加了三个控制门,分别为input gate、output gate和forget gate,通过三个控制门的共同作用完成对memory中内容存储、输入的控制
在这里插入图片描述  上图中输入门为 z z z ,输入控制门为 z i z_i zi,遗忘控制门为 z f z_f zf(遗忘门打开表示记住内容,遗忘门关闭表示忘记内容,与正常语义相反) ,输出控制门为 z o z_o zo
计算过程如下:
(1)输入 z z z通过激活函数后得到 g ( z ) g(z) g(z)
(2)输入控制门的 z i z_i zi通过激活函数后得到 f ( z i ) f(z_i) f(zi)
(3)将 g ( z ) g(z) g(z) f ( z i ) f(z_i) f(zi)相乘,并传给存储单元
(4)遗忘控制们的 z f z_f zf通过激活函数后得到 f ( z f ) f(z_f) f(zf),并将存储单元memory中的值c与 f ( z f ) f(z_f) f(zf)相乘
(5)将memory中的值c更新为 g ( z ) f ( z i ) g(z)f(z_i) g(z)f(zi)+ c f ( z f ) cf(z_f) cf(zf),记作 c ′ c^{'} c
(6)将 c ′ c^{'} c通过激活函数后得到 h ( c ′ ) h(c^{'}) h(c)
(6)将输出控制门的 z o z_o zo通过激活函数得到 f ( z o ) f(z_o) f(zo)
(7)将 h ( c ′ ) h(c^{'}) h(c) f ( z o ) f(z_o) f(zo)相乘并输入
在这里,激活函数使用sigmoid函数,因为它的输出在0和1之间,0表示控制们关闭,1表示控制门开启


  下面我们用一个具体计算案例说明计算过程:(图中只计算了输入部分,遗忘和输出请读者自行计算)
在这里插入图片描述
  在这个例子中,函数g和h使用线性函数,f都使用sigmoid函数。
通过计算过程我们可以看出:
(1)只有当输入门打开时,输入值才能传入到memory中;
(2)当遗忘门打开时,会将上一时刻的内容和此刻的输入相加,否则控制门的值为零,与 c c c相乘后为0,遗忘上一时刻的值,此时memory只有新传入的值;
(3)只有当输出门打开时,值才能输出

注意:输出控制门、输出控制门、遗忘控制门的开关是通过数据集学习而来,不是人为设置的,即图片中的权重和bias校正项是学习更新得出


在这里插入图片描述  在LSTM的网络中,一个输入 x t x^t xt 送入以后,要先分别和四个权重向量相乘,生成四个新的值 z z z z i z^i zi z f z^f zf z o z^o zo,再将其分别送入激活函数中进行计算。
  不难发现,RNN训练时直接把向量或序列送入模型,即可通过神经元完成计算;而LSTM是四输入一输出,除了input,还有三个控制门,这使得LSTM的参数量是普通网络的四倍,这也使得它可能发生过拟合。
  在实际的网络中输入向量通常不只是 x t x^t xt,而是将上一个节点memory中存储的 c t − 1 c^{t-1} ct1和送入激活函数前的 h t − 1 h^{t-1} ht1排列起来,一起作为输入
在这里插入图片描述

四、 RNN的学习

1.损失函数

在通过网络预测出输出 y i y^i yi,将yi用向量表示,在这个向量中只有它对应的词义是1,其他都是零,将其与标签比对,从而算出损失函数(笔者需要再深入学习,此处描述可能不严谨)
在这里插入图片描述

2.困难的训练过程

  和普通的Neural Networks相同,RNN通过计算损失函数、反向传播的方式进行参数更新,但在实践中发现RNN的网络很难训练,每次迭代的总损失值变化很大。这是因为在RNN的训练中,一个参数被反复使用,所以一个参数发生微小的变化,最终可能带来巨大的变化,即发生了梯度消失,或梯度爆炸。
  用LSTM可以有效改善,原因如下:使用LSTM可以解决梯度消失的问题,因为RNN中每个时间点的memory都会被洗掉,然后放入新的值,但是LSTM是以前的memory中的 c t − 1 c^{t-1} ct1乘上遗忘控制门的 f ( z f ) f(z_f) f(zf)再和新送入memory的 g ( z ) f ( z i ) g(z)f(z_i) g(z)f(zi)相加,所以如果现在的权重能影响到memory中的值的话,一但发生影响,这个影响会始终存在,而RNN采用重置的方式更新memory,产生的影响会消失。所以LSTM可以解决梯度消失的问题。
  注意:当初用LSTM解决梯度消失的时候,没有forget gate,所以现在要通过参数保证遗忘门多数情况下都是开着的。
  GRU只用两个门,是简单版的LSTM,参数少三分之一,过拟合的情况缓解。
将input和forget门联动,input门打开,forget门关闭,即旧的值清掉新的值才能放进来

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值