转自AI大本营https://blog.csdn.net/dQCFKyQDXYm3F8rB0/article/details/82922386

短时记忆

NN 会受到短时记忆的影响。如果一条序列足够长,那它们将很难将信息从较早的时间步传送到后面的时间步。 因此,如果你正在尝试处理一段文本进行预测,RNN 可能从一开始就会遗漏重要信息。

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

梯度更新规则

因此,在递归神经网络中,获得小梯度更新的层会停止学习—— 那些通常是较早的层。 由于这些层不学习,RNN 可以忘记它在较长序列中看到的内容,因此具有短时记忆。

作为解决方案的 LSTM 和 GRU

LSTM 和 GRU 是解决短时记忆问题的解决方案,它们具有称为“门”的内部机制,可以调节信息流。

这些“门”可以知道序列中哪些重要的数据是需要保留,而哪些是要删除的。 随后,它可以沿着长链序列传递相关信息以进行预测,几乎所有基于递归神经网络的技术成果都是通过这两个网络实现的。

LSTM 和 GRU 可以在语音识别、语音合成和文本生成中找到,你甚至可以用它们为视频生成字幕。对 LSTM 和 GRU 擅长处理长序列的原因,到这篇文章结束时你应该会有充分了解。

下面我将通过直观解释和插图进行阐述,并避免尽可能多的数学运算。

RNN 述评

为了了解 LSTM 或 GRU 如何实现这一点,让我们回顾一下递归神经网络。 RNN 的工作原理如下;第一个词被转换成了机器可读的向量,然后 RNN 逐个处理向量序列。

处理时,RNN 将先前隐藏状态传递给序列的下一步。 而隐藏状态充当了神经网络记忆,它包含相关网络之前所见过的数据的信息。

让我们看看 RNN 的一个细胞,了解一下它如何计算隐藏状态。 首先,将输入和先前隐藏状态组合成向量, 该向量包含当前输入和先前输入的信息。 向量经过激活函数 tanh之后,输出的是新的隐藏状态或网络记忆。

激活函数 Tanh

激活函数 Tanh 用于帮助调节流经网络的值。 tanh 函数将数值始终限制在 -1 和 1 之间。

当向量流经神经网络时,由于有各种数学运算的缘故,它经历了许多变换。 因此想象让一个值继续乘以 3,你可以想到一些值是如何变成天文数字的,这让其他值看起来微不足道。

没有 tanh 函数的向量转换

tanh 函数确保值保持在 -1~1 之间,从而调节了神经网络的输出。 你可以看到上面的相同值是如何保持在 tanh 函数所允许的边界之间的。

有 tanh 函数的向量转换

这是一个 RNN。 它内部的操作很少,但在适当的情形下(如短序列)运作的很好。 RNN 使用的计算资源比它的演化变体 LSTM 和 GRU 要少得多。

LSTM

LSTM 的控制流程与 RNN 相似,它们都是在前向传播的过程中处理流经细胞的数据,不同之处在于 LSTM 中细胞的结构和运算有所变化

这一系列运算操作使得 LSTM具有能选择保存信息或遗忘信息的功能。咋一看这些运算操作时可能有点复杂,但没关系下面将带你一步步了解这些运算操作。

核心概念

LSTM 的核心概念在于细胞状态以及“门”结构。细胞状态相当于信息传输的路径,让信息能在序列连中传递下去。你可以将其看作网络的“记忆”。理论上讲,细胞状态能够将序列处理过程中的相关信息一直传递下去。

因此,即使是较早时间步长的信息也能携带到较后时间步长的细胞中来,这克服了短时记忆的影响。信息的添加和移除我们通过“门”结构来实现,“门”结构在训练过程中会去学习该保存或遗忘哪些信息。

Sigmoid

门结构中包含着 sigmoid 激活函数。Sigmoid 激活函数与 tanh 函数类似,不同之处在于 sigmoid 是把值压缩到 0~1 之间而不是 -1~1 之间。这样的设置有助于更新或忘记信息,因为任何数乘以 0 都得 0,这部分信息就会剔除掉。同样的,任何数乘以 1 都得到它本身,这部分信息就会完美地保存下来。这样网络就能了解哪些数据是需要遗忘,哪些数据是需要保存。

接下来了解一下门结构的功能。LSTM 有三种类型的门结构:遗忘门、输入门和输出门。

遗忘门

遗忘门的功能是决定应丢弃或保留哪些信息。来自前一个隐藏状态的信息和当前输入的信息同时传递到 sigmoid 函数中去,输出值介于 0 和 1 之间,越接近 0 意味着越应该丢弃,越接近 1 意味着越应该保留。

输入门

输入门用于更新细胞状态。首先将前一层隐藏状态的信息和当前输入的信息传递到 sigmoid 函数中去。将值调整到 0~1 之间来决定要更新哪些信息。0 表示不重要,1 表示重要。

其次还要将前一层隐藏状态的信息和当前输入的信息传递到 tanh 函数中去,创造一个新的侯选值向量。最后将 sigmoid 的输出值与 tanh 的输出值相乘,sigmoid 的输出值将决定 tanh 的输出值中哪些信息是重要且需要保留下来的。

细胞状态

下一步,就是计算细胞状态。首先前一层的细胞状态与遗忘向量逐点相乘。如果它乘以接近 0 的值,意味着在新的细胞状态中,这些信息是需要丢弃掉的。然后再将该值与输入门的输出值逐点相加,将神经网络发现的新信息更新到细胞状态中去。至此,就得到了更新后的细胞状态。

输出门

输出门用来确定下一个隐藏状态的值,隐藏状态包含了先前输入的信息。首先,我们将前一个隐藏状态和当前输入传递到 sigmoid 函数中,然后将新得到的细胞状态传递给 tanh 函数。

最后将 tanh 的输出与 sigmoid 的输出相乘,以确定隐藏状态应携带的信息。再将隐藏状态作为当前细胞的输出,把新的细胞状态和新的隐藏状态传递到下一个时间步长中去。

让我们再梳理一下。遗忘门确定前一个步长中哪些相关的信息需要被保留;输入门确定当前输入中哪些信息是重要的,需要被添加的;输出门确定下一个隐藏状态应该是什么。

GRU

知道了 LSTM 的工作原理之后,来了解一下 GRU。GRU 是新一代的循环神经网络,与 LSTM 非常相似。与 LSTM 相比,GRU 去除掉了细胞状态,使用隐藏状态来进行信息的传递。它只包含两个门:更新门和重置门。

更新门

更新门的作用类似于 LSTM 中的遗忘门和输入门。它决定了要忘记哪些信息以及哪些新信息需要被添加。

重置门

重置门用于决定遗忘先前信息的程度。

这就是 GRU。GRU 的张量运算较少,因此它比 LSTM 的训练更快一下。很难去判定这两者到底谁更好,研究人员通常会两者都试一下,然后选择最合适的。

LSTM这一篇就够了相关推荐

  1. Matplotlib三维绘图,这一篇就够了

    Matplotlib三维绘图,这一篇就够了 1. 效果图 1.1 3D线效果图 1.2 3D散点效果图 1.3 3D随机颜色散点效果图 1.4 3D散点不同mark点效果图 1.5 3D线框效果图 1 ...

  2. Matplot pyplot绘制单图,多子图不同样式详解,这一篇就够了

    Matplot pyplot绘制单图,多子图不同样式详解,这一篇就够了 1. 单图单线 2. 单图多线不同样式(红色圆圈.蓝色实线.绿色三角等) 3. 使用关键字字符串绘图(data 可指定依赖值为: ...

  3. Hbase基础(特点、架构、应用场景、集群搭建、HA设计)这一篇就够了

    Hbase基础(特点.架构.应用场景.集群搭建.HA设计)这一篇就够了 1. Hbase特点 2. Hbase VS RDBMS 3. Hbase架构及版本选择 4. Hbase应用场景 5. Ntp ...

  4. Numpy掩码数组masked arrays,这一篇就够了

    Numpy掩码数组masked arrays,这一篇就够了 1. 什么是掩码数组 2.示例 2.1 一个例子走进掩码数组 2.2 创建一个数组第二个值是无效的 2.3 创建一个数组所有靠近1.e20的 ...

  5. Java 使用itextPdf7操作pdf,写入照片这一篇就够了

    Java 使用itextPdf7操作pdf,写入照片这一篇就够了 1. 效果图 1.1 M*N列图片(无边界&有边界) 1.2 图片重叠 1.3 文字背景图片 1.4 图片与文字相邻 & ...

  6. Matplitlib绘图入门1,这一篇就够了

    Matplitlib绘图入门1,这一篇就够了 1. 绘制简单的图表(标题.标签轴.刻度轴.表说明) 2. 绘图辅助函数方法,绘制多个图(随机点绘制多个子图,点状.x状等) 3. 可交互式绘图(一图单线 ...

  7. 学Redis这篇就够了!

    作者:王爷科技 https://www.toutiao.com/i6713520017595433485 Redis 简介 & 优势 Redis 数据类型 发布订阅 订阅者的客户端显示如下 事 ...

  8. 关于Jvm知识看这一篇就够了

    2016年左右的时候读了周志明<深入理解Java虚拟机:JVM高级特性与最佳实践>,读完之后受益匪浅,让我对Java虚拟机有了一个完整的认识,这是Jvm书籍中最好的读物之一. 后来结合实际 ...

  9. 一文详解JavaBean 看这篇就够了

    一文详解JavaBean 看这篇就够了 JavaBean的历史渊源 JavaBean的定义(通俗版) JavaBean应用 < jsp:useBean > < jsp:getProp ...

最新文章

  1. 取消对 null 指针“l”的引用。_C++中的引用
  2. Tomcat 8.5.29启动报TldScanner.scanJars错误问题解决办法
  3. mysql 并发 锁表_MySQL中的锁(表锁、行锁) 并发控制锁
  4. MySQL5.7 常用系统表大全
  5. linux的基础知识——信号的概念
  6. glide加载gif图不显示动画_用Python绘制会动的柱形竞赛图
  7. 【Linux】Ubuntu18.04深度学习环境配置+Google+TIM+搜狗输入法等安装方法
  8. android自定义速度仪表盘,自定义View实战:汽车速度仪表盘
  9. 计算机408考研经验分享
  10. 计算机大赛鼓励语录,比赛鼓励的话
  11. Android高德混淆问题
  12. 小马哥-----高仿苹果6 plus刷机 详细拆机主板图与开机界面图与移植触摸屏版中文rec 界面 多图展示
  13. 数据分析学习记录(五)--Paired Comparison Plot App插件的使用
  14. git fetch - git merge - git pull 指令
  15. ZZULIOJ:1134: 字符串转换
  16. iOS 使用 Admob 获取广告收入
  17. PaddlePaddle入门-1
  18. linux的中文意思,Linux中的./!$是什么意思?
  19. react-native集成阿里云推送
  20. VirtualHook: 基于VirtualApp的Java代码hook工具

热门文章

  1. 《武林外传》经典搞笑台词层出不穷
  2. 超硬核!!!神技~使用梯度下降法解二元一次方程
  3. 命令模式---烧烤点单
  4. mysql安装后默认密码
  5. iOS textfield textview 三方键盘的联想 或者 iPad键盘undo导致崩溃
  6. 公交车语音播报系统的使用说明书
  7. Linux进程概念(精讲)
  8. 小学数学学习的思想方法
  9. python各种常用符号的意思_写一篇专门介绍python中各种符号的意义及用法
  10. Go实战--golang中使用echo框架、MongoDB、JWT搭建REST API(labstack/echo、gopkg.in/mgo.v2、dgrijalva/jwt-go)