TinyZeaMays / CircleLoss

Pytorch implementation of the paper "Circle Loss: A Unified Perspective of Pair Similarity Optimization"

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Pair-wise level or Class-level?

haohang96 opened this issue · comments

单独看circle_loss.py这个文件,作者您实现的似乎是pair-wise level label的circle loss啊(拉近同类样本的embedding,拉远不同类样本的embedding)。为什么readme里要加一句:For pair-wise labels, another implementation https://github.com/xiangli13/circle-loss is suggested 呢?我看了另外一份实现,他用bineary_crossentropy计算loss感觉起来是不太对的啊

论文中对于损失函数的设计提出了比较好的思路,可以依据此思路改进各类loss,具体实现的的时候,根据sn/sp的定义,batch的设计,给出各种变种,bineary cross entropy的版本相当于认为每个样本都算circle loss,这时候或者仅有正样本对n,或者仅有负样本对p,可以认为是基于contrastive loss的circle loss改进。
https://github.com/xiangli13/circle-loss
的某个原始版本的溢出问题可以用logsumexp和softplus解决

即便是考虑单独一个样本, 我认为https://github.com/xiangli13/circle-loss 用了binary_crossentropy loss之后计算得到的loss也和circle loss不同:

let's use $lp$ denote positive logits, $ln$ denote negtive logits

original circle loss: L = log(1 + e^(ln)e^(-lp)) # eq1

loss of binary_ce: L = -log(1/(1+e^(-lp))) + -log(e^(-ln)/(1+e^(-ln)))
= log[(1+e^(-lp))(1+e^(ln))] # eq2

eq1 和 eq2显然是不一样的,我觉得正确的计算方式应该是您这个repo实现的版本。

-log(1/(1+e^(-lp))) = log(1 + e^(-lp))
-log(e^(-ln)/(1+e^(-ln))) = -log(1/(1 + e^(ln)) = log(1 + e^(ln))
这里或者仅有正样本对n,或者仅有负样本对p

也就是说batch内每一个sample要么只有正样本对,要么只有负样本对,是这个意思吗?

是这样的

明白了,多谢!