理解RNN
翻译摘自 https://www.cs.toronto.edu/~graves/preprint.pdf
3.2 Recurrent Neural Networks
在之前的章节中,我们讨论了前向神经网络--一种在连接中并不包含环的神经网络.如果我们排除这种限制,在连接中允许环的存在,我们就得到了RNN(recurrent neural network)。和前向神经网络一样,很多种类的RNN都已经被提出了,比如有:
Elman networks (Elman, 1990), Jordan networks (Jordan, 1990), time delay neural networks (Lang et al., 1990) and echo state networks (Jaeger, 2001)
,在本章中,我们仅仅关注简单的RNN, 仅仅包含一个自连接的隐藏层,就像图3.3中所示的那样.虽然多层感知器(可以理解为前向神经网络--译者注)和RNN之间的区别似乎是微不足道的,但对序列学习的影响是深远的。一个多层感知机仅仅只能将一个输入向量映射为一个输出向量,而RNN却可以可以原则上将整个历史输入映射为对应的输出。确实,对于多层感知机的通用近似理论来说,一个相同的结果就是-- 一个有足够隐藏层数量的RNN可以在一个任意精度上估计可测量的sequence to sequence.
(此句没有完全理解,原文:Indeed, the equivalent
result to the universal approximation theory for MLPs is that an RNN with a
sufficient number of hidden units can approximate any measurable sequence-to sequence mapping to arbitrary accuracy Hammer 2000)
RNN 的关键在与递归连接允许之前输入的"记忆"在网络的当前状态中继续存在,并且影响整个网络的输出.
3.2.1 Forward Pass
RNN的前向传递和只有一个隐藏层的的多层感知机很相似,不同的是RNN隐藏层的激活来源于当前的外部输入和之前时间步隐藏层的激活输出.现在考虑将一个长度为T的输入序列x递交给一个有I个输入单元,H个隐藏单元和K个输出单元的RNN
令x_i^t 作为t时刻的输入i, 让a_j^t b_j^t 相应的作为t时刻 j 单元的输入,和t时刻j单元的激活输出,对于隐藏层单元,我们有:
从t=1 时刻开始,随着t逐渐增加,通过递归地执行3.30 和3.31,隐藏层完整的序列就可以被计算出来. 注意到t=0时刻,b_i^0 的初始值必须为这些隐藏层单元选择好,这关系到在没有从序列数据获取到任何外部信息之前的网络状态.在这本书中,网络的初始状态通常被设置为0,然而,其他的研究者发现RNN的稳定性和表现可以通过指定非0初始值的方法得到提升(Zimmermann et al., 2006a)
RNN网络对输出单元的输入可以在隐藏层激活的同时得到计算:
对于序列分类(sequence classification) 和段分类(segment classification)问题,多层感知机的输出激活函数(逻辑sigmoid二分类和softmax多分类方法)可以同样应用在RNN中,这是由于分类的目标总是在最后时刻结束(序列输入完)之后才显示出来.
,同样的道理,3.3.1中提到的多层感知机的代价函数也可以在RNNs中得到复用。
3.2.2 Backward Pass
给定一个可导的代价函数L的偏导,下一步该做的就是根据偏导求得相应的权重值。两个非常著名的算法已经被设计出来,并且已经被证明在计算RNNs的权重偏导时非常有效。它们是:事实循环学习【: real time recurrent learning
(RTRL; Robinson and Fallside, 1987)】和 backpropagation through time
(BPTT; Williams and Zipser, 1995; Werbos, 1990)我们关注BPTT,因为BPTT不仅更加简单,而且在计算时更加高效。
就像标准的反向传播算法一样。BPTT也是由链式法则的反复应用组成的。它的灵敏之处在于,对于RNN来说,决定代价函数的隐层激活值,不仅仅影响输出层的输出值,而且也影响下一个时间步的隐层激活值。因此:
记
通过在t = T时刻开始,并循环地实施3.33式,t在每一个时间步递减,最终
得到完整的θ序列。(注意,对所有的j ,都有θ_j^(T+1) == 0,因为在输入序列之外没有接受到任何错误)最后,一定要记住所有的权重在每一个时间步都会被重用,我们最终将所有的θ序列求和,并最终求得整个网络的权重。
3.2.3 Unfolding
将RNN网络图的更新过程按照输入序列“展开”是将RNN神经网络可视化的一种有效方法,注意展开的网络图将不再包含环(与图3.3对比),否则前向传递和后向传递将不再定义完整。
将RNN网络视为展开的图将更容易概括一个有很多复杂更新独立项的网络(原文:Viewing RNNs as unfolded graphs makes it easier to generalise to networks with more complex update dependencies)我们将在下一章遇到这个问题(这里指的是LSTM ---译者注)
注意!!!
3.4中下面的一段介绍对理解RNN非常重要! 一般的文章中都会用展开后的图表示RNN,但是要注意的是,展开后的一个圈不再代表一个单独的cell,而代表了一组cells在一个时间步的集合。 如果把一个圈理解为一个cell,就会产生"输入单元个数不是应该和隐藏层单元个数相等的疑惑",笔者在这里疑惑了很长时间。
相关文章
http://karpathy.github.io/2015/05/21/rnn-effectiveness/
Application of RNN
https://homepages.inf.ed.ac.uk/ballison/pdf/lrec_skipgrams.pdf
Skip Gram Structure
Skip Gram Training
Introduction to Skip-Gram model