循环神经网络RNN(含LSTM,GRU)小综述
文章目录
- 前言
- 一、RNN循环神经网络
- 1.1 RNN的结构
- 1.2 BRNN的结构
- 1.3 梯度消失和梯度爆炸
- 二、LSTM
- 2.1 引子
- 2.2 LSTM单元
- 2.3 LSTM的补充理解方式和变种(☆)
- 2.3.1一步步的拆解LSTM
- 2.3.1LSTM变种
- 三、GRU
- 3.1 GRU介绍
- 3.2 GRU详解
- 3.2.1 更新门
- 3.2.2 重置门
- 3.2.3 当前记忆内容
- 3.2.4 当前时间步的最终记忆
- 参考文献
前言
全连接神经网络(Full Connected Neural Networks, FCNN)具有局限性,其同一层的节点之间是无连接的,当需要用到序列之前时刻的信息时,FCNN无法办到。由于FCNN一个序列的不同位置之间无法共享特征,所以只能单独的处理一个个的输入,即前一个输入和后一个输入之间没有关系,无法处理在时间或空间上有前后关联的输入问题。
重点介绍RNN的发展历史、模型改进及其应用领域,总结了RNN模型的特点及相关工作,旨在为刚进入该领域的初学者和对RNN进行深入研究的学者提供参考资料
一、RNN循环神经网络
1.1 RNN的结构
RNN的结构图如图:
右方是左方图的展开形式,对于每一个时间步t,都有来自前面时间步的信息,并加以权重w用于控制,在每一个时间步中,从输入X,加上权重Wx,和来自上一步的激活值a,以及激活值权重Wa,经过激活函数输出y,然后再对y使用损失函数计算损失。
但是这种做法会造成,在任一时间步t中处理时,只参考或者说获取了前面时间步的特征,序列后方的信息特征没有学习到,这无疑会造成问题,所以我们引入了BRNN(双向循环神经网络)
1.2 BRNN的结构
BRNN的结构如图:
BRNN的隐藏层需要记录两个值。A参与正向计算,A’参与反向计算。最终的输出值y取决于A和A’。
RNN的前向计算 按照时间序列展开,然后使用基于时间的反向传播算法(Back Propagation Through Time, BPTT)对网络中的参数进行更新,也是目前循环神经网络最常用的训练算法。
1.3 梯度消失和梯度爆炸
这样我们解决了如何学习序列后方特征的问题,但是RNN仍然存在问题,在训练RNN的过程中容易出现梯度爆炸和梯度消失的问题,导致在训练时梯度的传递性不高,即梯度不能在较长序列中传递,从而使RNN无法检测到长序列的影响。对于基于梯度的学习需要模型参数θ和损失函数L之间存在闭式解,根据估计值和实际值之间的误差来最小化损失函数,那么在损失函数上计算得到的梯度信息可以传回给模型参数并进行相应修改。
假设对于序列x1,x2,x3……,xt ,通过St=F(s,x)将上一时刻的状态映射到下 一 时刻的状态S。T时刻损失函数L关于参数的梯度为:
假设循环网络若要可靠地存储信息即∣ft′∣<1|f_{t}\prime|<1∣ft′∣<1 也意味着当模型能够保持长距离依赖z时,其本身也处于梯度消失的情况下。随着时间跨度增加,梯度也会以指数级收敛于0。当 ∣ft′∣>1|f_{t}\prime|>1∣ft′∣>1发生梯度爆炸的现象, 网络也陷入局部不稳定。
梯度爆炸问题是指在RNN中,每一步的梯度更新可能会积累误差,最终梯度变得非常大,以至于RNN的权值进行大幅更新,程序将会收到NaN错误。一般而言,梯度爆炸问题更容易处理,可以通过设置一个阈值来截取超过该阈值的梯度。
梯度消失的问题更难检测,可以通过使用其他结构的RNNs来应对,例如长短期记忆网络(long short-term memory, LTSM)和门控循环单元(Gated Recurrent Unit, GRU)。
二、LSTM
2.1 引子
使用梯度下降方法来优化RNN的一个主要问题就是梯 度在沿着序列反向传播的过程中可能快速消失。已经有大量的研究工作用于解决RNN中存在的训练问题并且提出了关于RNN的变体LSTM.
2.2 LSTM单元
LSTM的关键是细胞状态,表示细胞状态的这条线水平的穿过图的顶部。
细胞的状态类似于输送带,细胞的状态在整个链上运行,只有一些小的线性操作作用其上,信息很容易保持不变的流过整个链。
LSTM确实具有删除或添加信息到细胞状态的能力,这个能力是由被称为门(Gate)的结构所赋予的。门(Gate)是一种可选地让信息通过的方式。 它由一个Sigmoid神经网络层和一个点乘法运算组成。Sigmoid神经网络层输出0和1之间的数字,这个数字描述每个组件有多少信息可以通过, 0表示不通过任何信息,1表示全部通过
LSTM单元中有三种类型的门控,分别为:输入门i、遗忘门f和输出门o,门控可以看作一层全连接层,LSTM对信息的存储和更新正是由这些门控来实现。
更具体地说, 门控是由sigmoid函数和点乘运算实现,门控并不会提供额外的信息。门控的一般形式可以表示为:
g(x)=σ(Wx+b)g(x)=\sigma(Wx + b)g(x)=σ(Wx+b)其中
σ(x)=11+e−x\sigma(x)=\frac{1}{1+e^{-x}} σ(x)=1+e−x1
Sigmoid 函数,是机器学习中常用的非线性激活函数,可以将一个实值映射到区间 0 ~ 1,用于描述信息通过的多少.当门的输出值为0 ,表示没有信息通过,当值为1 则表示所有信息都可以通过。
LSTM的前向计算过程可以表示为式(1) ~ (5)。在时间步t时,LSTM的隐藏层的输入和输出向量分别为xt和ht,记忆单元为ct .输入门用于控制网络当前输入数据xt流入记忆单元的多少,即有多少可以保存到ct,其值为:
it=σ(Wxixt+Whiht−1+bi)…………(1)i_{t}=\sigma(W_{xi}x_{t}+W_{hi}h_{t-1}+b_{i})…………(1)it=σ(Wxixt+Whiht−1+bi)…………(1)
遗忘门是LSTM单元的关键组成部分,可以控制哪些信息要保留哪些要遗忘,并且以某种方式避免当梯度随时间反向传播时引发的梯度消失和爆炸问题。遗忘门控制自连接单元 ,可以决定历史信息中的哪些部分会被丢弃。即上一时刻记忆单元Ct-1中的信息对当前记忆单元Ct 的影响。
ft=σ(Wxfxt+Whfht−1+bf)…………(2)f_{t}=\sigma(W_{xf}x_{t}+W_{hf}h_{t-1}+b_{f})…………(2)ft=σ(Wxfxt+Whfht−1+bf)…………(2)ct=ft⨀ct−1+it⨀tanh(Wxcxt+Whcht−1+bc)…………(3)c_{t}=f_{t}\bigodot c_{t-1}+i_{t}\bigodot tanh(W_{xc}x_{t}+W_{hc}h_{t-1}+b_{c})…………(3)ct=ft⨀ct−1+it⨀tanh(Wxcxt+Whcht−1+bc)…………(3)
输出门控制记忆单元ct对 当 前 输 出 值 ht的 影 响 ,即记忆单元中的哪一部分会在时间步t 输出。输出门的值如式(4) 所示 ,LSTM单元的在t时刻的输出 ht可 以 通 过 式 (5)得到。
ot=σ(Wxoxt+Whoht−1+bo)…………(4)o_{t}=\sigma(W_{xo}x_{t}+W_{ho}h_{t-1}+b_{o})…………(4)ot=σ(Wxoxt+Whoht−1+bo)…………(4)ht=ot⨀tanh(ct)…………(5)h_{t}=o_{t}\bigodot tanh(c_{t})…………(5)ht=ot⨀tanh(ct)…………(5)
2.3 LSTM的补充理解方式和变种(☆)
2.3.1一步步的拆解LSTM
LSTM的第一步是决定我们要从细胞状态中丢弃什么信息。 该决定由被称为“遗忘门”的Sigmoid层实现。它查看ht-1(前一个输出)和xt(当前输入),并为单元格状态Ct-1(上一个状态)中的每个数字输出0和1之间的数字。1代表完全保留,而0代表彻底删除。
下一步是决定我们要在细胞状态中存储什么信息。 这部分分为两步。 首先,称为“输入门”的Sigmoid层决定了我们将更新哪些值。 接下来一个tanh层创建候选向量Ct,该向量将会被加到细胞的状态中。 在下一步中,我们将结合这两个向量来创建更新值。
现在是时候去更新上一个状态值Ct−1了,将其更新为Ct。我们将上一个状态值乘以ft,以此表达期待忘记的部分。之后我们将得到的值加上 it∗C̃ t。这个得到的是新的记忆细胞的值。
最后,我们需要决定我们要输出什么。 此输出将基于我们的细胞状态,但这明显是参考了记忆细胞C的过滤版本。 首先,我们运行一个sigmoid,它决定了我们要输出的细胞状态的哪些部分。 然后,我们将单元状态通过tanh(将值规范化到-1和1之间),并将其乘以Sigmoid门的输出,至此我们只输出了我们决定的那些部分。
2.3.1LSTM变种
一个比较流行的LSTM变种是由Gers & Schmidhuber (2000)提出的,添加“peephole connections”。这意味着允许gate层去看细胞的状态。下图中所有的Sigmoid层都增加了窥视,但许多论文实现不是针对所有都增加窥探,而是有针对性的增加。这也叫做窥视孔连接.
另一种变化是使用耦合的忘记和输入门,而不是单独决定要忘记什么、添加什么,这个决定需要一起做。 只有当需要输入某些信息的时候,我们才会忘记这个位置的历史信息。只有当我们忘记一些历史信息的时候,我们才在状态中添加新的信息。
LSTM的一个稍微更显着的变化是由Cho介绍的门控循环单元(或GRU)。 它将遗忘门和输入门组合成一个统一的“更新门”。它还将单元格状态和隐藏状态合并,并进行了一些其他更改。 所得到的模型比标准LSTM模型更简单,并且越来越受欢迎。GRU将在下一节进行介绍。
三、GRU
3.1 GRU介绍
在LSTM中,引入了三个门函数:输入门、遗忘门和输出门。而在GRU中,只有两个门:更新门和重置门。模型的结构如图所示:
GRU的前向传播公式:
GRU 有两个有两个门,即一个重置门(reset gate)和一个更新门(update gate)。从直观上来说,重置门决定了如何将新的输入信息与前面的记忆相结合,更新门定义了前面记忆保存到当前时间步的量。如果我们将重置门设置为 1,更新门设置为 0,那么我们将再次获得标准 RNN 模型。使用门控机制学习长期依赖关系的基本思想和 LSTM 一致,但还是有一些关键区别:
GRU 有两个门(重置门与更新门),而 LSTM 有三个门(输入门、遗忘门和输出门)。 |
---|
GRU 并不会控制并保留内部记忆(c_t),且没有 LSTM 中的输出门。 |
LSTM 中的输入与遗忘门对应于 GRU 的更新门,重置门直接作用于前面的隐藏状态。 |
在计算输出时并不应用二阶非线性。 |
3.2 GRU详解
3.2.1 更新门
在时间步 t,我们首先需要使用以下公式计算更新门 u_t:ut=σ(Wxuxt+Whuht−1+bu)u_{t}=\sigma(W_{xu}x_{t}+W_{hu}h_{t-1}+b_{u})ut=σ(Wxuxt+Whuht−1+bu)
其中 x_t 为第 t 个时间步的输入向量,即输入序列 X 的第 t 个分量,它会经过一个线性变换(与权重矩阵 W(z) 相乘)。h_(t-1) 保存的是前一个时间步 t-1 的信息,它同样也会经过一个线性变换。更新门将这两部分信息相加并投入到 Sigmoid 激活函数中,因此将激活结果压缩到 0 到 1 之间。以下是更新门在整个单元的位置与表示方法。
更新门帮助模型决定到底要将多少过去的信息传递到未来,或到底前一时间步和当前时间步的信息有多少是需要继续传递的。这一点非常强大,因为模型能决定从过去复制所有的信息以减少梯度消失的风险。
3.2.2 重置门
本质上来说,重置门主要决定了到底有多少过去的信息需要遗忘,我们可以使用以下表达式计算:rt=σ(Wxrxt+Whrht−1+br)r_{t}=\sigma(W_{xr}x_{t}+W_{hr}h_{t-1}+b_{r})rt=σ(Wxrxt+Whrht−1+br) 该表达式与更新门的表达式是一样的,只不过线性变换的参数和用处不一样而已。下图展示了该运算过程的表示方法。如前面更新门所述,h_(t-1) 和 x_t 先经过一个线性变换,再相加投入 Sigmoid 激活函数以输出激活值。
3.2.3 当前记忆内容
现在我们具体讨论一下这些门控到底如何影响最终的输出。在重置门的使用中,新的记忆内容将使用重置门储存过去相关的信息,它的计算表达式为:
h~t=tanh(Wxhxt+Whh(rt⨀ht−1)+bh)\widetilde{h}_{t}=tanh(W_{xh}x_{t}+W_{hh}(r_{t} \bigodot h_{t-1})+b_{h})ht=tanh(Wxhxt+Whh(rt⨀ht−1)+bh) 输入 r_t 与上一时间步信息 h_(t-1) 先经过一个线性变换,即右乘矩阵 W_hh 。因为前面计算的重置门是一个由 0 到 1 组成的向量,它会衡量门控开启的大小。例如某个元素对应的门控值为 0,那么它就代表这个元素的信息完全被遗忘掉。该乘积将确定所要保留与遗忘的以前信息。将这两部分的计算结果相加再投入双曲正切激活函数中。该计算过程可表示为:
3.2.4 当前时间步的最终记忆
在最后一步,网络需要计算 h_t,该向量将保留当前单元的信息并传递到下一个单元中。在这个过程中,我们需要使用更新门,它决定了当前记忆内容 h’t 和前一时间步 h(t-1) 中需要收集的信息是什么。这一过程可以表示为:ht=(1−ut)∗ht−1+ut∗h~th_{t}=(1-u_{t})*h_{t-1}+u_{t}*\widetilde{h}_{t}ht=(1−ut)∗ht−1+ut∗ht
u_t 为更新门的激活结果,它同样以门控的形式控制了信息的流入。1 - u_t 与 h_(t-1) 的 乘积表示前一时间步保留到最终记忆的信息,该信息加上当前记忆保留至最终记忆的信息就等于最终门控循环单元输出的内容。
门控循环单元不会随时间而清除以前的信息,它会保留相关的信息并传递到下一个单元,因此它利用全部信息而避免了梯度消失问题。
参考文献
[1]
作者:colah
链接:https://colah.github.io/posts/2015-08-Understanding-LSTMs/
来源:Understanding LSTM Networks(Github)
[2]
作者:Jerry_wl
链接:https://www.jianshu.com/p/4b4701beba92
来源:简书
[3]
作者:杨丽,吴雨茜,王俊丽,刘义理
论文:《循环神经网络研究综述》
来源:计算机应用, 2018, 38( S2): 1 - 6,26
[4]
翻译者:李亚洲
文章:《经典必读:门控循环单元(GRU)的基本概念与原理》
来源:https://www.jiqizhixin.com/articles/2017-12-24
循环神经网络RNN(含LSTM,GRU)小综述相关推荐
- 循环神经网络(RNN、LSTM、GRU)
循环神经网络(RNN.LSTM.GRU) 目录 循环神经网络(RNN.LSTM.GRU) 概述: 计算: LSTM(长短记忆模型): GRU:
- 循环神经网络RNN、LSTM、GRU实现股票预测
Tensorflow--循环神经网络RNN 循环核 TensorFlow描述循环核 循环神经网络 TensorFlow描述循环神经网络 循环计算过程 输入一个字母,预测下一个字母 输入四个连续字母,预 ...
- [Python人工智能] 十二.循环神经网络RNN和LSTM原理详解及TensorFlow编写RNN分类案例
从本专栏开始,作者正式开始研究Python深度学习.神经网络及人工智能相关知识.前一篇讲解了TensorFlow如何保存变量和神经网络参数,通过Saver保存神经网络,再通过Restore调用训练好的 ...
- 循环神经网络RNN、LSTM、GRU原理详解
一.写在前面 这部分内容应该算是近几年发展中最基础的部分了,但是发现自己忘得差不多了,很多细节记得不是很清楚了,故写这篇博客,也希望能够用更简单清晰的思路来把这部分内容说清楚,以此能够帮助更多的朋友, ...
- 自然语言处理入门实战——基于循环神经网络RNN、LSTM、GRU的文本分类(超级详细,学不会找我!!!)
1 一.实验过程 1.1 实验目的 通过这个课程项目大,期望达到以下目的: 1.了解如何对 自然语言处理 的数据集进行预处理操作. 2.初识自然语言数据集处理操作的步骤流程. 3.进一步学习RNN ...
- [深度学习-原理篇]什么是循环神经网络RNN与LSTM
1. 什么是 RNN 循环神经网络(Recurrent Neural Network,RNN)是一种以序列数据为输入来进行建模的深度学习模型,它是 NLP 中最常用的模型. 2. RNN 的结构 RN ...
- tensorflow lstm从隐状态到预测值_机器学习100天-Day2405 循环神经网络RNN(LSTM)
说明:本文依据<Sklearn 与 TensorFlow 机器学习实用指南>完成,所有版权和解释权均归作者和翻译成员所有,我只是搬运和做注解. 进入第二部分深度学习 第十四章循环神经网络 ...
- 循环神经网络RNN与LSTM
文章目录 1. 神经网络与循环神经网络 1.1 强大的功能 1.2 层级结构 1.3 多种RNN 2. LSTM 2.1 长时间依赖问题 2.2 "记忆细胞"与状态 3. LSTM ...
- 循环神经网络RNN 2—— attention注意力机制(附代码)
attention方法是一种注意力机制,很明显,是为了模仿人的观察和思维方式,将注意力集中到关键信息上,虽然还没有像人一样,完全忽略到不重要的信息,但是其效果毋庸置疑,本篇我们来总结注意力机制的不同方 ...
- CS224N笔记(四) Lecture 7:循环神经网络RNN的进阶——LSTM与GRU
本文将介绍两种比RNN更好地应对梯度消失问题的模型结构--LSTM和GRU,文章以CS224N的课件和材料为基础,重点分析他们的结构特点和梯度计算,在梯度消失的解决策略上进行了深入探究,并进一步分析它 ...
最新文章
- JavaScript_上
- matplotlib tick_params参数刻度线调整
- | ^ ~ 按位运算符
- ajax spring mvc 接收json数据,easyui ajax请求获取SpringMVC @ResponseBody返回的Json数据为什么非得eval才能通过对象获取值?...
- PacketGetAdapterNames返回false
- 主成分分析原理解释(能力工场小马哥)
- 使用 Tye 辅助开发 k8s 应用竟如此简单(三)
- 系统新模块增加需要哪些步骤_人工智能之父的问题解决策略:模块化
- servlet中servletContext的五大作用(一)
- 2021百度职业教育行业洞察
- ActiveMQ学习-Network connectors(1)
- BZOJ1925: [Sdoi2010]地精部落
- windows磁盘备份还原
- 分布式配置管理平台VS统一集中配置管理
- php扩展 ioncube组件的安装方法_安装IonCube Loader扩展方法
- java 回合制抛物线游戏_回合制抛物线射击游戏《坦克总动》重磅来袭!
- Unity3D场景转换效果
- Only one expression can be specified in the select list when the subquery is not introduced with EXI
- 【Axure高保真原型】上传表格数据
- 【Codeforces613D】Kingdom and its Cities【虚树】【Tree DP】
热门文章
- ZYNQ Vivado address editor
- python由当前时间计算上周一、周日的日期时间
- 黄教主入选!巴伦周刊TOP 30 CEO名单公布
- ICLR2020国际会议焦点论文(Spotlight Paper)列表(内含论文源码)
- pe系统下读不到服务器硬盘,WinPE系统里找不到硬盘怎么办 WinPE系统里找不到硬盘解决【详解】...
- c语言画bmp五星红旗图片,用asp程序编写一个bmp图片格式的五星红旗
- CSP-S 2019 考前复习日记
- 3w字 长文干货!100 道 Linux 常见面试题
- 海思3516对接mipi屏幕总结
- nginx启动成功,但是访问不了页面解决办法