序列模型(Recurrent Neural Networks)是Andrw Ng深度学习专项课程中的第五门课,也是最后一门课。这门课主要介绍循环神经网络(RNN)的基本概念、模型和具体应用。该门课共有3周课时,因此我将分红3次笔记来总结,这是第一节笔记。
——前言网络
序列模型可以应用在许多领域,例如:app
这些序列模型基本都属于监督式学习,输入x和输出y不必定都是序列模型。若是都是序列模型的话,模型长度不必定彻底一致。框架
下面以命名实体识别为例,介绍序列模型的命名规则。示例语句为:ide
Harry Potter and Hermione Granger invented a new spell.函数
该句话包含9个单词,输出y即为1 x 9向量,每位表征对应单词是否为人名的一部分,1表示是,0表示否。很明显,该句话中“Harry”, “Potter”, “Hermione”, “Granger”均是人名成分,因此,对应的输出y可表示为:
对于输入x,表示为:
该词汇库可当作是10000 x 1的向量。值得注意的是天然语言处理NLP实际应用中的词汇库可达百万级别的词汇量。性能
对于序列模型,若是使用标准的神经网络,其模型结构以下:
使用标准的神经网络模型存在两个问题:
标准的神经网络不适合解决序列模型问题,而循环神经网络(RNN)是专门用来解决序列模型问题的。RNN模型结构以下:
RNN模型包含三类权重系数,分别是Wax,WaaWaa,Wya。且不一样元素之间同一位置共享同一权重系数。
RNN的正向传播(Forward Propagation)过程为:
其中,g(⋅)表示激活函数,不一样的问题须要使用不一样的激活函数。学习
为了简化表达式,能够对上式进行整合:
则正向传播可表示为:
He said, “Teddy Roosevelt was a great President.”
He said, “Teddy bears are on sale!”优化
针对上面识别人名的例子,通过RNN正向传播,单个元素的Loss function为:
该样本全部元素的Loss function为:
而后,反向传播(Backpropagation)过程就是从右到左分别计算L(y^,y)对参数Wa,Wy,ba,by的偏导数。思路与作法与标准的神经网络是同样的。通常能够经过成熟的深度学习框架自动求导,例如PyTorch、Tensorflow等。这种从右到左的求导过程被称为Backpropagation through time。编码
以上介绍的例子中,Tx=Ty。可是在不少RNN模型中,Tx是不等于Ty的。例如第1节介绍的许多模型都是Tx≠Ty。根据Tx与Ty的关系,RNN模型包含如下几个类型:翻译
不一样类型相应的示例结构以下:
语言模型是天然语言处理(NLP)中最基本和最重要的任务之一。使用RNN可以很好地创建须要的不一样语言风格的语言模型。
什么是语言模型呢?举个例子,在语音识别中,某句语音有两种翻译:
很明显,第二句话更有多是正确的翻译。语言模型实际上会计算出这两句话各自的出现几率。好比第一句话几率为10^−13,第二句话几率为10^−10。也就是说,利用语言模型获得各自语句的几率,选择几率最大的语句做为正确的翻译。几率计算的表达式为:
如何使用RNN构建语言模型?首先,咱们须要一个足够大的训练集,训练集由大量的单词语句语料库(corpus)构成。而后,对corpus的每句话进行切分词(tokenize)。作法就跟第2节介绍的同样,创建vocabulary,对每一个单词进行one-hot编码。例以下面这句话:
The Egyptian Mau is a bread of cat.
One-hot编码已经介绍过了,再也不赘述。还需注意的是,每句话结束末尾,须要加上< EOS >做为语句结束符。另外,若语句中有词汇表中没有的单词,用< UNK >表示。假设单词“Mau”不在词汇表中,则上面这句话可表示为:
The Egyptian < UNK > is a bread of cat. < EOS >
准备好训练集并对语料库进行切分词等处理以后,接下来构建相应的RNN模型。
单个元素的softmax loss function为:
该样本全部元素的Loss function为:
对语料库的每条语句进行RNN模型训练,最终获得的模型能够根据给出语句的前几个单词预测其他部分,将语句补充完整。例如给出“Cats average 15”,RNN模型可能预测完整的语句是“Cats average 15 hours of sleep a day.”。
利用训练好的RNN语言模型,能够进行新的序列采样,从而随机产生新的语句。与上一节介绍的同样,相应的RNN模型以下所示:
值得一提的是,若是不但愿新的语句中包含< UNK >标志符,能够在每次产生< UNK >时从新采样,直到生成非< UNK >标志符为止。
以上介绍的是word level RNN,即每次生成单个word,语句由多个words构成。另一种状况是character level RNN,即词汇表由单个英文字母或字符组成,以下所示:
Character level RNN与word level RNN不一样的是,y^<t>由单个字符组成而不是word。训练集中的每句话都当成是由许多字符组成的。character level RNN的优势是能有效避免遇到词汇表中不存在的单词< UNK >。可是,character level RNN的缺点也很突出。因为是字符表征,每句话的字符数量很大,这种大的跨度不利于寻找语句前部分和后部分之间的依赖性。另外,character level RNN的在训练时的计算量也是庞大的。基于这些缺点,目前character level RNN的应用并不普遍,可是在特定应用下仍然有发展的趋势。
语句中可能存在跨度很大的依赖关系,即某个word可能与它距离较远的某个word具备强依赖关系。例以下面这两条语句:
The cat, which already ate fish, was full.
The cats, which already ate fish, were full.
第一句话中,was受cat影响;第二句话中,were受cats影响。它们之间都跨越了不少单词。而通常的RNN模型每一个元素受其周围附近的影响较大,难以创建跨度较大的依赖性。上面两句话的这种依赖关系,因为跨度很大,普通的RNN网络容易出现梯度消失,捕捉不到它们之间的依赖,形成语法错误。关于梯度消失的原理,咱们在以前的吴恩达《优化深度神经网络》笔记(1)– 深度学习的实用层面已经有过介绍,可参考。
另外一方面,RNN也可能出现梯度爆炸的问题,即gradient过大。经常使用的解决办法是设定一个阈值,一旦梯度最大值达到这个阈值,就对整个梯度向量进行尺度缩小。这种作法被称为gradient clipping。
RNN的隐藏层单元结构以下图所示:
为了解决梯度消失问题,对上述单元进行修改,添加了记忆单元,构建GRU,以下图所示:
相应的表达式为:
上面介绍的是简化的GRU模型,完整的GRU添加了另一个gate,即Γr,表达式以下:
注意,以上表达式中的∗∗表示元素相乘,而非矩阵相乘。
LSTM是另外一种更强大的解决梯度消失问题的方法。它对应的RNN隐藏层单元结构以下图所示:
相应的表达式为:
LSTM包含三个gates:Γu,Γf,Γo,分别对应update gate,forget gate和output gate。
若是考虑c^<t−1>对Γu,Γf,Γo的影响,可加入peephole connection,对LSTM的表达式进行修改:
GRU能够当作是简化的LSTM,两种方法都具备各自的优点。
咱们在第3节中简单提过Bidirectional RNN,它的结构以下图所示:
BRNN对应的输出表达式为:
BRNN可以同时对序列进行双向处理,性能大大提升。可是计算量较大,且在处理实时语音时,须要等到完整的一句话结束时才能进行分析。
Deep RNNs由多层RNN组成,其结构以下图所示:
咱们知道DNN层数可达100多,而Deep RNNs通常没有那么多层,3层RNNs已经较复杂了。
另一种Deep RNNs结构是每一个输出层上还有一些垂直单元,以下图所示:至此,第一节笔记介绍完毕!