本篇文章被Google中国社区组织人转发,评价: 条理清晰,写的很详细!

被阿里算法工程师点在看!

所以很值得一看!

前言

目录:

RNN提出的背景

- 一个问题

- 为什么不用标准神经网络

- RNN模型怎么解决这个问题

- RNN模型适用的数据特征

- RNN几种类型

RNN模型结构

- RNN block

- 简化符号表示

- stacked RNN

- 双向RNN

- 梯度消失爆炸问题

GRU模型结构

LSTM模型结构

- LSTM背后的关键思想

- Step by Step理解LSTM

本文可以解答:

  • RNN用来解决什么问题,什么样的数据特征适合用它来解决

  • ​RNN的缺陷是什么,LSTM,GRU是如何解决这些缺陷的

  • 理解从简单RNN到LSTM的每个模型的结构

RNN提出背景/适用场景

一个问题

我们考虑一下这么一个问题,任意给定一句话,判断句子里的单词是不是人名的一部分。比如输入

x : Harry Potter and Hermione Granger invented a new spell.

单词有

['Harry', 'Potter', 'and', 'Hermione', 'Granger', 'invented', 'a', 'new', 'spell']

如果1表示单词是人名一部分,0表示不是人名的部分,那么输出的y就应该是

[1, 1, 0, 1, 1, 0, 0, 0, 0]

y的组成是和x等长,相同的index对应x中元素是不是人名。我们把x中的每个单词用one-hot向量来表征,如下所示。

为什么不用标准的神经网络?

如果我们用标准的神经网络来解决这个问题,标准神经网络的结构是这样的

标准神经网络的流程,将样本数据x一次性输入,从左边传到右边(输出层)。这样做不好的地方在于:

  • 输入和输出的长度不固定,比如有的句子输入长度是10,有的句子长度就不是10。

  • 如果使用标准网络,它不能共享文本不同位置学习到的东西,比如知道Harry是人名一部分,如果第i个位置又出现了Harray,它是不能自动识别的。

RNN模型怎么解决这个问题

 

RNN对数据的处理流程如上图所示,它不会同时输入数据。我们将首先输入X1(第一个单词Harray)得到预估值y1(Harray是不是人名一部分),然后将X1计算的结果传递到下一层与输入X2(第二个单词Potter)结合输出对X2的预测y2(Potter是不是人名一部分),这样y2的预测其实受X1的影响,以此类推。这样就解决了标准神经网络带来的问题。

RNN模型适用的数据特征

 

上面的句子有个特征:

  • States Dependency:当前的状态和上一步的状态是相关的;

  • 数据是序列的(sequential): 当我们说一个数据是序列的,是指数据之间有时间顺序,它是在不同时间输入的,如果我们更改顺序,把句子中的单词打乱,它就变的不同失去含义了。能用标准神经网络训练的数据就是可以打乱顺序,所以我们可以在一开始就输入它们。

所以用RNN最大的动力就是它可以连接之前的数据,意味着这个模型关心之前的东西是什么,接下来将要出现什么。

RNN的几种类型

除了上面的例子,RNN根据不同的输入和输出数量,有以下几种类型:

one on one: 输入一张图片,输出图片中的活动。

one  to many: 输入一张图片,输出描述图片中的内容,其中输出的内容前后是有依赖的,相关的,比如上面一张图就是‘一个人在跑步’,‘一个’和‘人’是相关的,如果‘一个’变了,那么‘人’可能也会变。

many to one: 情感分类,输入是一个句子,输出是评分,输入的前后是依赖相关的。

many to many: 翻译系统,将德语翻译成英语,输入和输出都是相关的。

many to many: 语音识别,传入一段语音,输出是转换成的文字。

RNN的模型结构

RNN block

 

我们的模型将会采用两个值,t时间处,X的输入值和前一个单元格 t-1 时间处的输出值A。左边是传统的神经网络模型,它在左边基础上是如何变成右边的?我们用第一个单元的运算来举例。

方程①:就像我们使用简单ANN所做的那样,它也存在权重Wax,Waa和偏差Ba。它只是增加一个输入值A0(前一个单元的输出值)。

单元有两个不同的输出: A1的输出(由公式②得到)将转到下一个单元,公式③的最终输出Y1。

所有权重的下标意思是,第一个下标是计算某类型的量,第二个下标是你要乘以的类型。比如Wax,它乘以的是X1,要计算的是A1,所以它的下标是ax。

现在,让我们进入下一个单元。整个过程如下图所示。

简化符号表示

但是为了简化符号,后面图中的公式都是简化的符号, 令:

于是:

我们将

变成

符号变了,但是意思是没有变的,只是为了方便简写,所以后面都是用简化后的公式。

 

Stacked RNN

如果把RNN堆在一起,输出的y又可以作为x输入到另一个神经网络中,那么它的结构就是这样的。

 

双向RNN

如果我们输入以下句子:

He said, “Teddy bears are on sale!”

模型可能会判断‘Teddy’是一个人名,是因为模型没有考虑之后句子的含义,所以,这时候又要考虑前面又要考虑后面,就需要双向的RNN,它的结构是这样的:

梯度消失/爆炸问题

 

我们看这样一个例子:

The cat,which already ate ...(中间省略很长很长), was(预测这个单词) full

The cats,which ate ...(中间省略很长很长), were(预测这个单词) full

当预测一个很长的句子,而预测的值依赖于很前面的信息(cat/cats),RNN就难以预测,这就是RNN不擅长处理的长依赖关系。为什么呢?

关键问题就在于向后传播。

向后传播的目的是在每一层更新权重,为了更新权重,我们将计算损失函数的梯度,并且因为链式法则,会把多个梯度相乘。试想一下,如果梯度大于1,那么多个梯度相乘将会使得数值比较大,用它来更新优化权重会比较大,这种情况我们叫做梯度爆炸(exploding gradients),这还不是大问题,因为我们可以做个梯度修剪,如果大于某个值就缩放就行了;真正的问题是,如果梯度小于1,那么连乘梯度将使得结果非常的小,这样它就不能更新权重,输出的结果就没有什么不同,这样的情况我们叫梯度消失(vanishing gradients),这就表明向后传播是不能影响很前面层的。

这就是人们说RNN的记忆不好,如果输入长度太长,我们就不能预测实际的值,造成这样结果最根本原因就是神经网络中的权重更新。

那么我们怎么解决这个问题呢?

一个思想就是,与其记住所有的过去,不如选择性的记住重要的信息而忽略其它信息。

GRU模型结构

如何做到选择性的记忆之前的信息?关键思想是提出了一个门控循环单元(Units Gated Recurrent Units),用它来控制重要信息。

注: 图中的tanh就是上面图中激活函数g的具体化函数。

GRU相对于RNN,多了一个绿色的框框,这个框框就是门控制器,我们把它叫做更新门,用来决定记住过去的信息多少的,提供模型的记忆能力。

GRU第一步也是和RNN第一步一样,用激活函数激活,但是它不会马上被使用,而是作为候选值静静等待。接着计算GRU更新门的值,由于它采用的是sigmoid函数,所以它的输出值范围是在0到1之间的。所以将第2步的值乘以第1步的值实际上就是在做"选择性记忆",如果是0,那么就是“不记忆/不更新/不使用”,如果是1,那么就是"记忆/更新/使用",就像一个打开关闭的门。GRU第三步就是用更新门的值来决定当前是用新的计算值还是用之前的值。

它比接下来讲的LSTM要简单,参数要少,更少的参数就意味着减少过拟合,减少训练时间。

LSTM的模型结构

 

LSTM背后的关键思想

 

LSTM的全称是Long Short Term Memory networks,LSTM被明确设计为避免长期依赖问题。长时间记住信息是它的默认行为,而不是它努力学习的东西。LSTM的关键是单元状态(cell state),最上面那条水平线。图中C表示,它将包含放在隐藏状态值之外的记忆值。它有点像是传送带,仅仅在一些微小的线性变换下贯穿整个链条,信息不加改变地流动非常容易。

LSTM可以通过门这种结构给cell state移除或增加信息。门能够选择性让信息通过,它由sigmoid神经网络层和逐点乘法操作符组成。sigmoid层输出0到1的数字,描述每个组件应该让它通过多少。数值0表示都不通过,1表示让它全部通过。

LSTM有三个门来保护和控制cell state的状态。整个模型结构如下图

图中的三个绿色框框从左到右依次是忘记门(forget gate),更新门(update gate),输出门(output gate)。

Step by Step理解LSTM

 

先整体看一下LSTM和GRU的不同:

让我们看看右边,前两行其实就是和GRU一样,第3行等式,它是计算忘记门的值,它用于更新单元状态(第四行等式),最后第5行是计算输出门,用于得到第6行A在t时刻的值。

第一步就是决定我们要从cell state中丢弃哪些信息。这个决定是由叫‘forget gate layer’的sigmoid层指定的。它看起来像输入ht-1,xt,然后为每个ct-1(t-1时刻的cell state)变量中的数据输出0到1之间的数字。1就是保留全部,0是全部不要。

下一步是确定要在cell state下存储哪些新信息

这一步包括两个部分:

  • 首先,称为“更新门”的sigmoid层决定了我们将更新哪些值。

  • 接下来,tanh层创建新候选值(可以添加到cell state中的值)C̃ t向量。

下一步将会结合这两个值去对状态进行更新。

这一步是更新cell state

我们将旧状态值和忘记门相乘,目的是忘记该忘记的信息,只记住重要的信息;然后用更新门和候选状态相乘,目的是决定到底我们需要多少新状态值的信息。

最后,我们需要决定要输出什么

这个输出是在cell state基础上计算的,但是是它的过滤版本。首先我们用sigmoid层来确定要输出当前cell state的哪些部分;接着我们把结果送到tanh并和输出门相乘,这样我们就可以只输出我们期望的那部分结果。

因为有这三个额外的门,LSTM有着更强的记忆能力,它们控制着哪个部分需要记住,记住多少,所以它在处理序列模型的时候很受欢迎。

参考资料:

  • 吴恩达deeplearning.ai第五门课 Module 1: Recurrent Neural Networks (RNNs)

  • The Most Intuitive and Easiest Guide for Recurrent Neural Network

  • Must-Read Tutorial to Learn Sequence Modeling (deeplearning.ai Course #5)

  • 2015-08-Understanding-LSTMs

今日互动

 

文首的问题你想清楚了吗?

吴恩达deepLearning.ai循环神经网络RNN学习笔记_没有复杂数学公式,看图就懂了!!!(理论篇)的更多相关文章

  1. 吴恩达deepLearning.ai循环神经网络RNN学习笔记_看图就懂了!!!(理论篇)

    前言 目录: RNN提出的背景 - 一个问题 - 为什么不用标准神经网络 - RNN模型怎么解决这个问题 - RNN模型适用的数据特征 - RNN几种类型 RNN模型结构 - RNN block - ...

  2. 用纯Python实现循环神经网络RNN向前传播过程(吴恩达DeepLearning.ai作业)

    Google TensorFlow程序员点赞的文章!   前言 目录: - 向量表示以及它的维度 - rnn cell - rnn 向前传播 重点关注: - 如何把数据向量化的,它们的维度是怎么来的 ...

  3. 一文看懂神经网络初始化!吴恩达Deeplearning.ai最新干货

    [导读]神经网络的初始化是训练流程的重要基础环节,会对模型的性能.收敛性.收敛速度等产生重要的影响.本文是deeplearning.ai的一篇技术博客,文章指出,对初始化值的大小选取不当,  可能造成 ...

  4. 吴恩达DeepLearning.ai的Sequence model作业Dinosaurus Island

    目录 1 问题设置 1.1 数据集和预处理 1.2 概览整个模型 2. 创建模型模块 2.1 在优化循环中梯度裁剪 2.2 采样 3. 构建语言模型 3.1 梯度下降 3.2 训练模型 4. 结论   ...

  5. 循环神经网络(RNN)--学习笔记

    一.基本概念 RNN针对的数据是时序数据.RNN它解决了前馈神经网络,无法体现数据时序关系的缺点.在RNN网络中,不仅同一个隐含层的节点可以相互连接,同时隐含层的输入不仅来源于输入层的输入还包括了上一 ...

  6. 吴恩达《AI For Everyone》_练习英语翻译_待更新

    AI For Everyone https://www.coursera.org/learn/ai-for-everyone 讲师: Andrew Ng (吴恩达) CEO/Founder Landi ...

  7. 吴恩达deeplearning之CNN—卷积神经网络

    https://blog.csdn.net/ice_actor/article/details/78648780 个人理解: 卷积计算的过程其实是将原始的全连接换成了卷积全连接,每个kernel为对应 ...

  8. 吴恩达DeepLearning 第一课第四周随笔

    第四周 4.1深度神经网络符号约定 L=4______(神经网络层数)   4.2 校正矩阵的维数 校正要点:,, dZ,dA,dW,db都与它们被导数(Z,A,W,b)的维数相同 4.3 为什么使用 ...

  9. 吴恩达 Deep learning 第一周 深度学习概论

    知识点 1. Relu(Rectified Liner Uints 整流线性单元)激活函数:max(0,z) 神经网络中常用ReLU激活函数,与机器学习课程里面提到的sigmoid激活函数相比有以下优 ...

随机推荐

  1. express项目创建

    npm install express-generator -g       全局安装express生成器 express -h  帮助中心 express 项目名 npm i    安装依赖 nod ...

  2. Java 循环队列

    传统数组实现的队列有缺陷,当多次入队出队后,队头指针会后移,当队尾指针达到数组末尾时,会提示队列已满,导致数组前部分空间被浪费.如果当队尾和队头指针到达数组末尾时能从数组[0]继续添加数据,可以提升数 ...

  3. 【LC_Lesson3】---回文数的判别

    判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 121 输出: true 示例 2: 输入: -121 输出: false 解释: 从左向 ...

  4. C#与JavaScript中URL编码解码问题(转)

    混乱的URI编码 JavaScript中编码有三种方法:escape.encodeURI.encodeURIComponent C#中编码主要方法:HttpUtility.UrlEncode.Serv ...

  5. Django 导入配置文件

    from django.conf import settings

  6. Java单体应用 - 开发工具 - 02.Maven

    原文地址:http://www.work100.net/training/monolithic-tools-maven.html 更多教程:光束云 - 免费课程 Maven 序号 文内章节 视频 1 ...

  7. 【WPF on .NET Core 3.0】 Stylet演示项目 - 简易图书管理系统(4) - 图书列表界面

    在前三章中我们完成了登录窗口, 并掌握了使用Conductor来切换窗口, 但这些其实都是在为我们的系统打基础. 而本章中我们就要开始开发系统的核心功能, 即图书管理功能了. 通过本章, 我们会接触到 ...

  8. 彻底理解Future模式

    先上一个场景:假如你突然想做饭,但是没有厨具,也没有食材.网上购买厨具比较方便,食材去超市买更放心. 实现分析:在快递员送厨具的期间,我们肯定不会闲着,可以去超市买食材.所以,在主线程里面另起一个子线 ...

  9. Java程序员学习Go语言—之一

    转载:https://www.luozhiyun.com/archives/206 GOPATH 工作空间 GOPATH简单理解成Go语言的工作目录,它的值是一个目录的路径,也可以是多个目录路径,每个 ...

  10. Python3基础之正则表达式

    正则表达式 在线测试工具 http://tool.chinaz.com/regex/ 同一个位置上可以出现的字符的范围. 字符组 : [字符组] 在同一个位置可能出现的各种字符组成了一个字符组,在正则 ...