作者 Michael Nguyen
王小新 编译自 Towards Data Science
量子位 出品 | 公众号 QbitAI

AI识别你的语音、回答你的问题、帮你翻译外语,都离不开一种特殊的循环神经网络(RNN):长短期记忆网络(Long short-term memory,LSTM)。

最近,国外有一份关于LSTM及其变种GRU(Gated Recurrent Unit)的图解教程非常火。教程先介绍了这两种网络的基础知识,然后解释了让LSTM和GRU具有良好性能的内在机制。当然,通过这篇文章,还可以了解这两种网络的一些背景。

图解教程的作者Michael Nguyen是一名AI语音助理方面的机器学习工程师。

下面,跟着量子位一起来学习一下~

短期记忆问题

RNN受限于短期记忆问题。如果一个序列足够长,那它们很难把信息从较早的时间步传输到后面的时间步。因此,如果你尝试处理一段文本来进行预测,RNN可能在开始时就会遗漏重要信息。

在反向传播过程中,RNN中存在梯度消失问题。梯度是用于更新神经网络权重的值,梯度消失问题是指随着时间推移,梯度在传播时会下降,如果梯度值变得非常小,则不会继续学习。

 梯度更新规则

因此,在RNN中,梯度小幅更新的网络层会停止学习,这些通常是较早的层。由于这些层不学习,RNN无法记住它在较长序列中学习到的内容,因此它的记忆是短期的。

关于RNN的更多介绍,可访问:
https://towardsdatascience.com/illustrated-guide-to-recurrent-neural-networks-79e5eb8049c9

解决方案:LSTM和GRU

LSTM和GRU是克服短期记忆问题提出的解决方案,它们引入称作“门”的内部机制,可以调节信息流。

这些门结构可以学习序列中哪些数据是要保留的重要信息,哪些是要删除的。通过这样做,它可以沿着长链序列传递相关信息来执行预测。几乎所有基于RNN的先进结果都是通过这两个网络实现的。LSTM和GRU经常用在语音识别、语音合成和文本生成等领域,还可用来为视频生成字幕。

当你看完这篇文章时,我相信你会对LSTM和GRU在处理长序列的突出能力有充分了解。下面我将通过直观解释和插图来进行介绍,并尽可能绕开数学运算。

直观认识

我们从一个思考实验开始。当你在网络上购买生活用品时,一般会先阅读商品评论来判断商品好坏,以确定是否要购买这个商品。

当你查看评论时,你的大脑下意识地只会记住重要的关键词。你会选择“amazing”和“perfectly balanced breakfast”这样的词汇,而不太关心“this”,“give”,“all”,“should”等字样。如果有人第二天问你评论内容,你可能不会一字不漏地记住它,而是记住了主要观点,比如“下次一定还来买”,一些次要内容自然会从记忆中逐渐消失。

在这种情况下,你记住的这些词能判定了这个餐厅的好坏。这基本上就是LSTM或GRU的作用,它可以学习只保留相关信息来进行预测,并忘记不相关的数据。

RNN回顾

为了理解LSTM或GRU如何实现这一点,接下来回顾下RNN。RNN的工作原理如下:首先单词被转换成机器可读的向量,然后RNN逐个处理向量序列。

 逐个处理向量序列

在处理时,它把先前的隐藏状态传递给序列的下一步,其中隐藏状态作为神经网络记忆,它包含相关网络已处理数据的信息。

 把隐藏状态传递给下个时间步

下面来介绍RNN中每个cell单元是如何计算隐藏状态的。

首先,将输入和先前隐藏状态组合成一个向量,向量中含有当前输入和先前输入的信息。这个向量再经过激活函数Tanh后,输出新的隐藏状态,或网络记忆。

 RNN单元

激活函数Tanh

激活函数Tanh用于帮助调节流经网络的值,且Tanh函数的输出值始终在区间(-1, 1)内。

当向量流经神经网络时,由于存在各种数学运算,它经历了许多变换。因此,想象下让一个值不断乘以3,它会逐渐变大并变成天文数字,这会让其他值看起来微不足道。

 无Tanh函数的向量变换

Tanh函数能让输出位于区间(-1, 1)内,从而调节神经网络输出。你可以看到这些值是如何保持在Tanh函数的允许范围内。

 有Tanh函数的向量变换

这就是RNN,它的内部操作很少,但在适当情况下(如短序列分析)效果很好。RNN使用的计算资源比它的演化变体LSTM和GRU少得多。

LSTM

LSTM的控制流程与RNN类似,它们都是在前向传播过程中处理传递信息的数据,区别在于LSTM单元的结构和运算有所变化。

 LSTM单元及其运算

这些运算能让LSTM具备选择性保留或遗忘某些信息的能力,下面我们将逐步介绍这些看起来有点复杂的运算。

核心概念

LSTM的核心概念为其单元状态和各种结构。

单元状态相当于能传输相关信息的通路,让信息在序列链中传递下去,这部分可看作是网络的“记忆”。理论上,在序列处理过程中,单元状态能一直携带着相关信息。因此,在较早时间步中获得的信息也能传输到较后时间步的单元中,这样能减弱短期记忆的影响。

在网络训练过程中,可通过门结构来添加或移除信息,不同神经网络都可通过单元状态上的门结构来决定去记住或遗忘哪些相关信息

Sigmoid

门结构中包含Sigmoid函数,这个激活函数与Tanh函数类似。但它的输出区间不是(-1, 1),而是(0, 1),这有助于更新或忘记数据,因为任何数字乘以0都为0,这部分信息会被遗忘。同样,任何数字乘以1都为相同值,这部分信息会完全保留。通过这样,网络能了解哪些数据不重要需要遗忘,哪些数字很重要需要保留。

 Sigmoid输出区间为(0, 1)

下面会深入介绍下不同门结构的功能。LSTM单元中有三种调节信息流的门结构:遗忘门、输入门和输出门。

遗忘门

遗忘门能决定应丢弃或保留哪些信息。来自先前隐藏状态的信息和当前输入的信息同时输入到Sigmoid函数,输出值处于0和1之间,越接近0意味着越应该忘记,越接近1意味着越应该保留。

 遗忘门操作

输入门

输入门用来更新单元状态。先将先前隐藏状态的信息和当前输入的信息输入到Sigmoid函数,在0和1之间调整输出值来决定更新哪些信息,0表示不重要,1表示重要。你也可将隐藏状态和当前输入传输给Tanh函数,并在-1和1之间压缩数值以调节网络,然后把Tanh输出和Sigmoid输出相乘,Sigmoid输出将决定在Tanh输出中哪些信息是重要的且需要进行保留。

 输入门操作

单元状态

这里已经具备足够信息来计算单元状态。首先把先前的单元状态和遗忘向量逐点相乘,如果它乘以接近0的值,则意味在新的单元状态中可能要丢弃这些值;然后把它和输入门的输出值逐点相加,把神经网络发现的新信息更新到单元状态中,这样就得到了新的单元状态。

 计算单元状态

输出门

输出门能决定下个隐藏状态的值,隐藏状态中包含了先前输入的相关信息。当然,隐藏状态也可用于预测。首先把先前的隐藏状态和当前输入传递给Sigmoid函数;接着把新得到的单元状态传递给Tanh函数;然后把Tanh输出和Sigmoid输出相乘,以确定隐藏状态应携带的信息;最后把隐藏状态作为当前单元输出,把新的单元状态和新的隐藏状态传输给下个时间步。

 输出门操作

这里总结下,遗忘门能决定需要保留先前步长中哪些相关信息,输入门决定在当前输入中哪些重要信息需要被添加,输出门决定了下一个隐藏状态。

代码示例

这里还提供了一个用Python写的示例代码,来让大家能更好地理解这个结构。

  1. 首先,我们连接了先前的隐藏状态和当前输入,这里定义为变量combine;

  2. 把combine变量传递到遗忘层中,以删除不相关数据;

  3. 再用combine变量创建一个候选层,用来保留可能要添加到单元状态中的值;

  4. 变量combine也要传递给输出层,来决定应把候选层中的哪些数据添加到新的单元状态中;

  5. 新的单元状态可根据遗忘层、候选层和输入层和先前的单元状态来计算得到;

  6. 再计算当前单元输出;

  7. 最后把输出和新的单元状态逐点相乘可得到新的隐藏状态。

从上面看出,LSTM网络的控制流程实际上只是几个张量操作和一个for循环。你还可以用隐藏状态进行预测。结合这些机制,LSTM能在序列处理过程中有选择性地保留或遗忘某些信息。

GRU

介绍完LSTM的工作原理后,下面来看下门控循环单元GRU。GRU是RNN的另一类演化变种,与LSTM非常相似。GRU结构中去除了单元状态,而使用隐藏状态来传输信息。它只有两个门结构,分别是更新门和重置门。

 GRU单元结构

更新门

更新门的作用类似于LSTM中的遗忘门和输入门,它能决定要丢弃哪些信息和要添加哪些新信息。

重置门

重置门用于决定丢弃先前信息的程度。

这两部分组成了GRU,它的张量操作较少,因此训练它比LSTM更快一点。在选择网络时很难判断哪个更好,研究人员通常会两个都试下,通过性能比较来选出更适合当前任务的结构。

总结

总而言之,RNN适用于处理序列数据和预测任务,但会受到短期记忆的影响。LSTM和GRU是两种通过引入门结构来减弱短期记忆影响的演化变体,其中门结构可用来调节流经序列链的信息流。目前,LSTM和GRU经常被用于语音识别、语音合成和自然语言理解等多个深度学习应用中。

如果你对这方面很感兴趣,作者还列出一些干货链接,可以从更多角度来理解LSTM和GRU结构。

用python来实现GRU和LSTM网络

http://www.wildml.com/2015/10/recurrent-neural-network-tutorial-part-4-implementing-a-grulstm-rnn-with-python-and-theano

理解长短期记忆模型

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

最后,附上这篇文章的原文链接和视频版:

原文:

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

加入社群

量子位AI社群开始招募啦,欢迎对AI感兴趣的同学,在量子位公众号(QbitAI)对话界面回复关键字“交流群”,获取入群方式;

此外,量子位专业细分群(自动驾驶、CV、NLP、机器学习等)正在招募,面向正在从事相关领域的工程师及研究人员。

进专业群请在量子位公众号(QbitAI)对话界面回复关键字“专业群”,获取入群方式。(专业群审核较严,敬请谅解)

诚挚招聘

量子位正在招募编辑/记者,工作地点在北京中关村。期待有才气、有热情的同学加入我们!相关细节,请在量子位公众号(QbitAI)对话界面,回复“招聘”两个字。

量子位 QbitAI · 头条号签约作者

վ'ᴗ' ի 追踪AI技术和产品新动态

超生动图解LSTM和GPU:拯救循环神经网络的记忆障碍就靠它们了!相关推荐

  1. 9 循环神经网络——具有记忆功能的网络(2)

    9-25 rnnwordtest 通过让RNN网络对一段文字的训练学习来生成模型,最终可以使用机器生成的模型来表达自己的意思. wordstest.txt (样本,放在代码同级目录下): 在尘世的纷扰 ...

  2. 9 循环神经网络——具有记忆功能的网络(1)

    9-23 yuyinchall 准备一批带有文字标注的语音样本,构建BiRNN网络,通过该语料样本进行训练,实现一个能够识别语音的神经网络模型 程序: import numpy as np impor ...

  3. 循环神经网络(RNN、LSTM、GRU)

    循环神经网络(RNN.LSTM.GRU) 目录 循环神经网络(RNN.LSTM.GRU) 概述: 计算: LSTM(长短记忆模型): GRU:

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

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

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

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

  6. 用c语言实现循环神经网络,浅谈LSTM循环神经网络

    姓名:程祖晗 学号:19021210938 [嵌牛导读]人工神经网络(ANN)由大量相互连接的神经元或称节点组成,这些节点经过网络中的大量加权连接,将数据进行相互通信,实现了神经网络的记忆特性.在常规 ...

  7. MindSpore循环神经网络

    MindSpore循环神经网络 一. 神经网络的组成 神经元模型:首先简单的了解以下构成神经网络的最基础单元:神经元.每个神经元与其它神经元相连,处于激活状态时,就会向相连的神经元发送相应信号.从而改 ...

  8. 循环神经网络(RNN)简介

    人工神经网络介绍参考: https://blog.csdn.net/fengbingchun/article/details/50274471 卷积神经网络介绍参考: https://blog.csd ...

  9. 第七篇:循环神经网络

    阅读本文之前,大家可以稍微看一下这篇文章,有助于理解:浅谈RNN,LSTM和GRU 目录 循环神经网络 (RNN) RNN 展开 RNN 训练 语言模型--解决了吗? 长短期记忆 (LSTM) LST ...

最新文章

  1. 全面分析Web应用程序安全漏洞——《黑客攻防技术宝典:web实战篇》
  2. python将字典内容存入mysql
  3. 刚体运动中变换矩阵的逆
  4. SQL2000中因为选定的用户拥有对象,所以无法除去该用户.
  5. 与、或、短路或、自增、自减、的执行过程
  6. Nginx出现403 forbidden
  7. C#中FuncT,TResult的用法和Lambda表达式
  8. CSS节选——选择器
  9. 华师 计算机系统 作业,华师网络学院作业答案-计算机组成原理问答题
  10. 【机器学习】Andrew Ng——前言
  11. 这个路由器漏洞已存在12年,可影响全球数百万台设备引发供应链攻击
  12. warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8): No such file or directory
  13. matlab 绘制三维离散点云,并根据Z值大小着色,matlab怎样画颜色随着Z大小变化的三维散点图
  14. Atitit 文件远程传输读写协议 scp http ftp nfs webdav smb D:\Program Files\Git\usr\bin\scp.exe 4.密码安全策略不完善 在
  15. python 3d绘图kmeans_使用python绘制3d的图形
  16. 服务器bios界面usb无线网卡,修改BIOS添加网卡白名单问题
  17. XML语言的基本语法-Java Web
  18. HTML5期末大作业:京东商城网站设计——京东商城购物网站(4页) 基于Html+Css+javascript的网页制作(购物主题)
  19. 工作中常见的方法和法则(简单的法则不简单)
  20. Win10 如何删除系统盘大文件hiberfil.sys

热门文章

  1. 别人家的程序员是如何使用 Java 进行 Web 抓取的? 1
  2. 上传excel腾讯云服务器,使用SpringBoot上传文件到腾讯云
  3. plsql 往视图传参数_我们可以将参数传递给SQL中的视图吗?
  4. php关键技术,基于Apache+MySQL+PHP的关键技术分析
  5. java商城项目_javaweb实战之商城项目开发(一)
  6. yml连接sqlserver_Mybatis-plus连接操作SQLServer数据库(基于Maven项目)
  7. 诺基亚自带36个铃声_vivo手机的6个隐藏功能,快开启,帮你玩转vivo
  8. java重装机兵机甲咆哮_重装机兵之机甲咆哮流程攻略
  9. java反射取实体字符串_JAVA反射机制 通过反射 Field类获取和修改对象类的字符串值...
  10. script标签中的crossorigin属性