我使用的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
形状呢?
1条答案
按热度按时间bgibtngc1#
二进制交叉熵在最终分类层是sigmoid层时使用,即,对于每个输出维度,只有一个true/false输出是可能的。您可以将其想象为将一些标记分配给输入。这也意味着
labels
需要具有与logits
相同的维度,每个logit具有0/1。从统计学上讲,对于592个输出维度,你预测了592个伯努利分布,期望形状为32 × 56 × 592。当使用softmax层时,您假设只有一个目标类是可能的;你预测了592个可能的输出类的单一分类分布。然而,在这种情况下,正确的损失函数不是二元交叉熵,而是分类交叉熵,由PyTorch中的
CrossEntropyLoss
类实现。注意,它直接在softmax归一化之前取logit,并在内部进行归一化。预期形状为32 × 56,如代码片段所示。