注:这是2017年课程的lecture8。一直都在用RNN,但是对它内部的构造不甚了解,所以这次花了一个下午加一个晚上看了CS224n中关于RNN的推导,不敢说融会贯通,算是比以前清楚多了。做个笔记,便于日后查阅。
Overview
主要讲了以下几个内容:
-
传统语言模型
-
RNN和RNN语言模型
-
一些问题(梯度消失爆炸问题)和训练技巧
-
RNN的其他应用
-
双向RNN和多层RNN
传统语言模型
语言模型
首先介绍语言模型的概念,简言之,语言模型描述了一个单词序列的概率,原文是a language model computes a probability for a sentence of words. 这样的好处是可以描述单词顺序以及更好的单词选择。关于单词顺序,课上举的例子是(P(the cat is small) > P(small is the cat)),即正确语序在语言模型下的概率更高;关于单词选择,例子是(P(walking home after school) > P(walking house after school))。也就是说概率越高,越像人话。
传统语言模型
- 定义:
传统的语言模型计算的概率大多基于“窗口”大小,也就是(n-gram)中的(n)的大小。一个自然的理解是当前词的概率也应该和之前所有词的选择有关,即:
但是问题是这种计算不可行,随着语料的增大,当(t)足够大的时候,计算这个概率是很难的事情。因此,我们做出一个在数学上来看不正确,但是在实际计算中很有必要的Markov假设,即当前词的概率仅与之前的(n)个词有关,即:
- 计算:
计算多使用词频或者词组的频率计算,下面的公式展示了(unigram)和(bi-gram)的计算公式:
unigram:$$P({w_2}|{w_1}) = frac{{count({w_1},{w_2})}}{{count({w_1})}}$$
bigram: $$P({w_3}|{w_1},{w_2}) = frac{{count({w_1},{w_2},{w_3})}}{{count({w_1},{w_2})}}$$
其中,(count)表示对应数组在整个语料中的出现次数。根据公式可以看到,计算$${{count({w_1},{w_2},{w_3})}}$$的复杂程度与词汇表大小有关,具体是n-gram的复杂程度是({left| V ight|^n}),其中(left| V ight|)表示词汇表的大小。所以我们会发现这种方法对内存空间的要求很大,模型的表现越好,所需要的内存就越大。
RNN和RNN语言模型
RNN的优点:
-
根据时间序列进行预测,具体方法是共享权值矩阵。
-
理论上可以考虑之前所有的单词
-
内存需求低于传统语言模型
RNN的基本公式:
其中,(D_h)是隐藏层的维度,(d)是词向量的维度,(left| V ight|)是词汇表的大小
训练问题与技巧
目标函数
目标函数采用交叉熵函数:
(t)时刻:$${J^{(t)}}( heta ) = - sumlimits_{j = 1}^{left| V ight|} {{y_{t,j}}log {{hat y}_{t,j}}} $$
全部:$$J = - frac{1}{T}sumlimits_{t = 1}^T {sumlimits_{j = 1}^{left| V ight|} {{y_{t,j}}log {{hat y}_{t,j}}} } $$
评价指标
困惑度(perplexity, PPL),PPL的计算公式如下:
所以,PPL越小越好。
梯度消失与爆炸问题
首先给出结论,基本的RNN存在长距依赖问题,即训练时间足够长时,会出现梯度的突变,使得训练失去意义。我们从公式推导的角度说明这个问题。
- 首先,我们考虑一个简化的RNN,或许不叫RNN,只是在传统的RNN上做了一些修改,不会影响具体的性质:
- 总误差可以表示为每个时间步误差的和:
- 在反向传播过程中:
我们依次进行分析,首先是(W^S),它的梯度是比较容易得到的,即:
比较麻烦的是(W)和(W^hx)的梯度,但是这两个梯度很类似,求出一个另一个也类似可得,现在以(W)为例,我们先观察这三个式子:
(t)时刻:$${J^{(t)}}( heta ) = - sumlimits_{j = 1}^{left| V ight|} {{y_{t,j}}log {{hat y}_{t,j}}} $$
想要求(t)时刻(W)的梯度,应用链式法则有:
其中,(frac{{partial {J_t}}}{{partial {{hat y}_t}}}frac{{partial {{hat y}_t}}}{{partial {h_t}}})是比较好求的,不好处理的只有(frac{{partial {h_t}}}{{partial W}}),因为({h_{t-1}})中也有(W)项,应该使用连式法则求解,即:
我们再来看上式中的({frac{{partial {h_t}}}{{partial {h_k}}}}),由链式法则有以下的式子成立:
其中(h_j)与({h_{j-1}})的关系可以写成({h_j} = F({h_{j-1}})),所以这个式子可以写成一个雅克比矩阵:
即对这个偏导数求范数,其中({eta _W})和({eta _h})分别是(left| {{W^T}} ight|)和(left| {diag({f^{(1)}}({h_{j - 1}}))} ight|)的上界:
所以,当(0 < {eta _W}{eta _h} < 1),在足够长的时间后会产生梯度消失,否则产生梯度爆炸。
双向RNN和多层RNN
今天太困了,以后再补吧,鸽了QAQ