Loss to penalize overestimation

The sigmoid function is a soft version of the step function, so you can do:

diff = y_pred - y_true
diff2 = diff**2
mask = torch.sigmoid(diff)
losses = diff2 * (1 - mask) + diff2 * mask * 2
loss = losses.mean()

This penalizes (y_pred - y_true) > 0 approximately twice as much as the reverse. If we set diff to torch.linspace(-5, 5, 11), then losses ends up as:

tensor([25.1673, 16.2878,  9.4268,  4.4768,  1.2689,  0.0000,  1.7311,  7.5232,
        17.5732, 31.7122, 49.8327])
1 Like