第一周 循环序列模型(Recurrent Neural Networks)

1.1 为什么选择序列模型?(Why Sequence Models?)

DNA序列分析:DNAACGT四个字母来表示。给定一段DNA序列,能够标记出哪部分是匹配某种蛋白质?

机器翻译:输入句:“Voulez-vou chante avecmoi?”(法语:要和我一起唱么?),要求输出另一种语言的翻译结果

视频行为识别:得到一系列视频帧,要求识别其中的行为

命名实体识别:给定一个句子,要求识别出句中的人名

1.2 数学符号(Notation)

序列模型的输入语句是:“Harry Potter and Herminoe Granger invented a new spell.”。假如想要建立一个能够自动识别句中人名位置的序列模型,那么这就是一个命名实体识别问题

该句话包含9个单词,输出y即为1 x 9向量,每位表征对应单词是否为人名的一部分,对应的输出y表示为:

建立一个词汇库vocabulary,尽可能包含更多的词汇。例如一个包含10000个词汇的词汇库为:

1.3 循环神经网络模型(Recurrent Neural Network Model)

所以这样特定的神经网络结构的一个限制是它在某一时刻的预测仅使用了从序列之前的输入信息,并没有使用序列中后部分的信息

RNN的正向传播(Forward Propagation)过程为:

则正向传播可表示为:

RNN前向传播示意图:

1.4 通过时间的反向传播(Backpropagation through time)

反向传播计算方向与前向传播基本上是相反:

识别人名的例子,经过RNN正向传播,单个元素的Loss function为:

这是 binary classification 的 Loss Function,注意与1.6 的softmax Loss Function区别

该样本所有元素的Loss function为:

RNN反向传播示意图:

1.5 不同类型的循环神经网络(Different types of RNNs)

RNN模型包含以下几个类型:

  • 一对多,比如音乐生成或者序列生成

  • 多对一,如是情感分类的例子,首先读取输入,一个电影评论的文本,然后判断他们是否喜欢电影还是不喜欢

1.6 语言模型和序列生成(Language model and sequence generation)

在语音识别中,某句语音有两种翻译:

  • the apple and pair salad

  • the apple and pear salad

语言模型会计算出这两句话各自的出现概率:

选择概率最大的语句作为正确的翻译

概率计算的表达式为:

如何使用RNN构建语言模型:

首先需要一个足够大的训练集,训练集由大量的单词语句语料库(corpus)构成。然后,对corpus的每句话进行切分词(tokenize),建立vocabulary,对每个单词进行one-hot编码。例如下面这句话:

The Egyptian Mau is a bread of cat.

每句话结束末尾,需要加上< EOS >作为语句结束符。若语句中有词汇表中没有的单词,用< UNK >表示。假设单词“Mau”不在词汇表中,则上面这句话可表示为:

The Egyptian < UNK > is a bread of cat. < EOS >

准备好训练集并对语料库进行切分词等处理之后,接下来构建相应的RNN模型:

单个元素的softmax loss function为:

这是softmax Loss Function ,注意与1.4 binary classification 的 Loss Function区别

该样本所有元素的Loss function为:

对语料库的每条语句进行RNN模型训练,最终得到的模型可以根据给出语句的前几个单词预测其余部分,将语句补充完整。例如给出“Cats average 15”,RNN模型可能预测完整的语句是“Cats average 15 hours of sleep a day.”

1.7 对新序列采样(Sampling novel sequences)

基于词汇的RNN模型

序列模型模拟了任意特定单词序列的概率,要做的是对这些概率分布进行采样来生成一个新的单词序列。编号1所示的网络已经被上方所展示的结构训练过,编号2是进行采样

即无论得到什么样的用one-hot码表示的选择结果,都把它传递到下一个时间步,然后进行采样,直到最后一个时间步

怎样知道一个句子结束:

  • 如果代表句子结尾的标识在字典中,可以一直进行采样直到得到EOS标识(编号6),代表着已经抵达结尾,可以停止采样

  • 如果字典中没有这个词,可以决定从20个或100个或其他个单词进行采样,然后一直将采样进行下去直到达到所设定的时间步。不过这种过程有时候会产生一些未知标识(编号7),如果要确保算法不会输出这种标识,要做的是拒绝采样过程中产生任何未知的标识,一旦出现就继续在剩下的词中进行重采样,直到得到一个不是未知标识的词

这就是如何从RNN语言模型中生成一个随机选择的句子。以上所建立的是基于词汇的RNN模型,意思就是字典中的词都是英语单词(下图编号1)

基于字符的RNN结构

用以上字符组成字典(上图编号2所示)

优点:

不必担心会出现未知的标识,基于字符的语言模型会将Mau这样的序列也视为可能性非零的序列。而基于词汇的语言模型,如果Mau不在字典中,只能当作未知标识UNK

缺点:

最后会得到太多太长的序列,基于字符的语言模型在捕捉句子中的依赖关系也就是句子较前部分如何影响较后部分不如基于词汇的语言模型那样可以捕捉长范围的关系,并且基于字符的语言模型训练起来计算成本比较高

1.8 循环神经网络的梯度消失(Vanishing gradients withRNNs)

编号1cat是单数,应该用was,编号2 cats是复数,用were

这个例子中的句子有长期的依赖,最前面的单词对句子后面的单词有影响。但基本的RNN模型(编号3)不擅长捕获长期依赖效应

在反向传播的时候,随着层数的增多,梯度不仅可能指数型的下降,也可能指数型的上升。梯度消失在训练RNN时是首要的问题,不过梯度爆炸也会出现,但是梯度爆炸很明显,因为指数级大的梯度会让参数变得极其大,以至于网络参数崩溃。参数大到崩溃会看到很多NaN,或者不是数字的情况,这意味着网络计算出现了数值溢出

解决方法:用梯度修剪。梯度向量如果大于某个阈值,缩放梯度向量,保证不会太大

1.9 GRU单元(Gated Recurrent Unit(GRU))

门控循环单元:改变了RNN的隐藏层,使其可以更好地捕捉深层连接,并改善了梯度消失问题

简化的GRU模型

RNN隐藏层的单元的可视化:

为了解决梯度消失问题,对上述单元进行修改,添加了记忆单元,构建GRU,如下图所示:

表达式为:

完整的GRU

1.10 长短期记忆(LSTM(long short term memory)unit)

LSTM是另一种更强大的解决梯度消失问题的方法。它对应的RNN隐藏层单元结构如下图所示:

相应的表达式为:

LSTM前向传播图:

LSTM:更加强大和灵活,因为它有三个门而不是两个

1.11 双向循环神经网络(Bidirectional RNN)

双向RNN模型在序列的某点处不仅可以获取之前的信息,还可以获取未来的信息

值得注意的是计算的是网络激活值,这不是反向传播而是前向的传播,图中前向传播一部分计算是从左到右,一部分计算是从右到左。把所有激活值都计算完了就可以计算预测结果

预测结果:

这些基本单元不仅仅是标准RNN单元,也可以是GRU单元或者LSTM单元

双向RNN网络模型的缺点是需要完整的数据的序列才能预测任意位置。比如要构建一个语音识别系统,双向RNN模型需要等待整个语音说完,获取整个语音表达才能处理这段语音,并进一步做语音识别

1.12 深层循环神经网络(Deep RNNs)

对于RNN来说,有三层就已经不少了。由于时间的维度,RNN网络会变得相当大,即使只有很少的几层

另外一种Deep RNNs结构是每个输出层上还有一些垂直单元:

这些单元(编号3)没必要是标准的RNN,也可以是GRU单元或者LSTM单元,也可以构建深层的双向RNN网络,但深层的RNN训练需要很多计算资源,需要很长的时间

Last updated