从零开始机器学习程序员

从零开始机器学习-19 RNN:循环神经网络

2018-06-28  本文已影响40人  养薛定谔的猫

本文由 沈庆阳 所有,转载请与作者取得联系!

前言

相比于适合单个对象的卷积网络(Convolutional Neural Network,CNN),循环网络(Recurrent Neural Network,RNN)更加适合序列类型的数据。循环网络应用最多的领域有:机器翻译、语音识别、文章/音乐创作等。这是因为卷积网络的设计理念是在空间上共享参数,而循环网络的设计理念是在实践上共享参数。卷积网络和循环网络的目的都是为了提取、寻找模式(Pattern)。

什么是循环神经网络

人工神经网络(Artificial Neural Network,ANN)在一定程度上模拟了大脑中神经元之间运作的方式。在卷积神经网络中,其输入是单张的图像(或音频、三维的模型等),对于图像分类的场景十分有效。但事实上,生物神经网络的感知并非是静止的单张图像的,其对世界的感知是建立在一连串图像组成的序列之上、一连串文字组成句子之上、一连串动作组成的行为之上。图像与图像之间存在联系、一句话中的字与字之间也存在关系...人类的大脑可以处理这些连续的输入,是因为神经网络的连接是存在环的,而非像是卷积网络这种前馈网络中的输入和输出(上一层的输出是下一层的输入)这般存在(有向无环图)。循环神经网络正是建立在这种模拟生物神经网络中环的存在的基础上的。
假设有一个序列由事件组成(随时间推进),我们的目标是对这个序列中的事件在每个时间点上进行预测。


一个由事件构成的序列

在上面的这个情景之下,如果序列随时间推移的变化很小,那么我们则可以在每个时间点使用相同的分类器。这是最基本、也是最简单的情景,实际情况并非如此。实际上,在对某个时间点的事件进行预测的时候,我们需要将已经发生过的事件也考虑在内,这就包括了在预测点之前发生的所有事件。
一种方法是将分类器的状态循环(递归)地使用,作为对之前发生的所有事件的总结。因为一个序列的长度可以很长,对于上百个、上千个长度的序列,也就意味着网络的深度也需要成百上千层,这显然是不明智的做法。
另一种思想是捆绑,使用单个模型来总结过去的信息,并将其提供给分类器,在每个时间点(步)中,将分类器的一部分连接到输入层,另一部分连接到过去的事件,这一部分也就叫做递归连接层。
在对上文进行了阅读之后,我们会更好地理解循环网络的结构。循环神经网络只有一个自连接的隐藏层,这个隐藏层的输出就是它下一个时间点的输入。


RNN网络模型的展开结构

后向传播时间

RNN的训练算法有诸如实时循环学习(Real Time Recurrent Learning,RTRL)和后向传播时间(BackPropagation Through Time,BPTT)等。因BPTT更加高效,因此常被使用。
为了更新循环网络中的参数的数值,我们需要反向计算网络中从输入层一直到输出层的参数随时间的导数。就像普通的后向传播算法一样,BPTT也是一直使用链式法则。但在循环网络中,损失函数依赖于当前时刻的输出,也依赖于下一时刻的输出。
在循环网络中更新值是互相关的。这一特性对随机梯度下降算法十分不利,因为随机梯度下降算法更加倾向于无关联的参数更新来保证训练的稳定性,而相关联的更新使训练过程变得不稳定。这种不稳定指的是梯度以指数形式增长到无穷大(梯度爆炸),或梯度迅速减小为0(梯度消失)。无论上述哪种结果都会导致最后无法完成训练。

梯度爆炸与梯度消失

上文提到的梯度爆炸与消失这两个问题都会造成我们的网络模型无法完成训练,对于梯度爆炸与消失问题有相应地解决方法。
首先是梯度爆炸,解决梯度爆炸的方法有很多种。我们可以重新设计网络模型;使用ReLU作为激活函数;使用权重正则化;使用梯度裁剪。其中,梯度裁剪是最简单、最常用的方法。梯度裁剪具体在梯度的模增长地过大的时候减少学习的步长。
而解决梯度消失的问题则会更麻烦一些。梯度消失的后果是循环网络模型仅仅会记住近期的事件,而忘记过去较远的时间发生的事件,从而造成循环网络在几个时刻之后便失去作用。
为了解决梯度消失的问题,我们需要借助长短期记忆(Long Short-Term Memory)网络。

长短期记忆 LSTM

一个循环网络的定义上由很多个神经元构成,每个神经元包括一个基于过去的输入、一个新的输入、一个输出和一个连接到未来的输入(相对于下一时刻的输入)。


一个RNN网络的部分

此时中间的神经元是典型的神经元,其拥有一些权重、一些线性激活函数等。LSTM单元的功能和普通的神经元的功能一样,如果我们使用LSTM单元来替换这个典型神经元则不需要修改网络中的其他内容。使用LSTM网络可以有效地解决梯度消失的问题。
那么先不谈RNN网络,让我们来了解记忆系统是如何工作的。一个具有记忆功能的系统应该具有如下三种功能:将数据写入记忆中、从记忆中读取数据和删除记忆中的数据。而记忆系统的核心则是一个记忆单元。通过在记忆单元上添加输入门(Input Gate)、输出门(Output Gate)与遗忘门(Forge Gate)则组成了一个LSTM单元。


LSTM单元
首先是输入门,输入门的功能是判断这个输入是否要被写入“记忆”当中。
然后是输出门,输出门决定是否从记忆中读取相关内容。

最后是遗忘门,遗忘门可以判断是否从记忆中删除这个数据。
在一个LSTM内核中,如果一个门的值是0,则这个门关闭;若一个门的值是1,则这个门打开。在每个指令门处,控制门开关的值并不是非0即1的,而是介于0和1之间的连续决策。也就是说当这个数处在0和1之间时,部分的数据会被存储到记忆中。
既然控制LSTM内核的门的数值是一个连续函数,那么我们便可以对这个函数求导。既然可以求导,那么使用后向传播算法也变顺理成章了。


LSTM结构
LSTM中控制每个门的值是由一个基于输入参数的逻辑回归控制。每个值都有一套共享参数,在门与输入值之间嵌入一个反曲函数tanh来将值映射到-1到1之间。由于这些函数是连续可导的,因此优化这些函数也很方便。LSTM可以使得模型对需要的数据记忆地更久,对需要忘记的记忆立刻忘记,此外,LSTM也使得对模型的优化过程更加简单,从而解决了梯度消失的问题。

结语

RNN是一种通用的、易于训练的模型。RNN模型可以将可变长度的序列输入转换为固定长度的向量,Beam搜索、序列生成也可以将固定长度的向量转换为序列。
从一个向量开始,从预测结果中取样,然后再次输入到RNN模型中进行预测。这样就可以将一个任意长度的序列,转换成另一个任意长度的序列。这就是机器翻译的基础。
同样,我们可以将CNN和RNN结合起来。输入一个图像,通过CNN对图像进行检测,通过RNN对图像内容进行预测。于是,我可以得到一个自动为图像添加标题的机器学习程序。

参考文献:
[A Gentle Introduction to Exploding Gradients in Neural Networks] by Jason Brownlee
Long Short-Term Memory (LSTM) by Klaus Greff

觉得写的不错的朋友可以点一个 喜欢♥ ~
谢谢你的支持!

上一篇下一篇

猜你喜欢

热点阅读