循环神经网络之LSTM、GRU

1. 什么是 LSTM?

LSTM(Long short-term memory,长短期记忆)是一种特殊的RNN,主要是为了解决长序列训练过程中的梯度消失梯度爆炸问题。简单而言,LSTM是相比与普通RNN在更长序列数据中表现更好的一类循环神经网络。

2. 深入理解 LSTM 结构

首先使用 LSTM 的当前输入状态 xtx_txt​ 和上一个传递下来的状态 ht−1h_{t-1}ht−1​ 拼接得到 4 个门控状态
zf=σ(Wf⋅[ht−1,x]+bf)=σ(Wf⋅ht−1+Wf⋅x+bf)z_f=\sigma(W_f \cdot[h_{t-1},x]+b_f)=\sigma(W_f \cdot h_{t-1} + W_f \cdot x+b_f) zf​=σ(Wf​⋅[ht−1​,x]+bf​)=σ(Wf​⋅ht−1​+Wf​⋅x+bf​)

zi=σ(Wi⋅[ht−1,x])+bi)=σ(Wi⋅ht−1+Wi⋅x+bi)z_i=\sigma(W_i \cdot [h_{t-1},x]) + b_i)=\sigma(W_i \cdot h_{t-1}+W_i \cdot x + b_i) zi​=σ(Wi​⋅[ht−1​,x])+bi​)=σ(Wi​⋅ht−1​+Wi​⋅x+bi​)

z=tanh(W⋅[ht−1,xt]+b)=tanh(W⋅ht−1+W⋅xt+b)z=tanh(W \cdot [h_{t-1},x_t]+b)=tanh(W \cdot h_{t-1}+W \cdot x_t + b) z=tanh(W⋅[ht−1​,xt​]+b)=tanh(W⋅ht−1​+W⋅xt​+b)

z=σ(Wo⋅[ht−1,xt]+bo)=σ(Wo⋅ht−1+Wo⋅xt+bo)z=\sigma(W_o \cdot [h_{t-1},x_t]+b_o)=\sigma(W_o \cdot h_{t-1}+W_o \cdot x_t + b_o) z=σ(Wo​⋅[ht−1​,xt​]+bo​)=σ(Wo​⋅ht−1​+Wo​⋅xt​+bo​)

其中,zfz_fzf​、ziz_izi​、zoz_ozo​ 是由拼接矩阵乘以权重矩阵之后,再通过一个 sigmoidsigmoidsigmoid 激活函数转换成 0 到 1 之间的数值,作为一种门控状态。而 zzz 是将结果通过一个 tanhtanhtanh 激活函数转化成 -1 到 1 之间的值。

如果从传统的循环神经网络(Naive RNN)的角度来理解 zzz,可以发现它与 RNN Cell 的计算过程基本是一致的。与其他门控单元不同的是,它使用了 tanhtanhtanh 激活函数,相当于一个候选记忆细胞,主要记录当前输入 xtx_txt​ 和 隐藏状态 ht−1h_{t-1}ht−1​ 的信息。

下面进一步介绍这四个状态在 LSTM 内部的使用。LSTM 内部主要的三个阶段:

  1. 忘记阶段:这个阶段主要是对上一个节点传进来的输入 ct−1c_{t-1}ct−1​ 进行选择性遗忘。简单来说就是“忘记不重要的,记住重要的”;具体来说就是通过计算得到的 zfz_fzf​ 来作为忘记门控,来控制上一个状态的 ct−1c_{t-1}ct−1​ 哪些需要保留哪些需要遗忘。

    注:zfz_fzf​ 中的 fff 表示 forgetforgetforget ,所以 zfz_fzf​ 也被称为遗忘门

  2. 选择记忆阶段:这个阶段将这个阶段的输入有选择性地“记忆”。主要会对输入 xtx_txt​ 进行选择记忆。哪些重要则着重记录下来,哪些不重要,则少记一下。当前的输入内容由前面计算得到的 zzz 表示(候选记忆细胞)。而选择记忆的门控信号则是由 ziz_izi​ 来进行控制的。

    注:ziz_izi​ 中的 iii 表示 infomationinfomationinfomation,所以 ziz_izi​ 也被称为输入门

  3. 输出阶段:这个阶段将决定哪些将会被当做当前状态的输出。
    ct=zf⊙ct−1+zi⊙zc_t=z_f⊙c_{t-1}+z_i⊙z ct​=zf​⊙ct−1​+zi​⊙z
    这一步计算相当于将上一个节点的重要信息当前节点选择的记忆信息进行融合。
    ht=zo⊙tanh(ct)yt=σ(Wqht+bq)h_t=z_o⊙tanh(c_t) \\ y_t=\sigma(W_qh_t+b_q) ht​=zo​⊙tanh(ct​)yt​=σ(Wq​ht​+bq​)
    主要是通过 zoz_ozo​ 来进行控制。并且还对上一阶段得到的信息进行放缩处理(通过一个tanh激活函数进行变换),相当于输出门

    上面使用的 ⊙ 符号表示矩阵按元素乘法。

3. LSTM 微总结

LSTM 内部结构通过门控状态来控制传输系统,记住需要长期记忆的,忘记不重要的信息,至于如何让门控具备这种记忆状态,那就是由机器自己学习(self-learning)。

与传统的RNN只有一种记忆叠加不同,LSTM对很多需要 “长期记忆” 的任务来说,尤其好用。LSTM 因为引入了很多门控单元,导致参数变多(包含了5个权重向量和5个偏置项),尽管每一个 LSTM Cell 也是共享参数的,但也使得训练难度加大了很多。因此,很多时候我们往往会使用效果与 LSTM 相当的,但参数更少的 GRU 来构建大训练量的模型。


4. 什么是 GRU?

GRU(Gate Recurrent Unit) 也是循环神经网络的一种,与 LSTM 一样,也是为了解决长期记忆和反向传播中梯度消失和梯度爆炸等问题提出了的。

在正式介绍 GRU 之前,我们先思考一个问题:GRU 和 LSTM 在很多情况下表现的性能相差无几,那么为什么还要使用 GRU(于2014年提出)而不是相对经受了更多考验的 LSTM(于1997年提出)呢?

在一篇论文[R-NET: MACHINE READING COMPREHENSION WITH SELF-MATCHING NETWORKS(2017)]中明确指出:We choose to use Gated Recurrent Unit(GRU)(Cho et al., 2014) in our experiment since it performs similarly to LSTM(Hochreiter & Schmidhuber, 1997) but is computationally cheaper.

与 LSTM 相比,使用 GRU 能够达到相当的效果,并且相比之下 GRU 更容易进行训练,能够很大程度上提高训练效率,因此很多时候惠更倾向于使用 GRU。

5. 深入理解 GRU 结构

GRU 的输入输出结构与经典的RNN基本相同。有一个当前输入的 xtx_txt​ ,和上一个节点传递下来的隐状态(hidden state) h(t−1)h_(t-1)h(​t−1) ,这个隐状态包含了之前节点的相关信息

结合 xtx_txt​ 和 ht−1h_{t-1}ht−1​,GRU 会得到当前隐藏节点的输出 yty_tyt​ 和传递给下一个节点的隐状态 hth_tht​。

首先,我们先通过上一个传输下来的状态 ht−1h_{t-1}ht−1​ 和当前节点的输入 xtx_txt​ 来获取两个门控状态,我们把它称为重置门控 (reset gate)更新门控(update gate)

  1. 重置门控:

r=σ(Wr⋅[ht−1,xt]+br)r=\sigma(W_r \cdot [h_{t-1},x_t]+b_r) r=σ(Wr​⋅[ht−1​,xt​]+br​)

  1. 更新门控:

z=σ(Wz⋅[ht−1,xt]+bz)z=\sigma(W_z \cdot [h_{t-1},x_t]+b_z) z=σ(Wz​⋅[ht−1​,xt​]+bz​)

注:σ\sigmaσ 为 sigmoidsigmoidsigmoid 函数,通过这个函数可以将数据变换为 0-1 范围内的数值,从而用于充当门控信号。

得到门控信号之后,首先使用重置门控来得到 “重置” 之后的数据 ht−1′h'_{t-1}ht−1′​,ht−1′=ht−1⊙rh'_{t-1}=h_{t-1}⊙rht−1′​=ht−1​⊙r,再将 ht−1′h'_{t-1}ht−1′​ 与输入 xtx_txt​ 进行拼接,再通过一个 tanhtanhtanh 激活函数来将数据缩放到 -1~1 的范围内。
h′=tanh(W⋅[ht−1′,xt]+b)h'=tanh(W \cdot [h'_{t-1},x_t]+b) h′=tanh(W⋅[ht−1′​,xt​]+b)
这里的 h′h'h′ 主要是包含了当前输入的 xtx_txt​ 数据,有针对性地对 h′h'h′ 添加到当前的隐藏状态,相当于 “记忆了当前时刻的状态”,类似于 LSTM 的选择记忆阶段

GRU 最关键的步骤称为 “更新记忆” 阶段。这个阶段,我们同时进行了遗忘和记忆两个步骤,使用了先前得到的更新门控 zzz (update gate).

更新表达式:
ht=z⊙ht−1+(1−z)⊙h′yt=Wo⋅ht+boh_t=z⊙h_{t-1}+(1-z)⊙h' \\ y_t=W_o \cdot h_t + b_o ht​=z⊙ht−1​+(1−z)⊙h′yt​=Wo​⋅ht​+bo​
这里的门控状态 zzz 的范围为 0~1。门控信号越接近1,代表 “记忆” 下来的数据越多;而越接近0则代表 “遗忘” 的越多。

GRU 使用同一个门控 (update gate) 就可以同时进行遗忘和选择记忆(LSTM则使用到了多个门控单元):

  1. z⊙ht−1z⊙h_{t-1}z⊙ht−1​:表示对上一个节点的隐状态选择性 “遗忘”。这里的 zzz 可以想象成遗忘门(forget gate),忘记 ht−1h_{t-1}ht−1​ 维度中一些不重要的信息。
  2. (1−z)⊙h′(1-z)⊙h'(1−z)⊙h′:表示对包含当前节点信息的 h′h'h′ 进行选择性 “记忆”。与上面类似,这里的 (1−z)(1-z)(1−z) 同理也会忘记 h′h'h′ 维度中的一些不重要的信息。或者,这里我们更应当看作是对 h′h'h′ 维度中的某些信息进行选择。
  3. ht=z⊙ht−1+(1−z)⊙h′h_{t}=z⊙h_{t-1}+(1-z)⊙h'ht​=z⊙ht−1​+(1−z)⊙h′:综合上述,这一步的操作就是忘记传递下来的 ht−1h_{t-1}ht−1​ 中的某些维度信息,并加入当前节点输入的某些维度信息。

可以看到,这里的遗忘 zzz 和选择记忆 (1−z)(1-z)(1−z) 是联动的,也就是说,对于传递进来的维度信息,我们会进行选择性遗忘,则遗忘了多少权重 (z)(z)(z),我们就会使用包含当前输入的 h′h'h′ 中对应的权重 (1−z)(1-z)(1−z) 进行弥补,以保持一种 “恒定” 状态。

6. LSTM 与 GRU 的关系

GRU 是在 2014 年提出来的,而LSTM是1997年。它们的提出都是为了解决普通 RNN 存在的问题,那么 GRU 难免会参考 LSTM 的内部结构:

  1. h′h'h′ 实际上可以看成对应于 LSTM 的 cell state;上一个节点传下来的 ht−1h_{t-1}ht−1​ ,则对应于LSTM 的 hidden state ;
  2. zzz 对应的则是 LSTM 中的 zfz_fzf​ (forget gate),那么 (1−z)(1-z)(1−z) 似乎就可以看成是选择记忆门 ziz_izi​;

总结:GRU 的输入输出结构与普通的RNN相似,其中的内部思想与LSTM相似。与 LSTM 相比,GRU 内部少了一个 “门控单元”,参数比 LSTM 少,但是却也能够达到与 LSTM 相当的功能。如果考虑到硬件的计算能力和时间成本,因而很多时候我们也就会选择更加 “实用” 的GRU。

最后贴上自己所做的一些总结性笔记(提取码:6666 )百度云

循环神经网络之LSTM、GRU相关推荐

  1. YJango的循环神经网络——实现LSTM YJango的循环神经网络——实现LSTM YJango YJango 7 个月前 介绍 描述最常用的RNN实现方式:Long-Short Term Me

    YJango的循环神经网络--实现LSTM YJango 7 个月前 介绍 描述最常用的RNN实现方式:Long-Short Term Memory(LSTM) 梯度消失和梯度爆炸 网络回忆:在< ...

  2. 循环神经网络以及 LSTM 及其变体

    循环神经网络以及 LSTM 一.循环神经网络 1.1 RNN 简介概述 1.2 RNN 的图示讲解 1.3 RNN 的前向传播 二.LSTM ( Long Short-Term Memory) 2.1 ...

  3. RNN循环神经网络 、LSTM长短期记忆网络实现时间序列长期利率预测

    全文链接:http://tecdat.cn/?p=25133 2017 年年中,R 推出了 Keras 包 _,_这是一个在 Tensorflow 之上运行的综合库,具有 CPU 和 GPU 功能(点 ...

  4. 循环神经网络_漫谈循环神经网络:LSTM、GRU

    知乎视频​www.zhihu.com 简单循环神经网络的局限性 循环神经网络横向结构也是借助激活函数进行传递的: 上图是循环神经网络按时间步展开,而如果一次处理的时间步过长,即从左到右的层数很深,那么 ...

  5. 循环神经网络(LSTM和GRU)(1)

    循环神经网络的简单实现: import tensorflow as tf x=[1,2] state=[0.0,0.0] w_cell_state=np.array([[0.1,0.2],[0.3,0 ...

  6. 循环神经网络(三)(常用循环神经网络,LSTM、GRU,文本生成)

    文章目录 长短期记忆网络(LSTM) 模型定义 模型特点 用 LSTM 生成文本 门控循环单元网络(GRU) 模型定义 模型特点 References 长短期记忆网络(LSTM) 模型定义 简单循环神 ...

  7. 深度学习~循环神经网络RNN, LSTM

    目录 1. 循环神经网络RNN 1.1 RNN出现背景 1.2 RNN概念 2. LSTM 2.1 LSTM出现背景 2.2 LSTM结构 参考 1. 循环神经网络RNN 1.1 RNN出现背景 pr ...

  8. 深度学习笔记——循环神经网络RNN/LSTM

    原文来自知乎专栏NLP进阶之路,作者韦伟. 以下文章是摘录了原文部分内容的学习笔记,侵删. 循环神经网络(Rerrent Neural Network) RNN是神经网络的一种,RNN对具有序列特性的 ...

  9. 交通预见未来(1):循环神经网络之LSTM,不只有七秒钟的记忆

    文章名称:<Long short-term memory neural network for traffic speed prediction using remote microwave s ...

最新文章

  1. R语言psych包的fa函数对指定数据集进行因子分析(输入数据为相关性矩阵)、指定进行正交旋转、斜交旋转提取因子、比较正交旋转和斜交旋转之间的差异、因子结构矩阵、因子模式矩阵和因子相关矩阵之间的关系
  2. 实现点击在当前位置画一个黑点,打印出当前点击的坐标
  3. 使用python moviepy提取视频中的音频,同时对音频数据进行数据可视化分析
  4. 计算机辅助教学 林筑英,视频教学制作技巧.doc
  5. 第一章 安装OpenResty(Nginx+Lua)开发环境
  6. Hybris里类似ABAP Netweaver的DDIC - 如何做data type的extension
  7. 知乎超热门话题:为什么要考985?
  8. Python ' ~ ' (取反) 操作符解释
  9. 并发编程 - 线程 - 1.线程queue/2.线程池进程池/3.异步调用与回调机制
  10. 烟道机器人_力荐顺义区清洗烟道价格多少钱值得信赖
  11. elasticjob接入方式和管理端使用
  12. 基于内容推荐算法的java,协同过滤推荐算法Java-DEMO
  13. java未来三年的工作计划_个人未来三年工作计划
  14. python菜单怎么做_Python 城市菜单详解(超详解)
  15. 算法系列讲解之:社交网络之共同好友模型讲解
  16. Windows--下载系统镜像
  17. php 工资条系统下载,发工资条软件
  18. 数据结构与算法--图的广度优先搜索 (BFS)
  19. 华为鸿蒙os的内核是Linux,谈华为鸿蒙内核和操作系统
  20. 高手怎么抓热点,每天几点操作?

热门文章

  1. hec-ras的geometric Data对话框中如何加载GIS背景图层
  2. canvas实现粒子跟随鼠标动画
  3. Windows7更改自己的计算机名,方便局域网内的用户识别
  4. 【调试技巧】strace神器的使用方法详解与实践
  5. 什么是人脉和人脉资源
  6. MYSQL学习笔记06:列属性[NULL,default,comment],主键,自增长,唯一键,数据库设计规范[范式(1NF,2NF,3NF),逆规范化],表关系[1V1,1VN,NVN]
  7. java 控制台输出时间_Java获取时间打印到控制台代码实例
  8. 【概率题汇总】互联网公司概率面试题整理
  9. 亿道丨三防平板丨加固平板丨三防加固平板丨改善资产管理
  10. 【JAVA SE】 JAVA基础强袭之路 数据类型及其转换和提升全面讲解(猛男细节+保底一个收藏)