文章目录

  • Beam Search 及优化
    • 1. Review Beam Search
    • 2. Beam Search Refinement
      • 2.1 Hypothesis filtering
      • 2.2 Normalization
        • 2.2.1 Length Normalization
        • 2.2.2 Coverage Normalization
        • 2.2.3 End of sentence Normalization
      • 2.3 Decoding with auxiliary language model
      • 2.4 Decoding with lexical constraints
      • 2.5 Search algorithms
    • 3. References

Beam Search 及优化

1. Review Beam Search

参考:吴恩达 深度学习 笔记 Course 5 Week 3 Sequence Models

回顾beam search:

对greedy search进行了改进:扩大搜索空间,更容易得到全局最优解。beam search包含一个参数beam width B B B,表示每个时间步保留得分最高的B个序列,然后下一时间步用这 B B B个候选序列继续生成。

在sequence models中,input text { x < 1 > , … , x < T x > } \{x^{<1>},\dots,x^{<T_x>}\} {x<1>,…,x<Tx​>}输入Encoder,再通过Decoder,softmax层会输出词表大小 ∣ V ∣ |V| ∣V∣个输出概率值。
Beam Search的步骤:

  1. 找到第一个输出的概率值 P ( y < 1 > ∣ x ) P(y^{<1>}|x) P(y<1>∣x),取最大的前 B B B个单词保存。
  2. 分别计算前面 B B B种情况下的Decoder输出 P ( y < 2 > ∣ x , y < 1 > ) P(y^{<2>}|x,y^{<1>}) P(y<2>∣x,y<1>),将会有 B ⋅ ∣ V ∣ B\cdot|V| B⋅∣V∣个结果,最大化整个句子的概率 P ( y < 1 > , y < 2 > ∣ x ) = P ( y < 1 > ∣ x ) P ( y < 2 > ∣ x , y < 1 > ) P(y^{<1>},y^{<2>}|x)=P(y^{<1>}|x)P(y^{<2>}|x,y^{<1>}) P(y<1>,y<2>∣x)=P(y<1>∣x)P(y<2>∣x,y<1>),即第一个、第二个词对有最大的概率,从中选择概率最高的 B B B个结果并保存。
  3. 每一步都有 B B B个网络副本,来评估下一个单词的概率。继续计算并选择,直到出现句尾符号<EOS>

吴恩达的Andrew Ng的Coursera深度学习课程中提出了Beam Search的Refinement,如下面Normalization的第一部分。

这里我总结了Beam Search的优化方法有几类:

  • Hypothesis filtering:对生成的候选序列进行过滤。
  • Normalization:针对Beam Search得分函数的改进。
  • Decoding with auxiliary language model:利用辅助语言模型改进decoder。
  • Decoding with lexical constraints:添加对单词或短语的限制,decoder生成时需要参照限制词表。
  • Search algorithms:优化搜索策略,寻找更高效的算法。

2. Beam Search Refinement

2.1 Hypothesis filtering

可以通过控制 (unkown words) 数量来对 beam search 生成的 hypotheses 进行 filtering. 当一个 hypothese 包含太多 时可以将其 drop 掉。需要注意的是,drop hypotheses 会暂时降低 beam size。

2.2 Normalization

主要是对beam search的得分函数进行改进,包括对输出句子的长度和coverage添加惩罚。

2.2.1 Length Normalization

参考:吴恩达 深度学习 笔记 Course 5 Week 3 Sequence Models

Beam Search 要最大化的概率 P ( y < 1 > , … , y < T y > ∣ X ) P(y^{<1>},\dots,y^{<T_y>}|X) P(y<1>,…,y<Ty​>∣X),即衡量整个句子的概率,可以表示成条件概率的乘积:
P ( y < 1 > , … , y < T y > ∣ X ) = P ( y < 1 > ∣ X ) P ( y < 2 > ∣ X , y < 1 > ) P ( y < 3 > ∣ X , y < 1 > , y < 2 > ) … P ( y < T y > ∣ X , y < 1 > , y < 2 > , … , y < T y − 1 > ) P(y^{<1>},\dots,y^{<T_y>}|X)=P(y^{<1>}|X)P(y^{<2>}|X,y^{<1>})P(y^{<3>}|X,y^{<1>},y^{<2>})\dots P(y^{<T_y>}|X,y^{<1>},y^{<2>},\dots,y^{<T_y-1>}) P(y<1>,…,y<Ty​>∣X)=P(y<1>∣X)P(y<2>∣X,y<1>)P(y<3>∣X,y<1>,y<2>)…P(y<Ty​>∣X,y<1>,y<2>,…,y<Ty​−1>)

因为每个条件概率都是小于1,多个小于1的数值相乘,会造成数值下隘(numerical underflow)。数值太小,导致电脑的浮点表示不能精确地存储,所以实践中不能最大化这个乘积,而是取 l o g log log值。

最大化 l o g P ( y ∣ x ) logP(y|x) logP(y∣x)求和的概率值,数值更稳定,不容易出现数值误差(rounding errors)或数值下溢。因为对数函数( l o g log log函数)是严格单调递增的函数,最大化 l o g P ( y ∣ x ) logP(y|x) logP(y∣x)和最大化 P ( y ∣ x ) P(y|x) P(y∣x)是等价的。实际工作中,我们总是记录概率的对数和(the sum of logs of the probabilities),而不是概率的乘积(the production of probabilities)。

总结对beam search的目标函数的改进:

  • 对于beam search的原始目标函数

a r g max ⁡ y ∏ t = 1 T y P ( y < t > ∣ X , y < 1 > , … , y < t − 1 > ) arg \max_{y} \prod_{t=1}^{T_y}P(y^{<t>}|X,y^{<1>},\dots,y^{<t-1>}) argymax​t=1∏Ty​​P(y<t>∣X,y<1>,…,y<t−1>)

如果一个句子很长,那么这个句子的概率会很低,因为多个小于1的数字相乘得到一个更小的概率值。这个目标函数会倾向于短的输出,因为短句子的概率由更少数的小于1的数字乘积得到。

  • 对于改进后的beam search的目标函数

a r g max ⁡ y ∑ t = 1 T y l o g P ( y < t > ∣ X , y < 1 > , … , y < t − 1 > ) arg \max_{y} \sum_{t=1}^{T_y}logP(y^{<t>}|X,y^{<1>},\dots,y^{<t-1>}) argymax​t=1∑Ty​​logP(y<t>∣X,y<1>,…,y<t−1>)

每个概率 P ( y ∣ x ) ∈ ( 0 , 1 ] P(y|x)\in(0,1] P(y∣x)∈(0,1],而 l o g P ( y ∣ x ) log P(y|x) logP(y∣x)是负数。如果句子很长,加起来的项很多,结果越为负。所以这个目标函数也会影响较长的输出,因为长句子一直累加目标函数的值会十分小。

  • 改进beam search:引入归一化,降低输出长句子的惩罚。

a r g max ⁡ y 1 T y α ∑ t = 1 T y l o g P ( y < t > ∣ X , y < 1 > , … , y < t − 1 > ) arg \max_{y} \frac{1}{T_y^{\alpha}}\sum_{t=1}^{T_y}logP(y^{<t>}|X,y^{<1>},\dots,y^{<t-1>}) argymax​Tyα​1​t=1∑Ty​​logP(y<t>∣X,y<1>,…,y<t−1>)

α ∈ [ 0 , 1 ] \alpha\in [0,1] α∈[0,1]是一个超参数,一般取 α = 0.7 \alpha=0.7 α=0.7。取值是试探性的,可以尝试不同的值,看哪一个能得到最好的结果。

  • α = 0 \alpha=0 α=0,不归一化。
  • α = 1 \alpha=1 α=1,标准的长度归一化。

在Beam Search最后使用上式选择一个最优的句子。

如何选择 B B B?

  • B B B越大(10~100),考虑的情况越多,得到更好的结果,计算量越大,速度越慢。
  • B B B取小(1~10),得到的结果可能不够好,计算速度快。
  • 一般选择 B = 10 B=10 B=10。

Beam Search与DFS/BFS不同,是近似搜索算法/启发式算法,不是找全局最优,而是找局部最优。

在实际项目中,如何发现是RNN模型出了问题,还是Beam Search出了问题?

增加 B B B一般不会影响模型,就像增加数据集。

Beam Search中的误差分析:

在翻译任务中, y ∗ y^* y∗表示人工翻译结果, y ^ \hat{y} y^​表示算法结果。

用RNN模型计算 P ( y ∗ ∣ x ) P(y^*|x) P(y∗∣x)和 P ( y ^ ∣ x ) P(\hat{y}|x) P(y^​∣x),即比较期望值概率和输出概率的大小,来发现是RNN还是Beam Search的问题。

  • 第一种情况: P ( y ∗ ∣ x ) > P ( y ^ ∣ x ) P(y^*|x)>P(\hat{y}|x) P(y∗∣x)>P(y^​∣x),Beam Search出错。

    期望值概率更高,但是Beam Search没有选择期望值,是Beam Search的问题,可以通过增加B来改善。

  • 第二种情况: P ( y ∗ ∣ x ) ≤ P ( y ^ ∣ x ) P(y^*|x)\le P(\hat{y}|x) P(y∗∣x)≤P(y^​∣x),RNN模型出错,需要在RNN模型上花更多时间。

    RNN模型给出了错误的概率 P ( y ∗ ∣ x ) P(y^*|x) P(y∗∣x),给一个好的句子小的概率。可以通过正则化,更大的训练数据,不同的网络结构等方法改进。

如果使用长度归一化,则需要用归一化后的值来判断。

误差分析过程如下图所示,先遍历development set,找出算法产生的错误。例如, P ( y ∗ ∣ x ) = 2 × 1 0 − 10 , P ( y ^ ∣ x ) = 1 × 1 0 − 10 P(y^*|x)=2\times 10^{-10}, P(\hat{y}|x)=1\times 10^{-10} P(y∗∣x)=2×10−10,P(y^​∣x)=1×10−10,属于第一种情况,Beam Search出错。后面依次标注错误类型,通过这个误差分析过程,得出Beam Search和RNN模型出错的比例是多少。如果发现Beam Search造成大部分错误,可以增大beam width。相反,如果发现RNN模型造成更多错误,可以进行更深层次的分析:是否需要增加正则化、获得更多训练数据、尝试一个不同的网络结构或其他方案。

2.2.2 Coverage Normalization

论文1:Coverage-based Neural Machine Translation

论文2:Google’s Neural Machine Translation System: Bridging the Gapbetween Human and Machine Translation

这里将Beam Search 的目标函数称为Beam Search得分函数score。采用对数似然作为得分函数,如下所示,Beam Search会倾向于更短的序列。引入length normalization对长度进行归一化可以解决这一问题。
s c o r e ( x , y ) = ∑ t = 1 T y l o g P ( y t ∣ x , y < t ) score(x,y)=\sum_{t=1}^{T_y}logP(y_t|x,y_{<t}) score(x,y)=t=1∑Ty​​logP(yt​∣x,y<t​)
2016年华为诺亚方舟实验室的论文1提到,机器翻译的时候会存在over translation or undertranslation due to attention coverage 。作者提出了coverage-based atttention机制来解决coverage 问题。

Google’s Neural Machine Translation System 的论文2<7. Decoder>提出了 length normalization 和 coverage penalty。coverage penalty 主要用于使用 Attention 的场合,通过 coverage penalty 可以让 Decoder 均匀地关注于输入序列 x 的每一个 token,防止一些 token 获得过多的 Attention。

论文2把对数似然、length normalization 和 coverage penalty 结合在一起,可以得到新的beam search得分函数,如下面的公式所示,其中 X X X是source, Y Y Y是当前target, l p lp lp 是 length normalization, c p cp cp 是 coverage penalty, p i , j p_{i,j} pi,j​是第 j j j个target对应第 i i i个输入的Attention值。超参数 α \alpha α和 β \beta β分别控制length normalization 和 coverage penalty。如果 α = 0 & β = 0 \alpha=0 \;\& \;\beta=0 α=0&β=0,Decoder就退回普通的Beam Search。

2.2.3 End of sentence Normalization

参考:Beam search

有时Decoder生成序列很难停止,此时需要对最大生成长度进行控制,可以采用下面的公式进行约束:
e p ( X , Y ) = γ ∣ X ∣ ∣ Y ∣ ep(X,Y)=\gamma\frac{|X|}{|Y|} ep(X,Y)=γ∣Y∣∣X∣​
其中 ∣ X ∣ |X| ∣X∣是source的长度, ∣ Y ∣ |Y| ∣Y∣是当前target的长度, γ \gamma γ是End of sentence normalization的系数。那么由上式可知,target长度越长的话,上述得分越低,这样就会防止出现生成序列不停止的情况。

对于得分函数的改进方法,还有很多,例如有论文《 A Diversity-Promoting Objective Function for Neural Conversation Models》采用最大化互信息MMI(Maximum Mutual Information)作为目标函数,也可以作为Beam Search的得分函数。

2.3 Decoding with auxiliary language model

Beam search 还可以利用一个辅助的 language model 来定义 score function, 例如 “Shallow Fusion”:
s ( Y , X ) = s T M ( Y , X ) + β ⋅ s L M ( Y ) s(Y,X)=s_{TM}(Y,X)+\beta \cdot s_{LM}(Y) s(Y,X)=sTM​(Y,X)+β⋅sLM​(Y)
其中 s L M ( Y ) s_{LM}(Y) sLM​(Y)是输出序列 Y Y Y的语言模型 L M LM LM的对数概率, β \beta β是一个超参数。需要注意的是语言模型 L M LM LM不能使用双向RNN,需要与翻译模型 T M TM TM共享相同的词汇表(标记和特征)。

2.4 Decoding with lexical constraints

添加词表的限制,使得beam search只要在输入端找到对应的source token,那就限制词语或短语的生成。在论文Lexically Constrained Decoding for Sequence Generation Using Grid Beam Search中描述了Grid Beam Search方法,接受简单的one-token constraints。

2.5 Search algorithms

论文《Best-First Beam Search》关注于提升 Beam Search 的搜索效率,提出了 Best-First Beam Search 算法,Best-First Beam Search 可以在更短时间内得到和 标准Beam Search 相同的搜索结果。论文中提到 Beam Search 的时间和得分函数调用次数成正比,如下图所示,因此作者希望通过减少得分函数的调用次数,从而提升 Beam Search 效率。

Best-First Beam Search 使用了优先队列并定义新的比较运算符,从而可以减少调用得分函数的次数,更快停止搜索。

3. References

Beam search

Google’s Neural Machine Translation System: Bridging the Gapbetween Human and Machine Translation

【RNN】深扒能提高预测准确率的beam search

Coursera深度学习教程中文笔记

Sequence Models

吴恩达 深度学习 笔记 Course 5 Week 3 Sequence Models

详细介绍 Beam Search 及其优化方法

beam Seach refinement

Modeling Coverage for Neural Machine Translation

COVERAGE-BASEDNEURALMACHINETRANSLATION

Coverage-based Neural Machine Translation

A Diversity-Promoting Objective Function for Neural Conversation Models

A Diversity-Promoting Objective Function for Neural Conversation Models论文阅读

Best-First Beam Search

欢迎各位关注我的个人公众号:HsuDan,我将分享更多自己的学习心得、避坑总结、面试经验、AI最新技术资讯。

Beam Search 及5种优化方法相关推荐

  1. C/C++冒泡排序4种优化方法

    冒泡排序应该是大多数人接触的第一种排序方法,虽然它的时间复杂度为O(n^2),但是它简单易懂,代码复杂度低,所以仍有很大的用武之地.最近在总结排序算法,决定重温下冒泡排序,以及它的优化方法. 冒泡排序 ...

  2. 快速排序的5种优化方法

    三种快速排序以及快速排序的优化 1.快速排序的基本思想: 快速排序使用分治的思想,通过一趟排序将待排序列分割成两部分,其中一部分记录的关键字均比另一部分记录的关键字小.之后分别对这两部分记录继续进行排 ...

  3. 爬山算法改进粒子群求解测试测试函数shubert,测试函数的100种优化方法之14

    爬山算法粒子群求解测试测试函数 shubert函数属于周期性多峰函数,如图1所示拥有多个全局最优值,如图二所示在一个周期内只有一个全局最优值,局部最优解较多,适合测试算法的收敛性能,粒子群算法是一种收 ...

  4. 基于MATLAB樽海鞘算法SSA(麻雀算法(十一)也简称SSA)的Eggholeer函数优化,测试函数的100种优化方法之十二

    樽海鞘算法优化 Eggholder测试函数 樽海鞘算法SSA(麻雀算法也简称SSA,如果想了解麻雀算法,看方法十一)模拟了樽海鞘的聚集成链的生活习性而提出的优化算法,是近几年刚推出的新算法之一.算法将 ...

  5. 1D/1D动态规划的三种优化方法

    1D/1D1D/1D1D/1D动态规划 形如dp[i]=min{dp[j]+w(j,i)}(Li≤j≤Ri)dp[i]=min\{dp[j]+w(j,i)\} (L_i\leq j\leq R_i)d ...

  6. 几种优化方法的Matlab实现

    https://blog.csdn.net/u012938704/article/details/79979579

  7. NLP自然语言处理系列- week6-文本生成案例(5)(PGN+Beam Search)

    NLP自然语言处理系列- week6-文本生成案例(5)(PGN+Beam Search) PGN 模型 Beam Search 在计算机科学中,Beam Search是一种启发式搜索算法,通过在有限 ...

  8. 几种常用的优化方法梯度下降法、牛顿法、)

                                                                       几种常用的优化方法 1. 前言 熟悉机器学习的童鞋都知道,优化方法 ...

  9. 快排算法及常见两种常见优化方法

    简书同步发布 正常快排 最近在找实习,然而我觉得博客还是要坚持日更,我相信时间总是挤出来的,不扯淡了,快排这是个面试常考题,今天主要着重于讲他的优化方法,那我就直接先贴快排代码,再来细细道来我所知道的 ...

最新文章

  1. VS2010单元测试入门实践教程
  2. 【深度学习笔记】深度学习中关于epoch
  3. 网络营销——营销型网站如何在网络营销大环境中展开宣传与推广
  4. 初识 JSP---(Servlet映射 / ServletRequest / get与post区别 / 解决乱码)
  5. 中导入pygame_Pygame(二)--线条的艺术
  6. android设置wifiip地址,android Wifi 设置静态ip地址的方法
  7. 前台啊,就是这么杂!
  8. Mybatis Generator 自动生成数据库XML(Mybatis Generator 逆向工程)
  9. springboot 事务_第六章:springboot开启声明式事务
  10. 教大家一个简单的办法
  11. 一种基于SE-Inception的茄科疾病识别模型
  12. JSP的Listener介绍
  13. [网络工程师]-IEEE 802.3定义的传输介质特性
  14. 我是个Java开发者,我到底要不要学大数据开发?
  15. 实战无成本搭建php社工库,简单、高效、几T数据随便查,高效社工库搭建与数据库整理–深夜福利...
  16. 个人记录002--IAP程序做跳转的时候检查栈顶地址问题,(ck_addr0x2FFE0000)==0x20000000
  17. c# 调用Google查询天气 手机所属地 农历转换公历
  18. matlab论文致谢,大学毕业论文致谢信3篇
  19. 写作论文文献导入方法
  20. 数据结构~07.栈和队列的基本概念

热门文章

  1. 关于世界坐标系,相机坐标系,图像坐标系,像素坐标系的一些理解
  2. NB-IOT的应用领域及其特点
  3. 今天发现猎豹浏览器的一个大坑 Request.IsAuthenticated 一直为 false;另外附加原因以及临时的解决方法...
  4. The super tiny compiler(超级小的编译器)
  5. CQU路由器校园网Drcom解决方案
  6. 在ubuntu中复制粘贴文件
  7. 第一章 万恶之源Java
  8. 关于如何利用WordPress建立淘宝客的站的做法
  9. 【刷题】综合模拟1——2019浙大上机模拟(晴神)
  10. 快手创作者版App正式上线