背景
对比学习损失函数有多种,其中比较常用的一种是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](https://latex.codecogs.com/gif.latex?%5Ctau) 是设定的超参数,它的作用是控制模型对负样本的区分度。温度系数设的越大,q*k的分布变得越平滑,那么对比损失会对所有的负样本一视同仁,导致模型学习没有轻重。如果温度系数设的过小,则模型会越关注特别困难的负样本,但其实那些负样本很可能是潜在的正样本,这样会导致模型很难收敛或者泛化能力差。因此温度系数的设定是不可或缺的。
** 为什么不能使用交叉熵损失函数呢?**
交叉熵损失函数的形式如图所示:
但是在之前的实现中我们发现推荐系统中LightGCN的实现的![y_{i}](https://latex.codecogs.com/gif.latex?y_%7Bi%7D)是一个one-hot向量,因此交叉熵损失函数表示为:
![](https://img-blog.csdnimg.cn/0b268affafe749d3a2a5de5aced6da36.png)
这和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? - 知乎
版权归原作者 甘霖那 所有, 如有侵权,请联系我们删除。