pytorch中损失函数的怪异行为



我正在计算一个自定义成本函数,它只需取交叉熵的指数除以参数\eta。在第一次迭代(大约20次(中,训练损失在减少,但在那之后,我突然感到不安,我不明白为什么会发生这种情况。

我使用的代码如下:

e_loss = []
eta = 2 #just an example of value of eta I'm using 
criterion = nn.CrossEntropyLoss()
for e in range(epoch):
train_loss = 0
for batch_idx, (data, target) in enumerate(train_loader):
client_model.train()
optimizer.zero_grad()
output = client_model(data)
loss = torch.exp(criterion(output, target)/eta) # this is the line where I input my custom loss function
loss.backward()
optimizer.step()
train_loss += loss.item()*data.size(0)
train_loss = train_loss/len(train_loader) # average losses
e_loss.append(train_loss)

当输入为无界时,直接使用exp是非常不稳定的。如果网络非常自信地预测错误的类(b/c-log(x(变为inf,x变为0(,则交叉熵损失可以返回非常大的值。像这样的模型进行的一次不准确的预测可能会导致数值精度,从而导致梯度变为nan,这将立即导致模型的权重和输出变成nan。

例如

>>> import torch
>>> import torch.nn.functional as F
>>> torch.exp(F.cross_entropy(torch.tensor([[-50.0, 50.0]]), torch.tensor([0])))
tensor(inf)

最新更新