Various sequence to sequence architecture

Basic Models

Sequence to sequence(序列)模型在机器翻译和语音识别方面都有着广泛的应用。下面,我们来看一个机器翻译的简单例子:

Deeplearning.ai吴恩达笔记之循环神经网络3

如上图所示,我们将输入的法语单词通过某个RNN网络结构输出了对应的英语单词。

针对该机器翻译问题,可以使用“编码网络(encoder network)”+“解码网络(decoder network)”两个RNN模型组合的形式来解决。encoder network将输入语句编码为一个特征向量,传递给decoder network,完成翻译。具体模型结构如下图所示:

Deeplearning.ai吴恩达笔记之循环神经网络3

同样的,我们也可以将该种模型应用到图像捕捉领域。图像捕捉,即捕捉图像中主体动作和行为,描述图像内容。如下图所示:
Deeplearning.ai吴恩达笔记之循环神经网络3

首先,可以将图片输入到CNN,例如使用预训练好的AlexNet,删去最后的softmax层,保留至最后的全连接层。则该全连接层就构成了一个图片的特征向量(编码向量),表征了图片特征信息。

Deeplearning.ai吴恩达笔记之循环神经网络3

然后,将encoder vector输入至RNN,即decoder network中,进行解码翻译。

Deeplearning.ai吴恩达笔记之循环神经网络3

Picking the most likely sentence

Sequence to sequence machine translation模型与我们第一节课介绍的language模型有一些相似,但也存在不同之处。二者模型结构如下所示:

Deeplearning.ai吴恩达笔记之循环神经网络3

  • 在语言模型中,我们通过估计句子的可能性,来生成新的句子。语言模型总是以零向量开始,也就是其第一个时间步的输入可以直接为零向量;
  • 在机器翻译中,包含了编码网络和解码网络,其中解码网络的结构与语言模型的结构是相似的。机器翻译以句子中每个单词的一系列向量作为输入,所以相比语言模型来说,机器翻译可以称作条件语言模型,其输出的句子概率是相对于输入的条件概率。

还是以法语翻译英语为例,通过输入的法语句子,模型将会告诉我们各种英文句子输出所对应的可能性,如下图中的句子所示。

Deeplearning.ai吴恩达笔记之循环神经网络3

那么我们的目标是让P(y<1>,....,y<Ty>x)P(y^{<1>},....,y^{<T_y>}|x)最大化,从而选择合适的句子。

使用贪心搜索算法,在生成第一个词的分布后,贪心搜索会根据我们的条件语言模型挑选出最有可能输出的第一个词语,然后再挑选出第二个最有可能的输出词语,依次给出所有的输出。

但是具体单词的准确不能保证整个句子的准确(无法保证全局最优),在机器翻译领域大概率上贪心算法是找不出最优的句子的。其次,greedy search大大增加了运算成本,降低运算速度。

Beam Search

Greedy search每次是找出预测概率最大的单词,而beam search则是每次找出预测概率最大的B个单词。其中,参数B表示取概率最大的单词个数,可调。本例中,令B=3。

  • Step 1:对于我们的词汇表,我们将法语句子输入到编码网络中得到句子的编码,通过一个softmax层计算各个单词(词汇表中的所有单词)输出的概率值,通过设置集束宽度(beam width)的大小如3,我们则取前3个最大输出概率的单词,并保存起来。

    Deeplearning.ai吴恩达笔记之循环神经网络3

  • Step 2:在第一步中得到的集束宽度的单词数,我们分别对第一步得到的每一个单词计算其与单词表中的所有单词组成词对的概率。这样就有3×10000个选择,(这里假设词汇表有10000个单词),最后再通过beam width大小选择前3个概率最大的输出对;

Deeplearning.ai吴恩达笔记之循环神经网络3

  • Step 3~Step T:与Step2的过程是相似的,直到遇到句尾符号结束。

    Deeplearning.ai吴恩达笔记之循环神经网络3

Refinements to Beam Search

Beam search中,最终机器翻译的概率是乘积的形式:

arg maxt=1TyP(y^<t>x,y^<1>,,y^<t1>)arg max∏_{t=1}^{T_y}P(hat{y}^{<t>}|x,hat{y}^{<1>},⋯,hat{y}^{<t−1>})

多个概率相乘可能会使乘积结果很小,远小于1,造成数值下溢。为了解决这个问题,可以对上述乘积形式进行取对数log运算,即:

arg maxt=1TylogP(y^x,y^<1>,,y^<t1>)arg maxsum_{t=1}^{T_y}logP(hat{y}^{}|x,hat{y}^{<1>},⋯,hat{y}^{<t-1>})

因为取对数运算,将乘积转化为求和形式,避免了数值下溢,使得数据更加稳定有效。

这种概率表达式还存在一个问题,就是机器翻译的单词越多,乘积形式或求和形式得到的概率就越小,这样会造成模型倾向于选择单词数更少的翻译语句,使机器翻译受单词数目的影响,这显然是不太合适的。因此,一种改进方式是进行长度归一化,消除语句长度影响。相比直接除以输出单词长度的值,可以使用更加柔和的方式:在TyT_y上加上一个指数α,如α=0.7,通过调整其大小获得更加好的效果。

1Tyαarg maxt=1TylogP(y^x,y^<1>,,y^<t1>)frac{1}{T_y^{alpha}}arg maxsum_{t=1}^{T_y}logP(hat{y}^{}|x,hat{y}^{<1>},⋯,hat{y}^{<t-1>})

通过上面的目标,选取得分最大的句子,即为我们的模型最后得到的输出结果。

集束搜索讨论:

  • Beam width:B的选择,B越大考虑的情况越多,但是所需要进行的计算量也就相应的越大。在常见的产品系统中,一般设置B = 10,而更大的值(如100,1000,…)则需要对应用的领域和场景进行选择。

相比于算法范畴中的搜索算法像BFS或者DFS这些精确的搜索算法,Beam Search 算法运行的速度很快,但是不能保证找到目标准确的最大值。

Error analysis in beam search

集束搜索算法是一种近似搜索算法,也被称为启发式搜索算法。它的输出不能保证总是可能性最大的句子,因为其每一步中仅记录着Beam width为3或者10或者100种的可能的句子。

所以,如果我们的集束搜素算法出现错误了要怎么办呢?我们如何确定是算法出现了错误还是模型出现了错误呢?此时集束搜索算法的误差分析就显示出了作用。

例子:

同样以法语句子的英文翻译为例子,我们人类对法语句子的翻译如中间的句子,而我们的模型输出的翻译如下面的句子。通过我们的模型,我们分别计算人类翻译的概率P(yx)P(y^{∗}|x)以及模型翻译的概率P(y^x)P(hat{y}|x),比较两个概率的大小,通过比较我们就能知道是因为Beam Search 算法的问题还是RNN模型的问题。如下图所示:

Deeplearning.ai吴恩达笔记之循环神经网络3

如果beam search算法表现不佳,可以调试参数B;若RNN模型不好,则可以增加网络层数,使用正则化,增加训练样本数目等方法来优化。

Bleu Score

对于机器翻译系统来说,一种语言对于另外一种语言的翻译常常有多种正确且合适的翻译,我们无法做到像图像识别一样有固定准确度答案,所以针对不同的翻译结果,往往很难评估那一个结果是更好的,哪一个翻译系统是更加有效的。这里引入Bleu score 用来评估翻译系统的准确性。(Bleu, bilingual evaluation understudy)

评估机器翻译:

如下面的法语翻译的例子,我们有两种不同的翻译,但是两种翻译都是正确且较好的翻译结果。Bleu score 的评估理念是观察机器生成的翻译结果中的每一个词是否出现在至少一个人工翻译结果的参考之中。(这些参考位于开发集或者测试集中)。

Deeplearning.ai吴恩达笔记之循环神经网络3

  • 精确度:观察输出结果的每一个词是否出现在参考中。但是对于图中机器翻译的糟糕的结果,精确度确非常高。
  • 改良的精确度:将每个单词设置一个得分上限(单个参考句子中出现的最大的次数,如图中的the单词的上限为2)。

二元词组的Bleu score:

与单个词的评估相似,这里我们以两个相邻的单词作为一个二元词组来进行Bleu得分评估,得到机器翻译的二元词组的得分和其相应的得分上限,进而得到改进的精确度。

Deeplearning.ai吴恩达笔记之循环神经网络3

对于不同的n-gram,我们计算改良的精确度得分的公式如下:

Deeplearning.ai吴恩达笔记之循环神经网络3

Bleu score细节:

得到每种n-gram的Bleu score组合可得:
BPexp(1nn=1nPn)BPcdot exp(frac{1}{n}∑_{n=1}^nP_n)

其中,BP(brevity penalty)简短惩罚,作为一个调节因子,来对太短的翻译结果的翻译系统进行惩罚。
$
BP=
begin{cases}
1, & mbox{if MT_length>reference_length}
exp(1−MT_length/reference_length),& mbox{otherwise}
end{cases}
$
Bleu score 作为机器翻译系统的一种单一评估指标,它虽然不是非常完美,但是却也具有非常好的效果,尤其加快了整个机器翻译领域的进程,对机器翻译具有革命性的影响。同时,Bleu score对大多数的文本生成的模型均是有效的评估手段。

Attention Model Intuition

如果原语句很长,要对整个语句输入RNN的编码网络和解码网络进行翻译,则效果不佳。相应的bleu score会随着单词数目增加而逐渐降低。

Deeplearning.ai吴恩达笔记之循环神经网络3

对待长语句,正确的翻译方法是将长语句分段,每次只对长语句的一部分进行翻译。人工翻译也是采用这样的方法,高效准确。也就是说,每次翻译只注重一部分区域,这种方法使得bleu score不太受语句长度的影响。

Deeplearning.ai吴恩达笔记之循环神经网络3

根据这种“局部聚焦”的思想,建立相应的注意力模型(attention model)。

Deeplearning.ai吴恩达笔记之循环神经网络3

如上图所示,attention model仍由类似的编码网络(下)和解码网络(上)构成。其中,S<t>S^{<t>}由原语句附近单元共同决定,原则上说,离得越近,注意力权重(attention weights)越大,相当于在你当前的注意力区域有个滑动窗。

Attention Model

Attention model中选择双向RNN,可以使用GRU单元或者LSTM。由于是双向RNN,每个a<t>a^{<t′>}表示:

a<t>=(a<t>,a<t>)a^{<t′>}=(overrightarrow{a}^{<t′>},overleftarrow{a}^{<t′>})

RNN编码生成特征,注意力权重用αalpha表示,C是各个RNN神经元经过注意力权重得到的参数值。例如,α<1,t>α^{<1,t′>}表示机器翻译的第一个单词“jane”对应的第t’个RNN神经元,C<1>C^{<1>}表示机器翻译第一个单词“jane”对应的解码网络输入参数。满足:

tα<1,t>=1∑_{t′}α^{<1,t′>}=1
C<1>=tα<1,t>a<t>C^{<1>}=∑_{t′}α^{<1,t′>}⋅a^{<t′>}

也就是说,α<t,t>α^{<t,t′>}表示输出y^<t>hat{y}^{<t>}对RNN单元a<t>a^{<t′>}的注意力权重因子。

为了让α<t,t>α^{<t,t′>}之和为1,利用softamx思想,引入参数e<t,t>e^{<t,t′>},使得:

α<t,t>=e<t,t>tTxe<t,t>α^{<t,t′>}=frac{e^{<t,t′>}}{∑^{Tx}_{t′}e^{<t,t′>}}

这样,只要求出e<t,t>e^{<t,t′>},就能得到α<t,t>α^{<t,t′>}

如何求出e<t,t>e^{<t,t′>}呢?方法是建立一个简单的神经网络,如下图所示。输入是S<t1>S^{<t−1>}a<t>a^{<t′>},输出是e<t,t>e^{<t,t′>}

Deeplearning.ai吴恩达笔记之循环神经网络3

然后,利用梯度下降算法迭代优化,计算得到e<t,t>e^{<t,t′>}α<t,t>α^{<t,t′>}

Attention model的一个缺点是其计算量较大,若输入句子长度为TxT_x,输出句子长度为TyT_y,则计算时间约为Tx TyT_x ∗T_y。但是,其性能提升很多,计算量大一些也是可以接受的。

有趣的是,Attention model在图像捕捉方面也有应用。

Attention model能有效处理很多机器翻译问题,例如下面的时间格式归一化:

Deeplearning.ai吴恩达笔记之循环神经网络3

下图将注意力权重可视化:

Deeplearning.ai吴恩达笔记之循环神经网络3

上图中,颜色越白表示注意力权重越大,颜色越深表示权重越小。可见,输出语句单词与其输入语句单词对应位置的注意力权重较大,即对角线附近。

Speech recognition -Audio data

Speech recognition

语音识别是将一段音频信号转化为相应的文本信息。

语音识别问题:

在语音识别问题上,借鉴于人耳的处理过程,会将音频信号转化为该音频信号的声谱图(时间和频率的图,不同颜色代表不同的频谱能量的大小),再将声谱图作为特征送到相应的算法中进行处理。

之前的语音识别的系统中,语言学家构造了音素来学习语音识别系统。但是随着深度学习的发展,在end-to-end的模型中,这种音素的表示法已经不重要了。我们完全可以做到直接从语音信号到文本信息的转化,无需人工特征的设计。

Deeplearning.ai吴恩达笔记之循环神经网络3

语音识别的注意力模型(attention model)如下图所示:

Deeplearning.ai吴恩达笔记之循环神经网络3

一般来说,语音识别的输入时间序列都比较长,例如是10s语音信号,采样率为100Hz,则语音长度为1000。而翻译的语句通常很短,例如“the quick brown fox”,包含19个字符。这时候,TxT_xTyT_y差别很大。为了让Tx=TyT_x=T_y,可以把输出相应字符重复并加入空白(blank),形如:
ttt_h_eee_______qqq__ttt_h_eee____sqcup___qqq__⋯
其中,下划线”_“表示空白,”⊔“表示两个单词之间的空字符。这种写法的一个基本准则是没有被空白符”_“分割的重复字符将被折叠到一起,即表示一个字符。

这样,加入了重复字符和空白符、空字符,可以让输出长度也达到1000,即Tx=TyT_x=T_y。这种模型被称为CTC(Connectionist temporal classification)。

Deeplearning.ai吴恩达笔记之循环神经网络3

Trigger Word Detection

触发字检测(Trigger Word Detection)在很多产品中都有应用,操作方法就是说出触发字通过语音来启动相应的设备。例如Amazon Echo的触发字是”Alexa“,百度DuerOS的触发字是”小度你好“,Apple Siri的触发字是”Hey Siri“,Google Home的触发字是”Okay Google“。

Deeplearning.ai吴恩达笔记之循环神经网络3

触发字检测系统可以使用RNN模型来建立。如下图所示,输入语音中包含一些触发字,其余都是非触发字。RNN检测到触发字后输出1,非触发字输出0。这样训练的RNN模型就能实现触发字检测。

Deeplearning.ai吴恩达笔记之循环神经网络3

但是这种模型有一个缺点,就是通常训练样本语音中的触发字较非触发字数目少得多,即正负样本分布不均。一种解决办法是在出现一个触发字时,将其附近的RNN都输出1。这样就简单粗暴地增加了正样本。

Deeplearning.ai吴恩达笔记之循环神经网络3