简介

LSTM(Long short-term memory,长短期记忆)是一种特殊的RNN,主要是为了解决长序列训练过程中的梯度消失问题。以下先从RNN介绍。

简说RNN

RNN(Recurrent Neural Network,循环神经网络)是一种处理序列数据的神经网络。下图是它的结构:

从上图可以看出,RNN循环获取输入序列,并保存上一次输入的计算结果,与当前输入进行计算后,将计算结果输出并保存当前的计算结果,这样不断循环输入并计算,即可获取上文信息。

RNN内部网络如下图所示,从图中可以看出,在神经元内部的计算过程:先将上一个神经元细胞的输出ht-1与当前状态下神经元细胞的输入xt拼接后进行tan计算。

注:输出的ht-1(下图中的紫色圆圈)通常是将ht-1输入到一个线性层(主要是进行维度映射),然后使用softmax进行分类得到需要的数据。具体的计算方式要看模型的使用方式。

RNN优点:它能处理序列数据,并且有记忆能力,能够利用上文信息。

RNN缺点:

  • 梯度消失:对于获取长距离依赖的效果不是很好(即如果上文信息离当前输入距离太远的话,理论上它是能够记得上文信息,但是事实上并不是这样,所以它并不能很好地处理长距离依赖问题)
  • 梯度爆炸
  • RNN较难训练

注:长距离依赖处理效果不佳的原因是使用tanh或者relu作为激活函数。(如果是sigmoid函数则不会)

LSTM结构

LSTM也是一种RNN,因此它也是一种循环结构,不同的是RNN神经元内部只用tan层进行计算,而LSTM是有4个全连接层进行计算的,LSTM的内部结构如下图所示。 

上图中符号的含义如下图所示,黄色方框类似于CNN中的激活函数操作,粉色圆圈表示点操作,单箭头表示数据流向,下图中第四个符号表示两个向量的连接操作,第五个符号表示向量的拷贝操作,且上图中的σ表示sigmoid层(该层的输出时0-1的值,0表示不能通过,1表示能通过)。

现在来描述LSTM的内部操作,具体内容如下图所示:

LSTM的核心是细胞状态——最上层的横穿整个细胞的水平线,它通过门来控制信息的增加或者删除。

那么什么是门呢?门是一种用来选择信息通过与否的方式,它由一个sigmoid层和点乘操作组成。LSTM共有三个门,分别是遗忘门,输入门和输出门,具体内容如下所述:

(1)遗忘门:遗忘门决定丢弃哪些信息,输入是上一个神经元细胞的计算结果ht-1以及当前的输入向量xt,二者联接并通过遗忘门后(sigmoid会决定哪些信息留下,哪些信息丢弃),会生成一个0-1向量Γft(维度与上一个神经元细胞的输出向量Ct-1相同),Γft与Ct-1进行点乘操作后,就会获取上一个神经元细胞经过计算后保留的信息。

(2)输入门:表示要保存的信息或者待更新的信息,如上图所示是ht-1与xt的连接向量,经过sigmoid层后得到的结果Γit,这就是输入门的输出结果了。

但是接下来我们要计算该神经元细胞的输出结果,即新细胞的更新状态:Ct,Ct = Ct-1· Γf + Γit · ~ct(其中~ct = tanh(ht-1xt)),文字描述是:输入门的计算结果点乘 ht-1与xt的连接向量经过tanh层计算的结果后,再与上一个神经元细胞经过计算后保留的信息进行相加,则是最终要输出的Ct

(3)输出门:输出门决定当前神经原细胞输出的隐向量ht,ht与Ct不同,ht要稍微复杂一点,它是Ct进过tanh计算后与输出门的计算结果进行点乘操作后的结果,用公式描述是:ht = tanh(ct) · Γot

LSTM具体实现步骤[5]

1、首先,输入上一个神经元细胞输出的隐藏层向量和当前神经元细胞的输入,并将其连接起来。

2、将步骤1中的结果传入遗忘门中,该层将删除不相关的信息。

4、一个备选层将用步骤1中的结果创建,这一层将保存可能的会加入细胞状态的值或者说信息。

3、将步骤1中的结果传入输入门中,这一层决定步骤4的备选层中哪些信息应该加入到细胞状态中去。

5、步骤2、3、4计算结束后,用这三个步骤计算后的向量和上一个神经元细胞传出的细胞状态向量来更新当前细胞的细胞状态。

6、结果就被计算完了。

7、将结果和新的细胞状态进行点乘则是当前细胞状态的隐向量。

LSTM如何避免梯度消失与梯度爆炸

RNN中的梯度消失/爆炸与CNN中的含义不同,CNN中不同的层有不同的参数,每个参数都有自己的梯度;而RNN中同样的权重在各个时间步中共享,所以最终的梯度等于各个时间步的梯度和。因此,RNN中的梯度不会消失,它只会遗忘远距离的依赖关系,而被近距离的梯度所主导。但是LSTM中的梯度传播有很多条路径,最主要的一条是当前细胞的状态更新这一过程,该过程中只有逐元素的相乘和相加操作,梯度流最稳定,因此基本不会发生梯度消失或者梯度爆炸;但是其他的传播路径依然有梯度消失或者爆炸风险,而最终的梯度计算是各个梯度路径的和,因此LSTM仍然有梯度消失或者爆炸的风险,只是这个风险被大幅降低了。

LSTM变种-GRU

GRU是LSTM的变种,它也是一种RNN,因此是循环结构,相比LSTM而言,它的计算要简单一些,计算量也降低,但是二者的效果却不能一概而论,需要针对不同的case进行尝试才能知道哪一个模型效果更好。GRU使用隐向量进行信息交换(LSTM使用细胞状态),它有2个门:重置门和更新门。

如上图所示,现分别介绍两个门:

  • 重置门:用来决定需要丢弃哪些上一个神经元细胞的信息,它的计算过程是将Ct-1与当前输入向量xt进行连接后,输入sigmoid层进行计算,结果为S1,再将S1与Ct-1进行点乘计算,则结果为保存的上个神经元细胞信息,用C’t-1表示。

公式表示为:C’t-1 = Ct-1 · S1S1 = sigmoid(concat(Ct-1,Xt))

  • 更新门:更新门类似于LSTM的遗忘门和输入门,它决定哪些信息会丢弃,以及哪些新信息会增加。

总结

LSTM优点:LSTM降低了梯度消失或者梯度爆炸的风险,并且比RNN具有更强的长距离依赖能力。

LSTM缺点:

  • LSTM处理长距离依赖的能力依然不够,因此Transformer横空出世,它具有比LSTM更强的长距离依赖处理能力。
  • 它的计算很费时。每个细胞中都有4个全连接层(MLP),因此如果LSTM的时间跨度很大的话,计算量会很大也很费时。

参考资料

[1] https://zhuanlan.zhihu.com/p/32085405

[2] https://www.jianshu.com/p/95d5c461924c

[3] https://www.zhihu.com/question/34878706

[4] https://r2rt.com/written-memories-understanding-deriving-and-extending-the-lstm.html(待学习)

[5] https://towardsdatascience.com/illustrated-guide-to-lstms-and-gru-s-a-step-by-step-explanation-44e9eb85bf21

[NLP]LSTM理解的更多相关文章

  1. nlp语义理解的一点儿看法

    nlp领域里,语义理解仍然是难题! 给你一篇文章或者一个句子,人们在理解这些句子时,头脑中会进行上下文的搜索和知识联想.通常情况下,人在理解语义时头脑中会搜寻与之相关的知识.知识图谱的创始人人为,构成 ...

  2. LSTM理解

    简介 LSTM(Long short-term memory,长短期记忆)是一种特殊的RNN,主要是为了解决长序列训练过程中的梯度消失问题.以下先从RNN介绍. 简说RNN RNN(Recurrent ...

  3. 基于pytorch的CNN、LSTM神经网络模型调参小结

    (Demo) 这是最近两个月来的一个小总结,实现的demo已经上传github,里面包含了CNN.LSTM.BiLSTM.GRU以及CNN与LSTM.BiLSTM的结合还有多层多通道CNN.LSTM. ...

  4. 学习AI之NLP后对预训练语言模型——心得体会总结

    一.学习NLP背景介绍:      从2019年4月份开始跟着华为云ModelArts实战营同学们一起进行了6期关于图像深度学习的学习,初步了解了关于图像标注.图像分类.物体检测,图像都目标物体检测等 ...

  5. 自然语言处理NLP学习笔记一:概念与模型初探

    前言 先来看一些demo,来一些直观的了解. 自然语言处理: 可以做中文分词,词性分析,文本摘要等,为后面的知识图谱做准备. http://xiaosi.trs.cn/demo/rs/demo 知识图 ...

  6. 小样本利器2.文本对抗+半监督 FGSM & VAT & FGM代码实现

    小样本利器2.文本对抗+半监督 FGSM & VAT & FGM代码实现 上一章我们聊了聊通过一致性正则的半监督方案,使用大量的未标注样本来提升小样本模型的泛化能力.这一章我们结合FG ...

  7. [翻译]Primer on Cognitive Computing(认知计算入门)

    Source Kelly J., Primer on Cognitive Computing 20150216. 侵删,联系方式:zhoujiagen\@gmail.com. 按A candidate ...

  8. 资源 | 数十种TensorFlow实现案例汇集:代码+笔记

    选自 Github 机器之心编译 参与:吴攀.李亚洲 这是使用 TensorFlow 实现流行的机器学习算法的教程汇集.本汇集的目标是让读者可以轻松通过案例深入 TensorFlow. 这些案例适合那 ...

  9. 数十种TensorFlow实现案例汇集:代码+笔记(转)

    转:https://www.jiqizhixin.com/articles/30dc6dd9-39cd-406b-9f9e-041f5cbf1d14 这是使用 TensorFlow 实现流行的机器学习 ...

随机推荐

  1. 技术干货丨通过wrap malloc定位C/C++的内存泄漏问题

    摘要:用C/C++开发的程序执行效率很高,但却经常受到内存泄漏的困扰.本文提供一种通过wrap malloc查找memory leak的思路. 用C/C++开发的程序执行效率很高,但却经常受到内存泄漏 ...

  2. Python 默认参数 关键词参数 位置参数

    def StudentInfo(country='中国', name): print('%s,%s' % (name, country)) StudentInfo('美国', '大卫') 上述代码报错 ...

  3. Spring-boot 启动报错 调试小技巧

    描述: 我们在启动spring-boot,spring-cloud 项目时,是不是经常 遇到报错,但是在控制台 没有能找到 具体 报错信息,只是 提示,启动失败,缺乏具体的报错信息,这样就很不方便我们 ...

  4. 【XCTF】Cat

    标签:宽字节.PHP.Django.命令执行 解题过程 目录扫描没有发现任何可疑页面. 测试输入许多域名,均没有反应:输入ip地址得到回显. 猜测为命令执行,尝试使用管道符拼接命令. 测试:|.&am ...

  5. 数据可视化之powerBI基础(四)深入了解PowerBI的工具提示功能

    https://zhuanlan.zhihu.com/p/36804592 在PowerBI上个月的更新中,增加了工具提示功能,这项功能允许您将自己的可视化作品放置到工具提示中,通过鼠标悬停的方式来展 ...

  6. IOS10 window.navigator.geolocation.getCurrentPosition 无法定位问题

    在iOS 10中,苹果对webkit定位权限进行了修改,所有定位请求的页面必须是https协议的. 如果是非https网页,在http协议下通过HTML5原生定位接口会返回错误,也就是无法正常定位到用 ...

  7. C# 字段初始值无法引用非静态字段、方法或属性( 类内部变量初始化)

    问题:字段初始值设定项无法引用非静态字段.方法或属性的问题 在类中  变量赋值其他变量报错? public class TestClass{  public TestClass()  {  }  pu ...

  8. Vue你不得不知道的异步更新机制和nextTick原理

    前言 异步更新是 Vue 核心实现之一,在整体流程中充当着 watcher 更新的调度者这一角色.大部分 watcher 更新都会经过它的处理,在适当时机让更新有序的执行.而 nextTick 作为异 ...

  9. 普通list和树状list互转

    import java.util.ArrayList; import java.util.List; public class TreeNode { private String id; privat ...

  10. 集成Facebook SDK之Facebook登录

    前言 这几天应公司需求,需要在项目中接入facebook的登录,现在闲下来后再次巩固一下! 准备工作 保证自己的网络已经翻墙,能够进入Facebook网页 准备一个FB的开发者账号,如果没有可以免费申 ...