Huggingface gpt2语言模型代码哪里计算perplexity?
Where is perplexity calculated in the Huggingface gpt2 language model code?
我看到一些 github 评论说 model() 调用损失的输出是困惑的形式:
https://github.com/huggingface/transformers/issues/473
但是当我查看相关代码时...
https://huggingface.co/transformers/_modules/transformers/modeling_openai.html#OpenAIGPTLMHeadModel.forward
if labels is not None:
# Shift so that tokens < n predict n
shift_logits = lm_logits[..., :-1, :].contiguous()
shift_labels = labels[..., 1:].contiguous()
# Flatten the tokens
loss_fct = CrossEntropyLoss()
loss = loss_fct(shift_logits.view(-1, shift_logits.size(-1)), shift_labels.view(-1))
outputs = (loss,) + outputs
return outputs # (loss), lm_logits, (all hidden states), (all attentions)
我看到正在计算交叉熵,但没有转化为困惑。损失最终在哪里转化?或者是否已经存在我不理解的转换?
好的,我找到答案了。该代码实际上返回交叉熵。在 github 的评论中,他们说这是困惑......他们说是因为 OP 确实
return math.exp(loss)
将熵转化为困惑:)
没有乳胶没问题。根据定义,困惑度(三重 P)是:
PP(p) = e^(H(p))
其中H代表混沌(古希腊语:χìος)或熵。在一般情况下,我们有交叉熵:
PP(p) = e^(H(p,q))
e 是对数的自然底,这是 PyTorch 更喜欢计算熵和交叉熵的方式。
我看到一些 github 评论说 model() 调用损失的输出是困惑的形式: https://github.com/huggingface/transformers/issues/473
但是当我查看相关代码时... https://huggingface.co/transformers/_modules/transformers/modeling_openai.html#OpenAIGPTLMHeadModel.forward
if labels is not None:
# Shift so that tokens < n predict n
shift_logits = lm_logits[..., :-1, :].contiguous()
shift_labels = labels[..., 1:].contiguous()
# Flatten the tokens
loss_fct = CrossEntropyLoss()
loss = loss_fct(shift_logits.view(-1, shift_logits.size(-1)), shift_labels.view(-1))
outputs = (loss,) + outputs
return outputs # (loss), lm_logits, (all hidden states), (all attentions)
我看到正在计算交叉熵,但没有转化为困惑。损失最终在哪里转化?或者是否已经存在我不理解的转换?
好的,我找到答案了。该代码实际上返回交叉熵。在 github 的评论中,他们说这是困惑......他们说是因为 OP 确实
return math.exp(loss)
将熵转化为困惑:)
没有乳胶没问题。根据定义,困惑度(三重 P)是:
PP(p) = e^(H(p))
其中H代表混沌(古希腊语:χìος)或熵。在一般情况下,我们有交叉熵:
PP(p) = e^(H(p,q))
e 是对数的自然底,这是 PyTorch 更喜欢计算熵和交叉熵的方式。