How to interpret and get classification accuracy from outputs with MarginRankingLoss

When dealing with a binary classification problem, we can use either logistic loss or hinge loss to train our model, implemented with CrossEntropyLoss() or MarginRankingLoss() respectively, if I don’t misunderstand.

In both cases, we can use the same network, say a single FC to project the inputs to outputs y_est of shape (batch_size, 2), where 2 comes from the binary classification.

For CrossEntropyLoss(), we simply argmax the outputs per sample in a batch to yield our predictions: index 0 and 1 for class label 0 and 1, respectively.

On the other hand, do we do the same for MarginRankingLoss()? The target argument in the function (y in the formula below) should be either 1 or -1 (instead of 1 and 0), can we also argmax and say that index 0 and 1 as -1 and 1, respectively?


I am also wondering if it is correct to regard x1 and x2 as the y_est[:,0] and y_est[:,1].

Hi, in my understanding, x1 and x2 corresponds to distance between positive(same-class) pair and negative pair. Before you apply MarginRankingLoss(), you have to compute those distances from batch.

For example, we have X1c,X2c,X3,X4 (X1c,X2c belong to class c and others are not).

  • In the binary classification phase, we apply usual classification to X1~X4.
  • In the ranking phase, at first, distance Dp = d(f(X1c) - f(X2c)), Dn = (f(X1c) - f(X4)) are computed, where f() returns model output, d() returns distance between two feature vectors.
    Then loss computation would be as follows:
    loss = max(0, Dp - Dn + m)

In your case, if you fix x1 as Dp and x2 as Dn, y should be always 1

I have an impression of your description more like hinge loss for triplet.
What I was referring to does not have to worry about pairs; apologize if I didn’t make clear.

Particularly, I used MarginRankingLoss() as hinge loss for binary classification as answered here. So I am wondering how to make equal the formula in the OP (eq. 1, I believe that it is y E {-1, 1} not t) and the one from the doc (eq. 2):

max(0, 1 - t * y) where t E {-1, 1} (1)
max(0, -y * (x1 - x2) + 1) (2)

so I make x1 and x2 as y_est[:,0] and y_est[:,1], respectively. I also tried to set x2 to zeros but I am not sure about it.