RNN循环神经网络

1 为何使用RNN(Recurrent Neural Network)

传统神经网络,如卷积,全连接神经网络,同样的输入只能输出相同的输出。但在如语义识别的时候我们想要相同的输入对应不同的输出。如购票系统中,去‘’北京‘’,中的北京是目的地,而离开’北京‘,’中的北京是出发地。通过上下文来跟当前的输入来决定输出就需要使用RNN。

2 简单RNN

如下图是一个简单的RNN模型,输入层有两个神经元((x_1,x_2)),隐藏层有两个神经元,输出层有两个神经元((y_1,y_2))。若没有记忆单元((a_1,a_2)),相同的输入((x_1,x_2))一定会输出相同的((y_1,y_2))。若加上记忆单元((a_1,a_2)),在计算隐藏层的时候为,记忆单元乘以相应的权重(+)输入层乘以相应的权重,得到隐藏层,再把隐藏层的值存入记忆单元((a_1,a_2))中,下次在计算隐藏层的值的时候,((a_1,a_2))的值已经改变,所以算出的隐藏层的值不同,因此输出也不同。这是简单的RNN,至少实现了记忆功能。

出来上面的结构形式,还有如下图的简单RNN,区别就是一个把隐藏层的值传给记忆单元,一个把输出值传给记忆单元。

还有双向循环神经网络,通过把正向RNN跟反向RNN的隐藏层结合起来输出,来训练网络

3 LSTM(Long Short-Term Memory)

现在LSTM已经成了RNN的标准,与简单RNN不同的是,LSTM的记忆单元,由三个门控制,分别为

  1. 输入门(是否隐藏层的值要写入到记忆单元中)
  2. 遗忘门(当前记忆单元内的值是否需要洗掉)
  3. 输出门(是否输出新的记忆单元的值)

每个门都是一个向量,与对应需要控制的向量做元素之间的乘法,得到一个向量。基本运算如下图,即:

新的记忆单元=输入门×输入+遗忘门×记忆单元

输出向量 = 输出门×新记忆单元

这里省去了激活函数

这里的三个门的计算都为:

输入门=输入向量x×转换矩阵

遗忘门门=输入向量x×转换矩阵

输入门=输入向量x×转换矩阵

其中x可以被认为对应隐藏层的值,因为是通过隐藏层的值来更新存储单元

最终形式为

注意,上图的(x^t,x^{t+1})用的是同一个网络,即求(z^f,z^i,z,z^o)时的参数矩阵相同

4 RNN 的梯度爆炸与梯度消失

4.1 RNN的问题

在对RNN进行训练的时候,对于总损失值我们会发现,它不会平缓下降

这是因为如果我们观察参数对损失值的图片,就会发现,总损失值的图像是十分崎岖不平的。如下图可以看出,在部分地方,参数十分微小的变化变化就会使总损失值变得十分大,因而求得的梯度值就十分大。导致参数一下更新十分大的值。

4.2 产生的原因:

前面说了,在每一个时间点,RNN使用的权重都是相同的。因而权重哪怕变化很小的值,也会对RNN的最后结果,产生很大的影响。如下图,是一个非常简单RNN,当权重w变化很小的值,最后输出会产生很大的影响。

4.3 LSTM解决梯度消失的问题

因为LSTM中新的Memory中的值为旧的Memory中的值加上输入值。所以若遗忘门不为0那么Memory中总会有值,因此总会对LSTM结果产生影响,所以不会产生梯度消失的问题。

GRU 会将输入门与遗忘门结合起来

5 RNN的应用

5.1 Many to one

情感分析,如根据一段话来分析这段话的情感

5.2 Many to Many

5.21 语音识别

输入和输出都是序列, 但是输出更短。

这也会产生一问题是,输出会有很多重复的词汇,如“你你好好好好”。一种解决方法是将重复词汇删除,但是有时候需要保留重复的词汇,如“哈哈”。

5.22 CTC(Connectionist Temporal Classification)

可以解决这个问题。就是在输出中添加符号(varnothing)只把(varnothing)叠加起来。训练就是将所有含(varnothing)的情况都看为正确然后训练。

5.23 机器翻译

输入和输出都是序列,但是都没有固定的长度

将一种语言语音输入RNN输出另一种语言翻译,也可以。如输入英文语音直接输出中文翻译,中间没有先翻译成英文。

5.24文法解析

输入一段话,输入文法结构树

5.25 文本自动编码器

输入一段话,输出一个向量,这个向量里包含了,这段话的所有信息。

bag-of-words可以实现,不过会丢失单词的顺序信息,如下面话,bag-of-word会认为两段话一摸一样,因为单词内容一样,但是两段话是完全不同的意思。 一个积极一个消极。

做法就是,将一段话输入RNN,输出一个向量,在将这个向量放入一个RNN,输出这段话。

5.26 语音自动编码

将一段段语音讯号转化为一个个向量。这时可以看到,类似的语音转化成的向量就比较接近

训练方法如下,encoder跟decoder是一同训练的。

原文地址:https://www.cnblogs.com/lolybj/p/11503921.html