台湾大学深度学习课程 学习笔记 lecture3-1 Recurrent Neural Network (RNN)

来源:互联网 发布:java分布式 编辑:程序博客网 时间:2024/06/06 00:16

以下内容和图片均来自台湾大学深度学习课程。
课程地址: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”出现的可能性更大。

Language Modeling

N-Gram Language Modeling

想要估算出word sequence的概率,首先介绍了N-Gram Language Model 方法,是一种传统处理的方法。只考虑前面 (n1) 个words出现的概率。比如句子“我是谁”,令 n=2 ,“谁”这个字只考虑前面的“是”。

N-Gram

那么如何确定概率呢?
这需要先收集大量的训练资料使用机器学习的方法去训练得到概率。

概率计算

还有一个问题,假如搜集的训练集中有些sequences并没有出现,而恰好这些sequences就出现在了测试数据中。那么sequences概率就是0,这就会导致上面连乘公式 P(w1,w2,...,wm)=0。哪怕其他概率再大,只要出现一个未知的0,最终结果也是0 。

解决方法也很简单,叫 Smoothing,就是对这些没有出现,后面计算概率是直接赋予一个比较小的结果,比如“0.0001”。在一些情况下,效果还是不错的,但是这种简单粗暴的方法总是会存在一些问题,首先准确度不够,其次不同的情况赋予值是相同的。

解决方法

以上就是传统的处理方法,存在一些局限性。下面介绍使用深度学习的方法。

Feed-Forward Neural Language Model

假设我们已经有了一个训练好的神经网络模型,可以输入数据然后的到各种word出现的概率。
下图中,输入不同的vector(黄色),经过相同的神经网络模型(蓝色区域)进行预测,得到不同word出现的概率,选择所需的概率 P 。例如,输入 vector of “wreck”,选择对应的 “a”出现的概率 P(next word is a) ,最后把所有的概率相乘。

神经网络初步应用

上面讲到的神经网络模型结构如下,具体方法可以去看提到的文章 A Neural Probabilistic Language Model - Bengio et al ,和一般的神经网络稍有不同。

NN结构

上面讲的神经网络训练的方法相比传统的方法有一个优点,如下图。遇到未训练过的sequences时,可以自动的Smoothing,填充一个合适的值。原因是,假如训练数据中只有“…dog jump…”,而预测 “…cat jump…”时,模型会把类似于“dog”、“cat”、“rabbit”等属性相近的words归到一类,从而近似的预测“…cat jump…”的概率,最终的结果中 p(jump|cat) 值会相应的提高,而不是简单的用0.0001代替。

优势与劣势

上面的模型还是需要提供一个window n 的值,但是有时候 n 并不确定。

Recurrent Neural Network Language Model (RNNLM)

RNN 会考虑所有情况,并且和时间也有关系。

RNN

首先,这是之前说的一个神经网络结构的形式。

one-model

RNN Language Model 是将这些网络连接了起来,前一个word的信息也会传递到下一个word模型的计算中去。

RNN-model

单独看一个神经网络的话,在第 t 个神经网络的隐藏层 ht 中,除了正常的输入 x 外,还增加了 ht1 的信息。

结构


上面一节从传统方法及其局限问题,为了解决这些问题,讲到使用RNN进行处理。接下来,将对RNN的方法进行详细讲解。

Recurrent Neural Network

Definition

RNN的结构如下,简单表示就是下图左的样子,将其展开后,编程下图右的结构。

每个word按照在句子中的顺序,会接收上一个word的神经网络隐藏层并对其赋予 W 权重,与输入层的数据 xt 一起,隐藏层整合成一个新的线性关系 Wst1+Uxt 。然后放入激活函数(一般为 tanhReLU),经过一系列计算,最终预测出多分类结果(softmax(Vst))。从结果中找出预测为下一个word的概率值。
最后将本次神经网络的隐藏层同样赋予 W 权重后再传递到下一个word的预测中去。

Definition

虽然展开后有很多层,但是所有的神经网络其实用的是同一套参数,所以只有 U,V,W 这三类参数,减少了计算量。

参数

Training via Backpropagation through Time (BPTT)

反向传播之前课程中有详细介绍 Backpropagation ,如果理解了反向传播后,就会发现,其实RNN 的 Backpropagation 其实是同样的计算方法。只不过由于是多级神经网络增加了很多级而已,但是每一个神经网络其实以一样的原理。

首先是对输出层的损失函数 C(θ) 求偏导,得到各级输出结果组成的梯度方向 C

Backpropagation_C_theta

根据时间也就是 tt1 的方向向前转播。传递的内容和方式与之前讲的反向传播的方式一样。

Backpropagation2

其中的参数类型按照上面讲到的, 分为三种。
第一种是 输出层 之间的参数 为 V ,第二种是隐藏层之间进行传递的参数 W

Backpropagation参数

第三种是神经网络传递过程中每次都需要输入的 x 输入层之间的参数 U 。理论上讲,每个 U 会不一样,但是上面讲过,各循环之间共用一套参数,所以强制将 U 进行同步更新,保证使用的是相同的 U 。实际操作中就是将各层的 U 指向同一内存。

dU

dW

下面的图比较直观的反映了反向传播的顺序,以及各输出结果的损失函数 C 对各位置参数的影响。
每次Backpropagation都是全部同步更新的。

BPTT方向

Training Issue

梯度爆炸和梯度消失

由于RNN中每个神经网络使用相同的一套参数,矩阵不断地进行相乘后一部分值会成指数级的升高或降低,从而出现梯度爆炸和梯度消失。

issue

下图中,通过不断地迭代后,出现梯度爆炸和梯度消失,在50 steps时,参数分布在两端和0附近。

example

解决方法

梯度爆炸解决方法,将数字限定在一个范围里面,以防止其过大。

梯度爆炸解决方法

而梯度消失不像梯度爆炸一样能直接对其做限制,则比较麻烦,有一种方法是IRNN 。详细请参考论文 A Simple Way to Initialize Recurrent Networks of Rectified Linear Units - Le et al 。
W 初始化成单位矩阵 I ,并使用 ReLU 作为其激活函数。

梯度消失解决方法

下面是使用IRNN后的效果对比。

效果对比

另外,梯度下降还会引发另一个问题。当RNN有非常多循环,前面的神经网络就很难去影响后面的结果。但是有时候在一句话中,前面句子里面的word和靠后面word之间关系还是比较大的。针对这个问题,后面的课程中还会讲到。

gating mechanism

Extension

除了上面讲到的RNN结构,还有一些其他形式。
比如双向RNN和深层双向RNN。
需要注意的是,双向RNN并不是所有情况都适用。比如在股票预测这种就无法进行双向,因为股票信息无法获得之后未来的信息。

Bidirectional RNN

Deep Bidirectional RNN

Applications

Sequential Input

在输入方面的应用,由于RNN训练的结果在是有前后顺序信息的。所以可以对句子先进行RNN得到vector,将vector结果作为另一个神经网络的输入数据。

input

Sequential Output

在输出方面的应用。可以做词性的标记,在RNN中,设置不同的输出信息,可以训练得到相应的标签序列。例如,根据一个word在一句话中所在的位置,输出这个word的词性。

Tagging

另外一个是,做Natural Language Understanding (NLU) 自然语言理解。比如向Siri说出一段指令,Siri理解并根据指令进行操作。
如下图,其实是从这句话中找出符合send_email API接口的相应标签信息。

NLU

还有一个就是上面两种的结合使用,使用两个RNNs,一个用于处理输入信息,一个用于处理输出信息。两个RNNs同步训练。

Machine Translation

阅读全文
0 0
原创粉丝点击