LLM 解码方式详解:贪心、束搜索与采样策略
在训练完大语言模型(LLM)后,推理阶段的解码策略直接决定了生成文本的质量、多样性和效率。理解不同的解码机制对于优化模型输出至关重要。
什么是解码?
所谓解码,就是 LLM 的模型预测下一个 token 的过程。这是一个自回归(Autoregressive)的过程,即模型根据已生成的序列预测下一个词,并将该词加入序列继续预测。
以 PyTorch 为例,获取模型输出 outputs,其形状通常为 (batch_size, sequence_length, vocab_size):
outputs = model(
input_ids=input_ids,
attention_mask=attention_mask,
decoder_input_ids=decoder_input_ids,
decoder_attention_mask=torch.ones_like(decoder_input_ids).to(device)
)
# outputs[1] 通常是词汇表 logits (predictions)
lm_logits = outputs[1]
# lm_logits shape: (batch_size, sequence_length, vocab_size)
注意:LLM 每次输出的 outputs 其实包含了全部词汇表的预测概率。例如输入为'千问',第一次输出可能是'笑'的概率分布,第二次基于'千问笑'预测'料'的概率分布,以此类推。
常见的解码方式有哪些?
无论哪种方式,核心逻辑都是基于当前状态下的概率分布来选择下一个词。以下是主流解码策略的详细解析。
1. 贪心搜索 (Greedy Search)
特点:
- 每一步选择具有最高概率的下一个词。
- 通过逐步扩展最优路径生成文本。
- 这是许多 LLM 推理架构(如 TGI)的默认解码方式之一。
代码示例:
def sample_greedy(p):
# p shape (vocab_size,)
return np.argmax(p)
优点:
- 简单高效,计算开销最小。
- 对于确定性任务(如翻译),生成结果通常较稳定且一致。
缺点:
- 容易陷入局部最优解,导致生成的文本缺乏多样性。
- 无法探索其他可能的路径,容易产生重复或单调的内容。
2. 集束搜索 (Beam Search)
特点:
- 同时跟踪多条候选路径(称为'束',Beam)。
- 每一步选择 k 条最高概率的路径,最后选择累积概率最高的一条。
- k 是 Beam Size,决定了模型探索的广度。
原理说明: 假设输入为"Once upon a time",设置 beam size k=2。第一个词可能选出"a"和"the"。继续推理时,"a cat"的概率为 0.50.4=0.2,而"the people"的概率为 0.30.7=0.21。因此"the people"因概率更高被保留。
优点:
- 避免陷入局部最优解,相比贪心搜索能生成更高质量的文本。
- 适合需要生成高质量确定性结果的任务(如机器翻译)。
缺点:


