假设我使用:
sample_outputs = model.generate(**model_inputs,max_new_tokens=40,do_sample=True,
top_k=3,top_p=0.51, temperature=0.6, num_return_sequences=3,)
这个的执行顺序是什么? 查看 labml.ai 采样示例的代码,它没有意义,因为当使用带有 top-K 或 Top-P 的温度时,它首先使用 Softmax 并选择,然后使用
Sampler
在 Google Cloud Document 中,它说您使用 Top-K,然后使用 Top-P 和温度进行过滤。
假设你的
PROBABILITIES
为t0→0.4,t1→0.2,t2→0.2,t3→0.15,t4→0.05`
您使用
Top-K = 3
,现在您拥有 t0,t1,t2
。现在你有2个选择:
Top-P = 0.51
然后你再NormalizeTop-P = 0.51
,然后再次标准化最重要的是,如果我们使用
temperature = 0.6
,我们是否在开始时应用它?如果是,那么当我们只使用 Top-P
时情况会有所不同,因为分布已经发生了变化。
这是如何运作的?有人可以从执行方面解释一下吗?
top-p
操作是最后一个。在此之前,您仅使用分数(非标准化概率),这些分数首先按 temperature
缩放,然后按 top_k
过滤。
在GitHub上的当前代码中,您可以看到
transformers/generation/utils.py
中的顺序显示:
...
if generation_config.temperature is not None and generation_config.temperature != 1.0:
warpers.append(TemperatureLogitsWarper(generation_config.temperature))
if generation_config.top_k is not None and generation_config.top_k != 0:
warpers.append(TopKLogitsWarper(top_k=generation_config.top_k, min_tokens_to_keep=min_tokens_to_keep))
if generation_config.top_p is not None and generation_config.top_p < 1.0:
warpers.append(TopPLogitsWarper(top_p=generation_config.top_p, min_tokens_to_keep=min_tokens_to_keep))
...
让我们考虑您的示例:
t0 = 0.4, t1 = 0.2, t2 = 0.2, t3 = 0.15, t4 = 0.05
,并根据transformers/ Generation/logits_process.py中的代码完成这些步骤。在第一步中,您使用 TemperatureLogitsWarper按
temperature = 0.6
进行缩放,因此您得到
t0 = 0.4/0.6, t1 = 0.2/0.6, t2 = 0.2/0.6, t3 = 0.15/0.6, t4 = 0.05/0.6
。然后,您使用 TopKLogitsWarper应用
top_k = 3
,它会选择 3 个最高分数,因此您只剩下 t0 = 0.4/0.6 = 2/3, t1 = 0.2/0.6 = 1/3, t2 = 0.2/0.6 = 1/3
。接下来,使用 TopPLogitsWarper应用
top_p
运算,首先通过 softmax 运算将分数转换为概率,
N1 = exp(t0) + exp(t1) + exp(t2) = 4.739
t0 <- exp(t0) / N1 = 0.411
t1 <- exp(t1) / N1 = 0.2945
t2 <- exp(t2) / N1 = 0.2945
然后仅保留
t0
和 t1
,因为它们的累积概率 (0.411 + 0.2945) 超过 top_p = 0.51
值。最后,您对保留的分数(t0
和t1
)进行softmax归一化,这提供了采样概率:
N2 = exp(t0) + exp(t1) = 2.851
t0 <- exp(t0) / N2 = 0.5291
t1 <- exp(t1) / N2 = 0.4709