文本生成解码策略笔记-常见解码策略

在Seq2Seq模型生成文本的decoder端,假设处于第t步,则生成的结果依赖于encoder端对输入句子的向量hidden state和先前生成的t-1个字;我们会得到一个第t个字的向量,然后通过softmax的方式得到该步时的整个vocabulary的概率分布。当前字到底生成候选词典(vocab)中的哪一个,需要一定的策略,显然遍历的复杂度较高,如何选取也会影响生成文本的质量,一些常见的优化方法如下。

一、贪心搜索
即第t+1时间步取一个词使得第1步到第t+1的概率最大,然后依次进行递进搜索。例如下图,每一个时间步都取出对应使得概率最大的词(可以联系语言模型的定义),生成了序列[A,B,C]
在这里插入图片描述
二、Beam Search
又称集束搜索,Beam Search(集束搜索)是一种启发式图搜索算法,通常用在图的解空间比较大的情况下,为了减少搜索所占用的空间和时间,在每一步深度扩展的时候,剪掉一些质量比较差的结点,保留下一些质量较高的结点。这样减少了空间消耗,并提高了时间效率,但缺点就是有可能存在潜在的最佳方案被丢弃,因此Beam Search算法是不完全的,一般用于解空间较大的系统中。

相对贪心策略绝大的搜索空间,我们每次选制定的个数,num_beams个;num_beams=1时集束搜索就退化成了贪心搜索;num_beams=2,即,每个时间步都会保留到当前步为止条件概率最优的2个序列。然后依次往前递推;

如下图所示,假设字典vocab是之含有A,B,C,D,E的大小为5的字典;第一步有两个候选 A,C概率最高先被选出;第二步有AA,AB,AC,AD,AE,CA,CB,…,CD,CE共10种可能,依然只选概率最高的两种,如下图是AB,CE被选出,因为这两个概率最高

在这里插入图片描述
三、随机采样
虽然Beam Search优化了空间效率,高效的选取了一些结点,但还是容易生成重复、无意义的文本,这点在做实验中比较容易遇到。目前提出了随机采样(sampling)的做法对Beam Search做出一些改进;候选字有一定的概率分布,通过一些策略提高生成文本的质量。比较常见的做法如下:

1.Temperature Sampling

在softmax计算过程中引入温度参数 t来改变vocabulary probability distribution,使其更偏向high probability words
P ( x ∣ x 1 : t − 1 ) = e x p ( u t / t ) ∑ t ′ e x p ( u t ′ / t ) ) P(x|x_{1:t-1})=\frac{exp(u_{t}/t)}{\sum _{{t}'}exp(u_{{t}'}/t))} P(xx1:t1)=texp(ut/t))exp(ut/t),其中t的取值在[0,1)之间。

2.Top-k 采样
在解码过程中从 P ( x ∣ x 1 : i − 1 ) P(x|x_{1:i-1}) P(xx1:i1)分布中,取概率最高的k个tokens,将其概率求和记为sum-topk。概率重新分布转化如下:上述这k个tokens分别除以概率和sum-topk得到各自新的概率,其余token概率变为0。Top-k Sampling存在的问题是,常数k是给定的值,k设置过小则会容易生成更平淡或泛的句子。当k很大的时候,候选集合会包含一些不合适的token。下面的核采样方法则会有更动态的选取策略。

3.NUCLEUS SAMPLING 方法,或记为Top-p方法
主要的想法根据概率的分布来决定一个可以用来被采样的token集合。给定所有候选tokenx的分布 P ( x ∣ x 1 : i − 1 ) P(x|x_{1:i-1}) P(xx1:i1),这样的满足top-p条件的集合 V ( p ) ⊂ V V^{(p)}\subset V V(p)V
s u m x ∈ V ( p ) P ( x ∣ x 1 : i − 1 ) ≥ p sum_{x\in V^{(p)}}P(x|x_{1:i-1})\geq p sumxV(p)P(xx1:i1)p

p ′ = s u m x ∈ V ( p ) P ( x ∣ x 1 : i − 1 ) ≥ p p'=sum_{x\in V^{(p)}}P(x|x_{1:i-1})\geq p p=sumxV(p)P(xx1:i1)p,原始的分布重新计算转化到一个新的分布如下,可以看到不在候选集里的直接概率为0,屏蔽掉了,在候选集里 的要除以这个和p’。
P ′ ( x ∣ x 1 : i − 1 ) = { P ( x ∣ x 1 : i − 1 ) / p ′ i f x ∈ V ( p ) 0 o t h e r s i z e P'(x|x_{1:i-1})=\left\{\begin{matrix} P(x|x_{1:i-1})/p'&if x\in V^{(p)}\\ 0 & othersize \end{matrix}\right. P(xx1:i1)={P(xx1:i1)/p0ifxV(p)othersize

参考链接

[1]https://blog.csdn.net/hecongqing/article/details/105040105?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control
[2]https://zhuanlan.zhihu.com/p/68383015
[3]The Curious Case of Neural Text Degeneration(https://link.zhihu.com/?target=https%3A//arxiv.org/abs/1904.09751)

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值