构建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大小。

转载于:https://www.cnblogs.com/duye/p/10680076.html

【NLP】选择目标序列:贪心搜索和Beam search相关推荐

  1. 贪心搜索(greedy search)、集束搜索(beam search)、随机采样(random sample)

    当我们训练完成一个自然语言生成模型后,需要使用这个模型生成新的语言(句子),如何生成这些句子,使用如下的方法:贪心搜索,集束搜索,随机搜索. 贪心搜索(greedy search)/采样(Sampli ...

  2. 集束搜索(beam search)和贪心搜索(greedy search)

    最近读论文的时候看到文中经常用到集束搜索(beam search),可能很多人不懂这到底是个什么算法,其实很简单,顺便把贪心搜索(greedy search)也介绍一下. 贪心搜索(greedy se ...

  3. 集束搜索(Beam Search)

    来源:Coursera吴恩达深度学习课程 我们来看看集束搜索(beam search)算法,上篇文章选择最可能的句子讲了对于机器翻译来说,给定输入(法语句子),我们并不想要一个随机的英语翻译结果,而是 ...

  4. 集束搜索(Beam Search Algorithm )

    看计算机科学中最重要的32个算法,其中有个是集束搜索(又名定向搜索,Beam Search)--最佳优先搜索算法的优化.使用启发式函数评估它检查的每个节点的能力.不过,集束搜索只能在每个深度中发现前m ...

  5. 集束搜索【beam search】

    说明:用于在搜索中选择较优的结果,相对于暴力搜索减少了存储和计算资源.常被用于文本生成任务中. 主要思想:以se2seq为例(一般用于测试,因为在训练的时候已经知道最优解),在decoder部分,假设 ...

  6. NLP自然语言处理 集束搜索(beam search)和贪心搜索(greedy search)

    https://blog.csdn.net/qq_16234613/article/details/83012046 https://blog.csdn.net/weixin_38937984/art ...

  7. 改进集束搜索(Refinements to Beam Search)

    来源:Coursera吴恩达深度学习课程 上篇文章介绍了基本的集束搜索(Beam Search),这篇文章我们进一步学习一些技巧,能够使算法运行的更好. 如上图,长度归一化(Length normal ...

  8. Greedy search与beam search

    最近在看End-to-end Relation Extraction using LSTMs on Sequences and Tree Structures这篇文章时,看到此文在Entity det ...

  9. 如何通俗的理解beam search?

    大家好,我是小飞,今天讲解下机器学习中常用到的一种搜索算法beam search(束搜索).为了方便大家理解,这里先假设一个非常简单的搜索任务. 假设一个搜索任务 假设现在有一个简化版的中文翻译英文任 ...

最新文章

  1. Oracle数据库物理存储结构管理
  2. Codeforces Beta Round #14 (Div. 2) B. Young Photographer 水题
  3. HTML超文本描述语言,HTML超文本标记语言的介绍
  4. Android 控件之RatingBar评分条
  5. java中showconfirmdialog_Java实现超市管理系统(含数据库)
  6. Divergent series
  7. 2019白金之星 第一次初赛 第一题 Polynomial
  8. Kaggle注册无法进行人机验证You did not enter the correct captcha
  9. docker腾讯云加速器
  10. nginx中upstream的max_conns属性使用
  11. ArcGIS 利用全局(局域)空间自相关分析进行城市不同家庭收入情况的空间集聚分析
  12. 迅捷pdf编辑器是如何编辑pdf文件的
  13. 汇编/源操作数/目的操作数
  14. pinia报错, getActivePinia was called with no active Pinia. Did you forget to install pinia?
  15. red5+obs+ffmpeg 推流实现单方直播 window +linux
  16. 机器学习-sklearn第十二天——笔记
  17. 对话腾讯天琴赵伟峰:当音乐与科技结合,会碰撞出怎样的火花?
  18. CPU拓扑结构中的Die等级是指什么?
  19. word中如何批量更新题注(域)
  20. docker容器访问宿主机mysql数据库

热门文章

  1. 如何查看AWS实例上使用的key value pair名称
  2. 如何在Github里创建organization和代码仓库
  3. 如何在ubuntu上安装virtualbox的driver module vboxdrv
  4. android分层测试,Android视图层次和性能的检测(官方)
  5. 文字描边_学会这种描边效果,你的PPT也能这么好看
  6. wps 模拟分析 规划求解_【网友来稿】利用Excel求解线性规划问题
  7. oracledatabase11gr2怎么打开_win10 安装oracle 11gR2_database(内附下载地址)
  8. bootstraptable控制分页_bootstrap-table后端分页功能完整实例
  9. 混合音乐推荐系统_比女朋友更懂你的“音乐推荐系统”,是怎样搭建出来的?...
  10. mysql保持开启事件调度器_MySQL 5.1.6开始的事件调度器