吴恩达《深度学习》第五课第三周

序列模型与注意力机制

3.1基础模型

1.seq2seq模型

在法译英句子中,输入的法语有5个元素,输出有6个元素。

吴恩达《深度学习》第五课第三周

首先我们需要构建一个编码网络,这是一个典型的RNN的结构(可以是GRU或LSTM)

吴恩达《深度学习》第五课第三周

每次只向网络输入一个法语单词,在接收完序列后,RNN会输出一个向量来代表输入序列X<1>到X<5>。

然后构建解码网络,以编码网络的输出作为输入,每次输出一个翻译后的单词同时作为下一个节点的输入,一直到输出句子结尾标志符为止。

吴恩达《深度学习》第五课第三周

 

 

2.图像描述模型

输入为一张猫咪坐在椅子上的图片,模型要自动的给图片加上标题:a cat sitting on a chair.

吴恩达《深度学习》第五课第三周

该模型的训练过程为:首先构造编码网络,将图片输入到CNN中,让其学习图片的编码或者一系列特征,如下图所示将猫咪图片输入到AlexNet网络中,我们去掉softmax层,剩下的最后一层的4096维向量就表示猫咪图片。

吴恩达《深度学习》第五课第三周

然后将4096维向量输入到RNN中生成图像的描述,每次生成一个单词且作为下一个节点的输入,这种模型特别流行(特别是在描述不是很长的情况下)

吴恩达《深度学习》第五课第三周

 

3.两种模型的基本流程是一样的,但是运作方式有些不同,这主要体现在使用语言模型合成新的文本并生成序列的方式上

3.2选择最可能的句子

1.机器翻译=条件语言模型

机器翻译可以等同于建立一个条件语言模型,下图为一个语言模型

吴恩达《深度学习》第五课第三周

这个模型可以估计出一个句子的可能性P(y<1>, … , y<T_y>).

对比机器翻译模型我们可以发现,机器翻译模型的解码网络与语言模型是一样的

吴恩达《深度学习》第五课第三周

不同之处是语言模型总是从零向量开始,而机器学习的解码网络是从编码网络的输出开始,因此我们可以称机器翻译模型为条件语言模型,其中的条件就是编码网络部分,机器翻译估计一个句子的可能性是条件概率P(y<1>, … , y<T_y> | x<1>, … , x<T_x>).

2.找出最可能的翻译

在翻译吴恩达《深度学习》第五课第三周

时,其对应的可能性为P(y<1>, … , y<T_y> | x),x表示法语句子,而P(y<1>, … , y<T_y> | x)则表示某句翻译英文y<1>, … , y<T_y>的概率,当然模型可能给出几个翻译结果,比如:

吴恩达《深度学习》第五课第三周

而我们希望得到的是一个英文句子y,使得条件概率最大化

吴恩达《深度学习》第五课第三周

因此在构建机器翻译系统时,我们需要构建一个算法用来找到合适的y值,使得上式得结果最大,解决这个问题的最常用算法是Beam Search(束搜索)。那么为什么不使用greedy search(贪心搜索)?

3.贪心搜索模型

贪心搜索即在生成第一个词y<1>的分布之后,挑选出一个最有可能的词(即P(y<1>_hat | x)最大)作为y<1>,然后再挑选最有可能的第二个词,第三个词…但我们需要的是一次性挑选出整个单词序列y<1>,y<2> … , y<T_y>使得整体的概率P(y<1>, … , y<T_y> | x)最大,因此贪心搜索算法效果并不好。比如下面两个句子

吴恩达《深度学习》第五课第三周

很明显第一个句子好于第二个句子,但是当学习到前两个单词“Jane is”之后“is visiting”比“is going to”的概率低,使用贪心搜索的话就会给出第二句更高的概率,这不是好的选择。

4.假设词典的size=10000,而翻译结果可能是10单词,那可能的输出结果就是10000 ^ 10,这个数量非常庞大不可能计算每一种组合的可能性,因此我们需要使用一个近似搜索,使得

吴恩达《深度学习》第五课第三周

3.3集束搜索(Beam search)算法

还以机器翻译法译英为例:

吴恩达《深度学习》第五课第三周

使用的单词表单词总数为10000,

吴恩达《深度学习》第五课第三周

编码解码网络结构如下:

 

Step1:挑选要输出的英语翻译中的第一个单词,相比贪婪算法只从单词表中挑选一个单词而言,集束搜索算法会选择B个(假设B=3)概率最高的单词(B:beam width)。在选择英语翻译首单词前,集束搜索算法先将法语句子输入到编码网络(绿色),如下图:

吴恩达《深度学习》第五课第三周

然后会解码网络,其中的softmax层会输出10000个概率值,取前B个概率最高的单词,

假设找到的前3个首单词是:in,jane,September,接着算法会将这3个词存到计算机内存中以便下一步的集束搜索;

Step2:针对每个首单词考虑下一个单词是什么,当然第二个单词的可能性也很多,如下

吴恩达《深度学习》第五课第三周

图中可知,in,jane,September对应的从a到zulu的概率都是不同的,那么怎么计算第二个词的概率呢?我们就需要使用下面的解码网络计算第二个单词y<2>_hat,将y<1>_hat作为计算y<2>_hat的一个输入进行求取。

吴恩达《深度学习》第五课第三周

由于第二个单词的选择是以y<1>已经确定为前提的,因此第二个单词的概率其实质是单词对的概率,见上图的概率计算公式;同理,jane和september的第二个单词也同样的计算过程。

吴恩达《深度学习》第五课第三周

吴恩达《深度学习》第五课第三周

经过上述的运算,我们得到了3*10000个概率,从其中取前B个概率最大的值,假设前3个概率最高的单词对是:in September,jane is,jane visit这三个结果(此时淘汰掉了September作为第一单词的可能),算法会将这3个词存到计算机内存中以便下一步的集束搜索;

由于B=3,每一步我们都复制3个网络来评估部分句子和最后的结果,每个网络的第一个单词是不同的,而这三个网络可以高效的评估在选择第二个单词出现的30000个可能选择,而不需要初始化30000个网络副本,就可以快速的评估softmax的输出即y<2>_hat,

Step3:重复step2的操作直到搜索出翻译句子“jane visits Africa in September.<EOS> ”

Tips:如果B=1,则变成贪婪搜索算法;

3.4集束搜索算法的改进

1. length normalization(长度归一化)

集束搜索本质是使下式最大化吴恩达《深度学习》第五课第三周

式中的每一项都是小于1的,因此他们的乘积会产生一个非常小的数值,可能导致数值下溢(即数值太小,导致电脑的浮点表示不能准确的存储),因此在实践中我们不会最大化这个乘积公式,而是取log值

吴恩达《深度学习》第五课第三周

对于一个长句子而言,由于组成的单词比较多概率值会比较低,因为有多个小于1的数值相乘,所以这个目标函数存在一个缺点:更倾向于比较简短的翻译结果。解决这个问题的方法就是将目标函数归一化:

吴恩达《深度学习》第五课第三周

T_y: 翻译结果中单词个数,这样可以明显减少对长句子的惩罚。在实践中有一种探索性的方法(没有理论依据,但是效果非常好),归一化的对数似然目标函数:

吴恩达《深度学习》第五课第三周

 

如果alpha=1,则表示使用完全长度归一化;alpha=0表示没有使用归一化。因此令alpha=0.7表示更柔和的归一化方法,alpha也是超参数之一需要调整大小直至最好的结果。对于集束搜索算法,在得到概率较大的几个句子后,计算这个目标函数,最后从经过评估的句子中挑选出在归一化的log概率目标函数上得分最高的一个。

2.如何选择束宽B

B值越大意味着能找到的句子更好,但是B值太大计算代价也非常大。通常在实际应用中选择范围在10-100之间,对于科研领域有可能达到1000-3000.

3.与BFS和DFS的区别

BFS和DFS是具体的搜索算法,集束搜索运行得更快但不保证一定能搜索到精确的最大值

吴恩达《深度学习》第五课第三周

3.5集束搜索的误差分析

沿用上节中的例子,假设人类翻译的结果是:Jane visits Africa in September.(y*),算法翻译的结果是:Jane visited Africa last September.(y^)。很显然人类翻译优于算法翻译,我们在这个基础上可以计算这两个结果的概率:P(y* | x), P(y^ | x),根据二者之间的大小关系即可推断出到底是集束搜索算法存在问题还是RNN存在问题。

(1)P(y* | x) > P(y^ | x)

y*的概率高于y^这个结果与假设一致,说明RNN计算出的概率是无误的,但是beam search选择了y^,需要调整集束搜索算法。

(2)P(y* | x) <=  P(y^ | x)

y*的翻译好于y^,但是得到的概率却低于y^,说明RNN的预测出了问题,需要调整RNN算法。

3.6 Bleu得分(bilingual evaluation understudy)

1.作用:对于一个机器翻译的结果给出一个分值,以衡量机器翻译的好坏

2.评估机器翻译

在训练集或测试集中,通常会给出几个人工翻译的结果作为参考,例如:

吴恩达《深度学习》第五课第三周

假设此时机器翻译的结果非常极端为

吴恩达《深度学习》第五课第三周

我们很明确的知道这是个非常糟糕的结果,但使用最基本的评估方式——以MT中单词出现在参考句子中的次数除以MT句子中单词数量,得到的结果是 7/7,这显然是不正确的,我们需要对评估的方式进行修正:把MT句子中的每一个单词设定一个参考上线,参考上限值为这个单词在某个参考句子中出现的最多次数,在本例中the在reference1中出现2次,在reference2中出现1次,那么the的参考上限为2,这样本例中MT的结果就变成了2/7

3.二元词组(bigram)的Bleu得分

假设此次MT的结果为

吴恩达《深度学习》第五课第三周

虽略好一些,但仍然不够理想。此翻译结果中的bigram 按照先后顺序依次为:the cat, cat the, the cat, cat on, on the, the mat,最终统计成下表(count clip上限计数):

吴恩达《深度学习》第五课第三周

此时该翻译结果的得分为:4(sum of count clip)/ 6(sum of count)

4. n元词组公式总结

(1)一元词组

吴恩达《深度学习》第五课第三周

(2)n元词组

吴恩达《深度学习》第五课第三周

这个方法能够衡量机器翻译输出中与参考相似重复的程度

5.Bleu得分

假设Bleu采用n元组,那么计算P_1, P_2, … , P_n 的结果,然后合并成Bleu得分公式如下(假设n=4):

吴恩达《深度学习》第五课第三周

BP(brevity penalty)称为简短惩罚,其作用是惩罚输出了太短翻译结果的翻译系统,因为算法倾向于给短句高分。BP的公式如下:

吴恩达《深度学习》第五课第三周

Tips:通常Bleu适用于图像描述,而不适用于语音识别系统。

3.7 注意力模型直观理解

1. 注意力模型的直观理解

注意力模型可以解决神经网络在处理长句子时Bleu得分低的问题,结构如下图所示

吴恩达《深度学习》第五课第三周

图中alpha表示的是注意力权重,意味着当前时刻应该花多少注意力第t个法语单词上,当生成一个特定的英语单词时,这规定了在每个时间步上去看周围词距内的法语词需要花多少注意力。

3.8 注意力模型

1.注意力模型

首先使用双向RNN去计算每个词的特征,实际上双向GRU和双向LSTM比较常用,

吴恩达《深度学习》第五课第三周

为了便于计算和标注,a<t> = (前向a<t>, 后向a<t>),为了区分使用t’表示法语句子。

吴恩达《深度学习》第五课第三周

 

为了区别编码网络,使用状态s表示生成翻译;注意力权重之和为1,辅助公式如下:

吴恩达《深度学习》第五课第三周

 

2.计算alpha<t, t’>

alpha<t, t’>表示y<t>应该花在a<t’>上的注意力,计算公式如下:

吴恩达《深度学习》第五课第三周

由于alpha<t, t’>的和为1,因此对于上式我们需要使用softmax来求取对应的函数,对于e<t, t’>值的计算,一种常用的方式是使用一个小的神经网络如下图,

吴恩达《深度学习》第五课第三周

其中:s<t-1>是神经网络上一时刻的状态,如下图中所示

吴恩达《深度学习》第五课第三周

从上图中我们可以直观的感受到alpha<t, t’>和e<t, t’>的值都取决于s<t-1>和各a<t’>,但是这个对应关系函数我们不知道,因此构建softmax网络,利用反向传播来学到一个正确的函数。

3.注意力模型实例

(1)日期标准化

吴恩达《深度学习》第五课第三周

(2)可视化注意力权重

3.9 语音辨识

1. 语音辨识的问题

端到端的学习方法已经可以取代音位系统

2.注意力模型与语音识别

吴恩达《深度学习》第五课第三周

3.使用CTC损失用于语音识别

CTC(connectionist temporal classification)

吴恩达《深度学习》第五课第三周

这种算法的时间步很大,假设人声为100Hz,时长10s,这样我们会有1000个输入,但是这么短的时间说的话不可能有1000个字符,CTC算法采用字符重叠和空白位的方式强制网络输出与输入等量的结果,则结果如图所示,然后再处理重叠的字符和空白的位,得到正确的语音识别结果。

3.10触发字检测

1.什么是触发字检测

越来越多的设备通过语音来唤醒,比如:Amazon Echo的Alexa,Baidu DuerOS的小度你好,Apple Siri的Hey siri,Google Home的Okay Google来唤醒,这些都是触发字系统

2.触发字检测算法

首先我们要将一段音频转化计算出它的声谱图特征,得到特征向量x<1>, x<2>,…;然后把特征向量输入到RNN中;最后定义目标标签y。如果音频中正好有触发字,比如:Alexa,则网络的输出将置1,如下图

吴恩达《深度学习》第五课第三周

不过该算法有一个缺点:它构建了一个很不平衡的训练集,因为0的数量会比1多很多。解决方法:在输入的特征变为0之前的有效时间内多输出几个1,这种方法虽然简单但可以稍微提高0和1的比例。