pytorch BCE logit之间的损失和标签不起作用

vhmi4jdf  于 2023-01-30  发布在  Git
关注(0)|答案(1)|浏览(154)

我使用的GPT2模型输出logits(softmax之前),形状为(batch_size, num_input_ids, vocab_size),我需要将其与形状为(batch_size, num_input_ids)的标签进行比较,以计算BCELoss。

logits = output.logits #--of shape (32, 56, 592)
logits = torch.nn.Softmax()(logits)
labels = labels #---------of shape (32, 56)

torch.nn.BCELoss()(logits, labels)

但是尺寸不匹配,那么如何将logits收缩为labels形状,或者将labels扩展为logits形状呢?

bgibtngc

bgibtngc1#

二进制交叉熵在最终分类层是sigmoid层时使用,即,对于每个输出维度,只有一个true/false输出是可能的。您可以将其想象为将一些标记分配给输入。这也意味着labels需要具有与logits相同的维度,每个logit具有0/1。从统计学上讲,对于592个输出维度,你预测了592个伯努利分布,期望形状为32 × 56 × 592。

当使用softmax层时,您假设只有一个目标类是可能的;你预测了592个可能的输出类的单一分类分布。然而,在这种情况下,正确的损失函数不是二元交叉熵,而是分类交叉熵,由PyTorch中的CrossEntropyLoss类实现。注意,它直接在softmax归一化之前取logit,并在内部进行归一化。预期形状为32 × 56,如代码片段所示。

相关问题