深度学习-循环神经网络RNN、长短期记忆LSTM、门限循环单元GRU理解

本文主要是介绍深度学习-循环神经网络RNN、长短期记忆LSTM、门限循环单元GRU理解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

循环神经网络(Recurrent Neural Network,RNN); 长短期记忆(Long Short-Term Memory, LSTM); 门限循环单元(Gated Recurrent Unit, GRU)

  • 1.循环神经网络RNN
    • 1.1.优点
    • 1.2.缺点
  • 2.长短期记忆LSTM
    • 2.1.忘记门层
    • 2.2.更新状态
    • 2.3.输出(输出信息和更新后的状态)
    • 2.4.LSTM 的变体
  • 3.门限循环单元GRU
    • 3.1.更新门
    • 3.2.重置门
    • 3.3. 当前记忆内容
    • 3.4.当前时间步的最终记忆
    • 3.5.GRU和LSTM的区别

部分参考:
朱小虎XiaohuZhu:理解 LSTM 网络
【图文并茂】RNN、LSTM、GRU、ConvLSTM、ConvGRU、ST-LSTM的总结
经典必读:门控循环单元(GRU)的基本概念与原理
Deep Learning】详细解读LSTM与GRU单元的各个公式和区别

1.循环神经网络RNN

最为原始的循环神经网络,本质就是全连接网络,只是为了考虑过去的信息,输出不仅取决于当前输入,还取决于之前的信息,也就是输出由之前的信息(也就是状态state)和此时的输入决定。
在这里插入图片描述
RNN 可以被看做是同一神经网络的多次复制,每个神经网络模块会把消息传递给下一个。所以,如果我们将这个循环展开:
在这里插入图片描述
在这里插入图片描述

1.1.优点

  • RNN 很适合处理序列数据,因为考虑了之前的信息
  • 可以和CNN一起使用得到更好的任务效果

1.2.缺点

  • 相关信息和当前预测位置之间的间隔会变大,在这个间隔不断增大时,RNN 会丧失学习到连接如此远的信息的能力。
  • 存在梯度消失、梯度爆炸问题
  • RNN较其他CNN和全连接要用更多的显存空间,更难训练

2.长短期记忆LSTM

LSTM 通过刻意的设计来避免长期依赖问题。记住长期的信息在实践中是 LSTM 的默认行为。所有 RNN 都具有一种重复神经网络模块的链式的形式。LSTM 同样是这样的结构,但是重复的模块拥有一个不同的结构。不同于 单一神经网络层,这里是有四个,以一种非常特殊的方式进行交互。
在这里插入图片描述
在这里插入图片描述
在上面的图例中,每一条黑线传输着一整个向量,从一个节点的输出到其他节点的输入。粉色的圈代表按位 pointwise 的操作,诸如向量的和,而黄色的矩阵就是学习到的神经网络层。合在一起的线表示向量的连接,分开的线表示内容被复制,然后分发到不同的位置。
LSTM 有通过精心设计的称作为“门”的结构来去除或者增加信息到细胞状态的能力。门是一种让信息选择式通过的方法。他们包含一个 sigmoid神经网络层和一个按位的乘法操作。
在这里插入图片描述
Sigmoid层输出 0 到 1 之间的数值,描述每个部分有多少量可以通过。0 代表“不许任何量通过”,1 就指“允许任意量通过”
LSTM 拥有三个门,来保护和控制细胞状态。

2.1.忘记门层

LSTM 中的第一步是决定我们会从细胞状态中丢弃什么信息。这个决定通过一个称为忘记门层完成。该门会读取ht-1和 xt,输出一个在0 到 1之间的数值给每个在细胞状态Ct-1中的数字。 1表示“完全保留”, 0表示“完全舍弃”。将旧状态与ft相乘,丢弃掉我们确定需要丢弃的信息。
在这里插入图片描述

eg:语言模型中,将一句话翻译成翻译成别的语言时,胞状态可能包含当前主语性别,因此正确的代词可以被选择出来。当我们看到新的主语,我们希望忘记旧的主语

2.2.更新状态

Ct-1更新为Ct
在这里插入图片描述

  • sigmoid层称 “输入门层” 决定什么值我们将要更新。
  • tanh层创建一个新的候选值向量,Ct,会被加入到状态中。

it*Ct为新的候选值,根据我们决定更新每个状态的程度进行变化。在语言模型的例子中,这就是我们实际根据前面确定的目标,丢弃旧代词的性别信息并添加新的信息的地方

2.3.输出(输出信息和更新后的状态)

最终,我们需要确定输出什么值。这个输出将会基于我们的细胞状态,但是也是一个过滤后的版本。
在这里插入图片描述
总结,我们上述两步可以归纳为:首先,我们运行一个sigmoid层来确定细胞状态的哪个部分将输出出去。接着,我们把细胞状态通过tanh进行处理(得到一个在-1到1之间的值)并将它和sigmoid门的输出相乘,最终我们仅仅会输出我们确定输出的那部分。
在语言模型的例子中,因为他就看到了一个 代词,可能需要输出与一个 动词 相关的信息。例如,可能输出是否代词是单数还是负数,这样如果是动词的话,我们也知道动词需要进行的词形变化.
在这里插入图片描述

2.4.LSTM 的变体

peephole连接:让 门层 也会接受细胞状态的输入
在这里插入图片描述
coupled 忘记门和输入门:同于之前是分开确定什么忘记和需要添加什么新的信息,这里是一同做出决定。我们仅仅会当我们将要输入在当前位置时忘记。我们仅仅输入新的值到那些我们已经忘记旧的信息的那些状态 。
在这里插入图片描述

3.门限循环单元GRU

GRU背后的原理与 LSTM 非常相似,即用门控机制控制输入、记忆等信息而在当前时间步做出预测,根本上是一种LSTM的变体,它将忘记门输入门合成了一个单一的 更新门。同样还混合了细胞状态和隐藏状态,和其他一些改动。最终的模型比标准的 LSTM 模型要简单,也是非常流行的变体。
在这里插入图片描述
为了解决标准 RNN 的梯度消失问题,GRU 有两个有两个门,即一个重置门(reset gate)和一个更新门(update gate)。从直观上来说

  • 重置门决定了如何将新的输入信息与前面的记忆相结合,
  • 更新门定义了前面记忆保存到当前时间步的量。

基本上,这两个门控向量决定了哪些信息最终能作为门控循环单元的输出。这两个门控机制的特殊之处在于,它们能够保存长期序列中的信息,且不会随时间而清除或因为与预测不相关而移除
如果我们将重置门设置为 1,更新门设置为 0,那么我们将再次获得标准 RNN 模型。使用门控机制学习长期依赖关系的基本思想和 LSTM 一致,但还是有一些关键区别

3.1.更新门

在时间步 t,我们首先需要使用以下公式计算更新门 zt
在这里插入图片描述
其中 xt为第 t 个时间步的输入向量,即输入序列 X 的第 t 个分量,它会经过一个线性变换(与权重矩阵 W(z) 相乘)。ht-1保存的是前一个时间步 t-1 的信息。更新门将这两部分信息相加并投入到 Sigmoid 激活函数中,因此将激活结果压缩到 0 到 1 之间。
更新门帮助模型决定到底要将多少过去的信息传递到未来,或到底前一时间步和当前时间步的信息有多少是需要继续传递的。这一点非常强大,因为模型能决定从过去复制所有的信息以减少梯度消失的风险。我们随后会讨论更新门的使用方法,现在只需要记住 zt 的计算公式就行。

3.2.重置门

本质上来说,重置门主要决定了到底有多少过去的信息需要遗忘,我们可以使用以下表达式计算:
在这里插入图片描述
该表达式与更新门的表达式是一样的,只不过线性变换的参数和用处不一样而已。如前面更新门所述,ht-1 和 xt 先经过一个线性变换,再相加投入 Sigmoid 激活函数以输出激活值。

3.3. 当前记忆内容

现在我们具体讨论一下这些门控到底如何影响最终的输出。在重置门的使用中,新的记忆内容将使用重置门储存过去相关的信息,它的计算表达式为:
在这里插入图片描述

输入 xt 与上一时间步信息 ht-1 先经过一个线性变换,即分别右乘矩阵 W 和 U。
计算重置门 rt 与 Uht-1的 Hadamard 乘积,即 rt 与 Uht-1 的对应元素乘积。因为前面计算的重置门是一个由 0 到 1 组成的向量,它会衡量门控开启的大小。例如某个元素对应的门控值为 0,那么它就代表这个元素的信息完全被遗忘掉。该 Hadamard 乘积将确定所要保留与遗忘的以前信息
将这两部分的计算结果相加再投入双曲正切激活函数中。

3.4.当前时间步的最终记忆

在最后一步,网络需要计算 ht,该向量将保留当前单元的信息并传递到下一个单元中。在这个过程中,我们需要使用更新门,它决定了当前记忆内容 h’t和前一时间步 ht-1 中需要收集的信息是什么。这一过程可以表示为:
在这里插入图片描述
zt为更新门的激活结果,它同样以门控的形式控制了信息的流入。zt与 ht-1的 Hadamard 乘积表示前一时间步保留到最终记忆的信息该信息加上当前记忆保留至最终记忆的信息就等于最终门控循环单元输出的内容。

3.5.GRU和LSTM的区别

结构上

  • GRU 有个门(重置门与更新门),而 LSTM 有个门(输入门、遗忘门和输出门)。
  • GRU 并不会控制并保留内部记忆(Ct),且没有 LSTM 中的输出门
  • LSTM 中的输入与遗忘门对应于 GRU 的更新门,重置门直接作用于前面的隐藏状态。
  • 在计算输出时并不应用二阶非线性。

功能上:

  • GRU参数更少,训练速度更快,相比之下需要的数据量更少
  • 如果有足够的数据,LSTM的效果可能好于GRU

这篇关于深度学习-循环神经网络RNN、长短期记忆LSTM、门限循环单元GRU理解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/621898

相关文章

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

深入理解Apache Airflow 调度器(最新推荐)

《深入理解ApacheAirflow调度器(最新推荐)》ApacheAirflow调度器是数据管道管理系统的关键组件,负责编排dag中任务的执行,通过理解调度器的角色和工作方式,正确配置调度器,并... 目录什么是Airflow 调度器?Airflow 调度器工作机制配置Airflow调度器调优及优化建议最

Python判断for循环最后一次的6种方法

《Python判断for循环最后一次的6种方法》在Python中,通常我们不会直接判断for循环是否正在执行最后一次迭代,因为Python的for循环是基于可迭代对象的,它不知道也不关心迭代的内部状态... 目录1.使用enuhttp://www.chinasem.cnmerate()和len()来判断for

Java循环创建对象内存溢出的解决方法

《Java循环创建对象内存溢出的解决方法》在Java中,如果在循环中不当地创建大量对象而不及时释放内存,很容易导致内存溢出(OutOfMemoryError),所以本文给大家介绍了Java循环创建对象... 目录问题1. 解决方案2. 示例代码2.1 原始版本(可能导致内存溢出)2.2 修改后的版本问题在

Go中sync.Once源码的深度讲解

《Go中sync.Once源码的深度讲解》sync.Once是Go语言标准库中的一个同步原语,用于确保某个操作只执行一次,本文将从源码出发为大家详细介绍一下sync.Once的具体使用,x希望对大家有... 目录概念简单示例源码解读总结概念sync.Once是Go语言标准库中的一个同步原语,用于确保某个操

一文带你理解Python中import机制与importlib的妙用

《一文带你理解Python中import机制与importlib的妙用》在Python编程的世界里,import语句是开发者最常用的工具之一,它就像一把钥匙,打开了通往各种功能和库的大门,下面就跟随小... 目录一、python import机制概述1.1 import语句的基本用法1.2 模块缓存机制1.

深入理解C语言的void*

《深入理解C语言的void*》本文主要介绍了C语言的void*,包括它的任意性、编译器对void*的类型检查以及需要显式类型转换的规则,具有一定的参考价值,感兴趣的可以了解一下... 目录一、void* 的类型任意性二、编译器对 void* 的类型检查三、需要显式类型转换占用的字节四、总结一、void* 的

深入理解Redis大key的危害及解决方案

《深入理解Redis大key的危害及解决方案》本文主要介绍了深入理解Redis大key的危害及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、背景二、什么是大key三、大key评价标准四、大key 产生的原因与场景五、大key影响与危