深度学习周报(11.4-11.10)
目录
1 循环神经网络(Recurrent Neural Network, RNN)
2 长短期记忆网络(Long Short-term Memory, LSTM)
4.2.1 输出是更短的(Output is shorter)
摘要
本周学习了李宏毅深度学习关于循环神经网络(RNN)部分的课程。了解了什么是RNN、RNN的基本原理和几种典型的RNN。之后学习了长短期记忆网络(LSTM),认识了LSTM和普通神经网络、RNN的联系和区别。然后学习到了RNN的训练包括损失函数、梯度下降、误差分析等方面和RNN的应用例如多对一、多对多等方面。最后对比RNN和结构化学习,分析优劣。
Abstract
This week, I learned Hongyi Li's deep learning course on recurrent neural network (RNN). I learned what an RNN is, the basic principles of RNN, and several typical RNN. After that, I learned about long short-term memory (LSTM), and learned about the connections and differences between LSTM, ordinary neural networks, and RNN. Then, the training of RNN was learned, including loss function, gradient descent, error analysis, etc., and the application of RNN, such as many-to-one, many-to-many, etc. Finally, RNN and structured learning are compared to analyze the advantages and disadvantages.
1 循环神经网络(Recurrent Neural Network, RNN)
1.1 应用实例
如下图,一个关键元素就是一个槽位(Slot),从用户交互中抽取出的这个槽位对应的取值,就是填充(Filling)。下图的槽位(Slot)有两个,分别是目的地(destination)和到达时间(arrival time)。

在上述话中,可以得到Taipei是目的地,November 2nd是到达时间。但是,在订票系统中,Taipei也可能会属于出发地。到底属于目的地,还是出发地,如果不结合上下文,则很难做出判断。
这时可以通过一个前馈神经网络来解决,将词汇Taipei变成一个向量,作为神经网络的输入:

所以,首先得用向量表示词汇,例如通过1-of-N encoding来表示。在1-of-N encoding中,向量中元素数量就等于所有单词的数量,对1个单词来说只需要向量中对应元素为1,其余元素都是0即可。
但是由于向量长度有限,可能存在向量表示不了的情况,则可以加入一个“Other”来表示未出现的单词。
还有一种方法是利用26个字母进行hash映射。这种情况下则不需要额外考虑Other了,只要单词内出现对应连续的字母,则对应的则为1。

这样,将词汇向量化之后,把词汇向量作为神经网络的输入,则可以得到神经网络的输出则为:表示词汇属于目的地的概率,
则表示词汇属于出发地的概率。最后其实应该还有一层,做出预测,属于哪个概率最大,则输出哪个。

但是,如果遇到前缀不同的情况,例如该地址为出发地而不是目的地,这样前馈神经网络没法做出判断了。这个时候,就需要所构建的神经网络是有记忆的,否则无法解决该问题。让神经网络有记忆力,则可以根据不同上下文产生不同的输出。
而有记忆的神经网络就叫做循环神经网络(Recurrent Neural Network),即RNN。
1.2 RNN的基本原理
RNN通过将每一次隐藏层里的神经元产生的输出储存到记忆单元里去,再将记忆单元里的数据作为下个词汇向量的输入,然后不断循环该过程。

举例来说,假如有输入序列 [1, 1]、[1, 1]、[2,2] ...,神经网络的激活函数均为线性的,权重为1,无偏置。

首先,记忆单元m要有初始值,例设 [0, 0],则有:
- 输入 [1, 1] ,得到L [2, 2] 、m [2, 2],输出为Y [4, 4]
- 输入 [1, 1] ,得到L [6, 6] 和m [6, 6],输出为Y [12, 12]
- 输入 [2, 2],得到L [16, 16] - L2 [32, 32] - m [16, 16]
同一个RNN被多次使用,前一个词向量的输出得到的记忆单元里的值参与下一个词向量的输入

由此,前一个词向量不同时,得到的记忆单元里的值也不同,从而影响下一个词向量得到的输出也是不同的

循环神经网络的架构可以是任意设计的,当然可以是深层的(可以有多个隐藏层),即深层循环神经网络。
在时间点 时,每个隐藏层的输出被储存在记忆单元中,当到达下一个时间点
时,每一个隐藏层会把前一个时间点储存在记忆单元的值再读出来,再计算得到输出
,以此类推。

1.3 3种典型的RNN
1.3.1 Elman Network
Elman Network 也叫简单循环网络(simple recurrent networks,简称SRN)
Elman network的一个循环层的输出经过时延后作为下一时刻这一层的输入的一部分,然后循环层的输出同时送到网络后续的层,比如最终的输入层。
1.3.2 Jordan Network
Jordan network则直接把整个网络最终的输出,即输出层的输出经过时延后反馈回网络的输入层。

1.3.3 Bidirectional RNN
由于之前的RNN网络只能记住上文,而无法记住下文,为了解决这个问题。如下图,将网络设计成双向(Bidirectional )的,从而达到根据上下文来推断语义的功能。

2 长短期记忆网络(Long Short-term Memory, LSTM)
2.1 LSTM的基本原理
LSTM实际上,是将RNN中隐藏层的输出存入记忆单元的过程稍微复杂化了一些,使用了3个门进行代替:
- 输入门(Input Gate):当第一个神经元的输出想要被写入到记忆单元里面时候,必须通过一个输入门,只有输入门打开时,才能把值写入到记忆单元里面,输入门的打开取决于神经元的自我学习。
- 输出门(Output Gate):输出的地方有一个输出门,输出门会决定其他的神经能否从该内存中读取值,类似于输入门,输出门也是自我学习的。
- 遗忘门(Forget Gate):该门决定了什么时候记忆单元会把过去记得的东西网络,什么时候遗忘,也是神经网络自己学习的。
整个LSTM可以看做有四个输入一个输出,四个输入中一个是想要存在内存单元的值,还有控制三个门的讯号。

其工作原理如下图:
- 输入门的控制信号为
,遗忘门的控制信号为
,输出门的控制信号为
- 激活函数
通常是一个sigmoid函数,其输出介于0和1之间
- 输入
,c为存储单元的初始值,当输入门和遗忘门同时打开为1时,c'才能存储成功
- 输出
,当输出门打开为1时,才能输出a

举个简单的例子, 是输入门,
是遗忘门,
是输出门,有以下规则:
- 当
时,将
的值写入到记忆单元中。
- 当
时,将记忆单元中的值进行清除。
- 当
时,将记忆单元中的值进行输出。

如上图:
- 第1列:
,不存储值;
,不清除值;
,不输出值;
- 第2列:
,
的值存入记忆单元,记忆单元
为3;
- 第3列:
,不存储值;
,不清除值;
,不输出值;
- 第4列:
,
的值存入记忆单元,记忆单元
为7;
- 第5列:
,不存储值;
,不清除值;
,不输出值;
- 第6列:
,输出记忆单元
中的值7;
- 第7列:
,清除记忆单元
中的值进,记忆单元
为0;
- 第8列:
,
的值存入记忆单元,记忆单元
为6;
- 第9列:
,输出记忆单元
中的值6;
下图中详细展示了LSTM的计算过程,以下对网络的结构进行说明:
- 输入序列如下图右下角,假设四个输入的均为同一个向量
;
- 输入:只有
的权重为1,故输入值即为
;
- 输入门:偏置为-10,
权重为100,当
为正值时输入门打开,否则通常为关闭状态;
- 遗忘门:偏置为10,
权重为100,当
为负值时遗忘门关闭,否则通常为打开状态;
- 输出门:偏置为-10,
权重为100,当
为正值时输出门打开,否则通常为关闭状态;
和
均为线性激活函数,存放在memory里的初始值为0。

计算过程如下:

2.2 LSTM与普通神经网络的联系
在普通的神经网络中,存在很多的神经元,将输入乘上每个神经元对应的权重,就得到该神经元的输出,每一个神经元都是一个函数:

而在LSTM的一个单元就像一个神经元,通过把神经元换成LSTM单元,通过输入乘上不同的权重作为LSTM四个接口对应的输入参数,用于控制输入、输入门、遗忘门、输出门。
由此,LSTM网络结构的参数量一般是普通神经网络的4倍。

2.3 LSTM与RNN的联系
对于一个LSTM组成的RNN网络,将每个记忆单元的 组合为一个向量
,输入为向量
,由向量
乘上一个矩阵得到向量
,向量
的每一个维度控制着每一个LSTM的输入,向量
的维度数正好是LSTM网络的记忆单元的数量。向量
的第一维给到第一个记忆单元,第二维给到第二个记忆单元,以此类推。

除了向量 外,输入的
会再经过其他三个不同的变换从而得到另外三个不同的向量
、
、
。同样,这三个向量的每一维都给到一个LSTM,
为输入门的参数,控制输入门、
为遗忘门的参数,控制遗忘门、
为输出门的参数,,控制输出门。
则可以通过LSTM网络,得到输出 :

则相加的结果被存放在记忆单元 里,有
,然后,以此类推记忆单元的值
再参与下一次的运算
把隐藏层的最终输出 以及当前记忆单元的值
都连接到下一个时间点的输入上。在下一个时间点操控这些门的值,不只是看输入的
,还要看前一个时间点的输出
和j记忆单元的值
,因此需要把
、
、
这3个向量并在一起,乘上4个不同的转换矩阵,去得到LSTM的4个输入值
、
、
、
,再去对LSTM进行操控:

事实上LSTM基本上都会叠多层,如下图所示,左边两个LSTM代表了两层叠加,右边两个则是它们在下一个时间点的状态,叫做多层长短期记忆(Multiple-layer LSTM):

这里的LSTM虽然看起来很复杂,但是在实际中往往这是最标准化的设计。可以借助工具来实现它。
3 RNN的训练
3.1 损失函数(Loss Function)
依旧是槽填充的例子,需要把模型的输出 与映射到槽的参考向量求交叉熵,比如“Taipei”对应到的是“dest”这个槽,则参考向量在“dest”位置上值为1,其余维度值为0,其他词同理。
如下图,在输入arrive之后,记忆单元存储值为,而分类为other。在输入Taipei之后,结合之前存储的值a1,执行更新记忆单元为值
,并输出分类为dest。

RNN的输出和参考向量的交叉熵之和就是损失函数,也是要最小化的对象,需要注意的是,语句词要依次输入到模型,比如“arrive”必须要在“Taipei”前输入,不能打乱语序。
3.2 训练(Training)
有了损失函数后,训练其实也是用梯度下降法,为了计算方便,这里采取了反向传播的进阶版,即随时间的反向传播(Backpropagation through time, BPTT)。由于是在高序列上做运算,所以BPTT要考虑时间的信息。

但是,事实上RNN的训练并没有那么容易,都希望随着epoch的增加,参数的更新,损失值应该要像下图的蓝色曲线一样慢慢下降,但在训练RNN的时候,可能会遇到类似绿色曲线一样的学习曲线,损失值剧烈抖动,并且会在某个时刻跳到无穷大,导致程序运行失败:

3.3 分析误差曲面(Error Surface)
损失值由于参数产生的变化,所以造成误差曲面非常陡峭崎岖的,如下图,z轴代表损失值,x轴和y轴代表两个参数 和
,可以看到损失值在某些地方非常平坦,在某些地方又非常的陡峭。
如果此时在训练过程类似下图中从下往上的橙色的点,它先经过一块平坦的区域,又由于参数的细微变化跳上了悬崖,这就会导致损失值上下抖动得非常剧烈

如果运气特别不好,一脚踩在悬崖上,在悬崖上的梯度值很大,但是之前的梯度很小学习率很大,所以现在很大的梯度乘以很大的学习率,导致参数更新变大,起飞。
为了解决上述的问题,可以使用裁剪(Clipping),设置一个阈值,高于这个阈值的值就都设置为这个阈值。则当梯度过大时,将梯度限制在一个确定的值之内。例如限制值为15,而梯度为50,此时梯度会被网络看作15。

3.4 为什么RNN不好训练(Why?)
RNN的训练问题来自于把同样的东西反复使用,权重的改变可能会几乎没有影响,有影响的话就会是很严重的影响,如下图:

RNN经常会遇到这两个问题:
- 梯度消失(gradient vanishing):一直在梯度平缓的地方停滞不前;
- 梯度爆炸(gradient explode):梯度的更新步伐迈得太大导致直接飞出有效区间。
RNN不好训练的原因不在于激活函数,而是来自于他有高序列,同样的权重在不同的时间点被反复地使用。
3.5 Helpful Techniques
LSTM就是最广泛使用的技巧,它会把误差曲面上那些比较平坦的地方去掉,从而解决梯度消失的问题。但是不能解学习率learning rate设置的很小,进行训练。这是因为以下原因在LSTM中记忆单元与输入是以相加的方式进行运算该影响会一直存在除非遗忘门决定将其中参数删除。

还有另一种方法gated recurrent unit(GRU),这种RNN中仅有输入门和遗忘门,故其参数量相较于LSTM更小,从而相对更容易训练,并且不容易过拟合,它的基本精神是旧的不去,新的不来,GRU会把输入门和遗忘门连起来,当遗忘门把记忆单元里的值清空时,输入门才会打开,再放入新的值。
还有以下几种可以处理梯度塌缩的RNN:

4 RNN的应用
在初识RNN的应用实例中,其输入与输出是相同长度的,但RNN的能力不止于此,以下介绍RNN的一些其他应用。
4.1 多对一(Many to one)
多对一的输入是一个向量序列参数,但输出仅为一个向量。
如下图,在情绪分析领域,可以将许多评论输入进网络中,而网络的任务是给出各个评论对应的评级(好/坏):

在关键词提取分析中,RNN可以分析一篇文章并提取出其中的关键词,输入为一篇论文,输出为一组关键词。这里需要把含有关键词标签的文章作为RNN的训练数据:

4.2 多对多(Many to Many)
4.2.1 输出是更短的(Output is shorter)
例如语音识别,输入一组声音讯号的向量序列,输出是文字的序列。通常是一小段声音讯号,转换为一个字,再通过修剪(trimming)的方式删除序列中的重复文字。

但有时这种方式会产生歧义,因此需要其他的方式更为合理地进行该操作。
这时就需要用到CTC(Connectionist Temporal Classificaiton)算法,它的基本思想是,输出的不只是字符,还要填充NULL,输出的时候去掉NULL就可以得到连词的效果。

CTC的训练,采用枚举方法,把所有可能的都假设做正确的:

CTC的示例,RNN的输出就是英文字母+NULL,google的语音识别系统就是用CTC实现的,如下图:

4.2.2 没有限制(No Limitation)
例如机器翻译,下图中为过程的示意图:

显然若以上述的方式进行翻译,则翻译是无法停止的,解决方法与CTC类似,方法是添加一个或者一组代表停止的字符,若输出该字符,则停止。
在输出正确结果后,给它加一个“===”的符号,代表任务结束:

4.3 超越序列(Beyond Sequence)
用于句法分析,即解析一个句子中各个词对应的成分,并使用树的形式表达,具体效果如下图:

5 RNN vs structured learning
1、序列相关性
-
单向的RNN并不会考虑整段序列,双向的RNN可以考虑
-
HMM+viterbi会考虑整段序列
2、标签的依赖关系
-
RNN、LSTM不考虑
-
结构化预测能明确考虑标签的依赖关系
3、开销与误差相关性
-
RNN、LSTM的开销与误差不相关
-
结构化预测的开销是误差的上界
4、深度
- RNN与LSTM其网络结构可以做的特别深
- 结构化预测中的各种方法由于程式是线性的,当构造为深度结构化之后较难训练与收敛

基于上述原因,可以首先使用RNN处理数据,再将结果以结构化预测的方式处理,这样可以兼顾二者的优点。

总结
通过本周的学习,了解了什么是RNN,从Slot Filling案例引出需要有记忆力的神经网络RNN,然后学习到RNN的基本原理,通过将每一次隐藏层里的神经元产生的输出储存到记忆单元里去,再将记忆单元里的数据作为下个词汇向量的输入,然后不断循环该过程。以及几种典型的RNN:Elman Network、Jordan Network、Bidirectional RNN等。
还了解了LSTM的组成、工作原理与过程,以举例的方式了解了LSTM如何运作并手算。了解了LSTM与普通神经网络、RNN的关系,LSTM相当于普通神经网络中的神经元,且可以将普通神经网络中神经元简单的替换为LSTM,从而赋予其LSTM的相关特性。如果将LSTM与多种RNN相结合并以叠加的方式实现,那么会得到多层长短期记忆。
然后,学习到了RNN的训练并没有那么容易,一般的RNN会出现梯度消失和梯度爆炸。可以使用裁剪的方式简单的限制梯度,或者使用LSTM或GRU它会把误差曲面上那些比较平坦的地方拿掉,从而解决梯度消失的问题。而梯度爆炸的解决可以将学习率调小。还有RNN在各领域的一些应用,例如多对一的情绪分析和关键词提取、多对多的语音识别和机器翻译等。
最后,对比RNN与各种结构化学习预测方法,分析两者的优劣,得到未来的发展趋势是两者结合的形式。
更多推荐



所有评论(0)