5

我看到一些 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)

我看到交叉熵正在计算,但没有转化为困惑。损失最终在哪里转化?还是已经有我不理解的转变?

4

2 回答 2

8

啊,好的,我找到了答案。代码实际上是返回交叉熵。在他们说这是困惑的github评论中......他们这么说是因为OP确实

return math.exp(loss)

它将熵转化为困惑:)

于 2020-03-24T15:33:41.183 回答
0

没有乳胶没问题。根据定义,困惑度(三倍 P)是:

PP(p) = e^(H(p))

其中 H 代表混沌(古希腊语:χάος)或熵。在一般情况下,我们有交叉熵:

PP(p) = e^(H(p,q))

e 是对数的自然底,这是 PyTorch 更喜欢计算熵和交叉熵的方式。

于 2022-03-02T13:33:56.010 回答