Different decoding methods for LLMs

Greedy Search

在这里插入图片描述

model_inputs = tokenizer(
	'I enjoy walking with my cute dog', return_tensors='pt'
).to(torch_device)

greedy_output = model.generate(
	**model_inputs,
	max_new_tokens=40
)

Beam search

在这里插入图片描述

  • Beam search 时刻保存累积概率最大的 num_beams 条路径,上图中 num_beams=2. Beam search 可以找到累积概率更高的输出,但计算量会扩大 num_beams 倍,KV Cache 占用也会增加,此外对于 LLM 而言,更高的累积概率并不一定代表更高质量的输出,即使一些关键 token 处的概率与生成质量正相关,这些信息也完全被序列中其他语义不关键内容的概率完全摊平了,这导致 token 序列的概率显著与语义概率偏离。以上原因均导致 LLM 推理中比较少使用 beam search
beam_output = model.generate(
    **model_inputs,
    max_new_tokens=40,
    num_beams=5,	# generation is finished when all beam hypotheses reached the EOS token
    early_stopping=True
)

Sampling

Temperature

sample_output = model.generate(
    **model_inputs,
    max_new_tokens=40,
    do_sample=True,
    top_k=0,
    temperature=0.6,
)

Top-K Sampling

  • Top-K Sampling 从 Top-K token 中采样生成下个 token,用于增加生成随机性
sample_output = model.generate(
    **model_inputs,
    max_new_tokens=40,
    do_sample=True,
    top_k=50
)

Top-p (nucleus) sampling

  • Top-p sampling 从累积概率超过 p p p 的最少 token 组成的集合中采样生成下个 token. 相比 Top-K 采样,这种采样方式可能可以避免一些特殊情况,例如下左图中,概率分布普遍比较平坦,此时 Top-K 采样无法采样到 “man” 之后的 token,但这些 token 同样是很有可能被生成的,或者下右图中,概率分布比较陡峭,此时 Top-K 采样可能会采样到一些概率值很小的 token,使得生成结果变差
    在这里插入图片描述而 Top-p 采样则可以有效避免上述两种情况
    在这里插入图片描述
sample_output = model.generate(
    **model_inputs,
    max_new_tokens=40,
    do_sample=True,
    top_p=0.92,
    top_k=0
)

  • 虽然从理论上讲,Top-p 似乎比 Top-K 更优雅,但这两种方法在实践中都很好用Top-p 也可以与 Top-K 结合使用,这可以避免分数非常低的 Token,同时提供一些动态选择的空间
sample_outputs = model.generate(
    **model_inputs,
    max_new_tokens=40,
    do_sample=True,
    top_k=50,
    top_p=0.95,
)

Repetition Penalty

  • 语言模型在生成时经常会出现重复生成的问题,CTRL 这篇论文提供了一个简单的解决方案,就是记录之前已经生成过的 token,当预测下一个 token 时,人为降低已经生成过的 token 的分数,使其被采样到的概率降低
    p i = exp ⁡ ( x i / ( T ⋅ I ( i ∈ g ) ) ∑ j exp ⁡ ( x j / ( T ⋅ I ( j ∈ g ) ) I ( c ) = θ  if  c  is True else  1 p_i=\frac{\exp \left(x_i /(T \cdot I(i \in g))\right.}{\sum_j \exp \left(x_j /(T \cdot I(j \in g))\right.} \quad I(c)=\theta \text { if } \mathrm{c} \text { is True else } 1 pi=jexp(xj/(TI(jg))exp(xi/(TI(ig))I(c)=θ if c is True else 1其中, T T T 为 temperature, g g g 为已生成的 token 列表, θ ≥ 1 \theta\geq 1 θ1 为惩罚系数
sample_outputs = model.generate(
    **model_inputs,
    max_new_tokens=40,
    do_sample=True,
    top_k=50,
    top_p=0.95,
    repetition_penalty=1.2,
)

Prompt Engineering

[NeurIPS 2022] Chain-of-thought prompting elicits reasoning in large language models

[NeurIPS 2024] Self-Refine: Iterative Refinement with Self-Feedback

References

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值