深度学习(DL)(三) — 探析
介绍
假设您要输入一个法语句子,如Jane visite I'Afrique Septembre
,并且要将其翻译成英语句子,Jane is visiting Africa in September
。我们使用RNN
,这可能是GRU
或LSTM
,一次一个单词地输入法语单词。在获取输入序列后,RNN
会输出一个表示输入句子的向量。之后,您可以构建一个解码器网络。编码器网络的编码输出作为输入,然后可以训练一次一个单词地输出翻译。最后,识别出序列的结尾和解码器停止的句子标记,这样它们在使用语言模型合成文本时保持在之前的序列中。深度学习最显著的成果之一是模型有效性。给定足够多的法语和英语句子对,如果你训练一个模型来输入法语句子并输出相应的英语翻译,这很有效。这个模型只使用一个编码器网络,找到输入法语句子的编码,然后使用一个解码器网络生成相应的英语翻译。
序列->序列
机器翻译模型如下所示,我将使用两种不同的颜色,绿色和紫色,分别表示绿色的编码器网络和紫色的解码器网络。您会注意到,解码器网络看起来与上面的语言模型几乎完全相同。因此,机器翻译模型与语言模型非常相似,只是它不是从全零向量开始,而是有一个编码器网络,可以找出输入句子的一些表示,它获取该输入句子,并从输入句子的表示而不是全零的表示开始解码网络。所以,这就是将其称为条件语言模型的原因,它不是对任何句子的概率进行建模,而是对输出英语翻译的概率进行建模,条件是输入一些法语句子。例如,翻译为“Jane is visite l'Afrique en septembre
”的概率是多少,但输入的法语句子的条件是“Jane visite l'Afrique en septembre
”。这实际上是英语句子以输入的法语句子为条件的概率,这就是为什么它是一个条件语言模型。如果想应用此模型将句子从法语翻译成英语,给定这个输入的法语句子,该模型会告诉您相应的英语翻译存在差异的概率。Jane visite l'Afrique en septembre
”。并且,不希望随机抽样输出。如果从这个分布中抽取单词,给定Jane is visite l'Afrique en septembre
”。但是,也许另一次你会得到不同的翻译,这听起来有点别扭,但不是一个糟糕的翻译,只是不是最好的。当使用这个模型进行机器翻译时,你并不是从这个分布中随机抽样。相反,你想要的是找到最大化条件概率的英语句子Jane is
”作为前两个单词,因为“going
”是一个更常见的英语单词,那么在法语输入的情况下,“Jane is going
”的概率实际上可能高于在法语句子的情况下“Jane is visit
”的概率。如果最大化前三个单词的概率来选择第三个单词,那么最终可能会选择第二个选项。但是,这最终会导致句子不太理想,根据该模型对10,000
个单词,你正在考虑翻译长度不超过10
个单词,那么就有10
个单词。从词汇量中挑选单词,字典大小为10,000
个单词。这是一个巨大句子空间,不可能对它们全部进行评级,这就是为什么最常见的做法是使用近似搜索算法。近似搜索算法的作用是选择使条件概率最大化的句子
集束搜索
集束搜索(Beam Search
)算法是一种启发式搜索算法,主要用于处理解空间较大的问题,尤其在自然语言处理(NLP
)领域的序列生成任务中,如机器翻译、文本摘要和语音识别等。让我们使用法语句子“Jane, visite l'Afrique en Septembre
”的运行示例尝试集束搜索。希望翻译成“Jane, visits Africa in September
”。集束搜索要做的第一件事是选择英语翻译的第一个单词输出。这里列出了10,000
个单词到词汇表中。为了简化问题,将忽略大写。把所有单词都用小写字母列出来。在集束搜索(Beam Search
)的第一步中,使用这个网络片段,编码器用绿色表示,解码器用紫色表示,来评估第一个单词的概率。给定输入句子Beam Search
)则可以考虑多种替代方案。集束搜索(Beam Search
)算法有一个参数称为Beam Search
)会同时考虑三种可能性。假设对第一个单词的不同选择评估这个概率,发现Jane
和September
是英语输出中第一个单词最有可能的三种可能性。集束搜索(Beam Search
)会尝试这三个单词的信息隐藏在计算机内存中,如果集束宽度参数的设置不同,10
个选项,而不是3
个。为了执行集束搜索(Beam Search
)的第一步,需要做的是将输入的法语句子通过编码器网络运行,这是一个总共10,000
种可能性的softmax
输出。然后将获取这10,000
个可能的输出,并将其中的前三个输出保存在内存中。集束搜索(Beam Search
)的第二步。在选择了in、Jane
和September
作为第一个单词最有可能的三个选项之后,集束搜索(Beam Search
)现在要做的是,针对这三个选项中的每一个,考虑第二个单词应该是什么,所以在“in
”之后,第二个单词可能是“a
”,可能是September
,列表中有visit
,然后一直到z
,最后一个单词是zulu
。为了评估第二个单词的概率,它将使用此神经网络片段,其中绿色的是coder
,对于解码器部分,解码器首先输出in
”。然后它将输出是in
”,这个网络片段可用于评估给定输入法语句子的第二个单词的概率,以及翻译的第一个单词是否是单词“in
”。现在请注意,我们最终关心的是在这个第二步的集束搜索(Beam Search
)中,找到最有可能的第一个单词和第二个单词的配对,而不仅仅是第二个单词,其中最有可能的是第一个单词和第二个单词的配对,而最有可能的是条件概率规则。这可以表示为in
”、“Jane
”和“September
”,您保存了这个概率,那么您可以将它们乘以第二个概率以获得第一个单词和第二个单词的概率。所以现在你已经看到了如果第一个单词是“in
”,你如何评估第二个单词的概率。一开始是“Jane
”。句子可以是“Jane a
”、“Jane Aaron
”,等等,直到“Jane is
”、“Jane visits
”等等。你会在神经网络片段中使用它,在这里你会硬连线,Jane
。所以第一个单词Jane
,那么网络片段就可以告诉您第二个单词的概率。假设第一个单词是“Jane
”。与上述相同,September
执行相同的操作,从a
到Zulu
的所有单词,并使用这个网络片段。第一个单词是否是September
。第二个单词最有可能的选项是什么。对于第二步的集束搜索(Beam Search
),继续使用10,000
个单词,最终会考虑30,000
个选项,然后选择前三个。因此,经过缩减,这30,000
个可能性再次减少到3
,集束宽度再次四舍五入,假设30,000
个选项中最有可能的是September
,如果集束搜索(Beam Search
)确定最有可能的选择是第一个和第二个单词是in September、Jane is
或Jane visits
。那么它现在拒绝 September
作为输出英语翻译的第一个单词的候选,现在只剩下两个单词的可能性,但仍然Beam Search
)的第三步。由于30,000
个选项。不要实例化30,000
个网络副本或三个网络副本来快速地评估该softmax
输出的10,000
个可能的输出,假设前两个单词最有可能的选择是in September、Jane is 和 Jane visits
,对于这些单词对,我们应该在计算机内存中保存in September a?In September Aaron?
一直到in September Zulu
,为了评估第三个单词的可能选择,可以使用这个网络片段,其中将第一个单词硬连线为第二个单词September
。因此,这个网络片段允许您评估第三个单词的概率,给定输入法语句子in September
和英语输出。然后对第二个片段执行相同的操作。就像这样。对Jane visits
执行相同的操作,集束搜索(Beam Search
)将再次选择前三个可能,可能是September
。Jane
是可能的结果,或者Jane is visiting
是可能的,或者Jane visits Africa
是可能的,这是前三个词,然后进入第四步,即定向搜索,再加一个词,然后继续。这个过程的结果是,希望每次添加一个词,定向搜索将决定这一点。Jane visits Africa in September
将在句子结尾符号处终止。对于三个定向搜索一次考虑三种可能性。注意,如果定向宽度等于1
,那么本质上就变成了贪婪搜索算法,但同时考虑多种可能性,比如说三个、十个或其他数字,定向搜索通常会找到比贪婪搜索更好的输出句子。
集束搜索以最大化1
的数字,将许多小于1
的数字相乘会得到一个很小的数字,对于计算机中浮点表示来说,这个数字太小,无法准确存储。在实践中,不会最大化这个乘积,而是取对数,如果你在那里插入一个对数,那么乘积的对数就变成了对数的总和,最大化这个对数概率的总和应该会在选择最可能的句子给你相同的结果(1
的数字来估计这个句子的概率。如果你将小于1
的数字的对数相乘,你最终会得到一个较小的概率。这个目标函数有一个不良影响,它可能倾向于选择非常短的翻译输出,因为短句子的概率只是通过乘以这些数字中小于1
的数,乘积不会那么小。同样的事情也适用于这种情况,概率的对数总是小于或等于1
,对数的范围是这样的,所以加在一起的项越多,这个对数就越负。还有另一个改变算法的方法,那就是不要用这个作为最大化的目标。根据翻译中的单词数量进行归一化,这样就可以取每个单词概率对数的平均值,这确实可以显著降低输出较长翻译的惩罚。在实践中,作为一种启发式方法,而不是用
假设当你在学习到的RNN
模型和翻译模型上运行定向搜索时,它最终会得到这样的翻译Jane visits Africa in September
,这是法语的一个更糟糕的翻译。它改变了含义,所以这不是一个好的翻译。你的模型有两个主要组成部分。一个是神经网络模型,即序列到序列模型(RNN
)。它实际上是一个编码器和一个解码器。你有定向搜索算法,定向宽度为RNN
还是神经网络的问题,还是定向搜索算法的问题?但就像获得更多训练数据可能无法达到想要的性能水平一样。同样地,增加束宽可能无法让您达到想要的目标。但如何改进搜索算法?如何将问题分解并找出利用时间的方法。现在,RNN
,神经网络,编码器和解码器。例如,对于一个句子,插入Jane visits Africa in September
。现在最有用的事情就是使用这个模型计算RNN
模型计算RNN
或集束搜索算法中存在错误。计算1
中,RNN
模型输出的RNN
。定向搜索的工作是找到一个使该参数最大的2
中,RNN
,
机器翻译面临的挑战是,给定一个法语句子,会有多个英语翻译与该法语句子表现的一样好。如果有多个一样好的翻译结果,如何评估机器翻译系统呢?这不同于图像识别,后者只有一个正确结果。你只需测量准确度。如果有多个一样好的结果,你如何测量准确度?传统方法是通过BLEU
分数来完成的。假设有一个法语句子Le chat est sur le tapis
。你获得了一个人工生成的翻译,the cat is on the mat
。但是这个句子有多个不错的翻译。所以不同的人可能会把它翻译成:there is a cat on the mat
。这两个都是对法语句子的完美翻译。BLEU
分数的作用是,给定一个机器翻译,它允许您自动计算一个分数来衡量机器翻译的好坏。只要机器生翻译非常接近人类提供的参考,它就会得到一个很高的BLEU
分数。BLEU
代表双语评估。虽然可以让人类评估者评估机器翻译系统,但BLEU
分数可以替代让人类评估机器翻译系统的每个输出。所以BLEU
分数是Kishore Papineni、Salim Roukos、Todd Ward
和Wei-Jing Zhu
的功劳。这篇论文具有很高的影响力。查看机器生成的输出,看看它生成的单词类型是否出现在至少有一个人工生成的参考文献中。这些人工生成的参考文献将作为开发集或测试集的一部分被提供。现在,让我们看一个有点极端的例子。假设机器翻译系统简称机器翻译MT
。因此,机器翻译输出是the the the the the the the
。这显然是一个非常糟糕的翻译。衡量机器翻译输出好坏的一种方法是查看输出中的每个单词,看看它是否出现在参考文献中。这将被称为机器翻译输出的精度。在这种情况下,机器翻译输出中有7
个单词都出现在参考文献1
或参考文献2
中,单词the
出现在两个参考文献中。因此,其精度为7/7
。看起来精度很高。因此,精度测量是机器翻译输出中有多少单词也出现在参考文献中。这不是一个特别有效的测量方法。接下来将使用一种经过修改的精度测量方法,我们将只给每个单词在参考句子中出现的最大次数的信用。在参考文献1
中,单词the
出现了2
次。在参考文献2
中,单词the
只出现了1
次。因此单词the
最多获得两次信用。使用经过修改的精度,它在7
个单词中得到2
分。这里的分母是单词the
在总共7
个单词中出现的次数。分子是单词出现的次数2
,即2/7
。我们截取这个计数,取最大值,或者将这个计数截取为 2
。这样我们就得到了修改后的精度测量。到目前为止,我们一直在孤立地查看单词。BLEU
分数中,不想只查看孤立的单词。可能还想查看成对的单词。让我们根据二元组定义BLEU
分数。二元组指成对出现的单词。让我们看看如何使用二元组来定义BLEU
分数。The cat the cat on the mat
。这仍然不是很好的翻译,但可能比上一个好。所以这里,可能的二元组是cat
。然后是cat the
,这是另一个二元组。然后cat on
是下一个。然后是on the
,以及the mat
。这些是机器翻译输出中的二元组。让我们计算一下,每个二元组出现了多少次。The cat
出现了2
次,cat the
出现了1
次,其他的都只出现了1
次。最后,定义剪裁计数即1
或参考文献2
中出现的最大次数。cat
在任一参考文献中最多出现1
次。所以把这个剪裁计数为1
。这些是剪裁后的计数。我们取所有计数并进行剪裁,将它们减少到不超过该二元语法在至少一个参考文献中出现的次数。最后,我们修改后的二元语法精度将是剪裁后的计数之和。所以这是1、2、3、4
除以二元语法的总数。即2、3、4、5、6
,因此2/3
是二元组的修正精度。根据我们在单元组上所取得的成果,我们将计算单元组的修正精度定义为1
表示单元组。这表示对机器翻译输出中出现的单词的总和。这称该单元组的计数1
指的是单元组。如果机器翻译输出与参考文献1
或参考文献2
完全相同,那么所有这些值1.0
。有时即使翻译输出与参考文献不完全相同,也可以实现这一点。最后,把它们放在一起形成最终的BLEU
分数。n-gram
计算的BLEU
分数。也是基于n-gram
计算的修改后的精度。按照惯例,需要计算BLEU
分数定义为,然后是指数和线性运算,指数是单调递增的运算,然后用BP
惩罚来调整它。BP
代表简洁性惩罚。如果你输出非常短的翻译,更容易获得高精度。因为你输出的大多数单词可能都出现在参考文献中。但我们不想要非常短的翻译。因此,BP
是一个调整因子,它惩罚输出太短翻译的翻译系统。简洁性惩罚的公式如下图所示。如果机器翻译系统输出的内容比人工生成的参考文献更长,则它等于1
。
注意力模型
注意力思想是深度学习中最具影响力的思想之一。拿一个的很长的法语句子。编码器神经网络读入整个句子,并记住整个句子将其存储在此处的激活中。解码器网络负责生成英语翻译。Jane went to Africa last September and enjoyed the culture and met many wonderful people; she came back raving about how wonderful her trip was, and is tempting me to go too
。人类翻译这句话的方式不是先阅读整个法语句子,然后记住整个句子,最后从头开始翻译成英语句子。相反,人工翻译会阅读第一部分,可能生成部分翻译。查看第二部分,生成更多单词,查看更多单词,生成更多单词等等。你需要逐个处理句子,因为记住整个长句子真的很难。上面的编码器-解码器架构对短句非常有效,获得相对较高的Bleu
分数,但对于非常长的句子,可能超过30
或40
个单词,性能就会下降。注意力模型是由Dimitri、Bahdanau、Camcrun Cho
和Yoshua Bengio
提出的,尽管它是为机器翻译而开发的,但它也扩展到了许多其他应用领域。这确实是一篇非常有影响力的论文,我认为是深度学习文献中非常具有开创性的论文。让我们用一个短句来说明这一点,尽管这些想法更多地是为长句而开发的,但用一个更简单的例子来说明这些想法会更容易。Jane visite l'Afrique en Septembre
。假设使用双向RNN
,为每个输入单词计算一些特征集,双向RNN
的输出为RNN
计算句子中的单词以及每个位置周围的单词的特征集。我们将使用另一个RNN
来生成英语翻译。这里不再使用RNN
中的隐藏状态,所以使用Jane
,如Jane visits Africa in September
。当你试图生成这个第一个单词时,你应该关注输入法语句子的那一部分?似乎你应该主要关注第一个单词,还有其他几个附近的单词,但你不需要关注句子的末尾。注意力模型将计算一组注意力权重,使用1
表示当你生成第一个单词时投入多少的注意力。称作注意力权重,第二步,它们一起会生成第二个单词,然后进入第三步,
假设您有一个输入句子,使用双向RNN
、双向GRU
或双向LSTM
来计算每个单词的特征。对前向传播的第一个时间步。激活后向传播。激活前向传播,第二个时间步。激活后向等等。前向传播第五个时间步和后向传播第五个时间步。我们在这里有一个0,我们也可以有一个后向传播第六个作为全零的向量,实际上这是一个全零的因子。为了简化每个时间步的符号,即使您拥有从双向RNN
中的前向传播和后向传播计算出的特征。使用a^{RNN
,具状态 C
作为输入。如果您想用时间来索引它可以写一个1
。我们将在时间步1
处获得上下文,通常会删除上标,该上标将对RNN
序列,上下文向量作为输出,我们可以一次生成一个单词的翻译。我们还定义了如何根据这些注意力权重和输入句子的那些特征来计算上下文向量。所以剩下要做的就是如何计算这些注意力权重。softmax
方法来确保这些权重的总和为1
。对于1
。现在如何计算这些因子RNN
的隐藏状态,它会输出翻译,然后对于每个位置,每个单词查看它们的特征。
应用
语音识别
序列到序列模型最令人兴奋的发展之一是语音识别精确度的提高。有一个音频片段The
” 有“de
”和“e
”的发音,而Quick
有“ku
”和“wu
”、“ik
”、“k
”的发音,语言学家过去常常忽略这些基本的声音单位,并试图将语言分解为这些基本的声音单位。但语言学家过去常常假设,用这些称为音素的基本声音单位来记录音频是进行语音识别的最佳方式。但随着端到端深度学习的发展,发现音素表示不再是必要的。相反,你可以构建一个系统,输入音频片段并直接输出转录,而无需使用像这样的手工设计的表示。实现这一点的因素之一是使用更大的数据集。因此,语音识别的学术数据集为300
小时,在学术界,转录音频的3000
小时数据集被认为是合理的大小,许多研究论文都基于数千小时的数据集。但是,现在最好的商业系统是使用超过10,000
小时甚至有时超过100,000
小时的音频进行训练。它正在转向更大的音频数据集,转录CTC
进行语音识别。CTC
代表连接时间分类,由Alex Graves、Santiago Fernandes、Faustino Gomez
和Jürgen Schmidhuber
提出。想法是这样的。假设音频片段是说“敏捷的棕色狐狸”。我们将使用这样结构的神经网络,其输入RNN
的单向简单图,但在实践中,这通常是双向LSTM
和双向GRU
,通常是更深的模型。这里的时间步长数量非常大,在语音识别中,输入时间步长的数量通常比输出时间步长的数量大得多。例如,如果你有10
秒的音频,并且特征频率为100
赫兹,即每秒100
个样本,那么10
秒的音频片段最终将有1000
个输入。但输出可能没有1000
个字母。所以,你会怎么做?CTC
成本函数允许RNN
生成这样的输出,有一个特殊字符称为空白字符,我们将其写为下划线,th_eee___q
,然后可能是空格,CTC
成本函数的基本规则是折叠未被“空白”分隔的重复字符。使用这个下划线来表示特殊的空白字符,这与空格字符不同。通过折叠未被空格分隔的重复字符,它实际上将序列折叠为t、h、e
,然后是空格和q
。插入一堆空白字符,最终输出的文本记录仍然很短。这里的短语“the quick brown fox
”包括空格有19
个字符,较新的网络允许网络插入空格和重复字符而被强制超过一千个字符,并且仍然可以用这1000
个19
个字符的输出。Alex Grace
的这篇论文使用了这个想法来构建有效的语音识别系统。
触发词检测
随着语音识别的兴起,越来越多的设备可以通过语音唤醒,这些设备被称为触发词检测系统。那么让我们看看如何构建触发词系统。触发词系统的示例有Amazon Echo
,它可以通过Alexa
一词唤醒,百度DuerOS
驱动的设备可以通过短语xiaodunihao
唤醒,Apple Siri
可以通过hey,Siri
启动,Google Home可
以通过Okay,Google
唤醒。多亏了触发词检测,如果您的客厅里有Amazon Echo
,您可以走进客厅,只需说Alexa
,现在几点了?被Alexa
一词触发并进行语音查询。触发检测算法的文献仍在发展,因此对于触发词检测的最佳算法尚未达成广泛共识。现在有RNN
,获取一个音频片段,并计算频谱图特征。这会生成特征RNN
。剩下要做的就是定义目标标签Alexa
,那么在训练集中,您可以将该点之前的所有内容的目标标签设置为0
,然后将该点的目标标签设置为1
。稍后,触发词再次被说出来可以在此之后再次将目标标签设置为1
。这种RNN
标记方案可以发挥作用。这样做的一个小缺点是,它会创建一个非常不平衡的训练集,其中包含很多的 0
而不是1
。不是只设置一个时间步长输出1
,你可以让它连续输出几个1
,或者在固定的一段时间内输出几个1
,然后再恢复为0
。这样可以平衡1
和0
的比例。但如果这是在音频剪辑器中说出触发词时,那么紧接着,你可以将目标标签设置为1
,如果这是再次说出的触发词,那么紧接着就是你想要RNN
输出1
的时候。