红色石头的我的网站:redstonewill.comweb
《Recurrent Neural Networks》是Andrw Ng深度学习专项课程中的第五门课,也是最后一门课。这门课主要介绍循环神经网络(RNN)的基本概念、模型和具体应用。该门课共有3周课时,因此我将分红3次笔记来总结,这是第三节笔记。算法
Sequence to sequence(序列)模型在机器翻译和语音识别方面都有着普遍的应用。下面,咱们来看一个机器翻译的简单例子:api
针对该机器翻译问题,可使用“编码网络(encoder network)”+“解码网络(decoder network)”两个RNN模型组合的形式来解决。encoder network将输入语句编码为一个特征向量,传递给decoder network,完成翻译。具体模型结构以下图所示:网络
其中,encoder vector表明了输入语句的编码特征。encoder network和decoder network都是RNN模型,可以使用GRU或LSTM单元。这种“编码网络(encoder network)”+“解码网络(decoder network)”的模型,在实际的机器翻译应用中有着不错的效果。机器学习
这种模型也能够应用到图像捕捉领域。图像捕捉,即捕捉图像中主体动做和行为,描述图像内容。例以下面这个例子,根据图像,捕捉图像内容。svg
首先,能够将图片输入到CNN,例如使用预训练好的AlexNet,删去最后的softmax层,保留至最后的全链接层。则该全链接层就构成了一个图片的特征向量(编码向量),表征了图片特征信息。性能
而后,将encoder vector输入至RNN,即decoder network中,进行解码翻译。学习
Sequence to sequence machine translation模型与咱们第一节课介绍的language模型有一些类似,但也存在不一样之处。两者模型结构以下所示:测试
Language model是自动生成一条完整语句,语句是随机的。而machine translation model是根据输入语句,进行翻译,生成另一条完整语句。上图中,绿色部分表示encoder network,紫色部分表示decoder network。decoder network与language model是类似的,encoder network能够当作是language model的 ,是模型的一个条件。也就是说,在输入语句的条件下,生成正确的翻译语句。所以,machine translation能够当作是有条件的语言模型(conditional language model)。这就是两者之间的区别与联系。优化
因此,machine translation的目标就是根据输入语句,做为条件,找到最佳翻译语句,使其几率最大:
例如,本节笔记开始介绍的例子,列举几个模型可能获得的翻译:
显然,第一条翻译“Jane is visiting Africa in September.”最为准确。那咱们的优化目标就是要让这条翻译对应的 最大化。
实现优化目标的方法之一是使用贪婪搜索(greedy search)。Greedy search根据条件,每次只寻找一个最佳单词做为翻译输出,力求把每一个单词都翻译准确。例如,首先根据输入语句,找到第一个翻译的单词“Jane”,而后再找第二个单词“is”,再继续找第三个单词“visiting”,以此类推。这也是其“贪婪”名称的由来。
Greedy search存在一些缺点。首先,由于greedy search每次只搜索一个单词,没有考虑该单词先后关系,几率选择上有可能会出错。例如,上面翻译语句中,第三个单词“going”比“visiting”更常见,模型极可能会错误地选择了“going”,而错失最佳翻译语句。其次,greedy search大大增长了运算成本,下降运算速度。
所以,greedy search并非最佳的方法。下一小节,咱们将介绍Beam Search,使用近似最优的查找方式,最大化输出几率,寻找最佳的翻译语句。
Greedy search每次是找出预测几率最大的单词,而beam search则是每次找出预测几率最大的B个单词。其中,参数B表示取几率最大的单词个数,可调。本例中,令B=3。
按照beam search的搜索原理,首先,先从词汇表中找出翻译的第一个单词几率最大的B个预测单词。例如上面的例子中,预测获得的第一个单词为:in,jane,september。
几率表示为:
而后,再分别以in,jane,september为条件,计算每一个词汇表单词做为预测第二个单词的几率。从中选择几率最大的3个做为第二个单词的预测值,获得:in september,jane is,jane visits。
几率表示为: 。
此时,获得的前两个单词的3种状况的几率为:
接着,再预测第三个单词。方法同样,分别以in september,jane is,jane visits为条件,计算每一个词汇表单词做为预测第三个单词的几率。从中选择几率最大的3个做为第三个单词的预测值,获得:in september jane,jane is visiting,jane visits africa。
几率表示为: 。
此时,获得的前三个单词的3种状况的几率为:
以此类推,每次都取几率最大的三种预测。最后,选择几率最大的那一组做为最终的翻译语句。
Jane is visiting Africa in September.
值得注意的是,若是参数B=1,则就等同于greedy search。实际应用中,能够根据不一样的须要设置B为不一样的值。通常B越大,机器翻译越准确,但同时也会增长计算复杂度。
Beam search中,最终机器翻译的几率是乘积的形式:
多个几率相乘可能会使乘积结果很小,远小于1,形成数值下溢。为了解决这个问题,能够对上述乘积形式进行取对数log运算,即:
由于取对数运算,将乘积转化为求和形式,避免了数值下溢,使得数据更加稳定有效。
这种几率表达式还存在一个问题,就是机器翻译的单词越多,乘积形式或求和形式获得的几率就越小,这样会形成模型倾向于选择单词数更少的翻译语句,使机器翻译受单词数目的影响,这显然是不太合适的。所以,一种改进方式是进行长度归一化,消除语句长度影响。
实际应用中,一般会引入归一化因子 :
若 ,则彻底进行长度归一化;若 ,则不进行长度归一化。通常令 ,效果不错。
值得一提的是,与BFS (Breadth First Search) 、DFS (Depth First Search)算法不一样,beam search运算速度更快,可是并不保证必定能找到正确的翻译语句。
Beam search是一种近似搜索算法。实际应用中,若是机器翻译效果很差,须要经过错误分析,判断是RNN模型问题仍是beam search算法问题。
通常来讲,增长训练样本、增大beam search参数B都能提升准确率。可是,这种作法并不能获得咱们期待的性能,且并不实际。
首先,为待翻译语句创建人工翻译,记为 。在RNN模型上使用beam search算法,获得机器翻译,记为 。显然,人工翻译 最为准确。
Jane visite l’Afrique en septembre.
Human: Jane visits Africa in September.
Algorithm: Jane visited Africa last September.
这样,整个模型包含两部分:RNN和beam search算法。
而后,将输入语句输入到RNN模型中,分别计算输出是 的几率 和 的几率 。
接下来就是比较 和 的大小。
:Beam search算法有误
:RNN模型有误
若是beam search算法表现不佳,能够调试参数B;若RNN模型很差,则能够增长网络层数,使用正则化,增长训练样本数目等方法来优化。更多错误分析方法,能够参照以前的笔记:Coursera吴恩达《构建机器学习项目》课程笔记(2)– 机器学习策略(下)
使用bleu score,对机器翻译进行打分。
首先,对原语句创建人工翻译参考,通常有多我的工翻译(利用验证集火测试集)。例以下面这个例子:
French: Le chat est sur le tapis.
Reference 1: The cat is on the mat.
Reference 2: There is a cat on the mat.
上述两我的工翻译都是正确的,做为参考。相应的机器翻译以下所示:
French: Le chat est sur le tapis.
Reference 1: The cat is on the mat.
Reference 2: There is a cat on the mat.
MT output: the the the the the the the.
如上所示,机器翻译为“the the the the the the the.”,效果不好。Bleu Score的宗旨是机器翻译越接近参考的人工翻译,其得分越高,方法原理就是看机器翻译的各个单词是否出如今参考翻译中。
最简单的准确度评价方法是看机器翻译的每一个单词是否出如今参考翻译中。显然,上述机器翻译的每一个单词都出如今参考翻译里,准确率为 ,其中,分母为机器翻译单词数目,分子为相应单词是否出如今参考翻译中。可是,这种方法很不科学,并不可取。
另一种评价方法是看机器翻译单词出如今参考翻译单个语句中的次数,取最大次数。上述例子对应的准确率为 ,其中,分母为机器翻译单词数目,分子为相应单词出如今参考翻译中的次数(分子为2是由于“the”在参考1中出现了两次)。这种评价方法较为准确。
上述两种方法都是对单个单词进行评价。按照beam search的思想,另一种更科学的打分方法是bleu score on bigrams,即同时对两个连续单词进行打分。仍然是上面那个翻译例子:
French: Le chat est sur le tapis.
Reference 1: The cat is on the mat.
Reference 2: There is a cat on the mat.
MT output: The cat the cat on the mat.
对MIT output进行分解,获得的bigrams及其出如今MIT output中的次数count为:
the cat: 2
cat the: 1
cat on: 1
on the: 1
the mat: 1
而后,统计上述bigrams出如今参考翻译单个语句中的次数(取最大次数) 为:
the cat: 1
cat the: 0
cat on: 1
on the: 1
the mat: 1
相应的bigrams precision为:
若是只看单个单词,相应的unigrams precision为:
若是是n个连续单词,相应的n-grams precision为:
总结一下,能够同时计算 ,再对其求平均:
一般,对上式进行指数处理,并引入参数因子brevity penalty,记为BP。顾名思义,BP是为了“惩罚”机器翻译语句太短而形成的得分“虚高”的状况。
其中,BP值由机器翻译长度和参考翻译长度共同决定。
若是原语句很长,要对整个语句输入RNN的编码网络和解码网络进行翻译,则效果不佳。相应的bleu score会随着单词数目增长而逐渐下降。
对待长语句,正确的翻译方法是将长语句分段,每次只对长语句的一部分进行翻译。人工翻译也是采用这样的方法,高效准确。也就是说,每次翻译只注重一部分区域,这种方法使得bleu score不太受语句长度的影响。
根据这种“局部聚焦”的思想,创建相应的注意力模型(attention model)。
如上图所示,attention model仍由相似的编码网络(下)和解码网络(上)构成。其中, 由原语句附近单元共同决定,原则上说,离得越近,注意力权重(attention weights)越大,至关于在你当前的注意力区域有个滑动窗。
Attention model中选择双向RNN,可使用GRU单元或者LSTM。因为是双向RNN,每一个 表示:
RNN编码生成特征,注意力权重用 表示,C是各个RNN神经元通过注意力权重获得的参数值。例如, 表示机器翻译的第一个单词“jane”对应的第t’个RNN神经元, 表示机器翻译第一个单词“jane”对应的解码网络输入参数。知足:
也就是说, 表示输出 对RNN单元 的注意力权重因子。
为了让 之和为1,利用softamx思想,引入参数 ,使得:
这样,只要求出 ,就能获得 。
如何求出 呢?方法是创建一个简单的神经网络,以下图所示。输入是 和 ,输出是 。
而后,利用梯度降低算法迭代优化,计算获得 和 。
Attention model的一个缺点是其计算量较大,若输入句子长度为 ,输出句子长度为 ,则计算时间约为 。可是,其性能提高不少,计算量大一些也是能够接受的。
有趣的是,Attention model在图像捕捉方面也有应用。
Attention model能有效处理不少机器翻译问题,例以下面的时间格式归一化:
下图将注意力权重可视化:
上图中,颜色越白表示注意力权重越大,颜色越深表示权重越小。可见,输出语句单词与其输入语句单词对应位置的注意力权重较大,即对角线附近。
深度学习中,语音识别的输入是声音,量化成时间序列。更通常地,能够把信号转化为频域信号,即声谱图(spectrogram),再进入RNN模型进行语音识别。
以前,语言学家们会将语音中每一个单词分解成多个音素(phoneme),构建更精准的传统识别算法。但在end-to-end深度神经网络模型中,通常不须要这么作也能获得很好的识别效果。一般训练样本很大,须要上千上万个小时的语音素材。
语音识别的注意力模型(attention model)以下图所示:
通常来讲,语音识别的输入时间序列都比较长,例如是10s语音信号,采样率为100Hz,则语音长度为1000。而翻译的语句一般很短,例如“the quick brown fox”,包含19个字符。这时候, 与 差异很大。为了让 ,能够把输出相应字符重复并加入空白(blank),形如:
其中,下划线”_“表示空白,” “表示两个单词之间的空字符。这种写法的一个基本准则是没有被空白符”_“分割的重复字符将被折叠到一块儿,即表示一个字符。
这样,加入了重复字符和空白符、空字符,可让输出长度也达到1000,即 。这种模型被称为CTC(Connectionist temporal classification)。
触发字检测(Trigger Word Detection)在不少产品中都有应用,操做方法就是说出触发字经过语音来启动相应的设备。例如Amazon Echo的触发字是”Alexa“,百度DuerOS的触发字是”小度你好“,Apple Siri的触发字是”Hey Siri“,Google Home的触发字是”Okay Google“。
触发字检测系统可使用RNN模型来创建。以下图所示,输入语音中包含一些触发字,其他都是非触发字。RNN检测到触发字后输出1,非触发字输出0。这样训练的RNN模型就能实现触发字检测。
可是这种模型有一个缺点,就是一般训练样本语音中的触发字较非触发字数目少得多,即正负样本分布不均。一种解决办法是在出现一个触发字时,将其附近的RNN都输出1。这样就简单粗暴地增长了正样本。
至此,Ng深度学习专项课程所有总结完毕!
更多AI资源请关注公众号:红色石头的机器学习之路(ID:redstonewill)