16.1 基础模型
16.1.1 Sequence to sequence(seq2seq)
在机器解决翻译问题时,可以引入了一种新的解决翻译问题的模型,即为seq2seq模型。
如上图,seq2seq主要的模块有编码网络(encoder network)和解码网络(decoder network),两个网络都是RNN模型(可以是GRU或LSTM)。将需要翻译的句子输入(x)进编码网络后,会得到这个句子的特征向量;而这个特征向量会作为解码网络的输入,解码网络通过对特征向量的处理,得到输出(y),从而实现句子的翻译。
提出seq2seq模型的相关论文主要为:
Sequence to sequence learning with neural networks
Learning phrase representations using RNN encoder-decoder for statistical machine translation
16.1.2 编码网络和解码网络
以下内容摘自https://www.codercto.com/a/81490.html
Encoder-Decoder并不是一个具体的模型,更像是一类框架。encoder使用decoder进行训练,并且没有label(无监督)。损失函数中包含 实际输入 (actual input)和 重构输入(reconstructed input)之间的差异(delta)。一旦经过训练,encoder将给出输入的特征向量,解码器可以使用该特征重构输入。这种技术被用于非常多不同的应用中,比如翻译、生成模型(generative models)等。不过通常应用都不会重新构建原有的输入,而是 map/translate/associate 输入至特定的输出。比如把法语翻译成英语等。
16.1.3 seq2seq在图像描述领域的应用
该模型在图像描述有着比较好的表现,如上图,处理“猫坐在椅上”这一图像信息时,同之前的卷积神经网络的应用,将图片信息输入到CNN中(如AlexNet),但删除掉了softmax层,保留至最后的全连接层,这样全连接层就变成了一个含有图像信息的特征向量,再将该特征向量作为解码网络的输入,进行最后的解码翻译,描述出图片信息。
提出了seq2seq在图像描述领域的应用的论文主要有:
Deep captioning with multimodal recurrent neural networks
Show and tell:Neural image caption generator
Deep visual-semantic a alignments for generating image descripions
16.2 选择最可能的句子
16.2.1 语言模型和条件语言模型联系与区别
如上图,与之前的语言模型相对比,seq2seq的输入不为零向量,而是由输入x经过编码网络处理后得到的特征向量,但seq2seq的解码网络部分与传统的语言模型极为类似,故可认为语言模型与seq2seq对信息的处理上,只有输入向量上的不同,所以又称seq2seq对信息处理的模型为条件语言模型(或机器翻译模型)。传统的语言模型由于输入为零向量,所以最后生成的语句是随机的;而条件语言模型是在确定输入的条件下,生成最佳翻译语句,使该语句被翻译正确的概率最大。如下图
[图片上传失败...(image-7b5f4d-1607770539627)]
对于一句话,条件语言模型可能会生成许多不同的翻译,所以我们的目标就是在这些语句中,找到最优语句。
16.2.2 贪心搜索(greedy search)
[图片上传失败...(image-38570-1607770539627)]
为了找到最优语句,可用的方法有贪心搜索。贪心搜索上一个单词作为条件,通过上一个单词来搜索下一个单词的最佳翻译,力求把每个单词都翻译准确。例如上图,首先根据输入语句,找到第一个翻译的单词“Jane”,然后再找第二个单词“is”,再继续找第三个词“visiting”,以此类推。这也是其被命名为“贪心”的原因。但由于贪心搜索没有考虑到单词前后的联系,所以翻译效果并不好,由于该例中的第三个单词“going”比“visiting”更常见,所以模型很可能会地选择了“going”,而错失最佳翻译语句。同时,贪心搜索的运算速度也较慢。所以,贪心搜索并不是最佳的方法。
16.3 定向搜索
16.3.1 集束搜索(beam search)
贪心搜索每次是找出预测概率最大的1个单词,而集束搜索则是每次找出预测概率最大的B个单词。其中,B为集束宽,用以表示取概率最大的单词个数,可进行调节。在下图例子中,令B=3。
首先,先从含有10000个单词的词库中找出第一个单词被翻译的概率最大的B个预测单词。例如上面的例子中,计算第一个单词所有可能的翻译结果,并取概率最大的前三个,则预测得到的第一个单词为:in,jane,september。
然后,如上图,再分别以in,jane,september为条件,计算词库中每个单词作为预测第二个单词的概率,并取概率最大的前三个,作为第二个单词可能的翻译结果,得到:in september,jane is,jane visits。
此时,前两个单词的3种可能结果的概率可表示为:
16.3.2 集束搜索的下一步
如图,在之前进行了前两个单词的可能翻译结果的预测后,下一步再进行对第三个单词的预测。使用相同的方法,分别以in september,jane is,jane visits为条件,计算每个词汇表单词作为被翻译成第三个单词的概率。再从中选择概率最大的3个作为第三个单词的可能翻译结果,得到:in september jane,jane is visiting,jane visits africa。
此时,前三个单词的3种可能结果的概率可表示为:
之后单词的预测依此类推,最后得到整句话的最有可能的三种翻译结果,再选择其中概率最大的语句作为最后的翻译语句。
其中,当集束宽B设置为1时,集束搜索就变成了贪心搜索,B设置越大时,最后得到的翻译结果就会越准确。
16.4 改进定向搜索
长度归一化的推导过程:
前面所提到的计算概论公式如下图所示:
其乘积同时也可以表示为:
这些乘积其实是大量值都是远小于1的小数相乘而来的,进而得到一个更加小的数。当数量到达一定程度时,就会发生数值下溢,也就是数值太小了,导致电脑的浮点表示不能精确地储存。
因此在实践中,我们不会最大化这个乘积,而是取log值:对其进行如前面所说的分解,本质上即从乘积的log转变成了多个log的求和,而该式子就是在找求和的最大值,以此来得到一个更加稳定的算法,减少了误差。
因为log函数是对数函数,是严格的单调递增函数,所以最大化的log值和未进行log化的最大值是一样的,是同质的,如果一个参数能让两者中的一个增大,则另一个也会增大,所以使用对数和(log)比较多。
在上述的基础上还能进行一些改进,在很多的小数相乘的结果还是小数,在log函数中是为负数形式存在的,而且对于大量的小数相乘,会导致结果会不自然地倾向于简短的语句和结果(简短的语句短,乘的小数少,值就偏大),为此,进行了下列改进:
我们不再对结果进行最大化,而是进行归一化
(有时被叫做归一化的对数似然目标函数)
上式中进行了一个求平均的操作,其中Ty为输出句子的单词总数,避免对长度较长的输出的结果的训练的影响。
还有一种做法则为在Ty的值上再加一个指数a,也就是对Ty求a次幂,a常等于0.7
如果a = 1,则表示用完全长度进行归一化
如果a = 0,则相当于完全没有进行归一化
束算法步骤总结
(1)在进行束算法时,先计算出所设置的束宽下的所有的可能的句子长度
(2)然后对这些所有的可能,用前面说的归一化式子进行打分,取概率最大的几个句子
(3)最后挑选出得分最高的句子,即为结果。
如何选择束宽B
先进行各种情况的分析
1.如果束宽很大,所需要考虑的可能性会更多,也就可能会得到一个更好的结果,算法运行也会变得更慢,占用内存会更高。
2.如果束宽较小,结果可能会不是很好,考虑的选择减少了,但是运算速度更快,占用内存更少。
选择束宽需要区分商业产品以及科研的区别
在商业中,束宽一般较小,为10比较常见
在科研中,束宽较大,常用1000或者3000
吴恩达老师推荐使用BFS和DFS来进行束搜索,这样速度更快,但不能保证一定能搜到,课中也没有具体说明怎么使用,因为时间紧迫就不展开来讲。
BFS广度优先搜索
DFS深度优先搜索
介绍博客:https://blog.csdn.net/weixin_40953222/article/details/80544928
16.5定向搜索的误差分析
由于束搜索通常取到的是有限个输出中的较优解,而不能保证其一定是所有输出的最优解,为了查明误差我们需要进行误差分析
对束搜索进行误差分析的例子;
下列三行分别对应需要翻译的句子,人类的翻译的结果,机器翻译的结果,以及在旁边有对应的标注。
训练模型主要有两部分组成,一个是神经网络模型(RNN),另一个是束搜索算法,我们的误差检验主要是找出错误主要来自这两个部分中的哪一个。
(注意,单纯的增大数据集,或者单纯的增大束宽,可能并不会达到预期结果,此时就需要进行误差分析,判断这是否值得花时间进行解决)
对于上述例子,我们使用这两个部分,计算出P(y|x),以及P(y
我们来进行解释:
(1)*RNN*模型的输出结果P(y|x) > 束搜索算法的结果P(y
(2)*RNN*模型的输出结果P(y|x) <= 束搜索算法的结果P(y
注意:如果你用了某种长度归一化,那么你要做的就不是比较这两种可能性大小,而是比较长度归一化后的最优化目标函数值。
误差分析过程总结:
(1)先遍历开发集,然后在其中找出算法产生的错误(比较两者大小),列出表格
(2)分析所得结果,得出束搜索算法和*RNN*模型出错的比例是多少,哪个比例更大,哪个实际出错概率越大
16.6 Bleu 得分(选修)
BLEU得分定义;
对于类似于翻译等不是只有唯一的结果时,当有多个同样好的输出时,如何进行评估成为了难题,而BLEU则能够解决这个问题。
BLEU进行的工作为,给定一个机器生成的翻译,它能够自动地计算一个分数来衡量机器翻译的好坏
只要这个机器生成的翻译与任何一个人工翻译的结果足够接近,那么它就会得到一个高的*BLEU*分数。
*BLEU*代表*bilingual evaluation understudy* (双语评估替补)
其得分就相当于一个侯补者,它可以代替人类来评估机器翻译的每一个输出结果。
BLEU得分的具体做法:
衡量机器翻译输出质量的方法之一是观察输出结果的每一个词看其是否出现在参考中,这被称做是机器翻译的精确度,并且在这个基础上进行改良,还要把每一个单词的记分上限定为它在参考句子中出现的最多次数。
我们以一个例子进行说明:
假如给你一个法语句子:*Le chat est sur le tapis*,然后给你一个这个句子的人工翻译作参考1:*The cat is on the mat*和参考2:*There is a cat on the mat*
我们假设机器翻译系统缩写为*MT*。机器翻译 (*MT*)的输出是:*the the the the the the the*。这显然是一个十分糟糕的翻译。
这个情况下机器翻译输出了七个单词并且这七个词中的每一个都出现在了参考1或是参考2。单词*the*在两个参考中都出现了,。因此这个输出的精确度就是7/7,可以看出这里的误差非常大。
而如果我们进行限定参考出现次数时,在参考1中,单词*the*出现了两次,在参考2中,单词*the*只出现了一次。而2比1大,所以我们会说,单词*the*的得分上限为2。有了这个改良后的精确度,我们就说,这个输出句子的得分为2/7,因为在7个词中,我们最多只能给它2分。我们在达到上限时截断计数,这就是改良后的精确度评估。
二元词组的BLEU;
在*BLEU*得分中,不仅仅考虑单个的单词,也许要考虑成对的单词,所以就有了二元词组(*bigrams*)的*BLEU*得分。
*bigram*的意思就是相邻的两个单词。
用二元词组来定义*BLEU*得分具体做法:
1.二元词组的结合是和一元词组的结果最终合成最后的BLEU得分。
我们还是以前面的例子进行说明:
假定机器翻译输出翻译:*The cat the cat on the mat*,然后我们依此地提取出两个词的组合(不分大小写),有重复的就跳过。然后和前面一样,对参照1和2进行比较,找出所有二元词组中出现的次数,注意我们也需要定义一下截取计数,即设置上限值。这个上限值为二元词组出现在参考1或2中的最大次数,例如*the cat*在两个参考中最多出现一次,所以我将截取它的计数为1,(不同的词组设置的上限是不同的)。我们把所有的这些计数都截取了一遍,实际上就是将它们降低使之不大于二元词组出现在参考中的次数。最后,修改后的二元词组的精确度就是截取计数的之和。因此那就是4除以二元词组的总个数,也就是6。因此是4/6也就是2/3为二元词组改良后的精确度。
n元词组精确度;
我们进行公式化归纳:
对于一元词组:
1.将改良后的一元词组精确度定义为P1,P代表的是精确度。这里的下标1的意思是一元词组。
2.分子:为一元词组之和,也就是对机器翻译结果中出现在参考1或2最大次数之和。,
3.分母:机器翻译输出的一元词组出现的次数之和
对于n元词组:
1.Pn,这里的下标n的意思是n元词组,表示n元词组的精度。
2.分子:机器翻译输出的cout_clip之和,也就是n元词组出现在参考1或2中的最大次数的和
3.分母:n元词组出现的次数之和
这个方法都能够让你衡量机器翻译输出中与参考相似重复的程度。
另外,你能够确信如果机器翻译输出与参考1或是参考2完全一致的话,那么所有的这些p1,p2等等的值,都会等于1.0。
BP
最后将前面所说的所有东西进行组合:
Pn是n元组的项的*BLEU*得分,按照惯例,为了用一个值来表示最后的结果,需要计算P1到Pn,然后取平均值,然后乘方
按照惯例*BLEU*得分被定义为:
实际上还需要一个惩罚因子(BP)来进行上式的调整。
举例说明BP:
如果你输出了一个非常短的翻译,那么它会更容易得到一个高精确度。因为输出的大部分词可能都出现在参考之中,不过我们并不想要特别短的翻译结果。因此简短惩罚(*BP*)就是一个调整因子。它能够惩罚输出了太短翻译结果的翻译系统。
BP的公式:
如果你的机器翻译系统实际上输出了比人工翻译结果更长的翻译,那么它就等于1,其他情况如公式所述
16.7 注意力模型(Attention Model)直观理解
16.7.1 为什么需要AM?
给定一个很长的法语句子,在神经网络中,这个绿色的编码器做的是读整个句子,然后记忆整个句子,再在感知机中传递,而对于这个紫色的神经网络,即解码网络(the decoder network)将生成英文翻译。
对于人工翻译,一般是通过句子,一点一点地翻译,看一部分,翻译一部分。因为记忆整个的像这样的的句子是非常困难的。你在这个编码解码结构中,会看到它对于短句子效果非常好,于是它会有一个相对高的Bleu score,但是对于长句子而言,比如说大于30或者40词的句子,它的表现就会变差。Bleu评分随着单词数量变化,短的句子会难以翻译,因为很难得到所有词。对于长的句子,效果也不好,因为在神经网络中,记忆非常长句子是非常困难的。而注意力模型翻译得很像人类,一次翻译句子的一部分。
16.7.2 注意力模型举例
注意力模型源于论文: D., Cho, K., & Bengio, Y. (2014). Neural machine translation by jointly learning to align and translate. arXiv preprint arXiv:1409.0473.
模型源于机器翻译,但它也推广到了其他应用领域。
我们用一个句子举例说明一下,我们有一个很平常的句子:(法语)Jane visite l'Afrique en Septembre。假定我们使用使用一个双向的RNN(a bidirectional RNN)。我们要对单词做的就是,对于句子里的每五个单词,计算一个句子中单词的特征集,也有可能是周围的词,生成英文翻译。我们将使用另一个RNN生成英文翻译,为了避免混淆,用来表示RNN的隐藏状态(the hidden state in this RNN),不用,而是用。
注意力权重
我们希望这里第一个生成的单词将会是Jane,为了生成Jane visits Africa in September。当你尝试生成第一个词,应先看第一个单词,或它附近的词。所以注意力模型就会计算注意力权重,用来表示当你生成第一个词时你应该放多少注意力在这个第一块信息处。然后我们算第二个,这个叫注意力权重,告诉我们当你尝试去计算第一个词Jane时,我们应该花多少注意力在输入的第二个词上面。同理这里是,接下去也同理。这些将会告诉我们,我们应该花多少注意力在记号为的内容上。这就是RNN的一个单元,如何尝试生成第一个词的,这是RNN的其中一步。
对于RNN的第二步,我们将有一个新的隐藏状态,我们也会用一个新的注意力权值集,我们将用来告诉我们什么时候生成第二个词, 那么visits就是第二个标签。我们应该花多少注意力在输入的第一个法语词上。然后同理,接下去也同理,我们应该花多少注意力在visite词上,我们应该花多少注意在词l'Afique上面。我们第一个生成的词Jane也会输入到这里,于是就有了需要花注意力的上下文。第二步,这也是个输入,然后会一起生成第二个词,这会让我们来到第三步,这是输入,我们再有上下文,它取决于在不同的时间集上面的。这个告诉我们要花注意力在不同的法语的输入词上面。
直观来想就是RNN向前进一次生成一个词,在每一步直到最终生成可能是EOS。这些是注意力权重,即告诉你,当你尝试生成第个英文词,它应该花多少注意力在第个法语词上面。当生成一个特定的英文词时,这允许它在每个时间步去看周围词距内的法语词要花多少注意力。
16.8 注意力模型
跟上面一样先假定有一个输入句子,并使用双向的RNN,或者双向的GRU或者双向的LSTM,去计算每个词的特征。(实际上GRU和LSTM经常应用于这个,可能LSTM更经常一点。)
16.8.1 符号表示
: 输入的法语单词
: 输出的英文翻译
: 用来表示时间步上的特征向量
: 用来索引法语句子里面的词
: 用来生成翻译
: 注意力参数,即应该花在上注意力的数量
满足非负的条件,是0或正数,如果对求和,每一个固定的值,这些加起来等于1
: 上下文,取决于
16.8.2 计算注意力权重
=应该花费在上注意力的数量
上式可用来计算在此之前我们要先计算,先使用softmax,确保对求和时对于每一个固定的值,加起来等于1。
计算的一种方式是用下面这样的小的神经网络:
: 上一个deocder翻译状态的值
: 特征提取模型encoder中本状态的激活值
直观理解,应取决于这两个量,由于不知道具体函数关系,需要通过一个小的神经网络学习对应的具体的函数关系式。
16.8.2 算法缺点
它要花费三次方的时间,如果你有个输入单词和个输出单词,注意力参数的总数就会是。但是在机器翻译的应用上,输入和输出的句子一般不会太长,可能三次方的消耗是可以接受,但也有很多研究工作,尝试去减少这样的消耗。
16.8.3 注意力模型其他应用
注意力模型在深度学习各个领域被广泛使用,包括人体识别、图像处理、语音识别、自然语言处理等
了解更多可读博客:注意力机制最新综述解读
16.9 语音识别
16.9.1 语音识别问题
假如现在有一个音频片段,你的任务是自动地生成文本。
假如这个音频片段的内容是:"the quick brown fox"(敏捷的棕色狐狸),我们希望一个语音识别算法,通过输入这段音频,然后输出音频的文本内容。
音频数据的常见预处理步骤
考虑到人的耳朵并不会处理声音的原始波形,而是通过一种特殊的物理结构来测量这些,不同频率和强度的声波。音频数据的常见预处理步骤,就是运行这个原始的音频片段,然后生成一个声谱图(spectrogram)。横轴是时间,纵轴是声音的频率,而图中不同的颜色,显示了声波能量的大小,也就是在不同的时间和频率上这些声音有多大。通过这样的声谱图,或者伪空白输出(the false blank outputs),也经常应用于预处理步骤,人耳所做的计算和这个预处理过程非常相似。
过去语音识别系统是用音位来构建的,也就是人工设计的基本单元,不过在end-to-end模型中,可以构建一个系统,通过向系统中输入音频片段,然后直接输出音频的文本,而不需要使用这种人工设计的表示方法。使这种方法成为可能的一件事就是用一个很大的数据集,在文本音频数据集中同时包含和,通过深度学习算法大大推进了语音识别的进程。
16.9.2 注意力模型建立语音识别系统
在输入音频的不同时间帧上,可以用一个注意力模型,来输出文本描述,如"the quick brown fox",或者其他语音内容。
16.9.3 CTC损失函数建立语音识别系统
CTC(Connectionist Temporal Classification)算法思想如下:
假设语音片段内容是某人说:"the quick brown fox",我们使用一个新的网络,输入和输出的数量都是一样的,这里画的只是一个简单的单向RNN结构。在实际中,它有可能是双向的LSTM结构,或者双向的GIU结构,并且通常是很深的模型。
注意,这里时间步的数量非常地大。在语音识别中,通常输入的时间步数量要比输出的时间步的数量多出很多。举个例子,比如你有一段10秒的音频,并且特征(features)是100赫兹的,即每秒有100个样本,于是这段10秒的音频片段就会有1000个输入,就是简单地用100赫兹乘上10秒。所以有1000个输入,但可能你的输出就没有1000个字符了。这时要怎么办呢?
CTC损失函数允许RNN生成这样的输出(上图蓝字):ttt,下划线表示空白符,这句话开头的音可表示为h_eee_ _ ,然后这里可能有个空格,之后是 _ qqq_,这样的输出也被看做是正确的输出。下面这段输出对应的是"the q"。
CTC损失函数的一个基本规则是将空白符之间的重复的字符折叠起来,这里用下划线来表示这个特殊的空白符(a special blank character)和空格(the space character)是不一样的。所以the和quick之间有一个空格符,所以我要输出一个空格,通过把用空白符所分割的重复的字符折叠起来,然后我们就可以把这段序列折叠成"the q"。这样一来你的神经网络因为有很多这种重复的字符,和很多插入在其中的空白符(blank characters),所以最后我们得到的文本会短上很多。于是这句"the quick brown fox"包括空格一共有19个字符,在这样的情况下,通过允许神经网络有重复的字符和插入空白符使得它能强制输出1000个字符,甚至你可以输出1000个值来表示这段19个字符长的输出。
16.10 触发字检测
16.10.1 触发字系统举例
触发字检测系统:用你的声音来唤醒设备。
举例:Amazon Echo(Alexa)、Baidu DuerOS(xiaodunihao)、Apple Siri(Hey Siri)、Google Home(Okay Google)
16.10.2 常用算法
现在有这样一个RNN结构,我们要把一个音频片段计算出它的声谱图特征,得到特征向量X1,X2,X3......然后把它放到RNN中,最后要定义我们的目标标签y.假设下图音频片段中蓝色那点为触发字,那我们可以把这点之前,在训练集中的目标标签都设为0,这点之后目标标签设为1.假如在一段时间之后触发字又被说了一次,就可以再次在这点之后把目标标签设为1.该算法一个明显的缺点就是它构建了一个很不平衡的训练集。0比1多太多了。解决方法:可以在输出1之后,输出0的时间步之前多次输出1,稍微提高1的比例。
16.11 结论和致谢
16.11.1深度学习用途
深度学习是一种超能力,可以让计算机拥有“视觉”,可以让计算机自己合成小说,或者合成音乐,可以让计算机将一种语言翻译成另一种,也可以对放射影像进行定位,然后进行医疗诊断,或者构建自动驾驶系统,