吴恩达深度学习第五章序列模型——第三周序列模型和注意力机制

序列模型和注意力机制

Seq2Seq 模型

Seq2Seq(Sequence-to-Sequence)模型可以应用于机器翻译、语音识别等各类序列到序列的转换问题。一个 Seq2Seq 模型包含编码器(Encoder)解码器(Decoder)两部分,它们一般是两个不一样的 RNN。以下图所示,将编码器的输出做为解码器的输入,由解码器负责输出正确的翻译结果。web

Seq2Seq

提出 Seq2Seq 模型的相关论文:算法

这种编码器-解码器的结构也能够用于图像描述(Image captioning)。将 AlexNet 做为编码器,最后一层的 Softmax 换成一个 RNN 做为解码器,网络的输出序列就是对图像的一个描述。api

Image-captioning

图像描述的相关论文:网络

选择最可能的句子

机器翻译用到的模型与语言模型类似,只是用编码器的输出做为解码器第一个时间步的输入(而非 0)。所以机器翻译的过程其实至关于创建一个条件语言模型。函数

因为解码器进行随机采样过程,输出的翻译结果可能有好有坏。所以须要找到能使条件几率最大化的翻译,即arg \ max_{y^{<1>}, ..., y^{<T_y>}}P(y^{<1>}, ..., y^{<T_y>} | x)学习

鉴于贪心搜索算法获得的结果显然难以不符合上述要求,解决此问题最常使用的算法是集束搜索(Beam Search)优化

集束搜索

集束搜索(Beam Search)会考虑每一个时间步多个可能的选择。设定一个集束宽(Beam Width)BB,表明了解码器中每一个时间步的预选单词数量。例如 B=3,则将第一个时间步最可能的三个预选单词及其几率值P(y^{<1>}|x)保存到计算机内存,以待后续使用。编码

Beam-search

第二步中,分别将三个预选词做为第二个时间步的输入,获得 P(\hat y^{<2>}|x, \hat y^{<1>})lua

由于咱们须要的实际上是第一个和第二个单词对(而非只有第二个单词)有着最大几率,所以根据条件几率公式,有:P(\hat y^{<1>}, \hat y^{<2>}|x) = P(\hat y^{<1>}|x) P(\hat y^{<2>}|x, \hat y^{<1>})翻译

设词典中有 N 个词,则当B=3 时,有 3∗N个 P(\hat y^{<1>}, \hat y^{<2>}|x)。仍然取其中几率值最大的 3 个,做为对应第一个词条件下的第二个词的预选词。以此类推,最后输出一个最优的结果,即结果符合公式:

arg \ max \prod^{T_y}_{t=1} P(\hat y^{<t>} | x, \hat y^{<1>}, ..., \hat y^{<t-1>})

能够看到,当 B=1时,集束搜索就变为贪心搜索。

优化:长度标准化

长度标准化(Length Normalization)是对集束搜索算法的优化方式。对于公式

arg \ max \prod^{T_y}_{t=1} P(\hat y^{<t>} | x, \hat y^{<1>}, ..., \hat y^{<t-1>})

当多个小于 1 的几率值相乘后,会形成数值下溢(Numerical Underflow),即获得的结果将会是一个电脑不能精确表示的极小浮点数。所以,咱们会取 log值,并进行标准化:

arg \ max \frac{1}{T_y^{\alpha}} \sum^{T_y}_{t=1} logP(\hat y^{<t>} | x, \hat y^{<1>}, ..., \hat y^{<t-1>})

其中,Ty是翻译结果的单词数量,α是一个须要根据实际状况进行调节的超参数。标准化用于减小对输出长的结果的惩罚(由于翻译结果通常没有长度限制)。

关于集束宽 B 的取值,较大的 B 值意味着可能更好的结果和巨大的计算成本;而较小的 B 值表明较小的计算成本和可能表现较差的结果。一般来讲,B 能够取一个 10 如下的值。

和 BFS、DFS 等精确的查找算法相比,集束搜索算法运行速度更快,可是不能保证必定找到 arg max 准确的最大值。

偏差分析

集束搜索是一种启发式搜索算法,其输出结果不总为最优。当结合 Seq2Seq 模型和集束搜索算法所构建的系统出错(没有输出最佳翻译结果)时,咱们经过偏差分析来分析错误出如今 RNN 模型仍是集束搜索算法中。

例如,对于下述两个由人工和算法获得的翻译结果:

 

Human:\ Jane\ visits\ Africa\ in\ September.\ (y^*)

Algorithm:\ Jane\ visited\ Africa\ last\ September.\ (y^*)

将翻译中没有太大差异的前三个单词做为解码器前三个时间步的输入,获得第四个时间步的条件几率P(y^* | x)和 P(\hat y | x),比较其大小并分析:

  • 若是P(y^* | x)>P(\hat y | x),说明是集束搜索算法出现错误,没有选择到几率最大的词;
  • 若是 P(y^* | x)P(\hat y | x),说明是 RNN 模型的效果不佳,预测的第四个词为“in”的几率小于“last”。

创建一个以下图所示的表格,记录对每个错误的分析,有助于判断错误出如今 RNN 模型仍是集束搜索算法中。若是错误出如今集束搜索算法中,能够考虑增大集束宽 BB;不然,须要进一步分析,看是须要正则化、更多数据或是尝试一个不一样的网络结构。

Error-analysis-process

Bleu 得分

Bleu(Bilingual Evaluation Understudy)得分用于评估机器翻译的质量,其思想是机器翻译的结果越接近于人工翻译,则评分越高。

最原始的 Bleu 将机器翻译结果中每一个单词在人工翻译中出现的次数做为分子,机器翻译结果总词数做为分母获得。可是容易出现错误,例如,机器翻译结果单纯为某个在人工翻译结果中出现的单词的重复,则按照上述方法获得的 Bleu 为 1,显然有误。改进的方法是将每一个单词在人工翻译结果中出现的次数做为分子,在机器翻译结果中出现的次数做为分母。

Bleu-score-on-unigram

上述方法是以单个词为单位进行统计,以单个词为单位的集合称为unigram(一元组)。而以成对的词为单位的集合称为bigram(二元组)。对每一个二元组,能够统计其在机器翻译结果(countcount)和人工翻译结果(countclipcountclip)出现的次数,计算 Bleu 得分。

以此类推,以 n 个单词为单位的集合称为n-gram(多元组),对应的 Blue(即翻译精确度)得分计算公式为:

 

p_n = \frac{\sum_{\text{n-gram} \in \hat y}count_{clip}(\text{n-gram})}{\sum_{\text{n-gram} \in \hat y}count(\text{n-gram})}

对 N 个 pn进行几何加权平均获得:

p_{ave} = exp(\frac{1}{N}\sum^N_{i=1}log^{p_n})

有一个问题是,当机器翻译结果短于人工翻译结果时,比较容易能获得更大的精确度分值,由于输出的大部分词可能都出如今人工翻译结果中。改进的方法是设置一个最佳匹配长度(Best Match Length),若是机器翻译的结果短于该最佳匹配长度,则须要接受简短惩罚(Brevity Penalty,BP)

所以,最后获得的 Bleu 得分为:

 

Blue = BP \times exp(\frac{1}{N}\sum^N_{i=1}log^{p_n})

Bleu 得分的贡献是提出了一个表现不错的单一实数评估指标,所以加快了整个机器翻译领域以及其余文本生成领域的进程。

相关论文:Papineni et. al., 2002. A method for automatic evaluation of machine translation

注意力模型

对于一大段文字,人工翻译通常每次阅读并翻译一小部分。由于难以记忆,很难每次将一大段文字一口气翻译完。同理,用 Seq2Seq 模型创建的翻译系统,对于长句子,Blue 得分会随着输入序列长度的增长而下降。

实际上,咱们也并不但愿神经网络每次去“记忆”很长一段文字,而是想让它像人工翻译同样工做。所以,注意力模型(Attention Model)被提出。目前,其思想已经成为深度学习领域中最有影响力的思想之一。

Attention-Model

注意力模型的一个示例网络结构如上图所示。其中,底层是一个双向循环神经网络(BRNN),该网络中每一个时间步的激活都包含前向传播和反向传播产生的激活:

a^{\langle t'\rangle} = ({\overrightarrow a}^{\langle t' \rangle}, {\overleftarrow a}^{\langle t' \rangle})

顶层是一个“多对多”结构的循环神经网络,第 t个时间步的输入包含该网络中前一个时间步的激活 s^{\langle t-1 \rangle}、输出y^{\langle t-1 \rangle}以及底层的 BRNN 中多个时间步的激活 c,其中 c 有(注意分辨 α和 a):

c^{\langle t \rangle} = \sum_{t'}\alpha^{\langle t,t' \rangle}a^{\langle t' \rangle}

其中,参数\alpha^{\langle t,t' \rangle}即表明着 y^{\langle t\rangle}对 \alpha^{\langle t' \rangle} 的“注意力”,总有:

 

\sum_{t'}\alpha^{\langle t,t' \rangle} = 1

咱们使用 Softmax 来确保上式成立,所以有:

 

\alpha^{\langle t,t' \rangle} = \frac{exp(e^{\langle t,t' \rangle})}{\sum^{T_x}_{t'=1}exp(e^{\langle t,t' \rangle})}

而对于 e^{\langle t,t' \rangle},咱们经过神经网络学习获得。输入为 s^{\langle t-1 \rangle} 和 a^{\langle t' \rangle},以下图所示:

Computing-attention

注意力模型的一个缺点是时间复杂度为 O(n3)。

相关论文:

语音识别

在语音识别任务中,输入是一段以时间为横轴的音频片断,输出是文本。

音频数据的常见预处理步骤是运行音频片断来生成一个声谱图,并将其做为特征。之前的语音识别系统经过语言学家人工设计的音素(Phonemes)来构建,音素指的是一种语言中能区别两个词的最小语音单位。如今的端到端系统中,用深度学习就能够实现输入音频,直接输出文本。

对于训练基于深度学习的语音识别系统,大规模的数据集是必要的。学术研究中一般使用 3000 小时长度的音频数据,而商业应用则须要超过一万小时的数据。

语音识别系统能够用注意力模型来构建,一个简单的图例以下:

Attention-model-for-speech-recognition

用 CTC(Connectionist Temporal Classification)损失函数来作语音识别的效果也不错。因为输入是音频数据,使用 RNN 所创建的系统含有不少个时间步,且输出数量每每小于输入。所以,不是每个时间步都有对应的输出。CTC 容许 RNN 生成下图红字所示的输出,并将两个空白符(blank)中重复的字符折叠起来,再将空白符去掉,获得最终的输出文本。

CTC-for-speech-recognition

相关论文:Graves et al., 2006. Connectionist Temporal Classification: Labeling unsegmented sequence data with recurrent neural networks

触发词检测

触发词检测(Trigger Word Detection)经常使用于各类智能设备,经过约定的触发词能够语音唤醒设备。

使用 RNN 来实现触发词检测时,能够将触发词对应的序列的标签设置为“1”,而将其余的标签设置为“0”。

Trigger-word-detection-algorithm