参考:
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相关推荐

  1. ​​​​​​​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动图 ...

  2. DL之LSTM:LSTM算法论文简介(原理、关键步骤、RNN/LSTM/GRU比较、单层和多层的LSTM)、案例应用之详细攻略

    DL之LSTM:LSTM算法论文简介(原理.关键步骤.RNN/LSTM/GRU比较.单层和多层的LSTM).案例应用之详细攻略 目录 LSTM算法简介 1.LSTM算法论文 1.1.LSTM算法相关论 ...

  3. RNN LSTM GRU 代码实战 ---- 简单的文本生成任务

    RNN LSTM GRU 代码实战 ---- 简单的文本生成任务 import torch if torch.cuda.is_available():# Tell PyTorch to use the ...

  4. RNN, LSTM, GRU, SRU, Multi-Dimensional LSTM, Grid LSTM, Graph LSTM系列解读

    RNN/Stacked RNN rnn一般根据输入和输出的数目分为5种 一对一 最简单的rnn 一对多 Image Captioning(image -> sequence of words) ...

  5. RNN,LSTM,GRU计算方式及优缺点

    本文主要参考李宏毅老师的视频介绍RNN相关知识,主要包括两个部分: 分别介绍Navie RNN,LSTM,GRU的结构 对比这三者的优缺点 1.RNN,LSTM,GRU结构及计算方式 1.1 Navi ...

  6. RNN,LSTM,GRU基本原理的个人理解重点

    20210626 循环神经网络_霜叶的博客-CSDN博客 LSTM的理解 - 走看看 重点 深入LSTM结构 首先使用LSTM的当前输入 (x^t)和上一个状态传递下来的 (h^{t-1}) 拼接训练 ...

  7. [PyTorch] rnn,lstm,gru中输入输出维度

    本文中的RNN泛指LSTM,GRU等等 CNN中和RNN中batchSize的默认位置是不同的. CNN中:batchsize的位置是position 0. RNN中:batchsize的位置是pos ...

  8. 序列模型简介——RNN, Bidirectional RNN, LSTM, GRU

    既然我们已经有了前馈网络和CNN,为什么我们还需要序列模型呢?这些模型的问题在于,当给定一系列的数据时,它们表现的性能很差.序列数据的一个例子是音频的剪辑,其中包含一系列的人说过的话.另一个例子是英文 ...

  9. Pytorch中如何理解RNN LSTM GRU的input(重点理解seq_len / time_steps)

    在建立时序模型时,若使用keras,我们在Input的时候就会在shape内设置好sequence_length(后面简称seq_len),接着便可以在自定义的data_generator内进行个性化 ...

最新文章

  1. 堆栈的应用——用JavaScript描述数据结构
  2. 直播预告丨告别后知后觉的指标波动,神策智能预警分析直播来袭
  3. Android获取屏幕尺寸大小
  4. Web前端开发笔记——第四章 JavaScript程序设计 第四节 条件语句和循环语句
  5. 实现一个MVVM和promise
  6. 数据挖掘在呼叫中心的六大应用点
  7. 90 Subsets II
  8. 【MySQL】MySQL运维及开发规范
  9. Spring Security入门教程
  10. SPSS——非参数检验——1-Sample K-S 单个样本(Kolmogorov-Smirnov)柯尔莫哥洛夫-斯米诺夫检验
  11. 微信视频强制分享观看源码 微信流量裂变源码吸粉变现源码
  12. 经纬度坐标转像素坐标
  13. GitHub Copilot 自动写代码插件使用体验
  14. 无法打开包括文件:“afxcontrolbars.h”: 的解决方案
  15. android 自定义字体 ttf,Android利用TTF文件设置字体
  16. 图片文字识别的方法有哪些?
  17. 中国航空公司特点机型
  18. 用html语言编写笑脸,怎么使用HTML5中的Canvas绘制笑脸
  19. DIV display与visibility
  20. 基于python下django框架 实现外卖点餐系统详细设计

热门文章

  1. 刚子扯谈:我对黑客精神的一些认知
  2. django+前端+数据库 week1
  3. 字节青训营第三课之高质量编程与性能调优实战的笔记和总结
  4. gdb使用watch命令设置数据断点
  5. 美国跳过5G直抢6G市场,华为会让他如愿吗?
  6. GEA 1.6 运行时引擎架构
  7. 使用Python PySNMP模块获取设备指标
  8. 经典案例重点案例:点名表,JS正则验证全选、全不选、反选,点击可以实现三个功能,轮播图 字符串截取以及替换,图片切换
  9. 使用PBO更新NV21纹理,shader处理并渲染到FBO中,再进行二次渲染的例子
  10. npm打包报错ERROR in ./src/main/webapp/app/core解决方法