本文章参考《神经网络与深度学习》吴岸城 著
图片来源Christopher Olah 的博文
什么是RNN
RNN是两种神经网络的缩写:
- 一种是递归神经网络
- 一种是循环神经网络
它的目的是用来处理序列数据,本文主要是讲循环神经网络。
传统网络
在传统的神经网络模型中,是从输入层到隐含层,再到输出层,层与层之间是全连接的,每层之间节点是无连接的,但对很多问题无能为力。例如,预测句子中的下一个单词是什么,此时需要使用到前面的单词。
循环网络
循环神经网络即一个序列当前的输出与前面的输出也有关。具体的表现形式为网络会对前面的信息进行记忆并应用与当前输出的计算中。即隐藏层之间的节点不再无连接而是有链接的,并且隐藏层的输入不仅包括输入层的输出还包括上一时刻隐藏层的输出。
循环神经网络是只一个随着时间的推移,重复发生的结构。
例子
例如一个序列X = ['H', 'E', 'L', 'L'],该序列被送到一个神经元,而这个神经元的输出连接到他的输入上。
循环神经网络
进入神经网络之前,想一下人的思考步骤,或者叫做思考时序。
人类不会每一秒钟都从头开始思考的,比如看一本书,会基于你之前所积累的知识来推断每一个词的含义,而不会将所有的东西丢弃,然后用空白的大脑进行思考。
人类的这一特点,无法在传统的神经网络中找到。例如你要讲电影中每个时刻发生的事按照时间归类,需要使用之前在电影中出现的事件推理出后面发生的事情,而传统神经网络无法做到,
而循环神经网络可以解决这个问题。它们可以在网络中循环,并能够维持信息。
在上图中神经网络的单元A,它的输入Xt,输出值是ht。信息通过回路从网络的目前状态传递到下一个状态。同一个单元不停地处理不同的输入值,而这些值是自己产生的。反复出现的神经网络可以认为是同一个神经元在不同时间的状态,每个都传递消息给继承者,也就是下个时态的神经元。
将RNN神经元按照时间展开可以发现,其链式结构的本质使RNN与序列化的数据和列表密切相关,因此RNN是一种处理序列化数据的神经网络结构。
由于RNN的这种和时间相关的特性,必然会得到广泛的应用。例如,语音识别、语言建模、翻译、字幕、图像等等,这些成功的背后都是用了LSTMs(长短期记忆网络),它是这一种特殊的循环神经网络。
LSTM
长时间依赖的问题
RNN的诉求之一是,它也能使用以前的信息来解决问题。有时候,我们只需要看最近的信息来执行现在的任务,例如,试图预测“天空中有()”这句话的最后一个字。我们利用前面很少的信息就能判断出这个字是鸟或云。也就是说如果相关的信息和我们需要填词的位置之前的差距较小,那么RNN就能学会利用过去的信息。
有时候,我们需要更多的上下文,例如,预测“我在中国长大……, 我讲一个口流利的()”的最后一个词,利用最近的信息,可能是一个语言名字,如果想缩小语言名的范围,则需要更多的信息。相关上下文信息和我们需要得到的词的位置相差很大。这种距离将使RNN无法学习到这些信息。
LSTM网络
LSTM具有能够学习的长期依赖的能力,比如在文本处理中能够利用更多的上下文信息来判断下一个词的概率。
LSTM在实践中记住长期的信息是自身的属性。
所有的RNN都能够按时间展开成有重复的神经元模块组成的链式结构。对于标准的RNN,这个重复模块有一个非常简单的结构,如一个tanh层:
LSTM的重复模块
与RNN单个激活模块不同的是,LSTM包含4个激活单元。
LSTM核心理念
LSTM 的关键是单元状态,即通过图表的顶部的水平箭头。单元状态有点像一个传送带。它通过整个链网下运行,只有一些小的线性相互作用。信息会很容易地沿着箭头方向流动。
LSTM完全可以删除或添加单元状态的信息,被称为“门”的结构将会控制信息,可以选择地让信息通过,它有Sigmoid神经网络层和点乘操作组成。
Sigmoid层输出0和1之间的数字,描述每个组件能通过多少信息。0表示“不让任何信息通过”,而1表示“然所有信息通过”。一个LSTM有三种这样的门结构来保护和控制单元的状态。
LSTM分步执行
第一步决定从单元状态扔掉那些信息。是有“遗忘门”的Sigmoid层做决定的。在Ct-1上,ht-1和xt输出0和1之间的数字。
让我们回到语言模型,试着基于以前的信息预测下一个字的例子。比如在这样的问题中,单元状态可能包括性别的话题,这样就能正确使用代词了,比如他或者她。当我们看到一个新的话题时,我们想要忘记旧话题的有关性别的内容。
第二步我们要决定在单元状态中储存那些新的信息。这分为两个部分,
- 首先被称为“输入门”的一个Sigmoid层决定那些值会更新。
- 接着,一个tanh层创建新的候选值得向量Ct,它是一个可添加的状态。
第三步,我们结合这两种创建一个更新的状态。在语言模型的例子中,我们想添加有关性别的新话题,以取代我们需要忘记的旧话题。
再来更新就单元状态Ct-1,进入新的单元状态Ct。前面的步骤已经说明了要怎么做,现在我们只需要真正实现它。
我们乘以旧状态ft,丢弃我们之前决定忘记的东西。然后,我们加上itC~。这是新的候选值,由我们决定更新每个状态值。
在语言模型下,我们实际上把旧性别主题信息丢弃了,并添加了新的信息。
最后,决定输出什么,此输出将根据之前的单元状态,但这也是经过筛选的版本。
来看看输出的步骤:
- 首先我们运行一个sigmoid层,它决定我们要输出那些单元状态;
- 然后我们把单元状态通过tanh函数(将输出值规一化于-1到1之间)和Sigmoid门的输出相乘,以便只输出我们决定输出的部分。
在语言模型的例子中,因为它就看到了一个代词 ,可能需要输出与一个动词相关的信息。例如,它的输出代词是单数还是复数,这样如果是动词的话,我们也知道动词需要进行的词形变化。
LSTM变体
一种流行的LSTM变体,由Gers和Schmidhuber引入,增加了观察口连接。这意味着我们将使用单元的状态来控制门结构
所有门结构增加了观察口,但许多论文认为是一部分门结构有观察口,一部分没有
另一个变体是使用合并遗忘(也叫耦合忘记)和输入门。他们的差别在于不是分别决定忘记什么或我们应该添加什么新信息,而是一起做出这些决定。我们只有在有数据输入时才会去选择应该忘记那些旧数据。我们只有再忘记旧数据时,才会输入新的值。
LSTM的所有变体中最突出的一个是们重复单元(the Gated Recurrent Unit)或称为GRU,是由Kyunghyun Cho等人2014年引入。它结合了遗忘门和输入门合成了一个“更新门”。这也融合了单元状态和隐藏状态,还有一些其他的变化。这样得到的模型比标准的LSTM模型更简单,也越来越为大家所接受。
以上仅仅是一些最著名的LSTM变体。还有血多其他的,向深度们结构式RNN,由Yao等人发表。还有一些用完全不同的方法来解决长期依赖性,如始终RNN。
结论
人们用RNN取得了显著的成果,这基本上都使用LSTM实现的,它们对于大多数的任务都工作的很好。