[DeeplearningAI笔记]序列模型3.3集束搜索
5.3序列模型与注意力机制
觉得有用的话,欢迎一起讨论相互学习~Follow Me
3.3 集束搜索Beam Search
- 对于机器翻译来说,给定输入的句子,会返回一个随机的英语翻译结果,但是你想要一个最好的英语翻译结果。对于语音识别也是一样,给定一个输入的语音片段,你不会想要一个随机的文本翻译结果,你想要一个最接近愿意的翻译结果。
- Jane visite l'Afrique en septembre 希望翻译成英文句子 Jane is visiting Africa in September
- 集束搜索第一步就是挑选出英文翻译句子中的第一个单词。
- 首先英语字典可表示为:
- 第一个英语翻译的单词的概率可表示为:
\(P(y^{<1>}|x)\) , 其中x表示输入的法语句子,\(y^{<1>}\)表示输出的第一个英语单词。 - 此步骤的结构可表示为:
- 贪婪算法只会挑出最可能的那个单词,然后继续,然而 集束搜索算法 会考虑多个结果, 集束搜索算法 会有一个参数B, 叫做 集束宽(beam width) 在这个例子中,设置集束宽(beam width) 为3 这表明其会一次性考虑三个候选单词。然后 集束搜索算法 会把结果存到计算机内存中,以便后面尝试使用这三个词。
- 过程是先将整个待翻译的句子输入到 绿色 的编码网络中,然后使用 紫色 的解码网络进行解码,结果是一个1W维的向量,用来表示第一个英文单词的概率,选择概率最大的 3个(集束宽) 单词存储在内存中。
- 首先英语字典可表示为:
- 对于第二个单词,是要在确定第一个单词的情况下进行搜索。
- 假设第一个单词被设置为 in 或 jane 或 september
- 将第一个单词 in 作为 解码器 的第一个节点的输出,并且将其作为第二个节点的输入。这样这个网络就能评估第二个词的概率了 \(P(y^{<2>}|x,"in")\)
- Note 在第二步中,第一个和第二个单词的联合概率是关心的重点即\(P(y^{<1>},y^{<2>}|x)\),根据概率公式,有:\(P(y^{<1>},y^{<2>}|x)=p(y^{<1>}|x)P(y^{<2>}|x,y^{<1>})\).
- 同样,对第一个翻译结果的其他候选词("jane, september")进行如上操作.
- 由于使用的 集束宽 为3 ,并且词汇表中单词的数量为 1W, 所以最终会有3W(集束宽 * 词典中词汇总量)个可能的结果
- 再从3W个结果中挑选出3(集束宽)个概率最大的结果
- Note 对于第二个单词的挑选,使用三(集束宽)个不同的网络,因为每个网络的 \(y^{<1>}\) 不同。
- 假设第一个单词被设置为 in 或 jane 或 september
保存已经挑选出的前两个单词与在输入为x的条件下,前两个单词的概率,同上述操作挑选出第三个词:
集束搜索通过这种方法每次找到一个词,最终 得到 Jane visits africa in september 这个句子终止在句尾符号
3.4 改进集束搜索Refinements to beam search
长度归一化 Length Normalization
取log值
- 集束搜索的目的是最大化下式
其中: 上式也可表示为下式 \[P(y^{<1>}y^{<2>}...y^{<T_{y}>})=P(y^{<1>}|x)P(y^{<2>}|x,y^{<1>})...P(y^{<T_{y}>}|x,y^{<1>}...,y^{<T_{y}-1>})\]
- 但是\(P(y^{<1>}|x)P(y^{<2>}|x,y^{<1>})...P(y^{<T_{y}>}|x,y^{<1>}...,y^{<T_{y}-1>})\)这个乘积式中的因子都是小数,其乘积会是一个十分小的数,会造成 数值下溢(numerical underflow)
- 为了解决这个问题 ,将最大化的乘积式取对数 ,由 **logM*N=logM+logN** 公式可得,上述需要最大化的乘积式可以转化为:
即乘积的log变成了log的求和,最大化这个log的求和值能够得到同样的结果,并且不会出现 数值下溢和四舍五入
归一化
- 由于\(P(y^{<1>}|x)P(y^{<2>}|x,y^{<1>})...P(y^{<T_{y}>}|x,y^{<1>}...,y^{<T_{y}-1>})\)乘积式中各个因此都是小数,所以随着翻译句子的增长,P的乘积会越来越小。而 集束搜索 的结果会选取较大的P的乘积式。这样搜索方法会不自然的偏向 更短的翻译输出 因为 短句子 的概率是由更少的小于1的数字乘积得到的。而对于乘积的 对数式 ,由于取对数后的结果是负数,要取得更大的概率值,也会偏向于 更短的翻译结果
- 因此将原先的公式 除以翻译后句子的总长度/翻译后句子总长度的指数(指数小于1) ,这样很明显的减少了对输出长的结果的惩罚
束宽选择 Beam width B
- 束宽B越大,你考虑的选择越多,找到的句子可能越好,但是B越大,算法的计算代价越大,程序运行的也会相对较慢,因为要把更多可能的选择保存下来。
- 束宽B越小,需要考虑的选择越少,内存占用小,程序运行越快,但是效果没有那么好。
普通时候B一般选择10,工业界上也可以选择100,科研任务中需要得到最好的结果,也有将B设置为1000或3000的时候。
Note 相对于 深度优先搜索 , 广度优先搜索 等算法来说,束搜索运行的更快但是不能包含保证一定能找到arg max的准确的最大值
3.4 集束搜索误差分析 Error analysis on beam search
- 束搜索算法是一种 近似搜索算法(approximate search algorithm) , 也被称为 heuristic search algorithm 启发式搜索算法 , 其不总是输出可能性最大的句子 , 它仅记录着B为前3或者10或者100种可能。 所以束搜索方法也会出现错误。 本节将使用 误差分析 的方法对 束搜索(beam search) 进行改进,发现到底是束搜索方法出现了问题还是构造的RNN模型出现了问题导致整个系统的失效。
- 例句 Jane visite l'Afrique en septembre ,验证集中人工翻译的正确答案为 Jane visits Africa in September 将人工翻译的结果标记为 \(y^{ * }\) ,使用训练完成的机器翻译模型翻译为 Jane visited Africa last September 并将其标记为 \(\hat{y}\)
- 当然,机器翻译的结果不能算是好的翻译,其中机器翻译可以被分成两个部分 编码器与解码器 ,束搜索B 。必须有方法判断出是两部分中的哪部分的问题,导致翻译系统不能很好的工作。
- 增大束宽B 意味着在选择单词时有更好的选择 ,但是一味的增大束宽B也会带来不好的结果。
- RNN的功能是计算P(y|x),所以可以通过比较 \(P(y^{ * }|x)\) 和 \(P(\hat{y}|x)\) 的值的大小来判断RNN和束搜索方法的好坏。
\(P(y^{ * }|x) \ge P(\hat{y}|x)\)
束搜索方法选择了 \(\hat{y}\) , RNN计算P(y|x), 而束搜索方法就是找到了 \(\hat{y}\) ,使得P(y|x)达到最大。所以此时能够判断 束搜索方法不能提供一个能是P(y|x)达到最大的y值
\(P(y^{ * }|x) \le P(\hat{y}|x)\)
在例子中设定 \(y^{ * }\) 是比 \(\hat{y}\) 更好的翻译结果,不过根据RNN的概率计算 \(P(y^{ * }|x) \le P(\hat{y}|x)\) 这与P(x|y)的实际定义不符合,RNN应该判断更好的翻译结果具有更高的P(x|y)值,所以此时可以认为是RNN模型出了问题,不能对P(x|y)做出有效的判断。
总结
通过这个过程,你就能执行误差分析得出束搜索算法和RNN模型出错的比例是多少。可以通过对开发集中每一个错误例子(即翻译比人工差的情况)尝试确定这些错误,是搜索算法还是RNN模型出错。并且通过这个过程可以发现其中哪个对翻译出错的影响更大。并且只有当发现是束搜索算法引发了大量错误时,才可以决定增大集束宽度B。如果是发现RNN出了问题,你可以进行更深层次的分析来决定是需要增加正则化还是获取更多的训练数据或是尝试一个不同的网络结构
[DeeplearningAI笔记]序列模型3.3集束搜索的更多相关文章
- [DeeplearningAI笔记]序列模型3.2有条件的语言模型与贪心搜索的不可行性
5.3序列模型与注意力机制 觉得有用的话,欢迎一起讨论相互学习~Follow Me 3.2选择最可能的句子 Picking the most likely sentence condition lan ...
- [DeeplearningAI笔记]序列模型3.9-3.10语音辨识/CTC损失函数/触发字检测
5.3序列模型与注意力机制 觉得有用的话,欢迎一起讨论相互学习~Follow Me 3.9语音辨识 Speech recognition 问题描述 对于音频片段(audio clip)x ,y生成文本 ...
- [DeeplearningAI笔记]序列模型3.7-3.8注意力模型
5.3序列模型与注意力机制 觉得有用的话,欢迎一起讨论相互学习~Follow Me 3.7注意力模型直观理解Attention model intuition 长序列问题 The problem of ...
- [DeeplearningAI笔记]序列模型3.6Bleu得分/机器翻译得分指标
5.3序列模型与注意力机制 觉得有用的话,欢迎一起讨论相互学习~Follow Me 3.6Bleu得分 在机器翻译中往往对应有多种翻译,而且同样好,此时怎样评估一个机器翻译系统是一个难题. 常见的解决 ...
- [DeeplearningAI笔记]序列模型3.1基本的 Seq2Seq /image to Seq
5.3序列模型与注意力机制 觉得有用的话,欢迎一起讨论相互学习~Follow Me 3.1基础模型 [1] Sutskever I, Vinyals O, Le Q V. Sequence to Se ...
- [DeeplearningAI笔记]序列模型1.10-1.12LSTM/BRNN/DeepRNN
5.1循环序列模型 觉得有用的话,欢迎一起讨论相互学习~Follow Me 1.10长短期记忆网络(Long short term memory)LSTM Hochreiter S, Schmidhu ...
- [DeeplearningAI笔记]序列模型1.7-1.9RNN对新序列采样/GRU门控循环神经网络
5.1循环序列模型 觉得有用的话,欢迎一起讨论相互学习~Follow Me 1.7对新序列采样 基于词汇进行采样模型 在训练完一个模型之后你想要知道模型学到了什么,一种非正式的方法就是进行一次新序列采 ...
- [DeeplearningAI笔记]序列模型1.5-1.6不同类型的循环神经网络/语言模型与序列生成
5.1循环序列模型 觉得有用的话,欢迎一起讨论相互学习~Follow Me 1.5不同类型的循环神经网络 上节中介绍的是 具有相同长度输入序列和输出序列的循环神经网络,但是对于很多应用\(T_{x}和 ...
- [DeeplearningAI笔记]序列模型1.3-1.4循环神经网络原理与反向传播公式
5.1循环序列模型 觉得有用的话,欢迎一起讨论相互学习~Follow Me 1.3循环神经网络模型 为什么不使用标准的神经网络 假如将九个单词组成的序列作为输入,通过普通的神经网网络输出输出序列, 在 ...
随机推荐
- 5个最优秀的微信小程序UI组件库
开发微信小程序的过程中,选择一款好用的组件库,可以达到事半功倍的效果.自从微信小程序面世以来,不断有一些开源组件库出来,下面5款就是排名比较靠前,用户使用量与关注度比较高的小程序UI组件库.还没用到它 ...
- 你用 Python 做过什么有趣的数据挖掘项目?
有网友在知乎提问:「你用 Python 做过什么有趣的数据挖掘项目?」 我最近刚开始学习 Python, numpy, scipy 等, 想做一些数据方面的项目,但是之前又没有这方面的经验.所以想知道 ...
- 60行代码:Javascript 写的俄罗斯方块游戏
哈哈这个实在是有点意思 备受打击当初用java各种类写的都要几百行啦 先看效果图: 游戏结束图: javascript实现源码: [javascript] view plaincopyprint? & ...
- map的默认排序和自定义排序
STL的容器map为我们处理有序key-value形式数据提供了非常大的便利,由于内部红黑树结构的存储,查找的时间复杂度为O(log2N). 一般而言,使用map的时候直接采取map<typen ...
- C语言文法阅读与理解
<翻译单元>--><外部声明>--><函数定义>|<申报> <函数定义>--><声明说明符>-->< ...
- 探究Android中通过继承ViewGroup自定义控件的原理
原文地址:http://www.cnblogs.com/kross/p/3378395.html 今天断断续续的折腾了一下午到现在20:38,终于有点明白了.o(╯□╰)o 在Android开发中,我 ...
- XHTML5 与 HTML 4.01的差异
在 HTML 4.01 中,td 元素的 "bgcolor"."height"."width" 以及 "nowrap" ...
- javascript+html5+css3下拉刷新 数据效果
文章摘自:suchso.com/projecteactual/javascript-html5-css3-taobao-xiala-data.html segmentfault.com/a/11900 ...
- HttpHandler与HttpModule的理解与应用
问题1:什么是HttpHandler? 问题2:什么是HttpModule? 问题3:什么时候应该使用HttpHandler什么时候使用HttpModule? 答案1:HttpHandler,Http ...
- 【Python】python学习文件的序列化和反序列化
json和pickle序列化和反序列化 json是用来实现不同程序之间的文件交互,由于不同程序之间需要进行文件信息交互,由于用python写的代码可能要与其他语言写的代码进行数据传输,json支持所有 ...