当Top-K、Top-P和Temperature一起使用进行NLP解码时,实际的执行顺序是怎样的?

问题描述 投票:0回答:1

假设我使用:

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个选择:

  1. 是否申请
    Top-P = 0.51
    然后你再Normalize
  2. 或者先标准化,然后应用
    Top-P = 0.51
    ,然后再次标准化

最重要的是,如果我们使用

temperature = 0.6
,我们是否在开始时应用它?如果是,那么当我们只使用
Top-P
时情况会有所不同,因为分布已经发生了变化。

这是如何运作的?有人可以从执行方面解释一下吗?

machine-learning deep-learning nlp artificial-intelligence huggingface-transformers
1个回答
0
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.