Empirical Analysis of Beam Search Performance Degradation in Neural Sequence Models

 2019-06-13 10:28:44

Paper: [abs] [Download PDF][Supplementary PDF] Eldan Cohen, Christopher Beck ; PMLR 97:1290-1299

1. Background and Motivation:

Beam search 是一种常用在时序任务中解码算法,如:NLP 中的语言翻译,Image Captioning 等。不同于一般的贪婪搜索策略,该算法会始终维持相同的搜索宽度,最终会输出该宽度的多个搜索结果。就是因为这种天然的优势,该算法被广泛的应用于各种时序任务中。但是,大量的研究表明,beam search 存在如下的不足:“随着 width” 的增加,最终的效果也会不断降低,即:增加 width,不能提升效果,该算法只能在特定的较小的 width 条件下,才会 work 的很好。

针对上述问题,作者在本文中在多个任务上进行了大量的实验,来研究这个问题:machine translation,abstract summarization, and image captioning。作者在这些实验的基础上,提出了一种可解释的模型,该模型基于 search discrepancies(搜索差异性) 的概念,然后基于该差异性的分布进行了经验性的研究。主要贡献如下:

1). 本文表明增加 beam width 将会导致 solution 在早期有较大的不一致性 (discrepancies);这些序列通常会有较低的评价得分,从而导致最终的性能衰减。

2). 本文所提出的 explanatory model generalizes the previouly observed "copies" and predictions that repeat training set targets and accounts for more of the degraded predictions.

3).  本文表明对 beam search 进行修改,使其不考虑 large search discrepancies 可以有效的缓解性能衰减。

2. Neural Sequence Models

在神经序列模型中,通过充分的搜索以求得一个全局最优序列几乎是不可能的。贪心算法会在每一个时刻,选择一个最优的候选,使得序列局部最优,但是可能最终得到的仅仅是一个局部次优的序列。Beam search 将每一个时刻的可能序列宽度拓展为 B,这个 B 称为 beam width。正式的来说,beam search candidate 通过如下的方式进行更新:

本文将 search discrepancy 定义为:extending a partial sequence with a token that is not the most probable one. 正式的来说,一个序列 y 在时刻 t 有一个 search discrepancy,如果其满足如下的条件:

我们将最可能的 token 和 选择的 token 的差异性,取 log,记为:

为了说明该 discrepancy gap 是如何计算的,我们给出了上图1。具有最高条件概率候选的 discrepancy gap 为 0,其他候选之间的 gap 就是其 log 概率的距离。

3. Discrepancy-Constrained Beam Search:

本文评价了两种类似 trick 的方法来约束 beam search,都是考虑到较大的搜索差异。

Discrepancy Gap

给定阈值 M,我们修改 beam search 来仅仅考虑搜索差异小于等于 M 的候选。正式的来说,我们修改公式 1,使其包含这一约束:

Beam Candidate Rank

给定阈值 N,我们修改 $y_t$ 使其在每一个 beam 中仅仅包含 top N one-token extensions。注意到,beam search 仍然保持 top B candidates,然而在每一个 beam 中,其不会考虑超过 N 的候选。

4. Experiments

作者的实验表明,当考虑到作者提到的不一致性约束时,在增加 beam width 的时候,就不存在精度下降的问题了。但是这个表格貌似也反映了,beam width 设置的太大,有些情况下,并不会明显提升精度,反而有可能降低。到底该不该设置较大的 beam width,还是应该调调参数,试试才知道哇。

==

最新文章

  1. display:block 不起作用
  2. IOS 推送消息 php做推送服务端
  3. angularJs模糊查询
  4. debian hosts文件中的 127.0.1.1 主机地址
  5. Python 基础篇:字符编码、函数
  6. hpuoj 问题 C: 善良的国王【最小生成树kurskal】
  7. C语言博客作业--数据类型
  8. React Fiber 数据结构揭秘
  9. Struts2.5学习笔记----org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter报错
  10. 吴恩达课后作业学习2-week3-tensorflow learning-1-基本概念
  11. L1-033 出生年
  12. eclipse启动出现Could not read metadata for ……
  13. 02 如何创建线程 线程并发与synchornized
  14. Linux软中断、tasklet和工作队列
  15. poj-1989 The Cow Lineup
  16. mysql 开启远程访问
  17. 读取数据库信息并生成表设计文档Word版本
  18. webrtc前景如何
  19. 80端口占用异常解决方法java.net.BindException: Address already in use: JVM_Bind:80(或8080)
  20. hive表与外部表的区别

热门文章

  1. RocketMQ在CentOS7上安装
  2. java验证邮件正则
  3. SWD烧录/仿真方式
  4. O(n) 取得数组中每个元素右边最后一个比它大的元素
  5. ThinkPHP模板之一
  6. monkey内存泄露
  7. STLNormalFunc
  8. K-Nearest Neighbors Algorithm
  9. L1443
  10. Greenplum 资源队列(转载)