快捷搜索: 王者荣耀 脱发

推荐系统笔记(十):InfoNCE Loss 损失函数

背景

对比学习损失函数有多种,其中比较常用的一种是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的一般表示形式为:

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

InfoNCE Loss

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

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

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

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

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

但是在之前的实现中我们发现推荐系统中LightGCN的实现的是一个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算法的损失函数。

经验分享 程序员 微信小程序 职场和发展