【NLP】选择目标序列:贪心搜索和Beam search
构建seq2seq模型,并训练完成后,我们只要将源句子输入进训练好的模型,执行一次前向传播就能得到目标句子,但是值得注意的是:
seq2seq模型的decoder部分实际上相当于一个语言模型,相比于RNN语言模型,decoder的初始输入并非0向量,而是encoder对源句子提取的信息。因此整个seq2seq模型相当于一个条件语言模型,本质上学习的是一个条件概率,即给定输入\(x\),学习概率分布\(P(y|x)\)。得到这个概率后,对应概率最大的目标句子\(y\)就是模型认为的最好的输出。我们不希望目标的输出是随机的(这相当于对学习的概率分布\(P(y|x)\)随机取样),但要选择最好的句子\(y\)需要在decoder的每一步遍历所有可能的单词,假如目标句子的长度为\(n\),词典大小为\(v\),那么显然,可能的句子数量是\(v^n\),这显然是做不到的。
1 Greedy search
一个自然的想法是贪心搜索(greedy search),即decoder的每一步都选择最可能的单词,最后得到句子的每一个单词都是每一步认为最合适的单词。但这样并不保证整个句子的概率是最大的,即不能保证整个句子最合适。实际上,贪心搜索的每一步搜索都处理成仅仅与前面刚生成的一个单词相关,类似于马尔科夫假设。这显然是不合理的,具体来说,贪心搜索到的句子\(y\)概率是使得下式概率最大:
\(P(y|x) = \prod_{k=1}^{n}{p(y_k|x,y_{k-1})}\)
而实际上,根据全概率公式计算得到\(P(y|x)\)为:
\(P(y|x) = \prod_{k=1}^{n}p(y_k|x,y_1,y_2,...,y_{k-1})\)
2 Beam search
译为束搜索。思想是,每步选取最可能的\(k\)个结果,再从最后的\(k\)个结果中选取最合适的句子。\(k\)称为beam size。
具体做法是:
首先decoder第一步搜索出最可能的\(k\)个单词,即找到\(y_{11},y_{12},...,y_{1k}\),他们的概率\(p(y_{11}|x),...,p(y_{1k}|x)\)为最大的\(k\)个。
进行第二步搜索,分别进行\(k\)个模型副本的搜索。每个副本\(i\),根据上一步选取的单词\(y_{1i}\),选取概率最大的\(k\)个结果\(y_{21},y_{22},...,y_{2k}\)。这样,就有了\(k*k\)个可能的结果,从这些结果中选择\(k\)个概率最大的结果,即\(p(y_{1i}|x)*p(y_{2j}|x,y_{1i})\)最大的\(k\)个结果。
进行第三步搜索,从第二步中确定的\(k\)个结果出发,再进行\(k\)个模型副本的搜索,直到最后一步,从最后的\(k\)个结果中选取概率最大者。
显然,若\(k=1\)则为贪心搜索,\(k\)越大则占用内存越大,计算代价越大,实际应用中取10即可。
另外,可以发现概率的连乘使得概率越来越小,很可能溢出,为了保证模型的稳定性,常对概率连乘计算+log变为加法。
\(P(y|x) = log(\prod_{k=1}^{n}p(y_k|x,y_1,y_2,...,y_{k-1}))\)
3 改进Beam search
从Beam search的搜索过程中可以发现,Beam search偏向于找到更短的句子,也就是说,如果搜索过程中有一支搜索提前发现了\(<EOS>\),而另外\(k-1\)支继续搜索找到其余更长的结果,那么由于概率连乘(或log连加),越长的结果概率肯定越小。因此有必要进行模型修正,即进行长度归一化,具体来说,即:
选择概率\(P(y|x) = \frac{1}{n}log(\prod_{k=1}^{n}p(y_k|x,y_1,y_2,...,y_{k-1}))\)最大的句子,式中,\(n\)为该结果序列长度。
另外,实践中还做了如下修正:
\(P(y|x) = \frac{1}{n^\alpha}log(\prod_{k=1}^{n}p(y_k|x,y_1,y_2,...,y_{k-1}))\)
式中,超参数\(\alpha\)取0.7比较合适。
4 误差分析
对于训练的seq2seq模型,对它输出的句子\(y\),以及实际的句子\(y^*\),若概率\(y\)大于\(y^*\),(统计所有句子,平均来说是这个结果),则说明,seq2seq模型出错了。否则,说明,baem search并没有找到最合适的结果,可以考虑增大beam size大小。
【NLP】选择目标序列:贪心搜索和Beam search的更多相关文章
- Beam Search快速理解及代码解析
目录 Beam Search快速理解及代码解析(上) Beam Search 贪心搜索 Beam Search Beam Search代码解析 准备初始输入 序列扩展 准备输出 总结 Beam Sea ...
- Beam Search快速理解及代码解析(上)
Beam Search 简单介绍一下在文本生成任务中常用的解码策略Beam Search(集束搜索). 生成式任务相比普通的分类.tagging等NLP任务会复杂不少.在生成的时候,模型的输出是一个时 ...
- 集束搜索beam search和贪心搜索greedy search
贪心搜索(greedy search) 贪心搜索最为简单,直接选择每个输出的最大概率,直到出现终结符或最大句子长度. 集束搜索(beam search) 集束搜索可以认为是维特比算法的贪心形式,在维特 ...
- [DeeplearningAI笔记]序列模型3.2有条件的语言模型与贪心搜索的不可行性
5.3序列模型与注意力机制 觉得有用的话,欢迎一起讨论相互学习~Follow Me 3.2选择最可能的句子 Picking the most likely sentence condition lan ...
- 实现nlp文本生成中的beam search解码器
自然语言处理任务,比如caption generation(图片描述文本生成).机器翻译中,都需要进行词或者字符序列的生成.常见于seq2seq模型或者RNNLM模型中. 这篇博文主要介绍文本生成解码 ...
- Beam Search(集束搜索/束搜索)
找遍百度也没有找到关于Beam Search的详细解释,只有一些比较泛泛的讲解,于是有了这篇博文. 首先给出wiki地址:http://en.wikipedia.org/wiki/Beam_searc ...
- BLAST - 序列数据库搜索
我生信入门,老师就要求我学好blast比对,说得也确实是很有道理,是个人都知道比对是最基本的东西,现在再想想那老师的建议,也只能呵呵一笑. 北大生物信息公开课有一章专门讲得序列数据库搜索,可以好好看看 ...
- LeetCode 81. Search in Rotated Sorted Array II(在旋转有序序列中搜索之二)
Follow up for "Search in Rotated Sorted Array":What if duplicates are allowed? Would this ...
- LeetCode 33. Search in Rotated Sorted Array(在旋转有序序列中搜索)
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...
随机推荐
- 浅谈基于Intellij IDEA Maven的配置与使用
在java开发中,引入jar包的方式从种类上划分,可分为自动导入和手动导入,然而,手动导入繁琐,不是很适合当前开发模式,手动导入也被自动导入所取代. 当前,Maven和Gradle是比较主流的自动导入 ...
- 服务器配置java
先去链接下载jdk or jre(服务器上这个就好) 然后解压 tar 下载的文件,放到/usr/local/java/jdk_xxx下面 -v: 可视化显示进度. Enables verbose m ...
- 如何使用git和ssh部署本地代码到服务器
一.首先设置好自己本地的Git用户名和密码: git config --global user.name "your name" git config --global user. ...
- 表单数据验证方法(一)—— 使用validate.js实现表单数据验证
摘要:使用validate.js在前端实现表单数据提交前的验证 好久没写博客了,真的是罪过,以后不能这样了,只学习不思考,学的都是白搭,希望在博客园能记录下自己学习的点滴,虽然记录的都是些浅显的技术, ...
- DS控件库 DS开放式下拉列表
在一些场合中,需要使用组合式下拉列表控件,比如带treeivew的combobox,但是代码较多,使用不便.为此,本人制作了一个超级易用的DS开放式下拉列表. 以下演示使用过程. Private Su ...
- javascript小记三则:ASP.NET启动web调试,窗体自动放大的方法
源码如下,简单一句JS,轻松解决窗体不会自动放大的浏览器: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN& ...
- 根据点击事件去选取电脑中.rvt文件
private void button_Click(object sender, RoutedEventArgs e) { //这个选出来是文件夹 //选择文件 var openFileDialog ...
- MongoDB自学(3)
MongoDB关系:MongoDB的关系表示多个文档之间在逻辑上的相互联系.文档之间可以通过嵌入和引用来建立联系.关系:1:11:NM:1M:N 嵌入式:{ id:11;name:嘻嘻嘻;addres ...
- SpringBoot Mybatis 使用LocalDateTime
mybatis-spring-boot-starter 2.0.1 会报错,不知道如何解决(建议先不用) mybatis-spring-boot-starter 2.0.1 - 1.3.2 版本不会报 ...
- idea中Springcloud同时运行多个模块、微服务
idea中有个窗口叫做 Run DashBoard 在这里可以管理多个模块的启停,这个面板一般情况下是关闭的打开Run DashBoard面板 在工程的.idea中找到workspace.xml,并找 ...