DeepLearning.ai学习笔记(五)序列模型 -- week2 序列模型和注意力机制

1、基础模型

假设要翻译下面这句话:算法

"简将要在9月访问中国"网络

正确的翻译结果应该是:学习

"Jane is visiting China in September"大数据

在这个例子中输入数据是10个中文汉字,输出为6个英文单词,\(T_x\)\(T_y\)数量不一致,这就须要用到序列到序列的RNN模型。

优化



相似的例子还有看图说话:spa

只须要将encoder部分用一个CNN模型替换就能够了,好比AlexNet,就能够获得“一只(可爱的)猫躺在楼梯上”翻译

2、选择最优句子

下面将以前学习的语言模型和机器翻译模型作一个对比, P为几率3d

下图是语言模型,能够用在自动生成文章或者预测文字之类的应用中,即根据前一个字输出下一个字。code

下图是机器翻译模型,能够看到后半部分(紫色)其实就是语言模型,吴大大称之为“条件语言模型”,即在语言模型以前有一个条件,也就是被翻译的句子。视频

用数学公式表示就是:

\[P(y^{<1>},…,y^{<T_y>}|x^{<1>},…,x^{<T_x>})\]

可是咱们知道翻译是有不少种方式的,同一句话能够翻译成不少不一样的句子,那么咱们如何判断那一个句子是最好的呢?

仍是翻译上面那句话,有以下几种翻译结果:

  • "Jane is visiting China in September."
  • "Jane is going to visit China in September."
  • "In September, Jane will visit China"
  • "Jane's Chinese friend welcomed her in September."
  • ....

与语言模型不一样的是,机器模型在输出部分再也不使用softmax随机分布的形式进行取样,由于很容易获得一
个不许确的翻译,取而代之的是使用Beam Search作最优化的选择。这个方法会在后下一小节介绍,在此以前先介绍一下贪婪搜索(Greedy Search)及其弊端,这样才能更好地了解Beam Search的优势。

获得最好的翻译结果,转换成数学公式就是

\[argmax P(y^{<1>},…,y^{<T_y>}|x^{<1>},…,x^{<T_x>})\]

那么贪婪搜索是什么呢?

通俗解释就是每次输出的那个都必须是最好的。仍是以翻译那句话为例。

如今假设经过贪婪搜索已经肯定最好的翻译的前两个单词是:"Jane is "

而后由于"going"这个单词出现频率较高和其它缘由,因此根据贪婪算法得出此时第三个单词的最好结果是"going"。

因此根据贪婪算法最后的翻译结果多是下图中的第二个句子,可是第一句可能会更好(不服气的话,咱们就假设第一句更好hhhh)。

因此贪婪搜索的缺点是局部最优并不表明全局最优,就好像五黑,一队都是很牛逼的,可是各个都太优秀,就显得没那么优秀了,而另外一队虽说不是每一个都是最优秀,可是凑在一块儿就是能carry全场。

更形象的理解可能就是贪婪搜索更加短视,看的不长远,并且也更加耗时。假设字典中共有10000个单词,若是使用贪婪搜索,那么可能的组合有\(10000^{10}\)种,因此仍是挺恐怖的2333~~

3、定向搜索(Beam Search)

Beam Search是贪婪搜索的增强版,首先它须要设置beam width,下面设置为3。(若是设置为1,就是贪婪搜索)

步骤一

以下图示,由于beam width=3,因此根据输入的须要翻译的句子选出3个\(y^{<1>}\)最可能的输出值,即选出\(P(y^{<1>|x})\)最大的前3个值。假设分别是"in","jane","september"。

步骤二

以"in"为例进行说明,其余同理。
以下图示,在给定被翻译句子\(x\)和肯定 \(y^{<1>}\)="in" 的条件下,下一个输出值的条件几率是\(P(y^{<2>}|x,"in")\)。此时须要从10000种可能中找出条件几率最高的前3个。

又由公式\(P(y^{<1>},y^{<2>}|x)=P(y^{<1>}|x)P(y^{<2>}|x,y^{<1>})\),咱们此时已经获得了给定输入数据,前两个输出值的输出几率比较大的组合了。

另外2个单词也作一样的计算。






此时咱们获得了9组\(P(y^{<1>},y^{<2>}|x)\),此时咱们再从这9组中选出几率值最高的前3个。以下图示,假设是这3个:

  • "in september"
  • "jane is"
  • "jane visits"


步骤3:

继续步骤2的过程,根据\(P(y^{<3>}|x,y^{<1>},y^{<2>})\)选出\(P(y^{<1>},y^{<2>},y^{<3>}|x)\)最大的前3个组合。

后面重复上述步骤得出结果。

总结一下上面的步骤就是:

  • 第一步
    通过encoder之后,decoder给出最有可能的三个开头词依次为“in”, "jane", "september" --- \(P(y^{<1>}|x)\)
  • 第二步
    通过将第一步获得的值输入到第二步中,最有可能的三个个翻译为“in september”, "jane is", "jane visits" ---\(P(y^{<2>}|x,y^{<1>})\)
    (这里,september开头的句子因为几率没有其余的可能性大,已经失去了做为开头词资格)
  • 第三步
    继续这个过程... ---- \(P(y^{<3>}|x,y^{<1>},y^{<2>})\)

4、改进定向搜索

由于
\[P(y^{<1>},….,P(y^{T_y})|x)=P(y^{<1>}|x)P(y^{<2>}|x,y^{<1>})…P(y^{<T_y>}|x,y^{<1>},…y^{<{T_y-1}>})\]

因此要知足\(argmax P(y^{<1>},….,P(y^{T_y})|x)\),也就等同于要知足

\[argmax \prod_{t=1}^{T_y}P(y^{<t>}|x,y^{<1>},…y^{<{t-1}>})\]

可是上面的公式存在一个问题,由于几率都是小于1的,累乘以后会愈来愈小,可能小到计算机没法精确存储,因此能够将其转变成log形式(由于log是单调递增的,因此对最终结果不会有影响),其公式以下:

\[argmax \sum_{t=1}^{T_y}logP(y^{<t>}|x,y^{<1>},…y^{<{t-1}>})\]

But!!!上述公式仍然存在bug,观察能够知道,几率值都是小于1的,那么log以后都是负数,因此为了使得最后的值最大,那么只要保证翻译的句子越短,那么值就越大,因此若是使用这个公式,那么最后翻译的句子一般都是比较短的句子,这显然不行。

因此咱们能够经过归一化的方式来纠正,即保证平均到每一个单词都能获得最大值。其公式以下:

\[argmax \frac{1}{T_y}\sum_{t=1}^{T_y}logP(y^{<t>}|x,y^{<1>},…y^{<{t-1}>})\]

经过归一化的确能很好的解决上述问题,可是在实际运用中,会额外添加一个参数\(α\),其大小介于0和1之间,公式以下:

\[argmax \frac{1}{T_y^α}\sum_{t=1}^{T_y}logP(y^{<t>}|x,y^{<1>},…y^{<{t-1}>})\]

5、定向搜索的偏差分析

静下心来仔细想一想beam search,咱们会发现其实它是近似搜索,也就是说可能使用这种方法最终获得的结果并非最好的。固然也有多是由于使用的RNN模型有缺陷致使结果不是最好的。

因此咱们如何判断偏差是出在哪一个地方呢?

仍是以翻译这句话为例:“简在9月访问中国”。

假设按照人类的习惯翻译成英文是“Jane visits China in September.”,该结果用 \(y^*\) 表示。

假设经过算法得出的翻译结果是:“Jane visited China in September.”,该结果用\(\hat{y}\)表示。

要判断偏差出在哪,只须要比较\(P(y^*|x)\)\(P(\hat{y}|x)\)的大小便可。

下面分两种状况讨论:

1.\(P(y^*|x)>P(\hat{y}|x)\)

上面的不等式的含义是beam search最后选出的结果不如人类,也就是beam search并无选出最好的结果,因此问题出在beam search。

2.\(P(y^*|x)≤P(\hat{y}|x)\)

上面不等式表示beam search最后选出的结果要比人类的更好,也就是说beam search已经选出了最好的结果,可是模型对各个组合的预测几率值并不符合人类的预期,因此这个锅须要模型背。



上面已经介绍了偏差分析的方式,但时仅凭一次偏差分析就断定谁该背锅确定也不行,因此还须要进行屡次偏差分析屡次。

以下图示已经进行了屡次的偏差分析,每次分析以后都断定了锅该谁背,最后计算出beam search和模型背锅的比例,根据比例做出相应的调整。

例如若是beam search更高,能够相应调整beam width。
若是模型背锅比例更高,那么能够考虑增长正则化,增长数据等操做。



6、Bleu得分(选修)

主要介绍了如何给机器翻译结果打分,由于是选修内容。。。so。。。emm

7、注意力模型直观理解

1.为何要用注意力模型

​以前介绍的RNN翻译模型存在一个很明显的问题就是机器翻译的翻译过程是首先将全部须要翻译的句子输入到Encoder中,以后再经过Decoder输出翻译语句。以下图示机器算法将法语翻译成英语的模型。

机器翻译与人类的翻译过程不太相同。由于人类翻译通常是逐句翻译,或者是讲一段很长的句子分解开来进行翻译。

因此上述模型的翻译结果的Bleu评分与被翻译句子的长短有很大关系,句子较短时,模型可能没法捕捉到关键信息,因此翻译结果不是很高;可是当句子过长时,模型又抓不到重点等缘由使得结果也不是很高。

​而若是机器能像人同样逐句或者每次将注意力只集中在一小部分进行翻译,那么翻译结果将不受句子长度的影响。下图中的绿色线即为使用了注意力模型后的翻译句子得分。

2.模型介绍


下图展现了普通的翻译模型双向RNN结构,该结构可根据输入\(x^{<t>}\)直接获得输出\(y^{<t>}\)



注意力模型在此基础上作进一步处理。

为避免误解,使用另外一个符号\(s\)来表示节点。

以下图示,根据下面一层的双向RNN计算结果可获得节点\(s^{<1>}\)与其余节点权重\(α^{<1,1>},α^{<1,2>},…\),经过这些权重能够知道该节点与其余节点的相关联程度,从而能够达到将注意力集中到部分区域的效果。

​其余节点同理。整个注意力模型结构以下图示。

8、注意力模型

特别要区分\(a\) (字母a)\(α\) (alpha)。前者表示特征节点,后者表示注意力权重。

1.参数介绍

​以下图示,注意力模型采用双向RNN结构,因此每一个节点有两个值,用(\(\overrightarrow{a}^{<t'>},\overleftarrow{a}^{<t'>}\))表示,为了使公式更简化,令\(a^{<t'>}=(\overrightarrow{a}^{<t'>},\overleftarrow{a}^{<t'>})\)。其中\(t'\)表示输入数据的索引。

上一节已经介绍了注意力权重\(α^{<t,t'>}\),以第一个节点为例,它的权重值能够用\(α^{<1,t'>}\)表示,且全部权重值知足\(\sum{α^{<1,t'>}}=1\)

全部权重与对应节点的线性之和用\(c^{<t'>}\)表示(为方便书写,用\(c\)表示),c表示context,即上下文变量。

仍是以第一个节点为例,c的计算公式以下:

\[c^{<1>}=\sum_{t'}α^{<1,t'>}a^{<t'>}\]



2.注意力权值计算公式

\[\alpha^{<t,t'>}=\frac{exp(e^{<t,t'>})}{\sum_{t''=1}^{T_x}{exp(e^{t,t''})}}\]

上面公式中的\(e^{<t,t'>}\)计算图以下:

其中\(s^{<t-1>}\)表示上一个状态的值,\(a^{<t'>}\)表示第t'个特征节点。



视频中吴大大并无很详细的介绍上面的网络,只是一笔带过,说反向传播和梯度降低会自动学习,emmm。。。那就这样吧。

结合下图能够独自参考一下上面的公式是什么意思。



3.舶来品

下面的笔记是《大数据文摘》的笔记,感受他写的清楚一些。

如图所示,这是一个双向的rnn,而且在普通rnn的基础上增长attention层,将阶段性的输入部分转化为输出,这样的方式也更符合人类的翻译过程。

让咱们拿出细节部分仔细的理解一下,首先是attention层,也就是下图中\(context^{<t>}\),每个attention单元接受 三个单词的输入因此也称做语境单元(context), \(α\)是每单个输入词在语境单元中占得权重。对每个语境单元t 来讲,由于\(α\)是经过softmax决定的,因此\(\sum_{i=1}^{T_x}α^{t,i}=1\)。这里决定终每个单词占得语境权重仍然是经过一 个小型的神经网络来进行计算而且后获得的。

输出的\(context^{<t>}\)进入到下一层Post LSTM 这一步就和以前学习过的那样子,将前一步的输出与这一步通过重重分析的输入综合到一块儿产生这一步的输出。

让咱们评估一下attention model: 因为结构的复杂,计算量与时间比普通的语言模型要多和慢许多。不过对于机 器翻译来讲,因为每一句话并不会特别特比特的长,因此有的时候稍微慢一点也不是彻底没法接受:p

一个很重要attention model的应用就是语音识别,人经过麦克风输入一句话让机器来翻译输入的内容,让咱们来 看一下是如何实现的

9、语音辨识

通常语音识别过程是以下图示的,即首相将原音频(黑白的,纵轴表示振幅)转化成纵轴为频率的音谱图,而且经过人工预先设定的音素(phonemes)再来识别。



而引入注意力机制后的模型就表现优秀得多了



CTC(connectionist temporal classification)是以前较为经常使用的方法。

具体原理以下:

假设每秒音频能够提取出100个特征值,那么假设10秒的音频就有1000个特征值,那么输出值也有1000个,可是说出的话并无这么多啊,那该怎么处理呢?

方法很简单,只须要把“_”进行压缩便可,注意须要将 "_"和空额区分开来,由于空格也是占一个字符的。



10、触发字检测

假设下图式训练集中的一段音频,其中包含了两次唤醒词

搭建一个attention model,在听到唤醒词以前一直输出的是0,在听到唤醒词之后输出1,但由于一个唤醒词会持 续半秒左右因此咱们也不只仅只输出一次1,而是将输出的1持续一段时间,经过这样的方式训练出的rnn就能够很 有效的检测到唤醒词了。

11、结论和致谢

啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦了,终于学完了。虽然好像也并不能说明什么~~~2333333333



MARSGGBO原创




2018-6-3

相关文章
相关标签/搜索