您的位置:首页 > 理论基础 > 计算机网络

王小草【深度学习】笔记第六弹--循环神经网络RNN和LSTM

2016-12-08 17:10 2481 查看
标签(空格分隔): 王小草深度学习笔记

今天要讲的是神经网络中的一种————循环神经网络,它是一种具有记忆的神经网络,工业界最常见的应用比如“机器翻译”。另外,一切与序列或时间相关的问题都可以用RNN来尝试一下,比如RNN能模型写文章写代码写诗歌写乐谱等等。

本文,先介绍了RNN的一些应用,然后介绍rnn的运行原理,最后介绍RNN中的一款比较优秀的模型LSTM的结构与原理。

1. 循环神经网络的多种应用

1.1 生成模型

模仿论文:

把大量的论文喂给我们的循环神经网络宝宝,于是她自己学会了写论文,下图就是一篇由循环神经网络写的论文,从格式,标点,句式,公式等等所有的一切都无比正确,计算机活脱脱就成了一个学者大牛。



模仿linux内核代码写程序

这是一个喂代码的例子,循环神经网络在学习了大量代码后,自己也尝试着写出了一份程序。程序的格式完全正确,无一漏洞,令人惊叹!



模仿小四的作品

如果论文和代码你看到就头痛,那么来看一看循环神经网络学霸哥哥写文学作品吧。这位学霸哥吃了很多小四的文章和作品,于是自己也写起了这样的笔触,细细读来,还真是文采飞扬,忧伤淡淡,不乏哲思呢。



1.2 机器翻译

循环神经网络除了有强大的模仿能力,还有一个在工业界应用略成熟的功能,就是“机器翻译”。

你肯定做过这样一件事,在有道上打进一句中文,然后得到一句英文翻译,虽然有时候总也不那么准确,但是通过人工稍作调整就可以用了,哈哈。虽然不知道有道背后运用的是什么样的算法和逻辑,但通过许多实验与应用,循环神经网络做机器翻译的准确度确是非常高的。



1.3 看图说话

循环神经网络还会看图说话,如下图,第一张图片它能够描述出一辆火车沿着森林边的铁轨驶过;第二张图片它不但能识别出图中有两个人和一个冲浪板,还能猜测两人此刻的对话呢~



2. 循环神经网络

恩恩,如果你被上面的例子震撼到了(作为爱好写文的文青我,看到它模仿小四的文章,真的是折服啊!!),那么就一起怀着澎湃的激情来看看循环神经网络的运作原理与逻辑吧。。。

2.1 循环神经网络RNN概述

传统的深度神经网络与卷积神经网络,在前面的笔记中都已经详述,他们强大的能力与优势也已经有目共睹了。那么,为什么还要有循环神经网络RNN呢?

传统的神经网络,输入与输出都是互相独立的。比如说在用卷积神经网络做图像识别的时候,一个图片中的猫和狗是被分割开的,是互相独立的。

然而在有些场景下,后续的输出和之前的内容是相关的。比如“我是中国人,我的母语是_”,空格中要填写的需要依赖于前文中的“中国人”。其实就像英语考试中的完形填空一样,要知道这个空中填什么,必须要看上下文。

因此,RDD中引入了“记忆”的概念。“输出”依赖于“输入”和上一个时间点的”记忆“。记忆使得前文中的东西仍然对后文产生了影响。

2.2 循环神经网络的结构



先来看上图的右边部分。从左到右是时间发展的过程,第一个是t-1的时刻,中间是t时刻,第三个是t+1时刻。St是t时刻的记忆,x是指输入,O是指输出,W是指从上一个时刻t-1到这个时刻t的权重,U是指输入到隐层的权重。

很直观的看到,在t时刻,St被两个箭头所指向,分别是来自于t-1时刻的St-1 * W的影响,和t时刻的输入Xt * U的影响。也就是说,和传统的神经网络相比,RNN多了一份对过去的记忆。

公式:



f可以是tanh等的激励函数,输入激励函数的分别是前一个时刻的记忆乘以权重,和这个时刻的输入乘以权重

Ot的输出可能是softmax输出的属于每个候选词的概率,Ot = softmax(VSt)

将这三个时候折叠起来,其实就是左图中的样子。

循环神经网络之结构细节:

1.可以把隐状态St视作“记忆体”,它捕捉了之前时间点上的信息。

2.输出Ot由当前时间及之前所有的“记忆”共同得到。虽然指向St的只有上一个时刻的记忆St-1,但是St-1是由St-2的记忆得到的,逐层往前推,其实St是受到了之前所有的记忆的共同影响。

3.可惜的是,在实际应用中,St并不能捕捉和保留之前所有的信息(之后论述)。

4.不同于CNN,这里的RNN其实是整个神经网络共享了一组参数(U,V,W),极大减小了需要训练和估计的参数数量。也就是说,无论什么时刻,W的值和U的值都是一样,同时,V是softmax中的参数,它也是一样的。参数的数量并不会随着时间循环次数的增多而上升的。

5.图中的Ot在有些任务下是不存在的,比如文本情感分析,其实只需要最后的output结果就行。

2.3 不同类型的RNN

2.3.1 双向RNN

存在这样的情况,当前的输出不只依赖于之前的序列元素,还可能依赖之后的序列元素,比如之前说过的完形填空,可能需要去看看下文在讲什么,才能知道前面的空格填什么。此时就需要双向循环神经网络了,来看看双向RNN的结构:



与单向的RNN不同之处在于,它还有一个由t+1往回连接到t的一条线,t时刻的记忆受三个因素影响:t-1时刻的记忆,t+1时刻的记忆,t时刻的输入。若要写成公式可能更直观一点:



最终的

其实就是我们之前说的St.

是激励函数g()的输出,而输入激励函数的是前向和后向的两个ht组成的U函数加上一个常数项c。

2.3.2 深层双向RNN

深层双向RNN和双向RNN的区别是每一步,也就是每一个时间点我们设置了多层结构。



其公式的表达如下:



2.4 RNN与BPTT算法

还记得前面的笔记中讲到的用BP算法求导来求神经网络的最优参数吗~

在RNN中因为多了一个时间因素的影响,所以求最优化的过程也有那么一丁点的不同。对RNN求最优化的过程我们叫BPTT(TT = Through Time)

再来回顾一下RNN的结构好了:



然后开始贴公式了哈:

首先,最优化,就是求解误差最小的过程,误差是输出与实际值的差值。

是实际值,

是输出的预测值,因为每个时间点都会有输出,所以误差是所有时间上误差的总和。



现在要对上面的函数做求导,W是参数,先对W求导:



将以上公式展开,如下:



但是

,依赖于S2.所以根据链式法则,可以将公式推导成如下,k是循环的次数。



将公式再展开:



展开的过程可以直观地看下图理解:



2.5 RNN与图片描述

在1.3我们已经介绍过了RNN在看图说话中的应用。即给出一张图片,使得计算机能够准确得描述出图片中的信息。现在来详细地讲一讲这其中的原理。

首先进来一张图片,我们人眼能够轻易识别出图中是一个老人,戴着草帽。



图片进来之后不是直接进入RNN中的,它要先进入卷积神经网络。卷积神经网络CNN的结构在前面的笔记中已经讲过,在此赘述。图片进入CNN是以矩阵的形式(3 * 227 * 247维),通过卷积神经网络的各个层次,最后从全连接层出来时为1 * 4096维的向量,这个向量是经过softmax之后的一个结果。





将CNN中出来的1 * 4096维的向量作为RNN的一个输入,直接指向隐藏层h0。h0还被一个表示语句开始的向量所指向,对于第一次循环来说这是一个固定的词,表示一句话的开始,对之后的循环来说,这个向量其实就是前一次循环的输出,也就是记忆。



之前讲的RNN隐藏层的函数为:



那么现在多了一个由CNN而来的图片向量的输入,公式可以写成这样,即多了一个V,V是CNN中出来的结果,Wih是对应的权重。其他的不变。



第一次循环的输是y0,y0是经过sigmoid函数的一个输出,所以是一组概率,概率表示的是每个词的概率,模型会选取具有最大概率的那个词,比如这里,y0是“老人”。(在这之前会有一个one-hot的字典来对照的)。

进入第二次循环的时候,第一次循环的的记忆h0会作用于它,而刚刚CNN中输出的结果其实也已经被记忆在了h0中,也间接性地作用在了h1中,第二次循环输出的词是“戴着”。

同理第三次循环的输出是“帽子”。

若一句话结束了则最后一次循环输出的是“[end token]”。

于是将三次循环的结果拼在一起,就形成了“[start]老人戴着帽子[end]”,很好地描述了图片的信息。



如果想自己亲自做一做实验,下面这个网址提供了一份数据集,其中包含12万众图片,每张图片都有5句话描述。

http://mscoco.org

来看一看用这个数据集去训练RNN的所预测的结果,仔细看图片下面的描述文字,第一行图片被很准确地描述出来了,而第二行却差强人意,虽然语句通顺但与图片的信息却不太符合。



RNN只是图片描述中的一种,存在着一些缺陷不可置否,在工业界,还有许多其他优秀的算法也可以用来做图片描述,这些在之后的笔记中会详述。

3. 循环神经网络之 LSTM

3.1 LSTM概述

前面RNN中提到了,RNN虽然有记忆,但是随着时间间隔不断增大,RNN会丧失学习到连接如此远的信息的能力。也就是说,记忆容量有限,一本书从头到尾一字不漏去记,肯定离地越远的东西忘得越多。这主要是因为在BPTT后向求导的时候,偏导数会越来越接近于0,从而“丧失记忆”。

这个问题我们已经找到解决的办法,就是使用LSTM。

LSTM是RNN中的一种类型,大体的结构与RNN是几乎一样的。而区别在于:

LSTM的“记忆细胞”是改造过的;

LSTM实现了一种功能,就是该记的信息会一直传递下去,不该记的信息会被“门”gate给截断不往下传。

3.2 LSTM结构

在来回忆一下之前讲的普通的RNN是这样的结构的:



放大“记忆细胞”(就是之前讲的那个隐藏层h),内部的结构是这样的:



那么在LSTM中,记忆细胞变得稍微的那么复杂了一点点:



图中绿色的大块A是每一次循环中的记忆细胞,也就是隐藏层。在隐藏层中乍看有些凌乱又复杂的线路。粉红小圆表示的是点与点相乘的计算,黄色小方块表示的是激励函数,有sigmoid和tanh两种类型。

看到这里,有点心方,这隐藏层里好像装满了大肠小肠让人无法理解,不要方,接下来,会一部分一部分地讲解~

细胞状态:

细胞状态指的是从前一个时刻的记忆Ct-1到这一个时刻Ct的传送带,与之前普通的RNN中的链接一样。与之前的RNN不同的时,并不是将记忆直接通过这条线一路传过去,在传送的过程中会有一些线性的运算,这些线性的交互,是为了截掉无用的信息,增加有用的信息,使得记忆在不断的循环中仍然不会衰减。下图从左到右的黑线中有两个小粉圆,表示线性计算实现以上两个目的。



第一步:忘记门

在Ct-1到Ct传送记忆的过程中,第一步要遇到的线性交互就是”忘记门“。忘记门决定”细胞状态“中需要丢弃什么信息,这些信息对之后的计算和预测都是没有用的,所以趁早舍弃掉,不要占用大脑资源也避免了对后续信息的误导。



仔细看上图,忘记门的计算是这样的,首先输入来自两个因素,一个是ht-1,是上一时刻的输出,一个是xt,是这一时刻的输入。计算过程是这样的:他们一起乘以一个权重Wf后加上一个常数项bf(这是一个线性的过程),然后进入sigmoid函数。sigmoid函数输出的是一组[0,1]之间的概率,用函数ft表示。写成公式是酱紫的:



这个ft会和从”细胞状态“中传过来的Ct-1做一个相乘,。因为ft是一组概率,表示每一部分有多少量可以通过,所以乘完之后,概率为0的就被过滤掉了,其他的根据概率得到的量或多或少地继续在”细胞状态“这条传送带上往前奔跑了。

第二步:添加门”

添加门是我自己取的,不知道准不准确,意思就是这个步骤是为了将一些对后文有用的新的信息添加到“细胞状态”中。



仔细看图。增加门也有两个输入,也是前一时刻的输出ht-1,和这个时刻的输入xt。但是这两个东东要同时去做两个运算。一是通过sigmoid层去决定什么值需要更新;



另外还要通过tanh层去创建一个新的候选值向量




然后将上面得到的两个结果做相乘,需要保留的新的信息因为有更大的概率相乘,从而量也会更大。最后相乘计算后的结果再与“细胞状态”去做线性交互,然后继续往下传。

第三步:更新门



现在要把Ct-1更新为Ct了。将上面两个门的结果作用进来,写成公式如下:



第四步:基于“细胞状态”得到输出

首先运行一个sigmoid层来确定细胞状态的那个部分将输出,概率大的则输出量也大。

接着用tanh处理细胞状态,得到一个在[-1,1]之间的值,再将它和sigmoid的输出相乘,输出我们确定的输出部分。



公式表达式酱紫的:



3.3 LSTM的变种

LSTM也有很多变种,但这里不再着重强调了。下面这篇论文比较了各种变种,得出结论说其实这些变种的效果效果都相差不大。

2015的paper《LSTM:A Search Space Odyssey》

——————————————————嘻嘻——————————————————————

到这里为止,我们介绍了循环神经网络RNN以及它的升级版LSTM。理解它们的原理,有助于我们去看懂整个代码,从而也能够去自己调整代码,优化参数。

RNN的其他资料:

2015年论文《An Empirical Exploration of Recurrent Netword Architecture》中,google 和facebook的大神尝试了1W+种RNN架构,发现并非所有任务上LSTM都表现最好。

其他更多RNN的研究与应用可以在这里找到。

//github.com/kjw0612/awesome-rnn
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: