学习笔记之——RNN

版权声明: https://blog.csdn.net/gwplovekimi/article/details/83474593

本博文来源于我团队得一位师妹哈~

RNN的初步了解

  1. 什么是RNN

  循环神经网络Recurrent Neural Network神经网络是一种节点定向连接成环的人工神经网络。这种网络的内部状态可以展示动态时序行为。不同于前馈神经网络的是,RNN可以利用它内部的记忆来处理任意时序的输入序列,这让它可以更容易处理如不分段的手写识别、语音识别等。简单来说,RNN是一类用于处理序列数据的神经网络.

首先我们要明确什么是序列数据,摘取百度百科词条:时间序列数据是指在不同时间点上收集到的数据,这类数据反映了某一事物、现象等随时间的变化状态或程度。这是时间序列数据的定义,当然这里也可以不是时间,比如文字序列,但总归序列数据有一个特点——后面的数据跟前面的数据有关系。

  1. RNN的结构

我们从基础的神经网络中知道,神经网络包含输入层、隐层、输出层,通过激活函数控制输出,层与层之间通过权值连接。激活函数是事先确定好的,那么神经网络模型通过训练“学“到的东西就蕴含在“权值“中。

基础的神经网络只在层与层之间建立了权连接,RNN最大的不同之处就是在层之间的神经元之间也建立的权连接。如图:

这是一个标准的RNN结构图,图中每个箭头代表做一次变换,也就是说箭头连接带有权值。左侧是折叠起来的样子,右侧是展开的样子,左侧中h旁边的箭头代表此结构中的“循环“体现在隐层。

在展开结构中我们可以观察到,在标准的RNN结构中,隐层的神经元之间也是带有权值的。也就是说,随着序列的不断推进,前面的隐层将会影响后面的隐层。图中O代表输出,y代表样本给出的确定值,L代表损失函数,我们可以看到,“损失“也是随着序列的推荐而不断积累的。

除上述特点之外,标准RNN的还有以下特点:

1、权值共享,图中的W全是相同的,UV也一样。

2、每一个输入值都只与它本身的那条路线建立权连接,不会和别的神经元连接。

 

以上是RNN的标准结构,然而在实际中这一种结构并不能解决所有问题,例如我们输入为一串文字,输出为分类类别,那么输出就不需要一个序列,只需要单个输出。如图。

同样的,我们有时候还需要单输入但是输出为序列的情况。那么就可以使用如下结构:

还有一种结构是输入虽是序列,但不随着序列变化,就可以使用如下结构:

原始的N vs N RNN要求序列等长,然而我们遇到的大部分问题序列都是不等长的,如机器翻译中,源语言和目标语言的句子往往并没有相同的长度。 下面我们来介绍RNN最重要的一个变种:N vs M。这种结构又叫Encoder-Decoder模型,也可以称之为Seq2Seq模型。从名字就能看出,这个结构的原理是先编码后解码。左侧的RNN用来编码得到c,拿到c后再用右侧的RNN进行解码。得到c有多种方式,最简单的方法就是把Encoder的最后一个隐状态赋值给c,还可以对最后的隐状态做一个变换得到c,也可以对所有的隐状态做变换。 如下图;

双向RNN  基本思路基于当前状态下的输出不仅与前面序列有关,还与后面的序列有关。比如要预测序列的一个词,不仅要看左边的词,还要看右边的词。如图1

深度(双向)RNN  和双向RNN一样,只不过是每一步的隐藏层更多,这使得我们可以获得一个更加好的效果。如图2

除了以上这些结构以外RNN还有很多种结构,用于应对不同的需求和解决不同的问题。但相同的是循环神经网络除了拥有神经网络都有的一些共性元素之外,它总要在一个地方体现出“循环“,而根据“循环“体现方式的不同和输入输出的变化就形成了多种RNN结构。

3.标准RNN的前向输出流程

上面介绍了RNN有很多变种,但其数学推导过程其实都是大同小异。这里就介绍一下标准RNN的前向传播过程

再来介绍一下各个符号的含义:x是输入,h是隐层单元,o为输出,L为损失函数,y为训练集的标签。这些元素右上角带的t代表t时刻的状态,其中需要注意的是,因策单元ht时刻的表现不仅由此刻的输入决定,还受t时刻之前时刻的影响。VWU是权值,同一类型的权连接权值相同。

有了上面的理解,前向传播算法其实非常简单,对于t时刻:

h(t)=ϕ(Ux(t)+Wh(t1)+b)

其中ϕ()为激活函数,一般来说会选择tanh函数,b为偏置。

t时刻的输出就更为简单:

o(t)=Vh(t)+c

最终模型的预测输出为:

y^(t)=σ(o(t))

其中σ为激活函数,通常RNN用于分类,故这里一般用softmax函数。

4.RNN的训练方法——BPTT

BPTT(back-propagation through time)算法是常用的训练RNN的方法,其实本质还是BP算法,只不过RNN处理时间序列数据,所以要基于时间反向传播,故叫随时间反向传播。BPTT的中心思想和BP算法相同,沿着需要优化的参数的负梯度方向不断寻找更优的点直至收敛。综上所述,BPTT算法本质还是BP算法,BP算法本质还是梯度下降法,那么求各个参数的梯度便成了此算法的核心。

再次拿出这个结构图观察,需要寻优的参数有三个,分别是UVW。与BP算法不同的是,其中WU两个参数的寻优过程需要追溯之前的历史数据,参数V相对简单只需关注目前,那么我们就来先求解参数V的偏导数。

RNN的损失也是会随着时间累加的,所以不能只求t时刻的偏导。

WU的偏导的求解由于需要涉及到历史数据,其偏导求起来相对复杂,我们先假设只有三个时刻,那么在第三个时刻 LW的偏导数为:

相应的,L在第三个时刻对U的偏导数为:

可以观察到,在某个时刻的对W或是U的偏导数,需要追溯这个时刻之前所有时刻的信息,这还仅仅是一个时刻的偏导数,上面说过损失也是会累加的,那么整个损失函数对WU的偏导数将会非常繁琐。虽然如此但好在规律还是有迹可循,我们根据上面两个式子可以写出Lt时刻对WU偏导数的通式:

整体的偏导公式就是将其按时刻再一一加起来。

前面说过激活函数是嵌套在里面的,如果我们把激活函数放进去,拿出中间累乘的那部分:

我们会发现累乘会导致激活函数导数的累乘,进而会导致“梯度消失“梯度爆炸现象的发生。但是你可能会提出异议,RNN明明与深层神经网络不同,RNN的参数都是共享的,而且某时刻的梯度是此时刻和之前时刻的累加,即使传不到最深处那浅层也是有梯度的。这当然是对的,但如果我们根据有限层的梯度来更新更多层的共享的参数一定会出现问题的,因为将有限的信息来作为寻优根据必定不会找到所有信息的最优解。RNN的特点本来就是能“追根溯源“利用历史数据,现在告诉我可利用的历史数据竟然是有限的,这就令人非常难受,解决“梯度消失“是非常必要的。解决“梯度消失“的方法主要有:

1、选取更好的激活函数 
2
、改变传播结构

关于第一点,一般选用ReLU函数作为激活函数

关于第二点,我们需要在此基础上改进传播结构。

 

5.LSTM

RNNRecurrent Neural Network)的提出是出于“人的认知是基于过往记忆与经验”的这样一种想法而提出的,RNN对于输入,进行一个学习过程,我们所期望的即是根据上下时刻的输入输出,学习到最正确的参数W,V,U,用于预测当前输入对应的输出。而RNN会遇到一个很大的问题,她不适合长期记忆,也就是后面时间的节点对于前面时间的节点感知力下降,所以提出了一个新的结构,叫做LSTMLSTM引入一个核心元素就是Cell。

Long Short Term 网络—— 一般就叫做 LSTM ——是一种 RNN 特殊的类型,可以学习长期依赖信息。LSTM Hochreiter & Schmidhuber (1997)提出,并在近期被Alex Graves进行了改良和推广。在很多问题,LSTM 都取得相当巨大的成功,并得到了广泛的使用。 LSTM 通过刻意的设计来避免长期依赖问题。记住长期的信息在实践中是 LSTM 的默认行为,而非需要付出很大代价才能获得的能力!所有 RNN 都具有一种重复神经网络模块的链式的形式。在标准的 RNN 中,这个重复的模块只有一个非常简单的结构,例如一个 tanh

LSTM 同样是这样的结构,但是重复的模块拥有一个不同的结构。不同于 单一神经网络层,整体上除了h在随时间流动,细胞状态c也在随时间流动,细胞状态c就代表着长期记忆。

黄色的矩形是学习得到的神经网络层

粉色的圆形表示一些运算操作,诸如加法乘法

黑色的单箭头表示向量的传输

两个箭头合成一个表示向量的连接

一个箭头分开表示向量的复制

在我们 LSTM 中的第一步是决定我们会从细胞状态中丢弃什么信息。这个决定通过一个称为遗忘门完成。该门会读取ht1Xt,输出一个在 0 1 之间的数值给每个在细胞状态Ct1Ct1 中的数字。1 表示“完全保留”,0 表示“完全舍弃”。

让我们回到语言模型的例子中来基于已经看到的预测下一个词。在这个问题中,细胞状态可能包含当前主语的性别,因此正确的代词可以被选择出来。当我们看到新的主语,我们希望忘记旧的主语。这里可以抛出两个问题:这个门怎么做到“遗忘“的呢?怎么理解?既然是遗忘旧的内容,为什么这个门还要接收新的Xt?

对于第一个问题,“遗忘“可以理解为“之前的内容记住多少“,其精髓在于只能输出(01)小数的sigmoid函数和粉色圆圈的乘法,LSTM网络经过学习决定让网络记住以前百分之多少的内容。对于第二个问题就更好理解,决定记住什么遗忘什么,其中新的输入肯定要产生影响。

 

下一步是确定什么样的新信息被存放在细胞状态中。这里包含两个部分。第一,sigmoid 层称 “输入门层” 决定什么值我们将要更新。然后,一个 tanh 层创建一个新的候选值向量,Ct,会被加入到状态中。下一步,我们会讲这两个信息来产生对状态的更新。

在我们语言模型的例子中,我们希望增加新的主语的性别到细胞状态中,来替代旧的需要忘记的主语。现在是更新旧细胞状态的时间了,Ct1更新为 Ct。前面的步骤已经决定了将会做什么,我们现在就是实际去完成。

我们把旧状态与ft相乘,丢弃掉我们确定需要丢弃的信息。接着加上itC~titC~t。这就是新的候选值,根据我们决定更新每个状态的程度进行变化。

有了上面的理解基础输入门,输入门理解起来就简单多了。sigmoid函数选择更新内容,tanh函数创建更新候选。

最终,我们需要确定输出什么值。这个输出将会基于我们的细胞状态,但是也是一个过滤后的版本。首先,我们运行一个 sigmoid 层来确定细胞状态的哪个部分将输出出去。接着,我们把细胞状态通过 tanh 进行处理(得到一个在 -1 1 之间的值)并将它和 sigmoid 门的输出相乘,最终我们仅仅会输出我们确定输出的那部分。

这三个门虽然功能上不同,但在执行任务的操作上是相同的。他们都是使用sigmoid函数作为选择工具,tanh函数作为变换工具,这两个函数结合起来实现三个门的功能。

 

6.GRU

Gated Recurrent Unit。前面说到为了克服RNN无法很好处理远距离依赖而提出了LSTM,而GRU则是LSTM的一个变体,当然LSTM还有有很多其他的变体。GRU保持了LSTM的效果同时又使结构更加简单,所以它也非常流行。GRU模型如下,它只有两个门了,分别为更新门和重置门,即图中的ztrt。更新门用于控制前一时刻的状态信息被带入到当前状态中的程度,更新门的值越大说明前一时刻的状态信息带入越多。重置门用于控制忽略前一时刻的状态信息的程度,重置门的值越小说明忽略得越多。

7.应用

RNN已经被在实践中证明对NLP是非常成功的。如词向量表达,语句合法性检查,词性标注等。在RNN中,目前使用最广泛最成功的模型是LSTM模型。

基于LSTM的系统可以学习翻译语言、控制机器人、图像分析、文档摘要、语音识别图像识别、手写识别、控制聊天机器人、预测疾病、点击率和股票、合成音乐等等任务。举个例子,在2015年,谷歌通过基于CTC训练的LSTM程序大幅提升了安卓手机和其他设备中语音识别的能力,使用了我的实验室在2006年发表的方法。百度也使用了CTC;苹果的iPhoneQucikTypeSiri中使用了LSTM;微软不仅将LSTM用于语音识别,还将这一技术用于虚拟对话形象生成和编写程序代码等等。亚马逊Alexa通过双向LSTM在家中与你交流,而谷歌使用LSTM的范围更加广泛,它可以生成图像字幕,自动回复电子邮件,它包含在新的智能助手Allo中,也显著地提高了谷歌翻译的质量(从2016年开始)。事实上,谷歌数据中心的很大一部分计算资源现在都在执行LSTM任务。

总结

  1. RNN适用于处理序列数据和预测任务,但会受到短期记忆的影响。LSTMGRU是两种通过引入门结构来减弱短期记忆影响的演化变体,其中门结构可用来调节流经序列链的信息流.
  2. RNN最主要的特点是循环,既系统的输出会保留在网络里,和系统的下一刻的输入一起决定下一刻的输出。
  3. RNN的重要特性是可以处理不定长的输入,得到一定的输出。当你的输入可长可短, 比如训练翻译模型的时候, 你的句子长度都不固定,你是无法像一个训练固定像素的图像那样用CNN搞定的。而利用RNN的循环特性可以轻松搞定。
  4.  RNN的本质是一个数据推断(inference)机器, 它可以寻找两个时间序列之间的关联, 只要数据足够多,就可以得到从xt)到yt)的概率分布函数,理论上可以可以刻画输入的整个历史对于最终输出的任何反馈形式, 从而达到推断和预测的目的.


 

猜你喜欢

转载自blog.csdn.net/gwplovekimi/article/details/83474593
今日推荐