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])