看了一些LSTM的博客,都推荐看colah写的博客《Understanding LSTM Networks》 来学习LSTM,我也找来看了,写得还是比较好懂的,它把LSTM的工作流程从输入到输出整个撸了一遍,清晰地展示了整个流程,不足之处就是那个语言模型的例子不知道到底在表达什么。

But!

我觉得邱锡鹏老师的书写得更好!我又要开始推荐这本免费的书了:《神经网络与深度学习》。这本书第六章循环神经网络的LSTM部分,阐述了为什么要引入门控机制、LSTM的工作流程、LSTM的数学表达式、LSTM它为什么就叫这个名儿以及其他变体,数学公式和图都清晰明了,全是干货。粉丝在视频上看到自己的爱豆会想舔屏,我看这本书的时候想舔书。这本书比那本被吹上天的花书也好太多!真是低调的实力派,强推!

决定按照邱锡鹏老师的书来整理这部分知识点。

一、为什么要在循环神经网络中引入门控机制?

引入门控机制是为了缓解循环神经网络中的长期依赖问题

回顾一下,如果t时刻的预测yt依赖于t-k时刻的输入xt-k,当时间间隔k比较大时,容易出现梯度消失或梯度爆炸的问题,那么循环神经网络就难以学习到如此久远的输入信息。在这种情况下,当目前的预测又需要用到比较久远的信息时,就会出现长期依赖问题。

但是如果我们为了学习到非常久远的信息,而把所有过去时刻输入的信息都存储起来的话,会造成隐状态h上存储信息的饱和与重要信息的丢失。为此,一种比较好的方案是引入门控机制来控制信息的累积速度,包括有选择的加入新信息,并有选择地遗忘之前积累的信息。这一类网络称为基于门控的循环神经网络(Gated RNN)。比较经典的基于门控的循环神经网络有长短期记忆网络(LSTM)和门控循环单元网络(GRU)。

二、长短期记忆网络(LSTM)

(一)LSTM的网络结构

在标准的RNN模型中,第t时刻的隐状态输出ht是由如下公式计算得到的:

U、W、b是神经网络的参数,f(•)是非线性的激活函数,假设为Tanh函数。这一切计算是在一个隐藏层中完成的,这个隐藏层里就是用Tanh层做了非线性变换,如下图所示:

那么,在LSTM中,就是对这个隐藏层A进行了精心设计,添加了除Tanh层以外的东西,来避免长期依赖问题,如下图所示:

好,那接下来看,LSTM在这个隐藏层中到底添加了什么东西,做了哪些改进。

(二)LSTM的网络改进

相对于传统的RNN,LSTM的网络结构有两个改进:1是加入了新的内部状态,2是引入了门机制。下面将用这个图来解释LSTM的运作流程,ct就表示当前的内部状态,三个σ(•)则表示三种门。

1、新的内部状态

LSTM网络引入了一个新的内部状态ct,一方面进行线性的循环信息传递,比如图中的ct-1从左往右传递的过程,另一方面非线性地输出信息给隐藏层的外部状态ht ,比如图中ct从上往下的传递过程。这个内部状态ct的作用就是记录到当前时刻t为止所有的历史信息。传递的过程中会进行哪些计算,这里暂且按下不表。

2、门机制

LSTM网络引入门机制来控制信息传递的路径,一共有三个门:遗忘门ft,输入门it,输出门ot。LSTM网络中的门不是一个二值变量(即只能取0或1),而是取值在(0,1)之间的“软门”,表示以一定的比例让信息通过。

  • 三个门的作用为

当ft=0,it=1时,包含历史信息的内部状态ct-1被丢弃,历史信息被清空,此时的内部状态ct只记录了t-1时刻的信息,也就是候选状

经过输入 门it控制后留下的信息。

当ft=1,it=0时,内部状态ct只复制了前一个内部状态ct-1中的历史信息,而不写入由xt带来的新信息。

当然这三个门是不会取到0或1这种极端值的。

  • 三个门的计算公式如下

每个门都选择sigmoid激活函数σ(•),输出区间为(0,1),xt为当前时刻的输出,ht-1为上一时刻的外部状态。W*,U*,b*表示三个

门(三个神经层)中待学习的参数,*∈{i, f, o}。

(三)LSTM网络的时间循环单元结构的计算过程

1、首先利用上一时刻的外部状态ht-1和当前时刻的输入xt,计算出三个门;

2、然后利用上一时刻的外部状态ht-1和当前时刻的输入xt,计算出候选状态:

3、结合遗忘门ft、输入门it、上一时刻的内部状态ct-1和候选状态,计算当前的内部状态ct

4、把当前内部状态ct扔进tanh激活函数中,结合输出门ot,将内部状态的信息传递给外部状态ht

再次对照下面这个图,结合上面这四个步骤,那么LSTM网络的计算过程就比较清楚了。外部状态ht最终以两条路径进行下一步传递:一条路径是跳出了这个框,从下往上输出给了另一隐藏层或者输出层;另一条路径是按时间循环,传递给了下一时刻,用来计算ht+1。下面这个图只表示了第2条路径。

通过LSTM的内部状态记录所有时刻的历史信息,整个网络就可以建立较长距离的时序依赖关系。

以上的工作流程可以用简洁的公式概括为:

(四)什么是长短期记忆?

在循环神经网络中,记忆能力分为短期记忆、长期记忆和长短期记忆。

1、短期记忆

短期记忆指简单循环神经网络中的隐状态h。因为隐状态h存储了历史信息,但是隐状态每个时刻都会被重写,因此可以看做是一种短期记忆(short-term memory)。

2、长期记忆

长期记忆指神经网络学习到的网络参数。因为网络参数一般是在所有“前向”和“后向”计算都完成后,才进行更新,隐含了从所有训练数据中学习到的经验,并且更新周期要远远慢于短期记忆,所以看做是长期记忆(long-term memory)。

3、长短期记忆

在LSTM网络中,由于遗忘门的存在,如果选择遗忘大部分历史信息,则内部状态c保存的信息偏于短期,而如果选择只遗忘少部分历史信息,那么内部状态偏于保存更久远的信息,所以内部状态c中保存信息的历史周期要长于短期记忆h,又短于长期记忆(网络参数),因此称为长短期记忆(long short-term memory)。

三、LSTM的变体:GRU

对LSTM的门机制进行改进可以得到多种变体,而GRU(Gated Recurrent Unit,门控循环单元网络)就是其中一种比LSTM网络更简单的循环神经网络。

GRU网络对LSTM网络的改进有两个方面:

1、将遗忘门和输入门合并为一个门:更新门,此外另一门叫做重置门。

2、不引入额外的内部状态c,直接在当前状态ht和历史状态ht-1之间引入线性依赖关系。

GRU网络的结构如下图所示,第一眼看上去感觉好复杂啊,哪里简单了,比LSTM复杂多了。

好,那接下来按输入数据xt和历史状态ht-1在GRU网络中流动的过程,来阐述GRU网络的工作流程。

1、计算重置门rt和候选状态

重置门rt用来控制候选状态的计算是否依赖于上一时刻的状态ht-1

当前时刻的候选状态为:

2、计算更新门zt和当前状态ht

更新门zt用来控制当前状态ht需要从历史状态ht-1中保留多少信息,以及需要从候选状态中接收多少新信息。

然后计算出隐状态ht

可以看到,当zt=0,rt=1时,隐状态ht为简单循环神经网络中的计算公式,GRU网络退化为简单循环神经网络。

此外,把求隐状态ht的公式整理如下,可以看到当前状态ht和历史状态ht-1之间存在线性关系,也存在非线性关系,在一定程度上可以缓解梯度消失问题。

参考资料:

1、邱锡鹏:《神经网络与深度学习》

2、colah:《Understanding LSTM Networks》

网址:http://colah.github.io/posts/2015-08-Understanding-LSTMs/

循环神经网络之LSTM和GRU的更多相关文章

  1. 循环神经网络(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 ...

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

    1.tf.nn.dynamic_rnn()函数 参考:http://www.360doc.com/content/17/0321/10/10408243_638692495.shtml 参考:http ...

  3. 循环神经网络与LSTM网络

    循环神经网络与LSTM网络 循环神经网络RNN 循环神经网络广泛地应用在序列数据上面,如自然语言,语音和其他的序列数据上.序列数据是有很强的次序关系,比如自然语言.通过深度学习关于序列数据的算法要比两 ...

  4. TensorFlow之RNN:堆叠RNN、LSTM、GRU及双向LSTM

    RNN(Recurrent Neural Networks,循环神经网络)是一种具有短期记忆能力的神经网络模型,可以处理任意长度的序列,在自然语言处理中的应用非常广泛,比如机器翻译.文本生成.问答系统 ...

  5. 通过keras例子理解LSTM 循环神经网络(RNN)

    博文的翻译和实践: Understanding Stateful LSTM Recurrent Neural Networks in Python with Keras 正文 一个强大而流行的循环神经 ...

  6. Recurrent Neural Network系列1--RNN(循环神经网络)概述

    作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 本文翻译自 RECURRENT NEURAL NETWORKS T ...

  7. TensorFlow——循环神经网络基本结构

    1.导入依赖包,初始化一些常量 import collections import numpy as np import tensorflow as tf TRAIN_DATA = "./d ...

  8. 机器学习(ML)九之GRU、LSTM、深度神经网络、双向循环神经网络

    门控循环单元(GRU) 循环神经网络中的梯度计算方法.当时间步数较大或者时间步较小时,循环神经网络的梯度较容易出现衰减或爆炸.虽然裁剪梯度可以应对梯度爆炸,但无法解决梯度衰减的问题.通常由于这个原因, ...

  9. 十 | 门控循环神经网络LSTM与GRU(附python演练)

    欢迎大家关注我们的网站和系列教程:http://panchuang.net/ ,学习更多的机器学习.深度学习的知识! 目录: 门控循环神经网络简介 长短期记忆网络(LSTM) 门控制循环单元(GRU) ...

随机推荐

  1. Socket.io文字直播聊天室的简单代码

    直接上代码吧,被注释掉的主要是调试代码,和技术选型的测试代码 var app = require('express')(); var server = require('http').Server(a ...

  2. android 开发中,经常遇到http://dl-ssl.google.com/ 无法访问的问题解决

    window - android sdk manager 在选择某个版本sdk安装时,总是出现http://dl-ssl.google.com/无法链接的问题,那是因为qiang太高了,不过也还是有办 ...

  3. Hive入门学习--HIve简介

    现在想要应聘大数据分析或者数据挖掘岗位,很多都需要会使用Hive,Mapreduce,Hadoop等这些大数据分析技术.为了充实自己就先从简单的Hive开始吧.接下来的几篇文章是记录我如何入门学习Hi ...

  4. jenkins构建基于gradle的springboot项目CI采坑(采用jar方式部署)

    试了一堆插件,最后用的还是 publish over SSH jenkins基本配置不多说了,就是配置一下git仓储,配置一下gradle执行命令 clean bootRepackage 之后执行Se ...

  5. sudo apt-get 与 yum安装有啥区别

    rpm包和deb包是两种Linux系统下最常见的安装包格式,在安装一些软件或服务的时候免不了要和它们打交道. rpm包主要应用在RedHat系列包括 Fedora等发行版的Linux系统上, deb包 ...

  6. Java 面试知识点解析(二)——高并发编程篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  7. MySQL技术内幕 InnoDB存储引擎(笔记)

    1. InnoDB 体系架构 其中,后台程序主要负责刷新内存池中的数据,保证缓冲池中的内存缓存的是最近的数据. 此外将已经修改的数据刷新到磁盘文件,同时保证在数据库发生异常的时候Innodb能恢复正常 ...

  8. jquery和ajax的关系详细介绍【转】

    jquery和ajax的关系详细介绍 http://www.jb51.net/article/43965.htm

  9. 单片机开发——01工欲善其事必先利其器(Keil软件安装破解)

        本文是博主<单片机开发>博客第一篇文章,主要讲述51单片机编程软件Keil uVision4的安装及破解过程. 1. Keil uVision4安装包文件      PATH:链接 ...

  10. 由ping所引发的思考~

    今天看了掘金一片关于ping原理的文章,https://juejin.im/entry/5af8d5e651882565bd25581c?utm_source=gold_browser_extensi ...