循环神经网络RNN
发布日期:2021-05-07 22:36:24 浏览次数:13 分类:精选文章

本文共 7198 字,大约阅读时间需要 23 分钟。

转载自:作者:一只懒猪猪)


目录


Part One.计算图

一、计算图概览 

1.计算图介绍

计算图是描述计算结构的一种图

计算图的元素包括节点和边:

▲节点:表示变量,可以是标量、矢量、张量等

▲边:表示操作(函数)

计算图中的单变量、多变量及复合函数:

2.计算图中的连式法则

计算图中的连式法则:就是如何利用计算图进行求导,分为两种情况

Case1.如果从一个节点到另一个节点只有一条路径

变量 y 经过函数h的映射得到zz=h(y);所以zy的导数是\frac{dz}{dy}

变量x经过函数f的映射得到yy=f(x);所以yx的导数是\frac{dy}{dx}

所以zx的导数是\frac{dz}{dy}\frac{dy}{dx}

规律:两个节点之间的导数=\prod(该条路径上每两个相邻节点的导数 )

Case2.如果从一个节点到另一个节点有多条路径

路径1.

变量s经过函数g的映射得到xx=g(s);所以xs的导数是\frac{dx}{ds}

变量x经过函数k的映射得到zz=k(x);所以zx的导数是\frac{dz}{dx}

所以zs的导数是\frac{dx}{ds}\frac{dz}{dx}

路径2.

变量s经过函数h的映射得到yy=s(h);所以s对y的导数是\frac{dy}{ds}

变量y经过函数k的映射得到zz=k(y);所以zy的导数是\frac{dz}{dy}

所以zs的导数是\frac{dy}{ds}\frac{dz}{dy}

所以zs的导数是\frac{dx}{ds}\frac{dz}{dx}+\frac{dy}{ds}\frac{dz}{dy}

规律:两个节点之间的导数={\color{Magenta} \sum_{all \ the \ paths }(\prod(the \ derivative \ of \ every \ two \ adjacent \ nodes \ on \ every \ path))}

求导示例:

3.参数共享

例:一共9条路径,如果按照上面的方式分别算每一条路径,最后在相乘,这样会很复杂,分两部分计算会更加简单

前后向示例:

(疑问:这张图没有看明白)

4.计算图在神经网络中例子

以交叉熵作为衡量0/1分类模型的损失函数

\bg_white \hat{y}表示估计出来的不同类别的概率,\bg_white \hat{y}是一个向量,不同类别都会有一个概率\hat{y}=\begin{bmatrix} \hat{y_{1}}\\ \hat{y_{2}}\\ ...\\ \hat{y_{n}}\\ \end{bmatrix}

y是类别标签的0/1值组成的向量,例:y=\begin{bmatrix} 0\\ 1\\ ...\\ 0\\ \end{bmatrix}

\LARGE \bg_white ^{\frac{\partial C} {\partial \hat{y} }} 是损失函数C\hat{y}求导,是标量对向量的求导,相当于该标量对向量中的每一个元素求导,损失函数是一个值-log\hat{y},求导以后其他元素值是0,只有对-log\hat{y}求导得到\frac{-1}{\hat{y}}

\frac{\partial \hat{y} }{\partial z^{2}} 是\hat{y}对激活函数z^{2}求导,是向量对向量的求导,y向量中的第i行对z^{2}向量中的第j列求导,求导结果构成一个矩阵

^{\frac{\partial z^{2}}{\partial w^{2}}}会涉及向量对矩阵求导

粉色的线最终算出来的是损失函数z^{2}w^{2的求导

紫色的线最终算出来的是损失函数z^{2}b^{2}的求导

Part Two.循环神经网络

一、为什么需要RNN

CNN已经取得了巨大的成功,但是我们为森么还需要RNN呢?因为人工的神经网络和CNN他们对数据的处理都是相互独立的,输入的数据是一个个相互之间是独立的,并没有考虑在很多的应用中数据之间会存在上下文关系,例如序列性的数据,数据与数据之间会存在相关性;例如一句话中一个词和前面的词之间就会存在这种相关性。

下面的序列数据建模就是需要用RNN来处理的序列数据 

下面的这个例子中,同样的词语购物,在不同的句子中表现的词性是不同的,用CNN实际上也是可以训练的,但是计算复杂度极其高,而且扩展性很不好,所以人们提出了RNN,高效的处理这种序列数据,帮助人们提高预测的性能。

  

二、循环神经网络的定义

循环神经网络是一种人工神经网络,它的节点间的连接形成一个遵循时间序列的有向图。核心思想是样本间存在顺序关系,每个样本和它之前的样本存在关联。通过神经网络在时序上的展开,我们能够找到样本之间的序列相关性。

1.RNN的一般结构

紫色圈出的部分表示把上一时刻的状态传递到下一时刻

x_{t}是𝑡时刻的输入 ;s_{t}是𝑡时刻的记忆(状态) ;o_{t}是𝑡时刻的输出;𝑈、V、W是RNN的连接权重;b_{s}b_{o}是RNN的偏置

𝜎、𝜑是激活函数,𝜎通常选用tanh或Sigmoid,𝜑通常选用Softmax

Softmax用于分类问题的概率计算。本质上将一个K维的任意实数向量压缩(映射)成另一个K维的实数向量,其中向量中的每个元素取值都介于(0,1)之间

更一般的,每一层包含多个神经元,对应的前面那一层也可能包含多个神经元,这样也可以构建一个多层的RNN神经网络。但是为了计算,我们才以上面的RNN图为例介绍。

2.RNN不同的输入输出结构

one to one:一个输入,一个输出。没有RNN结构的人工神经网络。

例如Image Classification

one to many:一个输入,多个输出。

例如Image Captioning:输入一张图片,输出描述这张图片的句子

many to one:多个输入,一个输出。

例如Sentiment Classification:输入一句话,输出这句话所表达的情感的正负向

many to many:多个输入,多个输出。

例如Machine Translation:输入几句英文,输出对应的几句中文

many to many:多个输入,多个输出。

例如Vedio Classification on frame level输入多个视频帧构成的时间序列,每一帧每一帧的输出,这样可以有时序上的对应关系

3.RNN的训练算法BPTT

RNN这种结构我们应该怎么优化网络参数呢?其实和我们的CNN是基本相同的思路,都是基于误差的后向传递,不同的地方就是加上了时序演化

BP算法回顾:定义损失函数E来表示输出\hat{y}和真实标签y的误差,通过链式法则自顶向下(从后往前)求得E对网络权重的偏导。沿梯度的反方向更新权重的值,直到E收敛

利用前面计算图的思路,每一个时刻输入对应产生一个输出,每一个时刻都会产生一个损失函数loss,然后所有的损失函数loss相加就是一个总的损失函数loss。想要更新的参数就是𝑈、V、W。不同时刻的权重𝑈、V、W是相同的,都是参数共享的。我们接下来看一下在RNN中,具体该怎么进行训练的误差的后向传递

定义输出函数:

定义损失函数:

E_{ t }W的导数有红线,所以总的误差相对于变量W的导数,就是分别计算每一个损失函数E_{ t }对每一时刻的变量W的导数,最后在求和 

接下来我们就看一下,每一时刻的损失函数E_{ t }相对于变量UVW的导数

求输出的函数E 对于V 的梯度,先求 E3对于V 的梯度

求输出的函数E 对于的梯度,先求 E3 对于的梯度

其中: s_{3}依赖于s_{2},而s_{2}又依赖于s_{1}W,依赖关系一直传递到t = 0的时刻。因此,当我们计算对于W的偏导数时,也不能把s_{2}看作是常数项!也就是说,在这条路径上对W求导的话是可以一直算下去的。也就是s_{3}W求导是s_{2}s_{2}W求导是s_{1}s_{1}W求导是s_{0},所以E_{3}W的导数是所有的路径上的导数求和

求输出的函数E 对于的梯度,先求 E3 对于的梯度

其中: s_{3}依赖于s_{2},而s_{2}又依赖于s_{1}U,依赖关系一直传递到t = 0的时刻。因此,当我们计算对于U的偏导数时,也不能把s_{2}看作是 常数项!也就是说,在这条路径上对U求导的话是可以一直算下去的。也就是s_{3}U求导是x_{2}s_{2}U求导是x_{1}s_{1}U求导是x_{0},所以E_{3}U的导数是所有的路径上的导数求和

Part Three.长短时记忆网络LSTM

长短时记忆网络是在RNN领域应用最广泛的RNN网络  

一、RNN的梯度消失问题 

1.LSTM的提出

RNN梯度消失的问题导致了长时依赖的相关性在RNN中不能得到有效的利用,所以人们提出长短时记忆网络。 

系动词的单复数是直接有主语的单复数决定的,但是由于主语和系动词相隔太远,导致他们两个成分之间的时长增大,如果用传统的RNN,我们在更新参数的时候会有链式求导,同时激活函数采用正切的话,会出现一个连乘项,正切的话值是在0-1之间,这样会使得长时依赖的那条链上的梯度变得非常的小,从而导致误差更新的时候,长时依赖的这种相关性导致的误差更新会变得很小,从而使得长时依赖的影响变弱。

在CNN里面我们的解决办法是使用ReLu函数代替Sigmod函数。

在RNN里面我们的解决办法就是带有门控的RNN,即长短时记忆网络。

2.LSTM的基本结构

长短时记忆网络主要是由一个细胞,一个输入门、一个输出门以及一个遗忘门。这个细胞会记录下在任意一个时刻他的信息,三个门控制信息的流入和流出的量。

我们比较一下一般的RNN结构和长短时记忆网络的结构:

一般RNN结构:一般的RNN有不同时刻的输入x_{t-1}x_{t}x_{t+1}等,t时刻的输入和前一个时刻的隐藏层(即:隐状态层)的输出合在一起作为t时刻的输入,这个总的输入通过正切激活函数产生当前t时刻的隐藏层的一个输出,这个隐藏层的输出又会作为下一个时刻t+1时刻的输入

长短时记忆网络结构:在这个结构里面主要是引入了两个部分:

第1部分:在RNN的不同时刻加上了一条新的信息的通路,被称为cell,cell会承载不同时刻的信息(紫色线条部分)

第2部分:同时在下面的这部分增加了3种门控机制,来控制上面cell记录信息的流入流出的信息量(红色椭圆部分)

❑ LSTM依靠贯穿隐藏层的细胞状态实现隐藏单元之间的信息传递,其中只有少量的线性操作

❑ 门控机制都是作用在细胞的状态上面,所以用来控制细胞状态在不同时刻之间传递的信息的量,LSTM引入了“门”机制对细胞状态信息进行添加或删除 ,由此实现长程记忆 。“门”机制由一个Sigmoid 激活函数层和一个向量点乘操作组成 ,Sigmoid层的输出控制了信息传递的比例

细胞:仅线性操作

遗忘门:红色圈部分。LSTM通过遗忘门实现对细胞状态信息遗忘程度的控制,输出当前状态的遗忘权重,取决于h_{t-1}x_{t}。遗忘门是通过上一时刻隐藏层状态的输出h_{t-1}与当前时刻的输入x_{t},二者共同通过一个Sigmod激活函数\sigma,产生遗忘门的值f_{t}。因为经过Sigmod函数的激活,所以遗忘门的输出f_{t}是一个0-1之间的值,然后这个值f_{t}点乘^{\bigotimes }到上一个细胞的输出状态C_{t-1},这样的话,相当于对上一个细胞的信息量做了一个减小的操作,因为是f_{t}是一个0-1之间的值,也就是对一部分信息进行了遗忘,如果是1的话,之前的信息的全保留,如果0的话,之前的信息全遗忘。[h_{t-1},x_{t}] 是写成了矩阵的形式。

输入门:蓝色圈部分。紧跟在遗忘门之后,LSTM通过输入门实现对细胞状态输入信息接收程度的控制,输出的也是一个权重,输出的是当前输入信息的接受权重,取决于h_{t-1}x_{t}。通过上一时刻隐藏层状态的输出h_{t-1}与当前时刻的输入x_{t},二者共同通过权重W_{i},经过Sigmod激活函数\sigma,产生一个权重的控制i_{t},同理i_{t} \epsilon [0,1]。通过上一时刻隐藏层状态的输出h_{t-1}与当前时刻的输入x_{t},二者共同通过正切函数tanh,得到当前时刻新的信息的输入C_{t},这个信息C_{t}会输入到细胞状态里面。由于这个细胞也会记录一些之前时刻的信息,所以这个信息C_{t}也不一定百分之百的会加入到这个细胞里面,是否加入以及加入的量是由权重来控制的,会通过输入门来控制,这个信息C_{t}会乘上输入门的权重i_{t},然后在加载到细胞状态上,这样就实现了对细胞状态输入信息接收程度的控制

输出门:绿色圈部分。紧跟在输入门之后,LSTM通过输出门实现对细胞状态输出认可程度的控制,输出当前输出信息的认可权重,取决于h_{t-1}x_{t}。有一个Sigmod函数\sigma以及向量的点乘\bigotimes,有一个权重会控制细胞的输出状态的多少,之前的细胞状态乘上了正切函数tanh一条线经过Sigmod函数,另一条线经过正切函数,二者点乘以后的值是非常接近于0或者1的,这样会有助于我们信息的传递。

状态更新:细胞状态可以通过三个门的控制有效的实现细胞状态的更新,例如增加新的信息(输入门)或者删除旧的信息(遗忘门)。“门”机制对细胞状态信息进行添加或删除,由此实现长程记忆。什么是长程记忆呢?在输出门的部分我们最后说到了二者点乘以后的值是非常接近于0或者1的,这样会有助于我们信息的传递,所以呢就是说在输出门的最后,这个信息要么就全部都传递下去,要么就全不传递下去。

我们在进行BPTT算法的时候,我们会对每一个算法输出的loss沿着回路进行求导,我们加上了这样的一个细胞状态的信息传递,我们就多了一条信息传递的路,所以我们求导过程中,可以从绿色的路径走来求导,上文说到输出门的部分最后的输出要么是0,要么是1,所以要么信息就不反向传过去,要么信息就反向全部传过去;另一条路径就是紫色的路径,沿着这条路径进行求导,不会有梯度消失的问题。绿色的路径在这个单元也许不会传递信息,但是在下一个单元可能就会把全部的信息传递过去,这样就实现了长程的记忆。

Part Four.其它典型循环神经网络

一、Gated Recurrent Unit (GRU)

门控循环单元Gated Recurrent Unit(GRU), 2014年提出,可认为是LSTM的变种或改进

细胞状态与隐状态合并,在计算当前时刻新信息的方法和LSTM有所不同

GRU中引入了重置门和更新门

在音乐建模与语音信号建模领域与LSTM具有相似的性能,但是参数更少,因为它没有输出门

在LSTM中有两条信息传递的通道(一条细胞状态蓝线,一条隐状态红线),而在GRU中只有一条信息传递的通道(细胞状态与隐状态合并绿线),遗忘门控制上一个时刻细胞状态往当前时刻传递的时候信息量的多少;输入门控制当前时刻隐状态传入到细胞状态中的信息量的多少;输出门控制当前时刻细胞状态传入到下一个时刻信息量的多少

在GRU中,重置门r_{t}(灰色部分)用于控制忽略前一时刻细胞状态信息的程度,和遗忘门的功能是相似的,也是上一时刻的信息有一定程度的减少,因为重置门也是将信息压缩到0-1倍之间相当于信息的遗忘;另一个门是更新门z_{t}(黄色部分),更新门控制了当前时刻的信息和上一时刻的信息融合的时候,彼此的权重。1-z_{t}是上一时刻信息的h_{t-1}的权重;z_{t}是当前时刻信息的\widetilde h_{t}的权重,这部分与LSTM中的输入门不同,在LSTM中:C_{t}=f_{t}\times C_{t-1} +i_{t}\times \widetilde C_{t}表示遗忘门作为一个权重f_{t}来控制前一时刻的细胞的信息C_{t-1},然后有一个输入门i_{t}控制当前时刻产生的信息\widetilde C_{t}。在GRU里面强制两部分的权重之和为1-z_{t}+z_{t}=1,而LSTM里面是没有这样的强制的约束,f_{t}+i_{t}不是非得为1,这样就会使得整个GUR单元变得更简单简洁 

二、Peephole LSTM

Peephole LSTM可认为是LSTM的变种或改进,让门层也接受细胞状态的输入,同时考虑隐层信息的输入。在LSTM中加入Peephole Connection。上一个细胞的状态也传入了遗忘门,同时也传入了输入门,更新细胞之后的状态传入到了输出门,相当于让LSTM下一个时刻传递的时候有了更多的信息,这一点我们可以从公式中看出来

在标准LSTM基础之上还有很多的变种和改进,在论文LSTM: A Search Space Odyssey中研究了8种LSTM的变种,论文表明,他们的改进都没有性能上的显著提升。

三、 Bi-directional RNN(双向RNN)

这个是一个明显具有合理性的改进,因为当前时刻的状态不仅仅和前一时刻有关,还和后面时刻的状态有关。   

Bidirectional RNN(双向RNN)假设当前t的输出不仅仅和之前的序列有关,并且还与之后的序列有关,例如:完形填空 。因此提出两个RNNs上下叠加在一起组成,输出由这两个RNNs的隐藏层的状态决定。

S_{0}是隐状态,蓝色的圈表示输入,红色线就是一个标准的RNN结构(前一时刻输入到后一时刻),蓝色线表示这里面又多加了一个从后往前的传递(后一时刻输入到前一时刻),{S_{0}}'相当于{S_{i}}   (疑问:为什么{S_{0}}'相当于{S_{i}} ?????)

上一时刻的隐状态h_{t-1}和这一时刻的输入x_{t},共同产生当前时刻的正向的隐状态h_{t};下一时刻的隐状态h_{t+1}和这一时刻的输入x_{t},共同产生当前时刻反向的隐状态h_{t},最后输出的时候是两个隐状态一起产生当前时刻的输出y_{t}

实线是前向的,虚线是反向的。

前面我们说的都是单层的RNN,下面这个是多层的RNN

 

Part Five.循环神经网络的主要应用

循环神经网络RNN主要就是针对序列化的输入数据

一、语言模型

表达人类语言的一个概率,即人类表达的一句话是有一定的语法和逻辑关系的,并非是单词的随意拼接就是一句话。是要考虑哪个词与当前的句子可以构成一句合理的话的概率最大,根据之前和当前词预测下一个单词或者字母。可以用RNN的网络来预测。 例如问答系统,京东的智能客服 

二、语音识别

以语音为研究对象,将语音识别成文字,让机器可以理解和识别人类口述的语言

语音识别的流程:例子: 给定语音的拼音串“ta shi yan jiu sheng wu de”

三、自动作曲

音乐的律动也是有自己的规律的,论文:Song From PI: A Musically Plausible Network for Pop Music Generation

四、机器翻译

将一种语言自动翻译成另一种语言,语言的输入也有上下文的关系

五、自动摘要

为一篇或者多篇文章自动生成摘要,从一段文本中提取出关键性的文字,概括成要点。分为两分类:抽取式的摘要,就是对一个序列文章进行标注,标注成0/1这样的分类,1表示这个词留下来,0表示这个词不留下,也就是用关键字或者关键词作为这个摘要;另一种就是生成式的摘要

六、自动写作

根据现有资料自动写作,当前主要包括新闻写作和诗歌创作。主要是基于RNN&LSTM的文本生成技术来实现,需要训练大量同类文本,结合模板技术

七、图像描述

图像描述可以用RNN也可以用CNN。根据图像形成语言描述,CNN用于特征提取,RNN用于目标检测。

Part Six.中英文术语对照

❑ 计算图:Computational graph      

❑ 循环神经网络:Recurrent Neural Network

❑ 随时间反向传播算法:BP Through Time, BPTT

❑ 长短时记忆网络:Long Short-Term Memory

❑ 遗忘门:Forget gate

❑ 输入门:Input gate

❑ 输出门:Output gate

❑ 双向RNN:Bidirectional RNN

❑ 门控循环单元:Gated Recurrent Unit (GRU)

❑ 窥孔LSTM: Peephole LSTM

❑ 连续时间RNN: Continuous time RNN

❑ 语言模型:Language model

❑ 神经机器翻译: Neural Machine Translation

❑ 图像描述:Image captioning

❑ 自动摘要:Automatic summarization

❑ 自动写作:Automatic writing

上一篇:如何简单的理解LSTM——其实没有那么复杂
下一篇:绘图杂记【2】使用Python/R语言对柱形图、饼图进行纹理填充

发表评论

最新留言

表示我来过!
[***.240.166.169]2025年03月26日 18时50分50秒