引言

本文是吴恩达深度学习第五课:序列模型。本次课程将会学到如何为自然语言、语言和其他序列数据构建模型。会了解如何构建并训练一个循环神经网络,和常用的变体,比如GRU和LSTM。能应用序列模型到自然语音处理,包括情感分析。能应用序列模型到语音应用,包括语音识别和智能作曲。

第五课有以下三个部分,本文是第三部分。

  1. 循环神经网络
  2. 自然语音处理与词嵌入
  3. 序列模型与注意力机制

基础模型

本节介绍seq2seq模型,以法语翻译成英语的机器翻译为例。
在这里插入图片描述

Sequence to Sequence Learning with Neural Networks
Learning Phrase Representations using RNN Encoder-Decoder for Statistical Machine Translation

如何训练出一个新的网络,来输入序列x和输出序列y呢。下面介绍来自上面两篇论文的思想。
在这里插入图片描述
首先我们要建立一个编码网络,它是一个RNN的结构,每次只向该网络中输入一个法语单词,当输入序列接收完毕后,这个RNN会输出一个向量,来表示这个输入向量。
在这里插入图片描述

之后再接入一个解码网络,只要给出足够多的法文和英文对,这个模型表现还不错。

还有一个类似的结构,被用来做图像描述(image caption)。

在这里插入图片描述
给定这样一张图片给到网络,它会输出一只猫坐在椅子上。

在这里插入图片描述
用AlexNet结构来生成4096维的编码,不过后面不接softmax单元。而是将这个编码喂给RNN,来生成描述的句子。

选择最可能的句子

你可以把机器翻译想成是建立一个条件语言模型。
在这里插入图片描述
我们已经知道语言模型是上面的样子了,语言模型能够估计句子的可能性,也可以用它来生成新的句子。

那机器翻译模型有什么区别呢?
在这里插入图片描述
机器翻译模型包含编码网络(绿色的)和解码网络(紫色的),对比上面两个结构会发现,解码网络和语言模型几乎一模一样。

不同的是,语言模型的输入一般是零向量,而机器翻译模型的解码网络输入是经过计算的一些向量。

这就是为什么称机器翻译模型为条件语言模型,相比语言模型输出任意句子的概率,
机器翻译模型会输出句子的英文翻译,并且取决于输入的法语句子(条件)。

给定输入的法语句子,翻译模型会告诉你各种英文翻译的可能性,
在这里插入图片描述
显然你不想让它随机地进行输出,如果随机输出,每次得到的翻译可能不同,有时翻译的好,有时翻译的糟糕。

在这里插入图片描述

你想要得到的应该是一个英语句子 y y y,使得下面这个式子的概率最大化。
在这里插入图片描述
解决这种问题最通用的算法,就是束搜索(beam search)。

在介绍束搜索之前,先来看一下为什么不用贪心搜索。在挑选出第一个词后,再选择最有可能的第二个词,然后是最有可能的第三个词。。。

其实你真正需要的是一次性挑选出整个单词序列,来使得整体的概率最大化。
在这里插入图片描述
为了证明贪心算法在这里不好用,下面举一个例子。显然第一个句子比第二个句子要好,因为第一个句子更加简洁。
在这里插入图片描述
如果贪心算法挑选出了"Jane is",因为going在英文中很常见,因此going更有可能被贪心算法选中作为翻译出来的单词。

束搜索

本节介绍下束搜索,先来讲下它的算法思想。
首先是一个10000个单词的字典,
在这里插入图片描述
然后利用这个网络来评估第一个单词的概率值,给定法语 x x x,得到第一个输出 y y y的概率值是多少,这是第一步。

束搜索算法此时会考虑多个结果,会有一个参数B,叫做束宽(beam width)。这里令B=3,也就是会考虑三个结果。
在这里插入图片描述
假设第一个单词最有可能的三个是in、jane和september。然后将这三个结果保存到内存中。

下面我们来看下第二步,在已经选出的三个单词基础上,束搜索会考虑每个单词当初第一个单词的情况下,第二个单词是什么。
在这里插入图片描述

第二步这里我们更关心的是,要找到最可能的第一个,第二个单词对,而不仅是第二个单词。假如第一个单词是in,
在这里插入图片描述
对于jane和september也是同样的操作,每个会得到10000个大小的概率值,此时共有30000个选择。

然后根据可能的前两个词选出最有可能的三种结果,假设是in sepetember、jane is、jane visits。然后继续下一步。此时,相当于已经排除了sepetember作为第一个单词的可能。

由于束宽为3,每个步骤你会实例化网络的三个副本,在第二步是要实例化三个第一个词不同的网络副本,这三个网络副本可以用来有效地评估第二个单词的所有30000中选择。

接下来看第三步。
在第三步中,我们要考虑第三个单词是什么,在已知了三种不同前缀的情况下。

在这里插入图片描述
假设选出的最有可能的第三个单词是(in september) jane,(jane is) visiting,jane visits (africa)。

然后继续第四步,一直这样下次,得到越来越多的输出,直到遇到句子终止符。

改进束搜索

本节我们学习如何使束搜索算分运行的更好。长度归一化是对束搜索算法进行调整的一种方法,可以让你得到更好的结果。

在这里插入图片描述
束搜索要最大化这个概率,在计算时,这些概率值其实都是远小于1的,然后连乘会得到很小的数值,因此在实践中,我们会把整个式子取对数,变成累加。
在这里插入图片描述
对于这个式子还可以进行一些调整,使得翻译结果更好。

如果看第一个连乘的式子,这是很多概率的累乘,乘的概率越多,整个式子的值就越小,因此会不自然地倾向于更简短的翻译结果。

而对于取对数的式子,犹豫概率是小于1的,取对数的结果就是负数,因此也会遇到句子中单词越多,负的越多的问题。

所以对这式子进行一下改变,我们不再最大化这个式子了,而是将它归一化。即除以单词的数量。这样可以减少对输出长的结果的惩罚。
在这里插入图片描述
在实践中,还有人加了个指数 α \alpha α
在这里插入图片描述
来控制归一化的程度,这是一个超参数。

当你运行束搜索时,你会看到很多长度为1,2,3到可能是30的句子。
在这里插入图片描述
然后针对所有这些可能的输出句子,用这个公式来进行评分
在这里插入图片描述

从中选出评分最高的一个,就是最终的翻译结果。

最后还有一个问题是,如何选择束宽B呢。更大的束宽可以考虑的可能就更多,可以得到更好地结果,但是算法的计算代价也会更大。

而用小的束宽,结果会没那么好,但是计算速度快。

束搜索的误差分析

本节将会学习如何对束搜索进行误差分析。

在这里插入图片描述
假设 y ∗ y^* y是人工翻译的结果,而 y ^ \hat y y^是模型翻译的结果,模型翻译的意思已经相差甚远了,本来是在今年九月要去非洲,变成去年九月去了非洲。
在这里插入图片描述
我们知道这个翻译模型由两部分组成,一部分是这个RNN模型,包含编码器和解码器,另一部分是束搜索算法。

我们要找出造成翻译错是由哪部分造成的。
我们用这个RNN模型去计算给定输入翻译成两种句子的概率。
在这里插入图片描述
如果实际上取 y ∗ y^* y的概率 大,但是束搜索选择了 y ^ \hat y y^,那么说明束搜索犯错了。

还有一种情况是:

在这里插入图片描述
y ∗ y^* y是更好的翻译结果,但是RNN预测的是 y ^ \hat y y^的概率大,这种情况下,是RNN模型出现了问题。

误差分析过程看起来像下面这样,你先遍历开发集,然后在其中找出算法产生的错误句子,

在这里插入图片描述
把出现错误的原因写在最后一列。通过这个过程,就能执行误差分析,得出束搜索和RNN出错的比例是多少。

当你发现是束搜索造成了大部分错误时,才可以考虑去增大束宽度;
反之,如果是RNN模型出了更多的错误,那么需要通过深层次的分析来确定是否增加正则化还是获取更多的训练数据。

Bleu分数

机器翻译的一大难题是,不像图片识别能有一个确定的结果。以个法语句子有很多种同样好的人工英文翻译结果,此时有了一个机器翻译结果,要如何同时考虑多种好的人工翻译结果来评估机翻的好坏呢。

一种方法是Bleu分数(bilingual evaluation understudy),下面看下是如何工作的。

在这里插入图片描述
先来看下同一个法语句子,有两个都是很好的人工翻译,
Bleu得分做的是给定一个机器生成的翻译,它能自动计算出一个分数,来衡量机器翻译的好坏。

直觉告诉我们,只要这个机器生成的翻译与任何一个人工翻译的结果足够接近,那么就会得到一个高的BLEU分数。

BLEU得分背后的理念是观察机器生成的翻译,然后看生成的词是否出现在至少一个人工翻译参考之中。

我们现在来看一个极端的例子,假设机器翻译(MT)输出的都是THE。
在这里插入图片描述
显然这是一个糟糕的翻译,衡量机器翻译输出质量的方法之一是观察输出结果的每一个词,看其是否出现在参考中,
在这里插入图片描述
那么此时得到的结果就很不准确,来看一下改良后的精确度评估方法:
在这里插入图片描述
是这样计算的,看每个句子中某个单词出现的最多次数,叫截取次数(count clip)。the出现的最多次数是2,是在第一个句子中。因此如果都是the的话,分子也只能是2。或者说the只能拿到2分。

上面我们看的都是单个单词,我们还想考虑成对的单词(二元组)。就是挨在一起的两个单词。

在这里插入图片描述
假设此时MT给出了更好的翻译结果,但是还不是一个很好的结果。

下面我们先列出所有机器翻译的二元组。

在这里插入图片描述
接下来在MT的结果中数一数每个二元组出现了多少次,
在这里插入图片描述
然后定义截取次数,
在这里插入图片描述
比如the cat只在第一句话中出现了一次,因此这里写成1,其他词组也是这样定义。

此时计算精度就用count clip之和除以count之和:
在这里插入图片描述
总结一下这个公式就是,当考虑的单词数只有一个时:
在这里插入图片描述
就是MT结果中的一元组次数之和,除以MT结果中的一元组数量。

如果是n元组就是:
在这里插入图片描述
如果MT结果和人工翻译的某个句子一模一样的话,那么所有的一元组概率、二元组概率… 都等于1。

最后结合一下来得到最终的Bleu得分。 p n p_n pn表示n元组。

在这里插入图片描述
可以对一元组、二元组、三元组和四元组的得分进行求和,并除以4,然后乘以一个简短惩罚(BP),就可以当成是最终的Bleu得分。

在这里插入图片描述
BP的计算公式如上,如果MT结果长度大于人工翻译的程度,那么就没有惩罚,否则要考虑惩罚。

注意力模型直观理解

上面我们介绍的都是Encoder-Decoder框架解决机器翻译问题,而注意力模型是这个模型的一个改进。

在这里插入图片描述
假设我们有一个很长的法语句子,我们想让网络中绿色的编码器做的是读取并记住整个句子,对于紫色网络,解码网络,来生成英语翻译。

在这里插入图片描述
然而人类翻译句子的方法,并不是先读整个法语句子,并且记住整个句子,然后再返回一整个句子。
而是先读一部分,然后翻译出一部分。
在这里插入图片描述
上面这个模型对于短句子表现不错,但是对于超过30个单词的长句子,表现就开始下降了。
在这里插入图片描述
上图蓝线是普通的RNN模型,而绿线是我们要学习的注意力模型的表现。

Neural Machine Translation by Jointly Learning to Align and Translate

下面举例来说明注意力模型的思想。
在这里插入图片描述

假设有一个法语句子,然后我们使用双向的RNN计算每个单词的特征集(编码),

在这里插入图片描述
我们用另一个RNN来生成翻译的单词,假设第一个单词我们想生成Jane。
如果人类进行翻译的时候,会看法语句子jane附近的几个单词,但不会一直看到句尾,注意力模型模拟了这个过程。

我们引入一个注意力权重,用 α \alpha α来表示。

在这里插入图片描述
在生成第一个单词的这一步中 α < 1 , 1 > , α < 1 , 2 > , α < 1 , 3 > \alpha^{<1,1>},\alpha^{<1,2>},\alpha^{<1,3>} α<1,1>,α<1,2>,α<1,3>表示生成第一个单词,要看的这三个法文单词的注意力权重。

然后得到上下文c,传入RNN生成第一个英文单词。

在这里插入图片描述
在生成第二个单词时,同样要考虑附近的几个单词,不过注意力权重不一样,并且生成的第一个单词jane会作为输入。

在这里插入图片描述
同理生成第三个单词也是一样。

注意力模型

上节我们看到注意力模型如何让一个神经网络只注意到一部分的输入句子,就像人类进行翻译一样。

下面用公式来表达。
在这里插入图片描述
这里用 a < t > a^{<t>} a<t>来表示两个方向上的激活值。用 t ′ t^{\prime} t来索引法语单词。
在这里插入图片描述
每个单词的注意力权重之和为1,上下文c的计算就是这些权重乘以两个方向的激活值之和。

α < t , t ′ > \alpha^{<t,t^{\prime}>} α<t,t>表示 y < t > y^{<t>} y<t>应该对 a < t ′ > a^{<t^{\prime}>} a<t>的注意力大小。

上面就是生成第一个单词的公式。
下面来看一下如何定义注意力权重大小。

在这里插入图片描述
这里用到了softmax使得权重之和为1,那上面的 e e e是如何计算的呢。我们用一个小的神经网络来计算,输入是上一步的状态和特征。

在这里插入图片描述
这个算法的缺点是时间复杂度是 O ( n 2 ) O(n^2) O(n2)

好在机器翻译应用中,输入句子和输出句子都不会太长,这一点是可以接受的。

语音识别

本节来看一下seq2seq模型是如何应用到语音识别上面的。
在这里插入图片描述

语音识别就是给定音频片段x,来生成文本y。

通过深度学习,可以建立端到端的语音识别系统,这就需要大量的训练数据。

一般至少需要300小时的训练数据,包含语音和对应的文本。
在学术界通常用3000h的训练数据,而商业应用训练数据更多,有的有10万小时。

那么如何建立语音识别系统呢。

在这里插入图片描述
可以用注意力模型来做,横轴是不同时间帧上的音频。

在这里插入图片描述
还有一种方法是CTC损失函数,通常输入的时间步数量是远远大于输出的时间步数量的。

在这里插入图片描述

它允许输出这样的序列,这种序列也被当成是正确的。
CTC损失函数的一个基本规则是将空白符之间重复的字符折叠起来。上面用"_"来表示空白符。

触发字检测

触发字(唤醒词)检测应用十分广泛。

在这里插入图片描述
唤醒词通常是某个单词,比如hey siri。
在这里插入图片描述
假设上图蓝线标出的部分是唤醒词部分,那么标记训练集的时候,可以把此处标记为1,其他地方标记为0,这里有两个地方出现了唤醒词。

这种标记方式能在RNN上运行的不错。不过缺点是0的数量比1的数量多太多了。

优化方法是可以在单个时间点上输出多个1,这样可以稍微增加1的数量。

在这里插入图片描述

参考

  1. 吴恩达深度学习 专项课程
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐