Pair-wise level or Class-level?
haohang96 opened this issue · 6 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
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要么只有正样本对,要么只有负样本对,是这个意思吗?
是这样的
明白了,多谢!