采样器
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。
Top-p 采样
你可以要求 Outlines 只考虑累积概率大于阈值 p
的最高概率 token。在初始化采样器时指定 top_p
关键字参数。
贪婪采样器
贪婪采样在每一步选择概率最高的 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 在每一步维护多个候选序列,可能找到比贪婪采样或多项式采样更好的整体序列。
要使用 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
兼容性
只有来自 transformers
和 exllamav2
库的模型与 Beam Search 兼容。
参数
beams
:使用的 beam 数量(默认值:1)
采样器比较
下表比较了不同的采样器
采样器 | 优点 | 缺点 | 用例 |
---|---|---|---|
贪婪 | 确定性,速度快 | 可能产生重复文本 | 当你需要一致、可预测的输出时 |
多项式 | 平衡探索与利用 | 不同运行结果可能不同 | 通用文本生成,创意任务 |
Beam Search | 可以找到全局更好的序列 | 计算成本更高 | 当序列质量至关重要时,例如翻译 |
对于大多数用例,我们建议使用默认的 多项式采样器。