图解 RNN, LSTM, GRU
参考:
Illustrated Guide to Recurrent Neural Networks
Illustrated Guide to LSTM’s and GRU’s: A step by step explanation
Animated RNN, LSTM and GRU
文章目录
- 1. RNN and its problem
- 1.1 RNN Data Flow
- 1.2 Long-term dependence problem
- 1.3 Animated RNN
- 1.4 LSTM’s and GRU’s as a solution
- 2. LSTM
- 2.1 Core Concept
- 2.2 Sigmoid
- 2.3 Forget gate
- 2.4 Input Gate
- 2.5 Cell State
- 2.5 Output Gate
- 2.6 LSTM Cell pseudo
- 3. GRU
- 3.1 Update Gate
- 3.2 Reset Gate
- 4. Illustrate RNN, LSTM and GRU
- 4.1 Vanilla RNN
- 4.2 LSTM
- 4.3 GRU
1. RNN and its problem
1.1 RNN Data Flow
RNN
将其展开:
Unrolling RNN
RNN具有充当高速公路的循环机制,以允许信息从一个步骤流到下一步骤。
Passing Hidden State to next time step
此信息是隐藏状态,它表示以前的输入。
为了更好地了解其工作原理,介绍一个RNN的应用用例。假设要建立一个聊天机器人,可以根据用户输入的文字对意图进行分类。
Classifying intents from users inputs
解决这个问题。首先,我们将使用RNN对文本序列进行编码。然后,将RNN输出馈入前馈神经网络,该网络将对意图进行分类。例如用户输入了以下句子:
whattimeisit?what\ time\ is\ it?what time is it?
首先,将句子分解成单个单词。 RNN的工作是按顺序进行的,因此一次提供一个单词。
下一步,输入单词“time”和上一步中的隐藏状态。现在,RNN包含有关“What”和“time”的信息。
重复此过程,直到最后一步。可以在最后一步中看到RNN已经编码了先前步骤中所有单词的信息。
由于最终输出是从序列的其余部分创建的,因此应该能够获取最终输出,并将其传递给前馈层以对意图进行分类。
python伪代码如下:
首先,初始化网络层和初始隐藏状态。隐藏状态的形状和尺寸将取决于递归神经网络的形状和尺寸。然后,遍历输入,将单词和隐藏状态传递到RNN。RNN返回输出和修改后的隐藏状态。重复此过程,知道读取完所有输入单词。最后,将输出传递到前馈层,它返回一个预测。RNN的前向传递的控制流程是一个for循环。
为了说明RNN的短期记忆问题,将RNN的最后一个隐藏状态进行可视化。其中颜色对应上述例句中五个不同的单词。
Final hidden state of the RNN
1.2 Long-term dependence problem
RNN之所以只有短期记忆功能,是由梯度消失导致的,该问题在其它神经网络架构中也很普遍。随着RNN处理步骤的增多,它很难保留先前步骤中的信息。如上图所示,在最后一个时间步中,几乎没有先前单词“what”和“time”的信息。短期记忆和梯度消失是反向传播导致的。反向传播是一种用于训练和优化神经网络的算法,让我们看一下反向传播对深度前馈神经网络的影响。
训练神经网络有三个主要步骤。首先,它进行前向通过并做出预测。其次,它使用损失函数将预测结果与真实情况进行比较。损失函数输出一个误差值,该误差值是对网络运行状况的评估。最后,它使用该误差值进行反向传播,从而计算网络中每个节点的梯度。
在反向传播期间,递归神经网络遭受梯度消失的困扰。梯度是用于更新神经网络权重的值。消失的梯度问题是梯度随着时间的流逝而缩小。如果梯度值变得非常小,那么它对学习的贡献就不会太大。
梯度是用于调整网络内部权重以允许网络学习的值。梯度越大,调整幅度越大,反之亦然。这就是问题所在。进行反向传播时,层中的每个节点都会在其之前的层中根据梯度的影响来计算其梯度。因此,如果对它之前的网络层的调整很小,那么对当前层的调整就会更小。这导致梯度随着反向传播而呈指数收缩。早期的层没有做任何学习,因为内部权重由于极小的梯度而几乎没有被调整。这就是消失梯度问题。
Gradients shrink as it back-propagates down
让我们看看这是如何应用于RNN的。你可以把RNN中的每一个时间步看作一个层。为了训练RNN,你使用了一个反向传播的应用,称为时间反向传播。随着梯度值在每个时间步长中传播,梯度值将呈指数级收缩。
Gradients shrink as it back-propagates through time
同样,梯度用于调整神经网络的权重,从而使其能够学习。小梯度意味着小的调整。这导致早期的层不学习。
由于渐变消失,RNN没有学习跨时间步长的长程依赖关系。这意味着在试图预测用户意图时,有可能没有考虑“what”和“time”这两个词。然后,网络必须用“is it?”,这很模糊,甚至对人类来说也很困难。因此,无法学习更早的时间步骤会导致网络只具有短期记忆。
为了解决RNN的长程依赖问题,提出了两个专门的RNN。一种叫做长短期记忆(long short-term memory,LSTM) Hochreiter and Schmidhuber in 1997;另一种是门控循环单元(gated recurrent units,GRU)Cho et. al in 2014。LSTM和GRU的功能基本上和RNN一样,但是它们使用门控机制来学习长期依赖,这些门是不同的张量运算,可以决定传向隐藏状态的信息。
1.3 Animated RNN
RNN的工作方式如下:第一单词被转换为机器可读的向量。然后,RNN逐一处理向量序列。
Processing sequence one by one
处理时,它会将先前的隐藏状态传递给序列的下一步。隐藏状态充当神经网络记忆。它保存了网络以前见过的以前数据的信息。
Passing hidden state to next time step
让我们先看RNN的一个单元如何计算隐藏状态。首先,将输入和先前的隐藏状态组合成一个向量。该向量现在包含当前输入和以前输入的信息。向量经过tanh激活函数(tanh函数用于调节流经网络的值,将值压缩到-1和1之间,防止造成梯度爆炸),输出是新的隐藏状态(网络的记忆)。
RNN Cell
Tanh squishes values to be between -1 and 1
vector transformations without tanh
vector transformations with tanh
1.4 LSTM’s and GRU’s as a solution
这些门可以知道序列中哪些数据是重要的,以保留或丢弃。通过这样做,它可以将相关信息传递到长序列中进行预测。几乎所有基于RNN的最先进的结果都是通过这两种网络实现的。LSTM和GRU已经广泛应用于语音识别,语音合成,文本生成,视频字幕生成等领域。
2. LSTM
LSTM Cell and It’s Operations
2.1 Core Concept
LSTM的核心概念是单元状态(cell state),以及它的各种门(gate)。单元状态就像一条传输高速公路,沿着序列链一直传递相关信息。你可以把它当成网络的“记忆”。理论上,单元状态可以在整个序列处理过程中携带相关信息。因此,即使是来自早期时间步的信息也可以传递到后期时间步,从而减少短期记忆的影响。随着单元状态的发展,信息通过门被添加或移除到单元状态。门是不同的神经网络,决定单元状态允许哪些信息。门能够学习在训练期间需要保留或忘记哪些信息。
2.2 Sigmoid
门包含sigmoid激活函数,不同于tanh激活函数将输入值压缩到-1和1之间,sigmoid激活函数将输入值压缩到0和1之间。这对更新或忘记数据很有用,因为任何数字乘以0都为0,从而导致值消失(被遗忘)。任何数字乘以1都为其本身,因此该值保持不变(被保留)。
Sigmoid squishes values to be between 0 and 1
有三个不同的门来调节LSTM单元中的信息流。分别为:遗忘门,输入门和输出门。遗忘门决定了与先前步骤无关的内容。输入门决定从当前步骤开始添加哪些信息。输出门确定下一个隐藏状态的信息。
2.3 Forget gate
遗忘门决定应该丢弃或保留哪些信息。来自先前隐藏状态的信息和来自当前输入的信息通过Sigmoid函数传递。值介于0到1之间。接近0表示忘记,接近1表示保留。
Forget gate operations
2.4 Input Gate
输入门更新单元状态。首先,将先前的隐藏状态和当前输入传递到sigmoid函数中。这决定了通过将值转换为介于0和1之间的值来更新哪些值。0表示不重要,而1表示重要。还可以将隐藏状态和当前输入传递到tanh函数中,以压缩介于-1和1之间的值,以帮助调节网络。然后将tanh输出与sigmoid输出相乘。sigmoid输出将决定哪些信息对tanh输出至关重要。
Input gate operations
2.5 Cell State
现在有足够的信息来计算单元状态。首先,计算单元状态与遗忘向量(遗忘门的输出)的点积。如果将它乘以接近0的值,则表示有可能丢弃单元状态中的值。然后,与输入门的输出进行点积运算,至此完成单元状态的更新。
Calculating cell state
2.5 Output Gate
输出门决定下一个隐藏状态(hidden state)的值。注意,隐藏状态包含有关先前输入的信息,并用于预测。首先,将先前的隐藏状态和当前输入传递到sigmoid函数中。然后,将更新后的单元状态传递给tanh函数,进一步将tanh函数的输出与sigmoid函数输出进行点积运算,以确定隐藏状态应携带哪些信息。至此完成隐藏状态的更新。然后将新的单元状态和新的隐藏状态传递到下一个时间步。
output gate operations
遗忘门决定了与先前步骤无关的内容。输入门决定从当前步骤开始添加哪些信息。输出门确定下一个隐藏状态的信息。
2.6 LSTM Cell pseudo
python pseudo code
LSTM网络的控制流程包括一些张量操作和一个for循环,隐藏状态用于最终的预测。
- 1.首先,将先前的隐藏状态和当前输入合并(concatenate)。
- 2.将获取的内容合并到遗忘层,该层删除无关数据。
- 3.使用合并创建候选层,其包含有可能添加到单元状态的值。
- 4.将合并后的内容也输入到输入层中,该层决定应将来自候选层的哪些数据添加到新的单元状态。
- 5.在计算了遗忘层,候选层和输入层之后,使用这些向量和先前的单元状态来计算单元状态。
- 6.然后计算输出。
- 7.将输出与新的单元状态逐点相乘,得到新的隐藏状态。
3. GRU
GRU是新一代的递归神经网络,与LSTM非常相似。GRU去掉了单元状态,并使用隐藏状态来传输信息。它还只有两个门,一个重置门(reset gate)和一个更新门(update gate)。
GRU cell and it’s gates
3.1 Update Gate
更新门的作用类似于LSTM的遗忘门和输入门。它决定丢弃哪些信息以及添加哪些新信息。
3.2 Reset Gate
重置门用于确定要忘记多少过去的信息。
GRU的张量运算较少。因此,与LSTM相比,它的训练速度更快。二者没有明确的好坏,在实践中,通常根据需求测试是使用LSTM还是使用GRU来构建模型。
4. Illustrate RNN, LSTM and GRU
Legend for animations
注意,动画显示了一个时间步中发生的数学运算(以 ttt 为索引)。另外,输入大小为3(绿色)和2个隐藏单元(红色),批处理大小为1。
4.1 Vanilla RNN
Vanilla RNN cell ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201108205213449.gif#pic_center) Animated vanilla RNN cell
- t — time step
- X — input
- h — hidden state
- length of X — size/dimension of input
- length of h — no. of hidden units. Note that different libraries call them differently, but they mean the same:
- TensorFlow — num_units
- Keras — state_size ,units
- PyTorch — hidden_size
4.2 LSTM
LSTM cell
Animated LSTM cell
- C — cell state
注意,单元状态的尺寸与隐藏状态的尺寸相同。
4.3 GRU
GRU cell
Animated GRU cell
图解 RNN, LSTM, GRU相关推荐
- DL之RNN/LSTM/GRU:RNN/LSTM/GRU算法动图对比、TF代码定义之详细攻略
DL之RNN/LSTM/GRU:RNN/LSTM/GRU算法动图对比.TF代码定义之详细攻略 目录 RNN.LSTM.GRU算法对比 1.RNN/LSTM/GRU对比 2.RNN/LSTM/GRU动图 ...
- DL之LSTM:LSTM算法论文简介(原理、关键步骤、RNN/LSTM/GRU比较、单层和多层的LSTM)、案例应用之详细攻略
DL之LSTM:LSTM算法论文简介(原理.关键步骤.RNN/LSTM/GRU比较.单层和多层的LSTM).案例应用之详细攻略 目录 LSTM算法简介 1.LSTM算法论文 1.1.LSTM算法相关论 ...
- RNN LSTM GRU 代码实战 ---- 简单的文本生成任务
RNN LSTM GRU 代码实战 ---- 简单的文本生成任务 import torch if torch.cuda.is_available():# Tell PyTorch to use the ...
- RNN, LSTM, GRU, SRU, Multi-Dimensional LSTM, Grid LSTM, Graph LSTM系列解读
RNN/Stacked RNN rnn一般根据输入和输出的数目分为5种 一对一 最简单的rnn 一对多 Image Captioning(image -> sequence of words) ...
- RNN,LSTM,GRU计算方式及优缺点
本文主要参考李宏毅老师的视频介绍RNN相关知识,主要包括两个部分: 分别介绍Navie RNN,LSTM,GRU的结构 对比这三者的优缺点 1.RNN,LSTM,GRU结构及计算方式 1.1 Navi ...
- RNN,LSTM,GRU基本原理的个人理解重点
20210626 循环神经网络_霜叶的博客-CSDN博客 LSTM的理解 - 走看看 重点 深入LSTM结构 首先使用LSTM的当前输入 (x^t)和上一个状态传递下来的 (h^{t-1}) 拼接训练 ...
- [PyTorch] rnn,lstm,gru中输入输出维度
本文中的RNN泛指LSTM,GRU等等 CNN中和RNN中batchSize的默认位置是不同的. CNN中:batchsize的位置是position 0. RNN中:batchsize的位置是pos ...
- 序列模型简介——RNN, Bidirectional RNN, LSTM, GRU
既然我们已经有了前馈网络和CNN,为什么我们还需要序列模型呢?这些模型的问题在于,当给定一系列的数据时,它们表现的性能很差.序列数据的一个例子是音频的剪辑,其中包含一系列的人说过的话.另一个例子是英文 ...
- Pytorch中如何理解RNN LSTM GRU的input(重点理解seq_len / time_steps)
在建立时序模型时,若使用keras,我们在Input的时候就会在shape内设置好sequence_length(后面简称seq_len),接着便可以在自定义的data_generator内进行个性化 ...
最新文章
- 堆栈的应用——用JavaScript描述数据结构
- 直播预告丨告别后知后觉的指标波动,神策智能预警分析直播来袭
- Android获取屏幕尺寸大小
- Web前端开发笔记——第四章 JavaScript程序设计 第四节 条件语句和循环语句
- 实现一个MVVM和promise
- 数据挖掘在呼叫中心的六大应用点
- 90 Subsets II
- 【MySQL】MySQL运维及开发规范
- Spring Security入门教程
- SPSS——非参数检验——1-Sample K-S 单个样本(Kolmogorov-Smirnov)柯尔莫哥洛夫-斯米诺夫检验
- 微信视频强制分享观看源码 微信流量裂变源码吸粉变现源码
- 经纬度坐标转像素坐标
- GitHub Copilot 自动写代码插件使用体验
- 无法打开包括文件:“afxcontrolbars.h”: 的解决方案
- android 自定义字体 ttf,Android利用TTF文件设置字体
- 图片文字识别的方法有哪些?
- 中国航空公司特点机型
- 用html语言编写笑脸,怎么使用HTML5中的Canvas绘制笑脸
- DIV display与visibility
- 基于python下django框架 实现外卖点餐系统详细设计
热门文章
- 刚子扯谈:我对黑客精神的一些认知
- django+前端+数据库 week1
- 字节青训营第三课之高质量编程与性能调优实战的笔记和总结
- gdb使用watch命令设置数据断点
- 美国跳过5G直抢6G市场,华为会让他如愿吗?
- GEA 1.6 运行时引擎架构
- 使用Python PySNMP模块获取设备指标
- 经典案例重点案例:点名表,JS正则验证全选、全不选、反选,点击可以实现三个功能,轮播图 字符串截取以及替换,图片切换
- 使用PBO更新NV21纹理,shader处理并渲染到FBO中,再进行二次渲染的例子
- npm打包报错ERROR in ./src/main/webapp/app/core解决方法