LSTM和双向LSTM讲解及实践

目录

RNN的长期依赖问题
LSTM原理讲解
双向LSTM原理讲解
Keras实现LSTM和双向LSTM

一、RNN的长期依赖问题

在上篇文章中介绍的循环神经网络RNN在训练的过程中会有长期依赖的问题,这是由于RNN模型在训练时会遇到梯度消失(大部分情况)或者梯度爆炸(很少,但对优化过程影响很大)的问题。对于梯度爆炸是很好解决的,可以使用梯度修剪(Gradient Clipping),即当梯度向量大于某个阈值,缩放梯度向量。但对于梯度消失是很难解决的。所谓的梯度消失或梯度爆炸是指训练时计算和反向传播,梯度倾向于在每一时刻递减或递增,经过一段时间后,梯度就会收敛到零(消失)或发散到无穷大(爆炸)。简单来说,长期依赖的问题就是在每一个时间的间隔不断增大时,RNN会丧失到连接到远处信息的能力。

如下图,随着时间点t的不断递增,当t时刻和0时刻的时间间隔较大的时候,t时刻的记忆ht可能已经丧失了学习连接到远处0时刻的信息的能力了。

假设X0的输入为”我住在深圳”,后面插入了很多其他的句子,然后在Xt输入了“我在市政府上班”。由于X0与Xt相差很远,当RNN输入到Xt时,t时刻的记忆ht已经丧失了X0时保存的信息了。因此在Xt时刻神经网络无法理解到我是在哪一个城市的市政府上班了。

二、LSTM原理讲解

在理论上,RNN绝对可以处理这样的长期依赖问题。人们可以仔细挑选参数来解决这类问题中的最初级形式,但在实践中,RNN却不能够成功学习到这些知识。因此,LSTM就是为了解决长期依赖问题而生的,LSTM通过刻意的设计来避免长期依赖问题。记住长期的信息在实践中是 LSTM的默认行为,而非需要付出很大代价才能获得的能力!

所有RNN都具有一种重复神经网络模块的链式的形式。在标准的RNN 中,这个重复的模块只有一个非常简单的结构,例如一个tanh层。\

LSTM同样是这样的结构,但是重复的模块拥有一个不同的结构。不同于 单一神经网络层,这里是有四个,以一种非常特殊的方式进行交互。

先介绍上图中的符号意义:

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

接下来将对LSTM进行逐步理解。在每个记忆单元(图中A)中包括细胞状态(Ct),遗忘门,输入门和输出门。这些门结构能让信息选择性通过,用来去除或者增加信息到细胞状态。

1.细胞状态(Ct)

t时刻的记忆信息,用来保存重要信息。就好像我们的笔记本一样,保存了我们以前学过的知识点。如下图的水平线从图上方贯穿运行,直接在整个链上运行,使得信息在上面流传保持不变会很容易。

2.遗忘门

控制遗忘上一层细胞状态的内容,根据上一序列的ht-1和本序列的Xt为输入,通过sigmoid激活函数,得到上一层细胞状态内容哪些需要去除,那些需要保留。值得注意的是,该输入是以向量的形式,我们希望遗忘门输出的值大多为0或1,即对向量中的每个值是完全忘记或者完全记住,因此我们使用的是sigmoid函数作为激活函数,因为该函数在许多取值范围内的值都接近于0或1(这里不能用阶跃函数作为激活函数,因为它在所有位置的梯度都为0,无法作为激活函数)。其他门使用sigmoid函数同理。因此,虽然在其他神经网络可以变换激活函数,但并不建议变换LSTM的激活函数。

以一个例子来说明遗忘门的作用:在语言模型中,细胞状态可能保存着这样的重要信息:当前主语为单数或者复数等。如当前的主语为“小明”,当输入为“同学们”,此时遗传门就要开始“干活”了,将“小明”遗忘,主语为单数形式遗忘。

3.输入门

处理当前序列位置的输入,确定需要更新的信息,去更新细胞状态。此过程分为两部分,一部分是使用包含sigmoid层的输入门决定哪些新信息该被加入到细胞状态;确定了哪些新信息要加入后,需要将新信息转换成能够加入到细胞状态的形式。所以另一部分是使用tanh函数产生一个新的候选向量。(可以这么理解,LSTM的做法是对信息都转为能加入细胞状态的形式,然后再通过第一部分得到的结果确定其中哪些新信息加入到细胞状态。)

有了遗忘门和输入门,现在我们就能把细胞状态Ct−1更新为Ct了。如下图所示,其中ft×Ct−1表示希望删除的信息,it×Ct表示新增的信息。

4.输出门

最后要基于细胞状态保存的内容来确定输出什么内容。即选择性的输出细胞状态保存的内容。类似于输入门两部分实现更新一样,输出门也是需要使用sigmoid激活函数确定哪个部分的内容需要输出,然后再使用tanh激活函数对细胞状态的内容进行处理(因为通过上面计算得到的Ct每个值不是在tanh的取值范围-1~1中,需要调整),将这两部分相乘就得到了我们希望输出的那部分。

举个例子,同样在语言模型中,细胞状态中此时包含很多重要信息,比如:主语为单数形式,时态为过去时态,主语的性别为男性等,此时输入为一个主语,可能需要输出与动词相关的信息,这个时候只需要输出是单数形式和时态为过程,而不需要输出主语性别就可确定动词词性的变化。

三、双向LSTM(Bi-directional LSTM)

如上篇文章BRNN所述同理,有些时候预测可能需要由前面若干输入和后面若干输入共同决定,这样会更加准确。因此提出了双向循环神经网络,网络结构如下图。可以看到Forward层和Backward层共同连接着输出层,其中包含了6个共享权值w1-w6。

在Forward层从1时刻到t时刻正向计算一遍,得到并保存每个时刻向前隐含层的输出。在Backward层沿着时刻t到时刻1反向计算一遍,得到并保存每个时刻向后隐含层的输出。最后在每个时刻结合Forward层和Backward层的相应时刻输出的结果得到最终的输出,用数学表达式如下:

有些问题,其实稍微看看就可以明白。

四、Keras实现LSTM和双向LSTM

Keras对循环神经网络的支持和封装在上一篇文章已经讲解了,在这里仅介绍两个模型的搭建,如有疑问请阅读keras系列的上一篇文章。

原文链接:https://blog.csdn.net/fendouaini/article/details/8019899

 

单向LSTM与双向LSTM对比,一个简单的DEMO:实现手写数字图片的识别

https://blog.csdn.net/kudou1994/article/details/80851227

LSTM和双向LSTM讲解及实践的更多相关文章

  1. 使用Keras进行深度学习:(六)LSTM和双向LSTM讲解及实践

    欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! 介绍 长短期记忆(Long Short Term Memory, ...

  2. 使用Keras进行深度学习:(五)RNN和双向RNN讲解及实践

    欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! 笔者:Ray 介绍 通过对前面文章的学习,对深度神经网络(DNN) ...

  3. PaddlePaddle︱开发文档中学习情感分类(CNN、LSTM、双向LSTM)、语义角色标注

    PaddlePaddle出教程啦,教程一部分写的很详细,值得学习. 一期涉及新手入门.识别数字.图像分类.词向量.情感分析.语义角色标注.机器翻译.个性化推荐. 二期会有更多的图像内容. 随便,帮国产 ...

  4. 【中文分词系列】 4. 基于双向LSTM的seq2seq字标注

    http://spaces.ac.cn/archives/3924/ 关于字标注法 上一篇文章谈到了分词的字标注法.要注意字标注法是很有潜力的,要不然它也不会在公开测试中取得最优的成绩了.在我看来,字 ...

  5. NLP(十九) 双向LSTM情感分类模型

    使用IMDB情绪数据来比较CNN和RNN两种方法,预处理与上节相同 from __future__ import print_function import numpy as np import pa ...

  6. 使用Keras进行深度学习:(七)GRU讲解及实践

    ####欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! 介绍 GRU(Gated Recurrent Unit) ...

  7. 基于双向LSTM和迁移学习的seq2seq核心实体识别

    http://spaces.ac.cn/archives/3942/ 暑假期间做了一下百度和西安交大联合举办的核心实体识别竞赛,最终的结果还不错,遂记录一下.模型的效果不是最好的,但是胜在“端到端”, ...

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

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

  9. keras实例学习-双向LSTM进行imdb情感分类

    源码:https://github.com/keras-team/keras/blob/master/examples/imdb_bidirectional_lstm.py 及keras中文文档 1. ...

随机推荐

  1. python相关软件安装

    一. python 3 安装 Python官网 在官网下载对应系统的安装包 安装步骤 注意:有的时候安装完后会出现"Disable path length limit"的按钮,如果 ...

  2. 使用Kerberos进行Hadoop认证

    使用Kerberos进行Hadoop认证 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Kerberos是一种网络身份验证协议.它旨在通过使用秘密密钥加密为客户端/服务器应用程序提 ...

  3. props、state、forms

    {}用来内嵌任何JS表达式JSX属性JS核心分为三大块:Es6.DOM.WindowBABEL编译器:可以在线编译html语法生成对应的react语法 **自定义组件第一个字母大写:用于区别普通的对象 ...

  4. S3cmd

    一:安装方法 #wget http://nchc.dl.sourceforge.net/project/s3tools/s3cmd/1.0.0/s3cmd-1.0.0.tar.gz #tar -zxf ...

  5. WCF 学习系列——WCF的学习基础

    这个系列的博客由WCF4 高级编程学习记录,如有错误请指正. 首先介绍一些概念: SOA: (Service-Oriented Architecture 面向服务架构),一种架构方法,也是一种编程模式 ...

  6. CTSC2010 珠宝商

    珠宝商 题目描述 Louis.PS 是一名精明的珠宝商,他出售的项链构造独特,很大程度上是因为他的制作方法与众不同.每次 Louis.PS 到达某个国家后,他会选择一条路径去遍历该国的城市.在到达一个 ...

  7. flask框架下读取mysql数据 转换成json格式API

    研究了一天 因为需要从数据库拿数据然后转换成json的格式 expose出去为 API 发现一条数据是容易,两条以上我居然搞了这么久 好歹出来了 先贴一下 后面更新 mysql的操作 比较容易了htt ...

  8. Appium环境搭建(Mac)

    为什么选择Mac做自动化测试? 既可以做iOS端的测试也可以进行Android端测试 Mac运行效率相对于Win要高很多,可以真正发挥appium的功能 环境依赖 Node.js Appium App ...

  9. JavaScript倒计时并刷新页面

    //10秒倒计时效果自动补全09,08等<div id="we">10</div>s <script> window.onload = func ...

  10. 在idea中调试spark程序-配置windows上的 spark local模式

    spark程序大致有如下运行模式: standalone模式:spark自带的模式 spark on yarn:利用hadoop yarn来做集群的资源管理 local模式:主要在测试的时候使用, 这 ...