本文为大家分享自然语言生成中的解码方法,主要包括两部分:自回归生成中常用的解码方法,以及适用于大模型推理加速的speculative decoding方法。
1.自回归生成中常用的解码方法
在生成文本序列时,由于全局搜索整个序列所需的计算成本极高,我们通常使用自回归生成(autoregressive generation),即逐个生成token,如下图所示。目前最常用的解码方法(即选择token的方法)包括:贪心搜索、波束搜索、top-k采样和top-p采样。此外,本文也会介绍通过改变概率分布来控制生成效果的temperature和repetition penalty。
贪心搜索(Greedy Search)
在每个时间步,我们会基于已生成的文本来计算词表中各词语的概率分布,最直接的方法就是选择概率最大的词。
贪心搜索的生成速度很快,短序列看起来效果也还可以,但很快就会出现语言不流畅、重复、缺乏多样性等问题。其主要问题是可能会忽略那些低概率词后可能出现的高概率词。比如在下图示例中,整体概率更高的序列“The dog has”就被漏掉了。
波束搜索 (Beam search)
为了解决上述问题,人们引入了波束搜索的方式。也就是在每一步中,都保留概率最高的k个序列,如下图所示。
在选择beam size时,较小的值会使解码速度更快,但生成的结果可能会出现与贪心搜索类似的问题。较大的值可以缓解这些问题,但计算成本会增加。而且对于对话生成等开放领域任务,较大的beam size还可能会倾向于生成更通用的回复。
总的来说,beam search在机器翻译、文章摘要等任务中效果较好。但是,由于它仍然是基于最大概率的方法,所以不适用于需要多样性和创造力的开放域任务。
Top-K采样 (Top-K sampling)
为了使生成的文本更具创新性和多样性,人们在选择token的策略中引入了一定的随机性,也就是从一部分词中进行随机采样。最基础的方法就是top-k采样,即选择概率最高的k个词,基于这些词的概率分布进行采样。
在选择k值时,较大的值会使生成的内容更具多样性,但可能会生成不合理的内容;较小的值则使生成的内容多样性较低,但质量更有保证。我们可以根据任务的不同选择合适的k值。
由于top-k采样的k值是固定的,不同的概率分布可能会带来不同的问题。如图所示,当概率分布较平坦时(上半图),top-k采样可能会剔除许多概率相近的合理词语;而当概率分布较陡峭时(下半图),可能会保留一些概率很低的不合理词语。因此,我们可以考虑动态调整k值,也就是实施top-p采样。
Top-P采样 (Top-p sampling)
如上文所述,top-p采样的思路是根据具体的概率分布情况来调整k值的选择。具体地,从累积概率超过某个阈值 p 的k个词中进行随机采样。基于此,以上讨论的两种问题都能得到解决。
Temperature
除了改变选词策略,我们还可以通过调整概率分布来改变生成效果,一个常用的思路是在概率分布的Softmax函数中引入Temperature参数(下图公式中的τ)。
Temperature的取值一般在0-1之间,值越大,概率分布越平缓,生成的序列更具多样性,适合于需要创造性的任务;值越小,概率分布越陡峭,生成的序列更稳定,适合于需要准确度的任务。
Repetition Penalty
在文本生成中,重复性高是一个常见问题。一个常用的解决方法是降低已生成词的概率,即在Softmax函数中对已生成的词额外除以一个θ。一般来说,该值取1.1或者1.2即可。
2.Speculative Decoding方法
在大模型的时代,随着模型参数量增加,生成token所需的访存时间大大增加,传统的串行式的自回归生成方法不再适用。为了提高大模型的推理速度,近年来,许多研究开始关注speculative decoding,一种Draft-then-Verify的解码方法。如下图所示,在Draft阶段,先用更高效的方式生成长度为k的序列;然后在Verify阶段,将该序列输入大模型,一次性验证这k个token是否合理,并修改不合理的token。
该方法的动机主要源于两点:(1)序列中的许多简单词可以用更有效、更简单的方法生成。例如,在以下序列"Geoffrey Hinton did his PhD at the University of Edinburgh."中,"of"很容易判断,我们完全可以使用1B的模型来代替100B的模型;(2)传统自回归生成的推理过程主要受限于访存速度,即生成每个token时都需要等待LLM的参数读写。使用draft-then-verify的思路,虽然目标大模型的计算量没变,但是内存访问时间大大降低了。
为了更清晰地展示speculative decoding的过程,我们以下图为例。在每一步,Draft阶段会生成5个token,绿色的是目标模型确认的token,红色是目标模型第一个拒绝的token,蓝色是经过修正的token(注意,第一个被拒绝的token之后的所有token都将被丢弃)。比如第一步,Draft阶段生成了5个token,目标模型接受输入 "[START] Japan ’ s benchmark bond",计算每个token位置对应的概率分布,然后拒绝了 "bond",并基于概率分布采样,将其改为 "n"。
可以发现,在Speculative Decoding中有三部分具体策略:(1)Draft策略,例如使用更小的、与目标模型分布接近的模型进行自回归生成;(2)Verify策略,例如判断候选词是否是目标模型中概率最大的词;(3)Correct策略,例如使用greedy decoding或者contrastive decoding。近期关于speculative decoding的综述 [3] 中对不同的方法进行了详细的总结。
总结
本文总结了最常用的自回归解码方法。进行自回归文本生成时,大家可以根据各方法的原理调整参数。此外,本文介绍了一种提升解码效率 (efficiency) 的方法,即speculative decoding方法。除此之外,还可以从提升解码质量(quality)、可控性 (controllability)、多样性 (diversity)、可信度 (faithfulness) 等方面继续进行相关研究探索。
审核编辑:黄飞
-
自然语言
+关注
关注
1文章
288浏览量
13351 -
大模型
+关注
关注
2文章
2459浏览量
2734
原文标题:自然语言生成中的解码方法汇总
文章出处:【微信号:zenRRan,微信公众号:深度学习自然语言处理】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论