borgwang/tinynn

About Huber Loss

Zhangang1999 opened this issue · 2 comments

It is easy to konw the way to calculate it.But the code is different as following.

    def loss(self, predicted, actual):
        l1_dist = np.abs(predicted - actual)
        mse_mask = l1_dist < self._delta  # MSE part
        mae_mask = ~mse_mask  # MAE part
        mse = 0.5 * (predicted - actual) ** 2
        mae = self._delta * np.abs(predicted - actual) - 0.5 * self._delta ** 2

        m = predicted.shape[0]
        return np.sum(mse * mse_mask + mae * mae_mask) / m

I think it should be wrong. the return part should not have mae_mask* and mse_mask.

# huber loss
def huber(true, pred, delta):
    loss = np.where(np.abs(true-pred) < delta , 0.5*((true-pred)**2), delta*np.abs(true - pred) - 0.5*(delta**2))
    return np.sum(loss)

@Zhangang1999
The implementation is correct. If you divide the loss by the batch_size i.e. return np.mean(loss), the result would be exactly the same.