背景

        对比学习损失函数有多种,其中比较常用的一种是InfoNCE loss。最近学习实现了SGL推荐系统算法,对InfoNCE Loss做一个总结。

        InfoNCE Loss损失函数是基于对比度的一个损失函数,是由NCE Loss损失函数演变而来。那为什么要使用InfoNCE Loss呢?将在下文介绍到。

原理

        介绍InfoNCE Loss需要先介绍NCE Loss损失函数。

        NCE Loss 

        NCE是基于采样的方法,将多分类问题转为二分类问题。以语言模型为例,利用NCE可将从词表中预测某个词的多分类问题,转为从噪音词中区分出目标词的二分类问题,一个类是数据类别 data sample,另一个类是噪声类别 noisy sample,通过学习数据样本和噪声样本之间的区别,将数据样本去和噪声样本做对比,也就是“噪声对比(noise contrastive)”,从而发现数据中的一些特性。。

        详细请参考:求通俗易懂解释下nce loss? - 知乎

        论文链接:https://arxiv.org/pdf/1410.8251.pdf

        NCE Loss的一般表示形式为:

        但是,如果把整个数据集剩下的数据都当作负样本(即噪声样本),虽然解决了类别多的问题,计算复杂度还是没有降下来,解决办法就是做负样本采样来计算loss,这就是estimation的含义,也就是说它只是估计和近似。

 

        InfoNCE Loss        

        Info NCE loss是NCE的一个简单变体,它认为如果你只把问题看作是一个二分类,只有数据样本和噪声样本的话,可能对模型学习不友好,因为很多噪声样本可能本就不是一个类,因此还是把它看成一个多分类问题比较合理,公式如下:

        其中的q和k可以表示为其他的形式,比如相似度度量,余弦相似度等。分子部分表示正例之间的相似度,分母表示正例与负例之间的相似度,因此,相同类别相似度越大,不同类别相似度越小,损失就会越小。

        我们注意到有一个温度系数\tau ,这个温度系数有什么作用呢?

        温度系数\tau 是设定的超参数,它的作用是控制模型对负样本的区分度。温度系数设的越大,q*k的分布变得越平滑,那么对比损失会对所有的负样本一视同仁,导致模型学习没有轻重。如果温度系数设的过小,则模型会越关注特别困难的负样本,但其实那些负样本很可能是潜在的正样本,这样会导致模型很难收敛或者泛化能力差。因此温度系数的设定是不可或缺的。

        为什么不能使用交叉熵损失函数呢?

        交叉熵损失函数的形式如图所示:

        但是在之前的实现中我们发现推荐系统中LightGCN的实现的y_{i}是一个one-hot向量,因此交叉熵损失函数表示为:

         

        这和InfoNCE Loss的损失函数的形式十分相似,不同在于,上式中的k在有监督学习里指的是这个数据集一共有多少类别,比如CV的ImageNet数据集有1000类,k就是1000。 而在InfoNCE loss中类别只有两类或者几类,而交叉熵损失函数每一个用户或者商品自成一类,softmax操作在如此多类别上进行计算是非常耗时的,再加上有指数运算的操作,这导致计算复杂度相当高且不能实现。因此在对比学习中使用InfoNCE Loss而不是交叉熵损失和NCE Loss。

总结

        InfoNCE Loss是为了将N个样本分到K个类中,K<<N,而不是NCE Loss的二分类或者交叉熵损失函数的完全分类,是契合对比学习LightGCN即SGL算法的损失函数。

参考链接:

求通俗易懂解释下nce loss? - 知乎

Logo

一座年轻的奋斗人之城,一个温馨的开发者之家。在这里,代码改变人生,开发创造未来!

更多推荐