[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循环神经网络模型 为什么不使用标准的神经网络 假如将九个单词组成的序列作为输入,通过普通的神经网网络输出输出序列, 在 ...
随机推荐
- 使用 Sublime Text 做 Javascript 编辑器 - 集成 JSHint 问题检测工具
JSHint(jshint.com)是 Javascritp 代码质量工具,可以帮助开发人员发现 Javascript 代码中的错误和潜在的问题.jshint.com 是一个在线编辑器,我们可以为 S ...
- baidu网盘下载神器 Pandownload
最近百度网盘超级会员到期,经同学的推荐,我最近发现了一个特别NB的工具pandownload,官方说是能够破解加速,经过使用确实能够达到很快的下载速度. 这里附上官方的下载网站 http://pand ...
- WCF RestFull提交数据超出限额解决方法
最近在使用wcf restfull时出现了超大数据提交出错的问题. 服务端会返回错误:服务器处理请求时遇到错误.有关构造有效服务请求的内容,请参阅服务帮助页.异常消息为“反序列化对象 属于类型 Yes ...
- OpenLayers 3 入门教程
OpenLayers 3 入门教程摘要OpenLayers 3对OpenLayers网络地图库进行了根本的重新设计.版本2虽然被广泛使用,但从JavaScript开发的早期发展阶段开始,已日益现实出它 ...
- Oracle数据库表空间常用操作
1. 查看所有表空间大小 SQL> select tablespace_name,sum(bytes)/1024/1024 from dba_data_files group by tables ...
- SQL SERVER SA密码忘记,windows集成身份验证都登录不了不怎么办
有时候SQL SERVER 的SA强密码策略真的很烦人,不同的系统密码策略又不一样,导致经常会忘记密码,这不,这回我本机的SQL SERVER很久不用了,彻底忘了密码是什么.查了一下资料还是找到了解决 ...
- List、Set、Map典型实现
1:集合 Collection(单列集合) List(有序,可重复) ArrayList 底层数据结构是数组,查询快,增删慢 线程不安全,效率高 Vector 底层数据结构是数组,查询快,增删慢 线程 ...
- 一张图看懂css的position里的relative和absolute的区别
position有以下属性:static.inherit.fixed.absolute.relative前三个好理解好区分:static:是默认状态,没有定位,元素出现在正常的流中(忽略 top, b ...
- 【Python】Python基础教程系列目录
Python是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. 在现在的工作及开发当中,Python的使用越来越广泛,为了方便大家的学习,Linux大学 特推出了 <Python基 ...
- 方法调用时候 传入this 谁调用 传入谁
方法调用时候 传入this 谁调用 传入谁