台湾大学深度学习课程 学习笔记 lecture3-1 Recurrent Neural Network (RNN)
以下内容和图片均来自台湾大学深度学习课程。
课程地址:https://www.csie.ntu.edu.tw/~yvchen/f106-adl/syllabus.html
Recurrent Neural Network (RNN)循环神经网络常被用到的领域是Language Modeling,下面就从Language Modeling方法的发展,引入RNN。
Language Modeling
多个word组成一句话,根据一句话出现的概率可以得到更符合语法结构和有意义的句子。
比如根据给出的一段语音,可以得到两种完全不同的句子“recognize speech”、“wreck a nice beach”,但是“recognize speech”出现的可能性更大。
N-Gram Language Modeling
想要估算出word sequence的概率,首先介绍了N-Gram Language Model 方法,是一种传统处理的方法。只考虑前面
那么如何确定概率呢?
这需要先收集大量的训练资料使用机器学习的方法去训练得到概率。
还有一个问题,假如搜集的训练集中有些sequences并没有出现,而恰好这些sequences就出现在了测试数据中。那么sequences概率就是0,这就会导致上面连乘公式
解决方法也很简单,叫 Smoothing,就是对这些没有出现,后面计算概率是直接赋予一个比较小的结果,比如“0.0001”。在一些情况下,效果还是不错的,但是这种简单粗暴的方法总是会存在一些问题,首先准确度不够,其次不同的情况赋予值是相同的。
以上就是传统的处理方法,存在一些局限性。下面介绍使用深度学习的方法。
Feed-Forward Neural Language Model
假设我们已经有了一个训练好的神经网络模型,可以输入数据然后的到各种word出现的概率。
下图中,输入不同的vector(黄色),经过相同的神经网络模型(蓝色区域)进行预测,得到不同word出现的概率,选择所需的概率
上面讲到的神经网络模型结构如下,具体方法可以去看提到的文章 A Neural Probabilistic Language Model - Bengio et al ,和一般的神经网络稍有不同。
上面讲的神经网络训练的方法相比传统的方法有一个优点,如下图。遇到未训练过的sequences时,可以自动的Smoothing,填充一个合适的值。原因是,假如训练数据中只有“…dog jump…”,而预测 “…cat jump…”时,模型会把类似于“dog”、“cat”、“rabbit”等属性相近的words归到一类,从而近似的预测“…cat jump…”的概率,最终的结果中
上面的模型还是需要提供一个window
Recurrent Neural Network Language Model (RNNLM)
RNN 会考虑所有情况,并且和时间也有关系。
首先,这是之前说的一个神经网络结构的形式。
RNN Language Model 是将这些网络连接了起来,前一个word的信息也会传递到下一个word模型的计算中去。
单独看一个神经网络的话,在第
上面一节从传统方法及其局限问题,为了解决这些问题,讲到使用RNN进行处理。接下来,将对RNN的方法进行详细讲解。
Recurrent Neural Network
Definition
RNN的结构如下,简单表示就是下图左的样子,将其展开后,编程下图右的结构。
每个word按照在句子中的顺序,会接收上一个word的神经网络隐藏层并对其赋予
最后将本次神经网络的隐藏层同样赋予
虽然展开后有很多层,但是所有的神经网络其实用的是同一套参数,所以只有
Training via Backpropagation through Time (BPTT)
反向传播之前课程中有详细介绍 Backpropagation ,如果理解了反向传播后,就会发现,其实RNN 的 Backpropagation 其实是同样的计算方法。只不过由于是多级神经网络增加了很多级而已,但是每一个神经网络其实以一样的原理。
首先是对输出层的损失函数
根据时间也就是
其中的参数类型按照上面讲到的, 分为三种。
第一种是 输出层 之间的参数 为
第三种是神经网络传递过程中每次都需要输入的
下面的图比较直观的反映了反向传播的顺序,以及各输出结果的损失函数
每次Backpropagation都是全部同步更新的。
Training Issue
梯度爆炸和梯度消失
由于RNN中每个神经网络使用相同的一套参数,矩阵不断地进行相乘后一部分值会成指数级的升高或降低,从而出现梯度爆炸和梯度消失。
下图中,通过不断地迭代后,出现梯度爆炸和梯度消失,在50 steps时,参数分布在两端和0附近。
解决方法
梯度爆炸解决方法,将数字限定在一个范围里面,以防止其过大。
而梯度消失不像梯度爆炸一样能直接对其做限制,则比较麻烦,有一种方法是IRNN 。详细请参考论文 A Simple Way to Initialize Recurrent Networks of Rectified Linear Units - Le et al 。
将
下面是使用IRNN后的效果对比。
另外,梯度下降还会引发另一个问题。当RNN有非常多循环,前面的神经网络就很难去影响后面的结果。但是有时候在一句话中,前面句子里面的word和靠后面word之间关系还是比较大的。针对这个问题,后面的课程中还会讲到。
Extension
除了上面讲到的RNN结构,还有一些其他形式。
比如双向RNN和深层双向RNN。
需要注意的是,双向RNN并不是所有情况都适用。比如在股票预测这种就无法进行双向,因为股票信息无法获得之后未来的信息。
Applications
Sequential Input
在输入方面的应用,由于RNN训练的结果在是有前后顺序信息的。所以可以对句子先进行RNN得到vector,将vector结果作为另一个神经网络的输入数据。
Sequential Output
在输出方面的应用。可以做词性的标记,在RNN中,设置不同的输出信息,可以训练得到相应的标签序列。例如,根据一个word在一句话中所在的位置,输出这个word的词性。
另外一个是,做Natural Language Understanding (NLU) 自然语言理解。比如向Siri说出一段指令,Siri理解并根据指令进行操作。
如下图,其实是从这句话中找出符合send_email API接口的相应标签信息。
还有一个就是上面两种的结合使用,使用两个RNNs,一个用于处理输入信息,一个用于处理输出信息。两个RNNs同步训练。