【机器学习】李宏毅——Recurrent Neural Network(循环神经网络)
假设我们当前要做一个人工智能客服系统,那该系统就需要对用户输入的话语进行辨认,例如用户输入:
I want to arrive Taipei on November 2nd
那么该系统就能够辨认出来Taipei是目的地,而后面是时间。那么我们可以用一个简单的前向网络来实现这个事情,输出为这个单词属于哪个含义的概率。但这会存在问题,例如输入以下:
I want to leave Taipei on November 2nd
同样输入都是Taipei,但是第一个句子是作为目的地,第二个句子是作为出发地,那么普通的前向网络是无法对同一个输出做出不同的输出的。因此就希望此时使用的网络能够具有一定的记忆性,即在看到Taipei之前因为已经读入了前一个词汇(arrive、leave),那么就根据这前面的词汇来进行辅助判断。
RNN的结构特点

其主要的特点在于每个隐含层的输出都会存放在一个另外的位置中(\(a_1,a_2\)),并且隐含层接受的输入包括原本的输入和当前存储记忆中的值,假设权重都是1,那么该隐含层的输入就是\(a_1+a_2+x_1+x_2\)。并且在第一次输入的时候由于记忆中没有值因此需要赋予初始值。
而这样存在记忆的结构就使得RNN对于输入的顺序是敏感的,不同的输入之间并不是独立的,它们顺序一旦变化就会引起输出的大不相同。那么如果用RNN来处理之前的任务:

注意这里并不是用到了三个网络结构,而是同一个网络在不同的时间点被使用了三次。那么这就可能使得输入同样的词汇结果输出是不一样的,因为前面的输入也会影响该结果。
而RNN同样也可以往deep发展:

RNN网络的变体
下面介绍RNN网络的变体:
Elman Network & Jordan Network
这两种网络都是RNN的推广,架构的主要区别在于:
- Elman Network每个隐含层的记忆中存储的是该隐含层的输出,跟RNN是一样的
- Jordan Network中隐含层存储的都是前一个输入样本的输出\(y^{t-1}\),这种网络架构具有更好的解释性因为输出我们知道它具有什么含义,而如果是隐含层的输出我们很难明确其含义,也就很难明确网络学习到什么东西
Bidirectional RNN(双向)
这个结构的特点在于对于网络的架构是双向的,即正向是跟前面一样,反向呢是从尾部不断读到头部(因为顺序不同输出也就不相同),然后再把每个对应的输出结合起来给输出层作为输入,即将正向的\(x^t\)的输出和反向的\(x^t\)的输出一起作为输出层的输入得到真正输出\(y^t\):

那么这就导致在在对每个输入做判断的时候,相当于综合了前后的所有信息来做判断。
Long Short-term Memory(LSTM)
顾名思义,就是具有比较长期记忆能力的RNN网络,前面的RNN 网络都是只要有了新的输入进来,记忆结点中就会被重写,但LSTM不一样,其主要特点的结构如下,其具有三个Gate

- Input Gata:输入端的闸门,在每次有新的输入进行神经网络后隐含层将会产生新的输出,而这个新的输出是否能够写入记忆结点中就取决于Input Gata,只有其是打开状态才能进行写入
- Ouput Gata:输出端的闸门,只有当该闸门打开时,才能够读取其中的内容来作为隐含层的另一个输入
- Forget Gata:该闸门控制什么时间点应该将当前记忆结点中的内容忘记掉
上面各个Gata的打开和关闭都是网络自己学习到的。因此每一个记忆结点就有四个输入(输入数值和三个控制信号)和一个输出
下面来看其具体的运作行为:

- 输出z经过激活函数g得到g(z),然后Input Gata的输出\(z_i\)经过激活函数(Gata的激活函数一般为sigmoid)得到\(f(z_i)\)
- 原来记忆单元中的值为c,而Forget Gate的输出与c相乘,计算得到\(c`=g(z)f(z_i)+cf(z_f)\),作为记忆单元中信的存储值
- 记忆单元中的值经过h得到\(h(c`)\),再与输出单元的输出相乘并进行输出
为什么采用Sigmoid函数来作为Gate的激活函数呢?因为它的输出在0到1之间,可以认为是该闸门打开的程度。而这里可以看出ForgetGate打开的时候(输出为1)是对原来的值进行记忆的,只有关闭的时候才是对原来的值清零的。也可以看出输出的值跟所有闸门的打开关闭是息息相关的。这边所有Gate的输入都是学习得到的。
上面所说的只是单个结点,整体的网络就相当于将神经元换成这整个记忆单元,如下图:

因此认为神经元数目相同时,LSTM参数量是普通的四倍。而实际上LSTM并不会这么简单:

可以认为x是乘以了四个矩阵(权重矩阵)得到了四个向量,这四个向量的长度和该层LSTM记忆单元的数目一样,然后每一个作为LSTM的输入,因此刚好就四个输入,如上图。因此如果多个串起来就是:

但实际上仍不是LSTM的完全体,完全体如下:

就是将上一层的输出和记忆单元当前的值和这一层的输入拼在一起作为输入,再加上多层:

这就是LSTM的完全体了。
Loss Function

将输出的词性或者是标注作为目标向量,损失函数就是输出向量与目标向量的距离。
学习算法Backpropagation through time(BPTT)
跟之前的网络一样,RNN对于网络参数的学习仍然是采用梯度下降的方式。而为了高效的计算梯度就有了BPTT这个算法(课程没有介绍这部分)。
但是RNN的训练并不容易:

这是因为它的损失函数非常地特殊:

这就导致损失函数计算梯度的时候经常跳动,总体损失也剧烈变化。而实际上做法可以将梯度设置一个阈值,超过则默认为阈值就可以了,不然可能会陡峭导致梯度无穷大。为什么会有上面这么陡峭的损失函数呢?来看下图的结构:

在很小的区间内,权重非常微小的变化就会导致输出剧烈的变化,因此很难通过学习率来应对。这主要是因为同一个参数在不同的时间点多次被使用所导致的。
而如果将RNN换成LSTM,它可以解决上述出现的梯度消失(Gradient vanishing)的问题,这可能会在面试中提及。
为什么LSTM可以解决梯度消失的问题
- RNN里面每一轮都会使得记忆结点中的值被清洗掉,而在LSTM中可以认为其记忆结点中的值是与输入进行累加的。因此可以认为一旦权重变化会导致记忆结点中的值发生变化,这个变化就会一直存在(除非Forget Gate决定将其洗掉,这是很少数的情况),因此除非ForgetGate关闭,否则都不会有Gradient vanishing 的问题。RNN中由于每次都清洗,因为可以认为权重的变化而引起的最终结果的变化时剧烈的,而LSTM是在原来有的基础上做变化,这就可以中和掉一些。
或者可以采用GRU,其只有两个gate,更简单但是表现也不差
【机器学习】李宏毅——Recurrent Neural Network(循环神经网络)的更多相关文章
- Recurrent Neural Network(循环神经网络)
Reference: Alex Graves的[Supervised Sequence Labelling with RecurrentNeural Networks] Alex是RNN最著名变种 ...
- Recurrent Neural Network系列1--RNN(循环神经网络)概述
作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 本文翻译自 RECURRENT NEURAL NETWORKS T ...
- 循环神经网络(Recurrent Neural Network,RNN)
为什么使用序列模型(sequence model)?标准的全连接神经网络(fully connected neural network)处理序列会有两个问题:1)全连接神经网络输入层和输出层长度固定, ...
- 4.5 RNN循环神经网络(recurrent neural network)
自己开发了一个股票智能分析软件,功能很强大,需要的点击下面的链接获取: https://www.cnblogs.com/bclshuai/p/11380657.html 1.1 RNN循环神经网络 ...
- Recurrent Neural Network(递归神经网络)
递归神经网络(RNN),是两种人工神经网络的总称,一种是时间递归神经网络(recurrent neural network),另一种是结构递归神经网络(recursive neural network ...
- 机器学习: Python with Recurrent Neural Network
之前我们介绍了Recurrent neural network (RNN) 的原理: http://blog.csdn.net/matrix_space/article/details/5337404 ...
- Recurrent Neural Network系列2--利用Python,Theano实现RNN
作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 本文翻译自 RECURRENT NEURAL NETWORKS T ...
- Recurrent Neural Network系列3--理解RNN的BPTT算法和梯度消失
作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 这是RNN教程的第三部分. 在前面的教程中,我们从头实现了一个循环 ...
- Recurrent Neural Network系列4--利用Python,Theano实现GRU或LSTM
yi作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 本文翻译自 RECURRENT NEURAL NETWORK ...
- Recurrent Neural Network[survey]
0.引言 我们发现传统的(如前向网络等)非循环的NN都是假设样本之间无依赖关系(至少时间和顺序上是无依赖关系),而许多学习任务却都涉及到处理序列数据,如image captioning,speech ...
随机推荐
- service的dns记录
当您创建一个 Service 时,Kubernetes 为其创建一个对应的 DNS 条目.该 DNS 记录的格式为 ..svc.cluster.local,也就是说,如果在容器中只使用 ,其DNS将解 ...
- Android类加载流程
背景 由于前前前阵子写了个壳,得去了解类的加载流程,当时记了一些潦草的笔记.这几天把这些东西简单梳理了一下,本文分析的代码基于Android8.1.0源码. 流程分析 从loadClass开始,我们来 ...
- LOJ139 树链剖分
题目 感觉这已经不能说是模板了吧...... 解析: 难点在于换根后对子树进行的操作,设rt为当前根节点,u为操作子树: u=rt时,就是对整棵树操作,没事么好说的. rt不在u的子树范围内,操作对象 ...
- acwing349 黑暗城堡 (最短路径生成树)
求出最短树,用乘法原理统计答案就行了(模拟prim过程). 不知道说什么了,直接上代码: 1 #include<cstring> 2 #include<iostream> 3 ...
- MatrixOne Linux 编译文档
MatrixOne Linux 编译文档 编译环境 硬件环境 操作系统 内存 CPU 磁盘 Windows环境下的Linux虚拟机 Linux version 3.10.0-1160.el7.x86_ ...
- 路径分析—QGIS+PostgreSQL+PostGIS+pgRouting(一)
前言 因业务需求,需要做最短路径分析.最近几天查询资料,并自己动手,实现了简单的路径分析. 下面就介绍具体的实现过程. 本篇文章最终结果是在 PostgreSQL 数据库中实现的,后续的可视化展示会继 ...
- 萌新也能看懂的KMP算法
前言 算法是什么?算法就是数学规律.怎么去总结和发现这个规律,就是理解算法的过程. KMP算法的本质是穷举法,而并不是去创造新的匹配逻辑. 以下将搜寻的字符串称为子串(part),以P表示.被搜寻的字 ...
- Docker | 自定义网络(网关、子网地址)
了解 docker network 通过下面的命令来获取帮助 docker network --help Commands: connect Connect a container to a netw ...
- 『现学现忘』Git分支 — 41、分支基本操作(二)
目录 6.新建一个分支并且使分支指向指定的提交对象 7.思考: 8.项目分叉历史的形成 9.分支的总结 提示:接上篇 6.新建一个分支并且使分支指向指定的提交对象 使用命令:git branch br ...
- Java多线程(4):ThreadLocal
您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来- 为了提高CPU的利用率,工程师们创造了多线程.但是线程们说:要有光!(为了减少线程创建(T1启动)和销毁(T3切换)的时间),于是工程师们又接着 ...