循环神经网络Recurrent Neural Network的一些介绍

本文介绍了循环神经网络RNN的基本结构,包括N vs N、N vs 1、One vs N和N vs M等变体,重点讨论了Encoder-Decoder模型和Attention机制。此外,还详细讲解了LSTM网络,包括其解决长期依赖问题的核心思想、网络结构、遗忘门、输入门、输出门以及常见的LSTM变体。
摘要由CSDN通过智能技术生成

由于前段时间在做有关RNN方面的实验,因此需要学习RNN的一些基本原理和知识。学习过程中看了莫凡的视频教程,读了RNN的综述论文也参考了一些博主写的关于RNN的文章。在这篇博文中我把我在这段时间学习到的有关RNN的内容进行一个整理。

1 经典RNN

1.1 RNN结构

1.1.1 N vs N

这是最经典的RNN结构。它的输入是x1,x2, … , xn,输出为y1, y2, … , yn,输入和输出序列必须要是等长的。由于这个限制的存在,经典RNN的适用范围比较小,但也有一些问题适合用经典的RNN结构建模,如:视频帧分类、Char RNN等。

1.1.2 N vs 1

有的时候,我们要处理的问题输入是一个序列,输出是一个单独的值而不是序列,只在最后一个h上进行输出变换就可以了:

这种结构通常用来处理序列分类问题。如输入一段文字判别它所属的类别,输入一个句子判断其情感倾向,输入一段视频并判断它的类别等等。

1.1.3 One vs N

输入不是序列而输出为序列,可以只在序列开始进行输入计算:

还有一种结构是把输入信息X作为每个阶段的输入:

这种1 VS N的结构可以处理的问题有:从图像生成文字(image caption),此时输入的X就是图像的特征,而输出的y序列就是一段句子;从类别生成语音或音乐等

1.1.4 N vs M

下面我们来介绍RNN最重要的一个变种:N vs M。这种结构又叫Encoder-Decoder模型,也可以称之为Seq2Seq模型。
原始的N vs N RNN要求序列等长,然而我们遇到的大部分问题序列不是等长的,如机器翻译中,源语言和目标语言的句子往往并没有相同的长度。为此,Encoder-Decoder结构先将输入数据编码成一个上下文向量c:

得到c有多种方式,最简单的方法就是把Encoder的最后一个隐状态赋值给c,还可以对最后的隐状态做一个变换得到c,也可以对所有的隐状态做变换。
拿到c之后,就用另一个RNN网络对其进行解码,这部分RNN网络被称为Decoder。具体做法就是将c当做之前的初始状态h0输入到Decoder中:

还有一种做法是将c当做每一步的输入:

由于这种Encoder-Decoder结构不限制输入和输出的序列长度,因此应用的范围非常广泛,比如:
1 机器翻译。Encoder-Decoder的最经典应用,事实上这一结构就是在机器翻译领域最先提出的。
2 文本摘要。输入是一段文本序列,输出是这段文本序列的摘要序列。
3 阅读理解。将输入的文章和问题分别编码,再对其进行解码得到问题的答案。
4 语音识别。输入是语音信号序列,输出是文字序列。

1.1.5 Attention

在Encoder-Decoder结构中,Encoder把所有的输入序列都编码成一个统一的语义特征c再解码,因此,c中必须包含原始序列中的所有信息,它的长度就成了限制模型性能的瓶颈。如机器翻译问题,当要翻译的句子较长时,一个c可能存不下那么多信息,就会造成翻译精度的下降。
Attention机制通过在每个时间输入不同的c来解决这个问题,下图是带有Attention机制的Decoder:

每一个c会自动去选取与当前所要输出的y最合适的上下文信息。具体来说,我们用aij衡量Encoder中第j阶段的hj和解码时第i阶段的相关性,最终Decoder中第i阶段的输入的上下文信息ci就来自于所有hj对aij的加权和。以机器翻译为例(将中文翻译成英文):

输入的序列是“我爱中国”,因此,Encoder中的h1、h2、h3、h4就可以分别看做是“我”、“爱”、“中”、“国”所代表的信息。在翻译成英语时,第一个上下文c1应该和“我”这个字最相关,因此对应的 就比较大,而相应的a12 、a13、a14就比较小。c2应该和“爱”最相关,因此对应的a22就比较大。最后的c3和h3、h4最相关,因此a33、a34的值就比较大。
最后关于aij,事实上, 同样是从模型中学出的,它实际和Decoder的第i-1阶段的隐状态、Encoder第j个阶段的隐状态有关。

1.2 前向传播

介绍完标准RNN的结构之后,我们来介绍标准的RNN的前向传播过程,如图1.2.1所示。

图1.2.1 RNN前向传播

其中,x是输入,h是隐层单元,o为输出,L为损失函数,y为训练集的标签。这些元素右上角带的t代表t时刻的状态,需要注意的是,隐藏单元h在t时刻的表现不仅由此刻的输入决定,还受t时刻之前时刻的影响。V、W、U是权值,同一类型的权连接权值相同。对于t时刻:

t时刻的输出:

最终模型的预测输出为:

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

1.3 BPTT和梯度消失(爆炸)

BPTT(back-propagation through time)算法是常用的训练RNN的方法,其实本质还是BP算法,只不过RNN处理时间序列数据,所以要基于时间反向传播,故叫随时间反向传播。
BPTT的中心思想和BP算法相同,沿着需要优化的参数的负梯度方向不断寻找更优的点直至收敛。综上所述,BPTT算法本质还是梯度下降法,那么求各个参数的梯度便成了此算法的核心。
图1.2.1中需要寻优的参数有三个,分别是U、V、W。与BP算法不同的是,其中W和U两个参数的寻优过程需要追溯之前的历史数据,参数V相对简单只需关注目前,那么先求解t时刻参数V的偏导数。

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

L在t时刻对W和U偏导数的通式:

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

我们会发现累乘将导致激活函数导数的累乘,进而会导致“梯度消失”和“梯度爆炸”现象的发生。 激活函数sigmoid和它的导数图像如下:

由上图可以看出sigmoid的导数值恒小于1,如果Ws也是一个小于1的值,则在long-range dependencies时——当t很大时,累乘部分就会趋向于0,导致RNN丧失学习到如此远的信息的能力。同理当Ws很大时累乘部分就会趋近于无穷,这就是RNN中梯度消失和爆炸的原因。

2 LSTM

LSTM(long short-term memory)是RNN的一种变体,RNN由于梯度消失的原因只能有短期记忆,LSTM网络通过精妙的门控制将短期记忆与长期记忆结合,并且在一定程度上解决了梯度消失的问题。

2.1 Long-Term Dependencies

RNN 的关键点之一就是他们可以用来连接先前的信息到当前的任务上,例如使用过去的视频段来推测对当前段的理解。
有时候,我们仅仅需要知道先前的信息来执行当前的任务。例如,我们有一个语言模型用来基于先前的词来预测下一个词。如果我们试着预测 “the clouds are in the sky” 最后的词,我们并不需要任何其他的上下文——下一个词很显然就应该是sky。在这样的场景中,相关的信息和预测的词位置之间的间隔是非常小的,RNN 可以学会使用先前的信息。
但是同样会有一些更加复杂的场景。假设我们试着去预测“I grew up in France… I speak fluent French”最后的词。当前的信息建议下一个词可能是一种语言的名字,但是如果我们需要弄清楚是什么语言,我们是需要先前提到的离当前位置很远的France的上下文,但此时相关信息和当前预测位置之间的间隔就肯定变得相当的大。但是在这个间隔不断增大时,RNN 会丧失学习到连接如此远的信息的能力。

2.2 网络结构

Long-Short Term Memory网络一般就叫做LSTM,是一种RNN特殊的类型,可以学习长期依赖信息。LSTM由Hochreiter & Schmidhuber (1997)提出,并在近期被Alex Graves进行了改良和推广。在很多问题,LSTM都取得相当巨大的成功,并得到了广泛的使用。
LSTM 通过刻意的设计来避免长期依赖问题。所有 RNN 都具有一种重复神经网络模块的链式的形式。在标准的 RNN 中,这个重复的模块只有一个非常简单的结构,例如一个 tanh 层。
LSTM 同样是这样的结构,但是重复的模块拥有一个不同的结构。不同于 单一神经网络层,整体上除了h在随时间流动,细胞状态c也在随时间流动,细胞状态c就代表着长期记忆。

2.3 Core idea

LSTM 的关键就是细胞状态,水平线在图上方贯穿运行。细胞状态类似于传送带。直接在整个链上运行,只有一些少量的线性交互。

LSTM通过gate来控制丢弃或者增加信息,从而实现遗忘或记忆的功能。gate是一种使信息选择性通过的结构,由一个sigmoid函数和一个点乘操作组成。sigmoid函数的输出值在[0,1]区间,0代表完全丢弃,1代表完全通过。一个LSTM单元有三个这样的gate,分别是forget gate(遗忘门)、input gate(输入门)、output gate(输出门)。LSTM 通过这3个gate,来保护和控制细胞状态。

2.2.1 forget gate

在我们LSTM中的第一步是决定我们会从细胞状态中丢弃什么信息。这个决定通过一个称为遗忘门完成,该门读取上一层的隐状态ht-1和xt,输出一个在0-1之间的值ft

语言模型的例子中来基于已经看到的预测下一个词。在这个问题中,细胞状态可能包含当前主语的性别,因此正确的代词可以被选择出来。当我们看到新的主语,我们希望忘记旧的主语。

2.2.2 input gate

Input gate确定什么样的新信息被存放在细胞状态中。这里包含两个部分:

  1. sigmoid层称“输入门层”决定什么值我们将要更新
  2. tanh层创建一个新的候选值向量C~t,会被加入到细胞状态中。
    在我们语言模型的例子中,我们希望增加新的主语的性别到细胞状态中,来替代旧的需要忘记的主语。

更新细胞状态,将Ct-1更新为Ct。通过将旧状态Ct-1与ft-1相乘,丢弃掉需要丢弃的信息,接着加上itC~t(这里波浪号没法打在C上面),得到更新后的细胞状态Ct。对于输入门:sigmoid函数选择更新内容,tanh函数创建更新候选。

2.2.3 output gate

最终,我们通过output gate确定输出什么值。这个输出将会基于我们的细胞状态,但是也是一个经过sigmoid选择后的值。首先,我们运行一个sigmoid层来确定细胞状态的哪个部分将输出出去。接着,我们把细胞状态通过tanh进行处理并将它和sigmoid门的输出相乘,最终我们仅仅会输出我们确定输出的那部分。

2.4 LSTM变体

我们到目前为止都还在介绍正常的LSTM。但是不是所有的LSTM都长成一个样子的。实际上,几乎所有包含LSTM的论文都采用了微小的变体。差异非常小,但是也值得拿出来讲一下。
其中一个流行的LSTM变体增加了“peephole connection”:我们让sigmoid也会接受细胞状态的输入。

另一个变体是通过使用coupled忘记和输入门。不同于标准LSTM是分开确定什么忘记和需要添加什么新的信息,这里是一同做出决定。

另一个改动较大的变体是Gated Recurrent Unit (GRU),由Cho, et al. (2014) 提出。它将forget gate和input gate合成了一个单一的更新门,同时还混合了细胞状态和隐状态。最终的模型比标准的LSTM模型要简单,也是非常流行的变体。

链接

参考论文

关于RNN的一篇综述论文:A Critical Review of Recurrent Neural Networks for Sequence Learning https://arxiv.org/abs/1506.00019v1

参考博客

博文参考和摘录了以下文章,在此由衷感谢以下作者的分享!
http://colah.github.io/posts/2015-08-Understanding-LSTMs/
https://zhuanlan.zhihu.com/p/28054589
https://blog.csdn.net/heyongluoyao8/article/details/48636251
https://blog.csdn.net/zhaojc1995/article/details/80572098
https://www.cnblogs.com/zhangchaoyang/articles/6684906.html

莫凡Python

https://www.bilibili.com/video/av16001891/?p=32

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值