跳到内容

采样器

Outlines 提供了不同的序列采样算法,未来我们将集成更多算法。你可以阅读这篇博客文章来了解不同采样算法的概述。

采样器控制着采样过程,使你能够影响模型的输出。这包括控制随机性(温度)、偏向特定 token (top-k, top-p) 或序列生成 (beam search)。

多项式采样

多项式采样是 Outlines 中的默认采样算法。

举例来说,假设我们只有两个可能的 token:“H” 和 “T”。对于一个固定的提示,比如“抛一枚硬币,你得到正面还是反面?”,语言模型会计算每个 token 的概率。

Token 概率
"H" 0.5
"T" 0.5

你期望得到“H”的概率是 50%,得到“T”的概率是 50%。

参数

  • samples:生成的样本数量(默认值:1)
  • top_k:仅考虑概率最高的 k 个 token(可选)
  • top_p:仅考虑累积概率 >= p 的概率最高的 token(可选)
  • temperature:控制采样的随机性(可选)

默认行为

Outlines 默认使用多项式采样器,不使用 top-p 或 top-k 采样,温度等于 1。

不指定采样器等同于

from outlines import models, generate, samplers


model = models.transformers("microsoft/Phi-3-mini-4k-instruct")
sampler = samplers.multinomial()

generator = generate.text(model, sampler)
answer = generator("What is 2+2?")

print(answer)
# 4

批处理

通过在初始化采样器时传入样本数量,可以要求生成器生成多个样本

from outlines import models, generate, samplers


model = models.transformers("microsoft/Phi-3-mini-4k-instruct")
sampler = samplers.multinomial(3)

generator = generate.text(model, sampler)
answer = generator("What is 2+2?")

print(answer)
# [4, 4, 4]

如果你为一个批次的提示请求多个样本,返回的数组形状将是 (样本数, 批次数)

from outlines import models, generate, samplers


model = models.transformers("microsoft/Phi-3-mini-4k-instruct")
sampler = samplers.multinomial(3)

generator = generate.text(model, sampler)
answer = generator(["What is 2+2?", "What is 3+3?"])

print(answer)
# [[4, 4, 4], [6, 6, 6]]

温度

你可以通过以下方式控制温度

from outlines import models, generate, samplers


model = models.transformers("microsoft/Phi-3-mini-4k-instruct")
sampler = samplers.multinomial(3, temperature=0.5)

generator = generate.text(model, sampler)
answer = generator(["What is 2+2?", "What is 3+3?"])

print(answer)

如果你想使用 temperature=0.0,请改用 sampler=samplers.greedy()

Top-k 采样

通过在初始化采样器时指定 top-k 关键字参数的值,可以要求 Outlines 在每一步仅考虑 top-k 的 logits。

sampler = samplers.multinomial(3, top_k=10)

Top-p 采样

你可以要求 Outlines 只考虑累积概率大于阈值 p 的最高概率 token。在初始化采样器时指定 top_p 关键字参数。

sampler = samplers.multinomial(3, top_p=0.95)

贪婪采样器

贪婪采样在每一步选择概率最高的 token。它是确定性的,对于给定的输入总是产生相同的输出。

要使用贪婪采样器,请使用该采样器初始化生成器

from outlines import models, generate, samplers


model = models.transformers("microsoft/Phi-3-mini-4k-instruct")
sampler = samplers.greedy()

generator = generate.text(model, sampler)
answer = generator("What is 2+2?")

print(answer)
# 4

贪婪采样器不能要求生成多个样本,因为它不清楚结果应该是什么。只能返回最有可能的 token。

Beam search 在每一步维护多个候选序列,可能找到比贪婪采样或多项式采样更好的整体序列。

要使用 Beam Search,请使用该采样器初始化生成器

from outlines import models, generate, samplers


model = models.transformers("microsoft/Phi-3-mini-4k-instruct")
sampler = samplers.beam_search(beams=5)

generator = generate.text(model, sampler)
answer = generator("What is 2+2?")

print(answer)
# 4

兼容性

只有来自 transformersexllamav2 库的模型与 Beam Search 兼容。

参数

  • beams:使用的 beam 数量(默认值:1)

采样器比较

下表比较了不同的采样器

采样器 优点 缺点 用例
贪婪 确定性,速度快 可能产生重复文本 当你需要一致、可预测的输出时
多项式 平衡探索与利用 不同运行结果可能不同 通用文本生成,创意任务
Beam Search 可以找到全局更好的序列 计算成本更高 当序列质量至关重要时,例如翻译

对于大多数用例,我们建议使用默认的 多项式采样器