Deep Learning (15) - RNN & LSTM
这是吴恩达五门Deep Learning课程的最后一门。开篇第一周的课程就是著名的RNN和LSTM。这两个模型都是为了解决序列模型的问题。典型的序列模型问题如下:
挨个翻译一下:
- 语音识别
- 音乐发生器
- 评论识别
- DNA序列识别
- 机器翻译
- 视频动作识别
- 名字识别
这些问题都有一个共同点,输入或输出都有可能是一个时间序列。例如语音识别,输入就是一个连续的音频在时间上的序列,视频动作识别也是类似的。音乐发生器没有输入,输出是一段音频,也就是声音在时间上的序列。其他几个输入是一段包含语义的文字,输出是识别的结果。通常包含语义的文字也是时间上的序列,文字只有形成时间上的序列才会有含义。
为什么要有序列模型
序列模型通常包含时间上的连续数据。当然,我们仍然可以采用经典的神经网络模型。那就要求输入包含所有时间上的切片以及不同的步长。
经典模型输出通常是同等维度的输出,而序列模型问题,输出有可能是不同的长度。例如语音识别,同样长度的音频,识别输出文本可能有长有短。如果采用经典模型,则要求输出补偿成相等长度。例如,估计一个最大长度,然后将不足的长度以0补足。
因为序列模型问题,时间上较后的输入受到较前的输入的影响,而经典神经网络没有这部分信息,理论上通过统计学角度,仍然能够达到最终的预测结果,但计算量可想而知,实际也是没有使用价值。这也就是引入序列模型算法的必要性。RNN和LSTM就是两个善于解决序列模型问题的较为常用的算法。
RNN
注:本章所有的例子都是基于解决NLP(Native Language Processing自然语言处理)问题进行阐述的。
基本模型
问题:
检测出文字中的名字字符串
输入:
Harry Potter and Hermione Granger invented a new spell.
首先有一个字典向量,通常这个字典包含10-15万个单词。每一个单词是,例如Harry是,Potter是等等。每一个x是一个one-hot向量。也就是一个与字典向量同维度的列向量,且对应单词位置取1,其他位置取0。
输出是:
也就是是名字的单词输出为1,否则为0。
Forward Propagation
通常令
其他类型的RNN
Many-to-one (Sentiment classification)
One-to-many (Music generation)
Many-to-many (
Many-to-many ( Machine translation)
Backward Propagation
这里的反向传播又称为Backward Propagation through time。
上图中蓝色的箭头是正向传播,红色的箭头是反向传播
RNN应用举例: Language Modelling & Sequence Sampling
Andrew花了两个视频介绍了Language Modelling和Sequence Sampling。后者基于前者来生成语句。两者均基于由RNN训练出来的模型。一个基本的RNN网络如下,在应用之前,我们需要输入大量的文本进行训练
Language Modelling
当训练完毕后,我们可以用下面的网络结构进行modelling。
与训练时的网络不同的是,这里没有样本输入,即:
Sequence Sampling
当得到每个时刻t的softmax输出时,运用np.random.choice即可产生一个此时刻的单词。当产生句子终止符<EOS>
的或者产生足够数量的单词的时候,sampling终止。
如果training set使用的是各种News,则产生的sequence读起来就和新闻一样。如果training set使用的是莎翁的作品,产生的sequence就会像出自莎翁的戏剧。
Character-level language model
这种model的字典向量从所有的词,变成字母+标点符号。字典向量维度大大降低。RNN模型将用来预估每一个字母后面出现字母的概率。
pros
- 不会出现
<UKN>
(未知单词),因为全是字母和标点符号。
cons - RNN的序列很长,所以计算量较大。
- 句子通常需要单词间语义的关联,如果以字母为预测单位,则损失了这一有用的信息
Vanishing Gradient
当序列问题的序列足够长的时候,实际也就是RNN网络的层数很多的时候,同标准神经网络一样,会遇到梯度爆炸(exploding gradient)和梯度消失(vanishing gradient)的问题。但是序列问题,又恰恰需要解决这一问题。例如这句话The cat, which already ate …, was full.
。主句谓语was需要按照主语是否复数来定。如果中间的从句可能很长,且发生梯度消失问题,则后续的输出不太会受到序列前期输入的影响。GRU和LSTM的提出,都是为了解决梯度消失的问题。
梯度爆炸通常比梯度消失容易解决,只要为梯度值设置一个上限即可,就不会导致梯度值变成NaN。但梯度消失通常不太好解决。
GRU
- 是memory cell,在GRU中记录激活值,即
- 是t时刻c的更新备选
- 是更新门,决定是否用更新
- 是相关门,代表和的相关性
- 所有的W,b都是learnable parameter
- 代表element-wise相乘
图中是simplified版本的GRU,没有参数
LSTM
- :更新门
- :遗忘门
- : 输出门
LSTM通常有很多变种,一个比较著名的变种就是在计算3个时,加入了的影响。这称为peephole connection(窥视孔连接)
在深度学习的发展中,LSTM很早就被提出,GRU反而相对较晚。GRU的特点是运用门数较少(2个),计算较快,适合搭建更大型的序列模型。LSTM有3个门控制,灵活性更大,但通常计算量也较大。
Bidirectional RNN
先举个name entity recognition的例子:
He said, “Teddy bears are on sale!”
He said, “Teddy Roosevelt was a great President!”
这两个句子,第一句中的Teddy不是名字,第二句中的Teddy是名字。
当这个网络里输入到Teddy了,怎么判断是不是一个名字的一部分呢?如果只通过前面输入的部分是无法判断的。必须要借助后面的语句才可以正确的判断。所以就有了双向循环网络的必要了。
最终网络结构如下图:
中间紫色的路径是标准的RNN,绿色的路径是反向路径。紫色和绿色的模块都可以采用GRU或者LSTM单元。通常在NLP的应用中,采用LSTM的双向网络是比较常见的。
Deep RNN
对于RNN来说一般很少像CNN那样堆叠很多层,3层对RNN来说就已经非常庞大了。如果需要堆叠多层,一般会删去水平连接。 每个RNN单元可以是标准RNN单元,也可以是GRU单元、LSTM单元甚至BRNN单元,可以自由设置。
如上图所示,
参考文献
GRU:
- Cho et al., 2014. On the properties of neural machine translation: Encoder-decoder approaches
- Chung et al., 2014. Empirical Evaluation of Gated Recurrent Neural Networks on Sequence Modeling
LSTM: Hochreiter & Schmidhuber 1997. Long short-term memory