正文
温度对贪心解码、束搜索和Top-K采样策略没有影响,因为它影响logit概率之间的距离,而所有这些策略都使用基于其顺序的top概率,温度不会改变概率的顺序。而Top-p采样允许更多或更少的竞争者进入基于其总概率的子集,因此,概率越接近(高温)随机性越大。
除了
t==0.0
和
t==0
之外,没有硬性规定的值可以复制,您必须为每个用例实验以找到最适合您需求的值 - 尽管您肯定会找到人们在不同用例中提供良好的基线。
指导文本生成(Guided Text Generation)
也称为结构化文本生成和辅助生成。
如果模型可以返回其生成的输出在特定的格式,而不是不受限制的格式,您不希望模型产生无效的格式。例如,如果您希望模型返回一个JSON字典,它应该这样做。
实现这一点的方法是使用指导文本生成。而不是选择概率最高的生成token,该技术使用下一个最佳概率的token,该token适合下一个预期的token子集。为了举例说明:如果您希望模型生成一个JSON字符串列表,如
["apples", "oranges"]
,因此我们期望:
["string", "string", ..., "string"]
123...
第一个生成的token必须是一个
[
。如果模型得到
"
,例如,而不是
[
,作为最高概率,而
[
的概率较低 - 我们选择概率较低的那个,以便它将是
[
。
然后,下一个生成的token必须是一个
"
. 如果不是,搜索概率较低的token直到找到
"
并选择它。
第三个token必须是一个有效的字符串(即不是
[
或
"
)。
以此类推。
基本上,对于每个下一个token,我们需要知道一个允许的token子集,并从该子集中选择概率最高的token。
这是一种非常酷的技术。与其尝试修复生成的输出,这些输出不一定总能匹配预期的格式,我们让模型首先生成正确的输出。
这种方法有几个缺点:
-
它降低了生成速度 - 它必须遵循的格式越复杂,生成token的速度就越慢。根据我对生成速度的测量,我发现一些结构化文本生成库比其他库快得多。
-
有多种实现这种技术的方法,截至本文撰写时,两个流行的库是:
-
https://github.com/outlines-dev/outlines
-
https://github.com/noamgat/lm-format-enforcer
您理想的做法是使用已经集成到推理框架(如vLLM)中的实现。
使用指导生成加速推理(Faster inference with guided generation)
也可以使用模式来加速推理。例如,考虑这个简单的“profile”模式:
{
"type": "object",
"properties": {
"name": { "type": "string"},
"age": { "type": "integer"}
},
"required": ["name", "age"]
}
由于模式具有特定的键
name
和
age
,一旦模型预测到:
{"n
或
{"a
,它就不需要进行自回归生成来得到``{"name":
和
{"age":
,因为这两者都必须导致一个特定的明确结果 - 因此在这里它可以执行预填充而不是解码,并节省一些缓慢的步骤,因为它100%知道接下来的几个token将是
ame":
或
ge":`。显然,当模式有很多预定的键和短生成值时,这种方法最有利。
推测解码(Speculative decoding)
也称为推测推理或辅助生成。
因为一次生成一个token非常慢,有时可以通过使用一个更小更快的草稿模型来作弊并加速。例如,您的正常推理使用Llama-70B,这会很慢,但我们可以使用Llama-7b作为草稿模型,然后我们可以验证预测是否正确,但一次为所有token执行。
示例:让我们以提示
I'm turnin', turnin', turnin', turnin', turnin' around and all that I can see is just
为例,现在:
-
使用Llama-7b以自回归方式预测
another lemon tree
,在3步中完成,但比Llama-70b快得多。
-
[...I can see is just]
[...I can see is just another]
[...I can see is just another lemon]
我缩短了完整的提示以进行演示,
...
表示其它的prompt部分。我在这里假装每个token都是一个完整的单词。
现在,Llama-70B在一步中生成:
[...I can see is just] another
[...I can see is just another] lemon
[...I can see is just another lemon] tree
现在可能会有多个结果:
-
如果一切都匹配 - 在3个短步骤和1个长步骤中,我们生成了最终结果,而不是使用3个长步骤。
-
如果只有
another lemon
匹配 - 如果我们节省了时间,我们可能会更好。