wujcan / SGL-TensorFlow

173 stars 43 forks source link

About Contrastive Learning Loss #21

Open zwb29 opened 2 years ago

zwb29 commented 2 years ago

Hi, thank you for your awesome work, the experiment results of the code are quite consistent with the paper. I have some question about the role of contrastive learning in SGL, I notice that in the training process, the loss of contrastive learning(in the function of calc_ssl_loss_v2) is not keep falling. Actually, after 7 or 8 epochs (yelp2018 for example), when the bpr loss falling rapidly and indicators like Recall increase rapidly, the SSL loss is a little bit increasing, I'm quite confused about it. Introducing Contrastive learning as a auxiliary task indeed accelerate convergence, but that doesn't show up in the loss. I would like to know what do you think of this, thank you!

大佬你好,谢谢您的工作,这份代码能够完美复现文章中的结果,非常佩服。 我有一点关于对比学习在SGL中的作用的问题。与其他几个图对比学习预训练任务(比如图分类)不同,SGL中对比学习损失作为一个辅助损失,在训练过程中不是持续下降的。 比如在yelp2018数据集中,在Recall等指标上升最快的阶段,对比损失反而是有一点小增加的。作为一个辅助损失,对比学习确实加快了收敛,也提升了模型的效果,但是这一点并没有体现在对比损失的减小上,这让我有点困惑,请问您怎么看待这个问题? 谢谢!

wujcan commented 2 years ago

这是个好问题,我们目前也没有明确的答案。可能的原因是: (1)整个训练过程对比loss的scale变化不大,而且对比loss的正负样本比例是1:N,导致负样本的选取会极大的影响loss的值,出现小幅上升是有可能的; (2)推荐task所采用的BPR跟representation learning的对比loss优化的目标是有区别的,联合优化相当于对两者做了trade off,如果单纯的优化对比loss应该不会出现loss scales上升的情况吧; (3)而且有意思的一点是,从paper中的figure 5可以看到在BPR下降前recall就已经开始有明显的提升了,说明BPR其实跟推荐的metric还是存在一定的gap的。这一阶段的提升应该主要有对比学习带来的。 这个问题我觉得还是值得深究的。

zwb29 commented 2 years ago

感谢回复! 我在您这份代码的基础上做过一些实验。 (1)在只使用contrastive loss和正则项,也就是文章中pretrain的情况下,contrastive loss会很快收敛,和graph classification等任务中的contrastive learning loss曲线类似,最初快速下降最终稳定在一个水平。 (2)在只使用BPR loss和正则项,也就是LightGCN的情况下,BPR loss会以很均匀的速度下降,recall等指标也是随着BPR loss的降低而慢慢提高。

而且有意思的一点是,从paper中的figure 5可以看到在BPR下降前recall就已经开始有明显的提升了,说明BPR其实跟推荐的metric还是存在一定的gap的。这一阶段的提升应该主要有对比学习带来的。

这一点您文章中提到了,我也注意到了。模型效果最佳的时候,BPR loss并没有充分收敛,甚至可以说BPR loss还很大的时候就已经达到了LightGCN的效果。所以我比较赞同您说的BPR跟推荐的metric是存在一定的gap的。 谢谢!

xiqxin1 commented 2 years ago

感谢大佬的分享和讨论,我最近也在做对比学习相关的工作。实验中我发现正样本对最终结果的影响非常大,如果训练时随机生成一些noise正样本,则结果会变得很糟糕。请问其中的原因可能是什么?目前我们只使用了dropout做数据增强,是否可以有其他思路做数据增强,来消除noise positive label 的影响呢? 再次感谢各位大佬的回复。