Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于tripletangularmarginloss.py中的负样本类距离loss计算absolut_loss_an #3110

Open
aaaaaaaak opened this issue Mar 18, 2024 · 13 comments
Assignees

Comments

@aaaaaaaak
Copy link

你好,请问在PaddleClas/ppcls/loss
/tripletangularmarginloss.py中
L108的absolut_loss_an计算,对于dist_an<an_value的值为何是置为1而不是置为0?
dist_an应该是小于an_value的,为什么在计算loss时对于小于an_value的dist_an给到了更大的loss?
为何不使用如下计算:absolut_loss_an = paddle.where(absolut_loss_an > 0,absolut_loss_an,paddle.zeros_like(absolut_loss_an))?
期待您的解答,谢谢
QQ截图20240318161757

欢迎您使用PaddleClas并反馈相关问题,非常感谢您对PaddleClas的贡献!
提出issue时,辛苦您提供以下信息,方便我们快速定位问题并及时有效地解决您的问题:

  1. PaddleClas版本以及PaddlePaddle版本:请您提供您使用的版本号或分支信息,如PaddleClas release/2.2和PaddlePaddle 2.1.0
  2. 涉及的其他产品使用的版本号:如您在使用PaddleClas的同时还在使用其他产品,如PaddleServing、PaddleInference等,请您提供其版本号
  3. 训练环境信息:
    a. 具体操作系统,如Linux/Windows/MacOS
    b. Python版本号,如Python3.6/7/8
    c. CUDA/cuDNN版本, 如CUDA10.2/cuDNN 7.6.5等
  4. 完整的代码(相比于repo中代码,有改动的地方)、详细的错误信息及相关log
@RainFrost1
Copy link
Collaborator

这个loss的计算方式是cosin相似度,而不是欧式距离,代码中变量命名方式可能存在误导。如果是使用欧式距离的话,确实应该是问题中提到写法,而使用cosine相似度的话,写法正好是相反的。对于欧式距离,anchor与negative距离越大越好,对于cosine相似度,anchor与negative相似越小越好

@aaaaaaaak
Copy link
Author

这个loss的计算方式是cosin相似度,而不是欧式距离,代码中变量命名方式可能存在误导。如果是使用欧式距离的话,确实应该是问题中提到写法,而使用cosine相似度的话,写法正好是相反的。对于欧式距离,anchor与negative距离越大越好,对于cosine相似度,anchor与negative相似越小越好

感谢您的回复!
我的疑问是(absolut_loss_an = dist_an - self.an_value) < 0时anchor与negative相似度dist_an更小,loss是否也该更小?但是为何此时要将absolut_loss_an置于更大的值1而不是0?

@changdazhou
Copy link
Contributor

对于cosine相似度,anchor与negative相似越小越好,所以距离越小的loss应该越大

@aaaaaaaak
Copy link
Author

aaaaaaaak commented Apr 26, 2024

对于cosine相似度,anchor与negative相似越小越好,所以距离越小的loss应该越大

你好,可能我的疑问没有清楚的被表达。
我的理解也是anchor与negative相似越小越好,且此处计算使用的dist_an代表anchor与negative相似度。
absolut_loss_an = dist_an - self.an_value
absolut_loss_an = paddle.where(absolut_loss_an > 0,
absolut_loss_an,
paddle.ones_like(absolut_loss_an))
对于以上代码我的理解是:
absolut_loss_an<0即是代表anchor与negative相似越小,相似越小则loss的值越小,loss值越小则应该将代码中的ones_like替换为zeros_like。
请问我的理解中是否有误?
@RainFrost1 @changdazhou

@changdazhou
Copy link
Contributor

changdazhou commented Apr 26, 2024

对于cosine相似度,anchor与negative相似越小越好,但是注意这里的dist_an越大代表越相似,从你的描述看来好像是认为dist_an越小则anchor与negative越相似,可能是这里理解反了。
对于你的理解:
absolut_loss_an<0即是代表anchor与negative相似越小,相似越小则loss的值应该越大才对,所以用paddle.ones_like

@aaaaaaaak
Copy link
Author

对于cosine相似度,anchor与negative相似越小越好,但是注意这里的dist_an越大代表越相似,从你的描述看来好像是认为dist_an越小则anchor与negative越相似,可能是这里理解反了。 对于你的理解: absolut_loss_an<0即是代表anchor与negative相似越小,相似越小则loss的值应该越大才对,所以用paddle.ones_like

你好,对于negative应该相似越低越好,那么为何absolut_loss_an越低(负样本越不相似越好)loss的值越大呢?效果越好loss不应该越小么
@changdazhou

@changdazhou
Copy link
Contributor

不好意思,前面可能说错了,主要还是得看这段代码:
absolut_loss_an = paddle.where(absolut_loss_an > 0,
absolut_loss_an,
absolut_loss_an这里是越大代表的越相似没问题吧,所以后面把相似的设置为了1。

@aaaaaaaak
Copy link
Author

不好意思,前面可能说错了,主要还是得看这段代码: absolut_loss_an = paddle.where(absolut_loss_an > 0, absolut_loss_an, absolut_loss_an这里是越大代表的越相似没问题吧,所以后面把相似的设置为了1。

absolut_loss_an = dist_an - self.an_value
absolut_loss_an = paddle.where(absolut_loss_an > 0,absolut_loss_an,paddle.ones_like(absolut_loss_an))

此处absolut_loss_an应该是anchor与negative相似度的loss。
当absolut_loss_an > 0时,an相似度高于an_value取absolut_loss_an本身;
当absolut_loss_an <= 0时,an相似度低于an_value表示anchor与negative越不相似,a/n越不相似效果越好,此时的loss值absolut_loss_an是否设为0更合适?
@changdazhou

@changdazhou
Copy link
Contributor

刚刚我们确认了一下,这里的作用不是为了增加负样本的loss,而是去筛选出相似度很低的样本作为负样本,增加相似度低的样本的loss权重,以让模型对于负样本会提升更多的关注度

@aaaaaaaak
Copy link
Author

刚刚我们确认了一下,这里的作用不是为了增加负样本的loss,而是去筛选出相似度很低的样本作为负样本,增加相似度低的样本的loss权重,以让模型对于负样本会提升更多的关注度

感谢您的耐心回复!
经过这一步筛选后,负样本中相似度小于an_value部分(absolut_loss_an <= 0)的loss固定为1,1一定会大于负样本中相似度大于an_value部分(absolut_loss_an > 0)的loss,那么这样会将模型向anchor与negative的相似度为an_value引导,而不是anchor与negative的相似度尽可能小?我的理解(absolut_loss_an > 0)部分的关注度需要大于(absolut_loss_an <= 0)部分

另外如果有此处筛选可以提升负样本关注度的相关论文可以麻烦分享一下么?
再次感谢 @changdazhou

@changdazhou
Copy link
Contributor

absolut_loss_an > 0说明该负样本的相似度较高。作为负样本,我们更应该关注那些相似度较低的样本
另外,不好意思,相关论文我们没办法提供哈,可以去网上搜一下

@aaaaaaaak
Copy link
Author

absolut_loss_an > 0说明该负样本的相似度较高。作为负样本,我们更应该关注那些相似度较低的样本 另外,不好意思,相关论文我们没办法提供哈,可以去网上搜一下

相似度高的negative才是难以判别的样本,不是更应该优化相似度高的negative?怎么会去更关注相似度低的negative?negative的相似度需要尽可能小 @changdazhou

@zhangyubo0722
Copy link
Contributor

这里是为了让相似度低的负样本距离更远,相似度高的正样本距离更近,可以看下这个文档的loss部分,TripletAngularMarginLoss是基于Triplet loss的百度自研损失函数,所以没有论文可供参考。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants