我想知道什么是贪婪搜索 (Greedy Search),请解释给我听

基本概念

贪婪搜索是LLM中最简单和直接的解码策略。顾名思义,它就是"贪婪"地在每一步都选择当前看起来最好的选项。

工作原理

  1. 逐步生成
    • 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(集束宽度)。

工作流程

  1. 初始阶段

    • 模型首先生成第一个token的概率分布
    • 选择概率最高的N个token作为起始点
  2. 扩展阶段

    • 对于每个已保留的序列,模型预测下一个token
    • 对于每个序列,都会产生完整词表大小的概率分布
    • 从所有可能的组合中选择得分最高的N个新序列
  3. 终止条件

    • 达到预设的最大长度
    • 或遇到结束符号(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):

按得分排序:

  1. “我想去” (0.12) ← 保留
  2. “我要去” (0.108) ← 保留
  3. “我想吃” (0.096)
  4. “我想看” (0.072)
  5. “我要吃” (0.054)
  6. “我要看” (0.036)

所以在第三步结束后,我们保留的两个序列是:

  • “我想去” (得分:0.12)
  • “我要去” (得分:0.108)

注意事项:

  1. 每一步的概率都是累乘的,这就是为什么随着序列变长,总体概率会越来越小
  2. 在实际应用中,通常会使用对数概率来避免数值太小
  3. 有时也会使用长度归一化来避免模型过分偏好短序列

这个过程会一直持续到:

  • 达到预设的最大长度
  • 或者生成了结束符号(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)

关键点:

  1. beam width=1 意味着在每一步只保留一个最高概率的序列
  2. 这就等同于贪婪搜索在每一步选择最高概率的token
  3. 两者都是"短视"的,只考虑当前步骤的最优选择

所以可以说:

  • 贪婪搜索是集束搜索的一个特例
  • 集束搜索是贪婪搜索的一个推广
  • beam width越大,考虑的可能性就越多,但计算成本也越高

我想知道什么是Top-K 采样,请解释给我听

Top-K采样的基本概念:

  • 它是对集束搜索(Beam Search)的扩展,增加了随机性的元素
  • 在每一步生成token时,不是简单地选择概率最高的token,而是:
    1. 先选出概率最高的K个token
    2. 从这K个token中随机采样一个作为输出

工作原理举例:
假设我们设置 K=5,模型在某一步预测下一个词时:

  1. 模型计算所有可能token的概率:

    • “the” (30%)
    • “a” (25%)
    • “this” (20%)
    • “one” (15%)
    • “that” (5%)
    • 其他词 (各占更小概率)
  2. 选择前K=5个最高概率的token形成候选池

  3. 从这5个token中按照它们的相对概率进行随机采样

    • "the"的选中概率最大
    • "that"的选中概率最小
    • 但每个token都有机会被选中

优点:

  1. 保持了输出质量 - 因为只从高概率token中选择
  2. 增加了多样性 - 引入随机性,避免输出过于刻板
  3. 可以通过调整K值来控制"创造性"程度:
    • K值越大,随机性越强
    • K值越小,输出越保守

应用场景:

  • 创意写作
  • 对话系统
  • 需要一定随机性但又要保持合理性的场景

这就是为什么Top-K采样被认为是一个在确定性和随机性之间取得良好平衡的策略。

我想知道什么是核采样 (Nucleus Sampling),请解释给我听

核采样是一种比较先进的LLM解码策略,也被称为"Top-p采样"。它的主要特点是:

  1. 基本原理
  • 不像Top-K采样固定选择K个token,而是使用概率阈值p
  • 将token按概率从高到低排序,累加概率直到超过阈值p
  • 这些累积概率和达到p的token集合被称为"nucleus"(核心集合)
  1. 工作流程
  • 假设设定p=0.9
  • 系统会从高到低累加token概率,直到总和≥0.9
  • 只有在这个"nucleus"中的token才可能被选中
  • 从这个集合中随机采样一个token作为输出
  1. 优势
  • 更灵活的选择范围:每一步可选token数量是动态的
  • 更自然的输出:可以在保持连贯性的同时增加多样性
  • 避免低概率词:自动过滤掉不太可能的选项
  1. 实际应用
  • 可以通过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更灵活,能在保持文本质量的同时带来适度的随机性和创造性。

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐