LLM解码策略详解:从贪婪搜索到核采样
本文系统介绍了大语言模型(LLM)中四种主要的解码策略:贪婪搜索(Greedy Search)、集束搜索(Beam Search)、Top-K采样和核采样(Nucleus Sampling)。这些策略代表了从确定性到随机性的渐进演化过程。
我想知道什么是贪婪搜索 (Greedy Search),请解释给我听
基本概念
贪婪搜索是LLM中最简单和直接的解码策略。顾名思义,它就是"贪婪"地在每一步都选择当前看起来最好的选项。
工作原理
- 逐步生成
- LLM在每一步会为词表中的所有token计算概率分布
- 每次只选择概率最高的那个token作为输出
- 将选中的token添加到序列中,继续预测下一个token
示例
假设LLM在生成一个句子:
输入:"The weather is"
第一步选择概率:
- "nice" (0.6)
- "bad" (0.3)
- "cold" (0.1)
→ 贪婪搜索会选择"nice",因为它概率最高
优点
- 实现简单
- 计算速度快
- 内存占用少
- 结果确定性强(相同输入总是得到相同输出)
缺点
- 容易陷入局部最优
- 生成的文本可能单调
- 缺乏多样性
- 可能错过更好的全局组合
使用场景
- 适合需要确定性答案的场景
- 适合简单、直接的文本生成任务
- 不适合需要创造性或多样性的场景
这就像在迷宫中总是选择当前看起来最正确的路,虽然可能到达终点,但不一定是最佳路径。这也是为什么在需要更有创意的输出时,我们会选择其他解码策略。
我想知道什么是集束搜索 (Beam Search),请解释给我听
基本概念
集束搜索是一种在每一步保留多个候选结果的解码策略。与贪婪搜索只保留概率最高的一个选项不同,集束搜索会同时追踪N个最可能的序列,这个N被称为beam width(集束宽度)。
工作流程
-
初始阶段
- 模型首先生成第一个token的概率分布
- 选择概率最高的N个token作为起始点
-
扩展阶段
- 对于每个已保留的序列,模型预测下一个token
- 对于每个序列,都会产生完整词表大小的概率分布
- 从所有可能的组合中选择得分最高的N个新序列
-
终止条件
- 达到预设的最大长度
- 或遇到结束符号(EOS token)
举个例子
假设beam width = 2,我们要生成一个句子:
第一步:
候选1:"我" (0.6)
候选2:"他" (0.3)
第二步:
"我" + "想" (0.4) = 0.24
"我" + "要" (0.3) = 0.18
"他" + "想" (0.3) = 0.09
"他" + "要" (0.4) = 0.12
保留前2个得分最高的组合:
"我想" (0.24)
"我要" (0.18)
优缺点
优点:
- 比贪婪搜索考虑更多可能性
- 能够产生更高质量的输出
缺点:
- 计算成本更高
- 仍然可能错过一些好的但概率不是最高的路径
这就是为什么在实际应用中,我们经常需要在beam width、计算资源和输出质量之间做权衡。
按照你举的例子,请继续模拟第三步
好的,让我们继续模拟第三步。记住我们保留了得分最高的两个序列:“我想”(0.24) 和 “我要”(0.18)。
第三步模拟
假设对于每个序列,下一个可能的词及其条件概率如下:
从"我想"(0.24)继续:
"我想去" (0.24 × 0.5 = 0.12)
"我想吃" (0.24 × 0.4 = 0.096)
"我想看" (0.24 × 0.3 = 0.072)
从"我要"(0.18)继续:
"我要去" (0.18 × 0.6 = 0.108)
"我要吃" (0.18 × 0.3 = 0.054)
"我要看" (0.18 × 0.2 = 0.036)
现在我们有6个候选序列,需要从中选择得分最高的2个(因为beam width = 2):
按得分排序:
- “我想去” (0.12) ← 保留
- “我要去” (0.108) ← 保留
- “我想吃” (0.096)
- “我想看” (0.072)
- “我要吃” (0.054)
- “我要看” (0.036)
所以在第三步结束后,我们保留的两个序列是:
- “我想去” (得分:0.12)
- “我要去” (得分:0.108)
注意事项:
- 每一步的概率都是累乘的,这就是为什么随着序列变长,总体概率会越来越小
- 在实际应用中,通常会使用对数概率来避免数值太小
- 有时也会使用长度归一化来避免模型过分偏好短序列
这个过程会一直持续到:
- 达到预设的最大长度
- 或者生成了结束符号(EOS token)
贪婪搜索 (Greedy Search)跟集束搜索 (Beam Search)的关系
是的,你说得对!当beam width=1时,集束搜索(Beam Search)就退化成了贪婪搜索(Greedy Search)。
让我用一个简单的例子来说明:
假设我们要生成一个序列,每一步的选择如下:
第一步 (概率分布):
"我" (0.6)
"他" (0.3)
"你" (0.1)
当beam width = 1时:
- 贪婪搜索:选择"我"(0.6)
- 集束搜索:也选择"我"(0.6)
第二步 (给定"我"后的概率分布):
"想" (0.4)
"要" (0.3)
"在" (0.3)
当beam width = 1时:
- 贪婪搜索:选择"想"(0.4)
- 集束搜索:也选择"想"(0.4)
关键点:
- beam width=1 意味着在每一步只保留一个最高概率的序列
- 这就等同于贪婪搜索在每一步选择最高概率的token
- 两者都是"短视"的,只考虑当前步骤的最优选择
所以可以说:
- 贪婪搜索是集束搜索的一个特例
- 集束搜索是贪婪搜索的一个推广
- beam width越大,考虑的可能性就越多,但计算成本也越高
我想知道什么是Top-K 采样,请解释给我听
Top-K采样的基本概念:
- 它是对集束搜索(Beam Search)的扩展,增加了随机性的元素
- 在每一步生成token时,不是简单地选择概率最高的token,而是:
- 先选出概率最高的K个token
- 从这K个token中随机采样一个作为输出
工作原理举例:
假设我们设置 K=5,模型在某一步预测下一个词时:
-
模型计算所有可能token的概率:
- “the” (30%)
- “a” (25%)
- “this” (20%)
- “one” (15%)
- “that” (5%)
- 其他词 (各占更小概率)
-
选择前K=5个最高概率的token形成候选池
-
从这5个token中按照它们的相对概率进行随机采样
- "the"的选中概率最大
- "that"的选中概率最小
- 但每个token都有机会被选中
优点:
- 保持了输出质量 - 因为只从高概率token中选择
- 增加了多样性 - 引入随机性,避免输出过于刻板
- 可以通过调整K值来控制"创造性"程度:
- K值越大,随机性越强
- K值越小,输出越保守
应用场景:
- 创意写作
- 对话系统
- 需要一定随机性但又要保持合理性的场景
这就是为什么Top-K采样被认为是一个在确定性和随机性之间取得良好平衡的策略。
我想知道什么是核采样 (Nucleus Sampling),请解释给我听
核采样是一种比较先进的LLM解码策略,也被称为"Top-p采样"。它的主要特点是:
- 基本原理
- 不像Top-K采样固定选择K个token,而是使用概率阈值p
- 将token按概率从高到低排序,累加概率直到超过阈值p
- 这些累积概率和达到p的token集合被称为"nucleus"(核心集合)
- 工作流程
- 假设设定p=0.9
- 系统会从高到低累加token概率,直到总和≥0.9
- 只有在这个"nucleus"中的token才可能被选中
- 从这个集合中随机采样一个token作为输出
- 优势
- 更灵活的选择范围:每一步可选token数量是动态的
- 更自然的输出:可以在保持连贯性的同时增加多样性
- 避免低概率词:自动过滤掉不太可能的选项
- 实际应用
- 可以通过temperature参数(0-1)进一步调节随机性
- temperature越低,生成更保守稳定
- temperature越高,生成更有创造性但可能不太可控
举个例子:
假设在某一步生成中:
- "的"概率为0.3
- "了"概率为0.25
- "在"概率为0.2
- "和"概率为0.15
- 其他词概率更小…
如果p=0.8,那么nucleus就会包含前四个词(因为0.3+0.25+0.2+0.15=0.9>0.8),系统会从这四个词中随机选择一个作为输出。
这种方法比固定选择Top-K个token更灵活,能在保持文本质量的同时带来适度的随机性和创造性。
更多推荐
所有评论(0)