对比学习视角重新审视推荐系统

目录

1 什么是对比学习

1.1 对比学习的渊源和谱系

1.2 什么是对比学习系统

1.3 对比学习的典型例子 SimCLR给出的解决办法

1.4 什么是不好的对比学习系统

1.5 什么是好的对比学习

1.6 SimCLR怎么防止坍塌:引入随机负例

2 典型对比学习模型

2.1 batch内负例-SimCLR

2.2 batch外负例-Moco

2.3 基于负例方法谱系(用负例避免模型坍塌的对比学习系统)

2.4 对比聚类-SwAV,典型的对比聚类方法​

SwAV的主要特点在:典型的做法

3 对比学习视角看召回/粗排模型

3.1 重新审视召回/粗排模型

3.1.1 双塔模型概述​

3.1.2 目前的双塔就是一种对比学习​

3.1.3 用对比学习解释经验做法

3.1.4 总结展望

3.2 更纯正的对比学习

双塔模型-item侧引入对比辅助loss​

在对比学习中最重要的正例此时怎么做?两种做法:

在item侧引入对比辅助loss有用吗?上图是实验结果

双塔模型-user/item侧同时引入对比辅助loss​

3.3 图模型召回

 怎么把对比学习引入图召回模型中?

有了经典的GNN模型,该怎么在GNN上采取对比学习?


  1. 对比学习可以说是自监督版本的度量学习,最大的的特点是自监督的,也就是自动构造正例的方法。SimCLR是对比学习的典型例子(对比损失函数InfoNCE来驱动达成对比学习的目标:正例拉近,负例推远)
  2. 容易发生模型坍塌的模型是不好的对比学习系统(SimCLR的防坍塌方法:随机负例,负例越多效果越好),好的对比学习系统应兼顾:alignment和uniformity,前者是希望相似正例在投影空间有相近的编码,后者是希望所有实例映射到投影空间之后分布尽可能均匀(希望实例对应的embedding可以保留更多的个性化信息)
  3. 双塔模型,模型简单,在线推理速度快,但因为拆分成了user和item两个塔,特征交互不充分,所以效果不如排序模型那种单塔模型。(召回模型的典型问题,特征交互太晚,当前有论文提出的实践结论是在打embedding做MLP之前引入SENet抑制噪音特征,强化有效特征,能更有效的表达user/item之间的特征交叉)
  4. 实践中的几个经验:
    1. 召回阶段双塔模型的负例有多种做法,in-batch,全局随机抽样,混合等,目的是让投影空间中的所有实例分布比较均匀 尽可能的保留自己个性化的信息、
    2. 打成embedding之后,相似度计算之前先做norm(把embedding映射到长度为1的单位超球面上会增加训练稳定性和投影空间线性可分性,这样就是用简单算法也能得到较好的效果)
    3. 是否在loss或相似性计算的时候引入温度超参(目的上让loss聚焦在hard负例上,自动做hard负例选择)
  5. 搜广推场景中数据长尾分布问题,是目前制约系统优化很严重的问题,用对比学习来解决长尾数据频次低难以通过很多用户行为数据推导出靠谱embedding的问题
  6. 双塔模型item侧引入对比辅助loss,实验结果表明在不同数据集合都有提升,数据稀疏场景尤其有效。双塔模型在user和item侧同时引入对比辅助loss,应该可以缓解数据稀疏的user/item对应embedding质量,还在尝试
  7. 用图模型做召回:很简单,把打user/item embedding的模型换成一个典型的GNN模型
  8. 在GNN上做对比学习,对子图做操作做正例,负例方法都行
  9. 图模型做对比学习:用户行为构造用户行为图,借用经典GNN方法构建图计算系统,对子图做操作得到正例,负例方法都行。这种典型基于对比学习的图召回模型,对于解决冷启动应该有帮助

1 什么是对比学习

1.1 对比学习的渊源和谱系

    其实来源于度量学习,兴起是因为bert的出现(效果特别好,自监督的方式,对比学习的正负例是根据规则自动构造的),可以说是自监督版本的度量学习

度量学习:是从数据中学习一种度量数据对象间距的方法,目标是使得在学得的距离度量下,相似对象距离小,不相似对象间距大

1.2 什么是对比学习系统

    概念:以一个图像为例子,通过自动构造正负例,形成图片的两个view,通过encoder编码后映射到一个投影空间,对比学习的优化目标是:希望投影空间的两个正例距离比较近,负例比较远。优化方法:一般来说是通过定义损失函数(指明了系统的优化方向)来做到。

    框架:正例构造-》encoder的结构-》损失函数的定义

  • 正例构造一般是自监督方式,负例随机选择
  • encoder映射函数怎么设计
  • 损失函数怎么设计

1.3 对比学习的典型例子 SimCLR给出的解决办法

  1. 正例构造:随机形成一个图像构成的batch,随机拿出一张图片做一些变形,构造出与它对应的两个正例,负例则选择batch中的任意图片
  2. encoder的网络结构:分为两部分的投影函数,第一部分是resnet抽取图片特征,编码成embedding来表征图片内容。第二部分是投影结构projecttor,由两到三层MLP链接构成,把embedding映射到某个投影空间。上下分支完全一样,参数也共享。
  3. 损失函数:经过双塔结构,SimCLR已经将输入数据,映射到投影空间里了。对正负例做相似度计算,相似度其实就是正负例在投影空间里的距离远近度量标准。相似度计算后,用对比损失函数infoNCE来驱动达成对比学习的目标(正例拉近,负例推远)

1.4 什么是不好的对比学习系统

    容易发生模型坍塌的模型是不好的对比学习系统。(模型坍塌:不论输入什么图片,经过映射之后,在投影空间里,所有的图像编码都会坍塌到同一个点(不论输入是什么,最终经过映射函数都被映射成同一个embedding,也就意味着没有编码任何有用的信息))

1.5 什么是好的对比学习

一个好的对比学习系统应当兼顾:alignment和uniformity

alignment:代表我们希望对比学习能将相似的正例在投影空间里有相近的编码(一般做一个embedding映射系统都希望能达成这个目标)

uniformty:希望所有实例映射到投影空间之后分布尽可能均匀,通过这个尽可能均匀的分布,希望实例对应的embedding可以更多的保留自己个性化的信息。(一张草地上奔跑的黑狗,一张水里游泳的白狗,投影后若保留了更多个性化的信息,那么两张图片在投影空间中是有一定距离的,来表征两者的不同。不会因为都是狗的图片而聚集到球面的同一点上

1.6 SimCLR怎么防止坍塌:引入随机负例

    SimCLR是通过引入负例来防止模型坍塌的(随机负例)

    InfoNCE损失函数中,分子部分体现了alignment:希望正例的相似性越大越好

    分母部分中的负例可以防止坍塌:越不相似,相似性得分越低,距离越远,损失函数越小。InfoNCE通过强迫图片和众多负例之间在投影球面相互推开来实现分布的均匀性(体现uniformty)

    这里反复强调alignment和uniformty这两个因素,是因为从对比学习视角审视推荐系统里的召回模型时,从这两个因素考虑是很重要的

    图像领域对比学习,目前有两个明确的结论:

  1. 在batch内随机选取负例,选的负例数量越多,对比学习模型的效果越好
  2. 在InfoNCE的公式里有个τ,叫做温度系数,它对于对比学习模型效果影响非常大,不同的参数可能效果会差百分之几十,按经验来说,取较小的值:0.01-0.1之间比较好

2 典型对比学习模型

2.1 batch内负例-SimCLR

 SimCLR的几个要点:

  1. 模型结构采用了做“搜广推”常见的双塔结构
  2. 对正负例的embedding做相似计算前,应该先做一个L2Norm,这会提升效果是已有的结论,现在基本所有的系统都会带这个norm过程
  3. 模型自动构造正例
  4. 负例是In-batch内随机负例,也就是说,在这个batch里面除了我这个正例之外的任何其他例子都作为负例(这是典型的In-batch负例方法)

2.2 batch外负例-Moco

根据上文所说的的一个已有结论:负例用的越多,模型效果越好。

    SimCLR是在batch内随机选负例,但是batchsize不能无限放大,batchsize的增大对计算资源要求比较高。batch size制约了负例的采样个数,什么手段能采样大量负例,又不受到batchsize大小的限制呢?mocov2给出了解决办法(解除batch size的约束,大幅增加负例的数量

    mocov2的模型结构与SimCLR基本类似:上下两个双塔结构,网络结构也由两个映射子结构组成。只有一点小差异,这也是moco对负例数量约束限制的解决办法:(1)下分支网路参数更新机制和上分支的更新机制不一样,采用了动量更新机制(2)moco维护了一个负例队列。

    通过维护的负例队列解决负例数量受batch size大小制约的影响

    下分支的正例通过下分支打成embedding,然后把它入队,在队列中待了太久的会让它出队。moco的负例采集方法和SimCLR一样,是随机抽取负例,不同之处是:不从batch中取,是在负例队列中取

2.3 基于负例方法谱系(用负例避免模型坍塌的对比学习系统)

    分为两大谱系:moco和SimCLR系列,他们不断相互借鉴做版本更新(mocov2借鉴了SimCLR的引入projector和复合图像增强做正例)

    采纳负例的方法有三个共识:(也是目前用负例做对比学习的三个比较典型的特点)

  1. 网络结构现在基本都是双塔结构
  2. 映射函数一般由resnet和projector构成,用来做图像编码和
  3. encoder越来越复杂,如果用resnet会越来越宽,越来越深,也可以用更复杂的transformer做这件事

2.4 对比聚类-SwAV,典型的对比聚类方法

  • 图像对比学习众多模型中效果最好的方法之一
  • 正负例的构造方法,同前文
  • 模型结构,同SimCLR:双塔结构和两个映射函数,上下对称

SwAV的主要特点在:典型的做法

  1. 对于batch内的实例,网络结构将实例映射成对应的embedding,之后,把当前batch内的数据做了聚类,在prototype这个位置聚成k个类,prototype可以理解为每个聚类的类中心
  2. 对比loss优化目标是
    1. 走上分支的图片达成了zi的embedding,假设它对应的正例zj通过聚类,聚到prototype的绿色的类里去了
    2. 此时SwAV的优化目标是:希望zi与zj所属聚类的类中心距离越近越好,也就是希望正例能聚到一起
    3. 因为上下分支对称,反过来也可以说是zj打成的embedding,其与对应正例zi所属类的类中心距离越近越好,其与对应正例zi所属类的类中心距离越近越好。所以它是一个对称的swapped predict的loss,上面两个子loss加起来就是它优化的目标

3 对比学习视角看召回/粗排模型

3.1 重新审视召回/粗排模型

3.1.1 双塔模型概述

    双塔模型的思路把user特征(包括context特征)和item特征拆开,分别传给两个塔,通过DNN打成embedding。左塔打出user embedding,表征用户兴趣。右塔通过DNN达成item embedding,表征物品。然后对两者做相似度计算,一般会用内积或者cosine。

    目前来说,双塔模型是线上用的最多的模型,因为有很多好处:模型简单,在线推理速度快(可以用ANN快速查找)缺点:因为拆分成了用户和item两个塔,导致用户侧特征和item侧特征交互太晚,在最后做内积的时候才交互。因为交互不充分,所以效果实际不如排序模型那种单塔模型。

    在实践中有几个决策点需要考虑,这里是三个实践经验

1 双塔模型-负例问题

     在做排序(rank)的时候,负例怎么构建?比如对于点击模型,一般把展示给用户曝光未点击样本做负例,就是曝光给用户了,不过他没点击,说明他不感兴趣,那这就是负例。

    但是,在做召回时,不能完全应用这种做法,(selection bias)召回用的双塔模型是排序的前置环节,面临的候选集是整个物料结合,不像rank阶段,rank阶段面临的候选集是召回或粗排筛完之后剩下的子集合,只是物料全集的一个子集。所以召回和排序的候选物料集合分布是有差异的。如果用rank阶段做负例的方式,来给召回环节做负例的话,你会发现有很多未曝光的或低曝光的样本,召回模型从来没有见过,所以导致误分

(排序的负例构建用的时候曝光未点击样本 面向召回之后剩下的子集,召回阶段面对的是所有物料 如果还用曝光未点击做负例的话会导致误分)

第一个决策点:召回阶段双塔模型的负例怎么做

    第一种选择就是in-batch负例,比如刚才的SimCLR

    第二种选择就是全局随机抽样,不存在selection bias,但问题是随机选的负例和正例因为太容易区分,不包含太多信息量,比如YouTube DNN

    也可以将两种混合,负例一部分来自于in-batch负例,一部分来自全局随机采样负例

    召回模型负例有很多可能的做法:in-batch随机负例+曝光未点击负例,两者按照一定比例混合,希望靠in-batch负例解决selection bias,靠曝光未点击负例增加学习难度,效果不错

第二个决策点:user特征打成user embedding,item特征打成item embedding,相似度计算之前先做Norm?

google双塔DNN论文实验部分供图,实验结论是:应该做一个normalization,效果会更好 为什么?

    第一种选择是内积

    第二种选择是用cosine,可以理解为user embedding和item embedding各自做了一个L2 Norm,然后两者在做内积

    经验之举是:要么用cosine给它自动做norm,要么用内积,原则上要在前一步做个L2 Norm,再求内积。两个方法基本等价

第三个决策点:做召回模型,比如做双塔模型时,应不应该在loss里或者相似性计算的时候引入温度超参?

    温度超参对于图像领域里的对比学习模型效果来说,不同参数设置,影响是巨大的 为什么

    最好加一个,至少可以作为一个改进模型尝试的选项。如图DNN双塔召回模型论文实验部分提到的一点:在做loss之前,user embedding和item embedding做相似度计算的时候应该放温度超参数,并给出了对比实验结果,左表是论文中给出的不同温度超参对效果影响的对比数据,可见,不同的温度超参对效果影响还是蛮大的。

3.1.2 目前的双塔就是一种对比学习

    双塔模型的三个实践经验:随机负例,embedding做L2 norm,加入温度超参数。为什么要这么做?

    目前:确定三个决策点后,左塔的user打成embedding,右塔的item打成embedding,对两个embedding做Norm,再做相似度计算,in-batch负例,带一个温度超参数。

    把SimCLR逐步改造成双塔模型:依然in-batch随机负例,正例方式换一下,encoder拿掉。从这个角度可以把目前双塔方法理解为一个典型的对比学习方法

  1. in-batch负例
  2. 正例:图像通过自动图像增强,对于推荐来说,把用户行为过的item作为正例,把正例方式换一下
  3. 把上图中的SimCLR的encoder拿掉,因为encoder用的是resnet,是专门提取图像特征的,这是做推荐不需要的。保留projector,它的实际做法也是MLP,跟我们推荐做双塔的DNN模型结构基本一样。
  4. 对两个embedding做Norm,两个embedding的正负例做Norm
  5. 引入infoNCE loss,可以看成推荐里常见的pairwise loss,比如BPR的一个拓展
  6. 带着温度超参

3.1.3 用对比学习解释经验做法

    如果把目前的召回模型看做是对比学习的一种变体,就可以用对比学习的理论来解释这三种做法背后的道理

问题1:双塔模型随机负例的作用是什么?让投影空间中的所有实例分布比较均匀尽可能的保留自己个性化的信息

    selection bias的角度解释:召回模型的候选集是整个物料集合,rank阶段面临的候选集是召回或粗排筛完之后剩下的物料全集的一个子集。用rank阶段做负例的方式给召回环节做负例,会发现有很多未曝光或低曝光的样本,召回模型没见过,导致的误分。

    对比学习的角度解释:一个好的对比学习系统满足alignment和uniformty两个要素。alignment就是InfoNCE的分子,也就是相似性越高拉得越近。uniformty,SimCLR是通过引入负例达成的,引入负例后可以让投影空间中的所有实例分布比较均匀,也就是让实例映射在投影空间之后尽可能的保留自己个性化的信息。

    进一步推论:根据现有结论“负例越多模型效果越好”,可以得出:做in-batch随机负例的双塔模型召回,随着batch size逐渐放大,效果应该越来越好(个人推论,无实验支撑)

问题2:温度超参的作用是什么?让loss聚焦在hard负例上,自动做hard负例选择

    可以借鉴图像领域对比学习的一些研究结论来解释,图为:图像领域对比学习中,InfoNCE中温度超参的作用:在InfoNCE中引入温度超参对于对比学习图像系统来说影响非常大,设不同的参数,可能效果会差百分之几十。那么怎么理解它的作用?对InfoNCE做梯度分析的话,会发现结论是:小的温度超参可以让loss聚焦在hard负例上,也就是,在大量随机负例中,会自动给hard负例分配更多的loss,因为这些hard负例带有更多信息,能给模型带来更多正面作用

    图:不同的温度超参,对训练好的对比学习系统带来的不同影响

    纵坐标:代表某个锚点实例和其他不同实例的相似性得分

    横坐标:是10个实例,红色是锚点对应的正例,蓝色代表较难区分的负例

    可以发现:前面子图引入小的温度系数和后面较大的温度系数最大的区别是,小的温度超参会把难的负例推的更远,相似性得分就拉开了,正例和hard负例区分度更明显。这说明了引入温度超参,且设的越小,hard负例在投影空间和锚点的距离就会越远

    对于召回模型来说,小的温度超参会将优化过程自动聚焦到hard负例上,因为hard负例带给我们的loss作用更大

    如果以上解释成立,可以进一步做些推论:召回模型用的是随机负例/in-batch负例,因为引入大量随机负例,大量简单负例信息含量不大,但是因为数量多所以聚集起来的loss会淹没掉hard负例的作用,那么这种情况下,引入温度超参应该更重要,因为它可以让loss更聚焦在hard负例上

(召回模型的负例策略,引入大量负例导致loss聚集会淹没hard负例的作用,此时温度超参的作用更重要了)

问题:3:embedding为什么要做Norm:把embedding映射到长度为1的单位超球面上为什么?会增加训练稳定性和投影空间的线性可分性,增加线性可分性,也就是用简单算法也能得到较好的效果

        也就是为什么相似性函数要用cosine而不是内积,同样用图像领域对比学习(上图论文)把结论迁移到推荐领域里来,它的解释是说:对user embedding或item embedding做L2 Norm,相当于在投影空间里把长度因素统一转换成了1,作用是把embedding的长度都归一化为1,把它们都映射到一个长度为1的单位超球面上去。为什么要这么做?投影到单位超平面上,会增加训练稳定性和投影空间的线性可分性,增加线性可分性,也就是说你用简单算法也能得到比较好的效果。退回到召回模型中,也就是为什么召回模型要带上L2 Norm,应该也是同样的原因。

3.1.4 总结展望

    归纳总结前文内容:

1、双塔召回模型原则上可以把它看成是一种比较典型的对比学习系统

2、在现有的召回模型里面,有一些经验的做法可以从对比学习里面给出它们的理论解释。在此基础上能搞一点有新意的做法吗

     召回模型有一个很典型的问题:user/item embedding之间特征交互太晚,导致效果不好。作者的实践结论是如果在user embedding和item embedding做MLP之前引入SENet,可能会对召回模型的效果有提升,引入SENet抑制噪音特征,强化有效特征,能更有效的表达user/item之间的特征交叉。

    feature embedding上还有比较大的挖掘空间

        如何用对比学习做召回模型?从对比学习的角度理解经典的双塔模型,SwAV模型原则上可以用来做推荐的召回模型。作者提出的推荐领域中的SwAV模型:ConCAT,它的做法就是参考SwAV对双塔模型做改进:用用户行为过的item做正例,这些正例形成batch,经过user和item塔,形成use/item embedding,类似SwAV,在形成embedding后加了一个聚类过程。优化目标是:左塔的loss:对于某个user embedding,希望其与对应的正例item所属聚类的类中心的embedding的距离越近越好,和其他聚类类中心越远越好。对应的对称的右塔的loss,希望item embedding和对应正例user所属的聚类类中心距离越近越好。两个loss相加就是模型优化的目标。作者认为这种方式可能做出一些比较新的召回模型。

思考:推荐系统有足够多训练数据,就不需要对比学习了吗

  1. 对比学习最大的特点是自监督的,也就是自动构造正负例,对于推荐系统来说,其实有足够多的可用数据,比如我们一般会用用户的点积item作为正例。
  2. 搜广推场景中,用户行为数据的稀疏性是非常严重的(典型的长尾分布),这也是目前制约系统优化很严重的问题,就是用户行为数据分布极度不均匀,真正被用户点击过的行为数据item,很多都分布在极少数或者极少比例的item里面,大多数都是长尾的,没有用户数据或者很少用户数据。
  3. 引入对比学习来解决长尾分布的问题:对于长尾侧的数据,用现有的监督方法打出的embedding不可靠,因为它的频次太低很难通过很多用户行为数据推导出靠谱的embedding

长尾分布的让视觉识别任务中数据建模困难

    此论文针对数据长尾分布的问题(头部类别具有较多样本实例,尾部类别具有较少样本,长尾分布会导致深度学习模型将在很大程度上由少数头部类主导,在尾部的少样本类别上它的性能会大大降低。现有的解决方法分为onestage imbalance learning和twostage imbalance learning),提出了一种用于长尾视觉识别的统一分布对齐策略:通过开发了一种自适应校准函数来调整各个数据点的分类概率,接着引入了一种通用的two-stage重加权方法来引入平衡类别先验信息,这个方法为视觉识别任务中的不同场景提供了灵活通用的方法。在图像分类、语义分割、目标检测和实例分割的实验中都验证了方法的有效性。本质上是通过引入一个参考分布来监督分类器输出的预测类别分布,利用有关类别的先验信息解决长尾分布问题,并基于这个思想巧妙的设计了自适应准配函数adaptive calibration function,通过线性变化和非线性激活函数调整分类器的输出,在多个视觉任务取得了显著的性能提升

3.2 更纯正的对比学习

  • 双塔模型-item侧引入对比辅助loss

        google的一个工作:上图左侧是标准的双塔召回模型,为了在item侧把长尾的item embedding打的更靠谱:在优化的过程中,除了主loss,也就是常规user和item侧的交叉熵loss,在对比学习辅助loss(右侧)是针对item的新双塔。

在对比学习中最重要的正例此时怎么做?两种做法:

    1 FD:dropout,把item的特征随机抛掉一部分,因为item两个塔各自随机抛掉的特征不一样,就会构造出同一个item两个不同的试图view,两个不同的view就可以当做item的正例,经过双塔打出两个embedding,loss函数采取InfoNCE,(经过dropout的两个正例,经过DNN映射后要求在投影空间里距离越近越好)in-batch随机抽样作为负例,让它和正例在投影空间里越远越好

    2 FM:feature mask,dropout方法说做正例时,随机抛掉一部分item特征,两个塔抛法不一样,通过这个方法制造一对正例。本方法是:人工把item特征分为两个子集合:A B。通过这种方式,制作item两个不同的view,并要求这两个view在投影空间距离近一些,in-batch随机负例与正例距离越远越好

  • 在item侧引入对比辅助loss有用吗?上图是实验结果

    FD和FM这两种做法相对标准双塔模型,效果有比较明显的提升,尤其是数据稀疏的场景,也就是低频的item或user embedding较多的场景,效果尤其好

    这里做了对比实验:在选择训练数据的时候,只取原始数据的10%甚至1%,人为制造稀疏场景,即使里面有中高频的数据由于抽样只取1%很多中高频也成了稀疏的了。结论是对于稀疏数据集,采用这种引入对比学习loss方法,效果提升明显

  • 双塔模型-user/item侧同时引入对比辅助loss

        刚才讲的googlle的一种典型对比学习召回模型做法,实际就是在item侧引入辅助的对比学习loss,目的是对于中低频或长尾的item embedding,让它打的更靠谱一些。稍微拓展就可以得到改进的模型:仿照item侧的做法,把user侧也引入对比辅助loss,做法相同。还没有结果,应该是可以的。

3.3 图模型召回

 怎么把对比学习引入图召回模型中?

    图为典型的如何用图模型做召回的思路:一般做召回模型时,把user和item特征分离,把user特征item特征通过离线模型训练打出embedding。在线服务时,拿到user embedding然后从item库里去做ANN匹配,找出得分最相似的item作为召回的结果。

    用图模型做召回:很简单,把打user和item embedding的模型换成一个典型的GNN模型。

召回是推荐系统的第一阶段,主要根据用户和商品部分特征,快速找回一小部分用户潜在感兴趣的物品交给排序环节。这部分需要处理的数据量非常大,速度要求快,所有使用的策略模型和特征都不能太复杂。

    上图是典型的GNN模型方法:把用户行为图,也就是把user对item的行为构建为一个二分图,也可以把user和item的属性放进来,拓展成更复杂的图,然后在这上面做一些图的迭代算法

有了经典的GNN模型,该怎么在GNN上采取对比学习?

        例子1:在图计算里面引入对比学习,与SimCLR和双塔召回模型过程一样:对于整个图中的一个子图,通过对子图做些操作,得到子图不同视角的view,以此来构造图的正例,常见的操作方法包括Node droping和edge perturbation等。做完正例,把它通过一个模型映射到embedding空间中去,要求两个正例在投影空间中距离越近越好。负例可以in-batch随机选取负例,要求正例和负例在投影空间里面的距离越远越好。这是典型的SimCLR做法,唯一区别是这里的输入侧不再是图像或者不再是推荐里的user或item,而是一个子图。

    在对比学习中最关键的如何构造正例问题?这里图模型是怎么构造正例的?这里的四种常见的方法:1、node dropping因为图由图节点和连接图节点的边构成,随机drop掉一些节点,就可以构造出一个不同的子图view出来。2、也可以对边做工作,随机删掉或增加一些边。3、也可以随机mask掉图节点的一些属性(图节点可能是带有属性的)。4、可以在图上随机游走,利用不同游走结果来构造对比学习图的view。

 

    已经知道了GNN模型如何引入对比模型,在推荐里,对于图模型召回怎么引入对比学习?结合上面介绍的知识:可以利用用户行为构造用户行为图,然后借用经典GNN的方法构建图计算系统,之后可以参照上面的GNN引入对比学习的思路,这样对于稀疏的user和item数据,会打出更靠谱的user/item embedding。在线服务的时候用user embedding拉对应的item embedding就可以了。这样就构造出一个典型的基于对比学习的图召回模型,它对于解决冷启动应该是有帮助的。

冷启动问题:在开始阶段就希望有个性化推荐应用的网站来说,如何在没有大量用户数据的情况下设计个性化推荐系统并且让用户对推荐结果满意从而愿意使用推荐系统

  • 召回阶段怎么用对比学习
  • 怎么从对比学习的角度看待已有的模型
  • 怎么用对比学习来改造现有的召回模型

        能在rank模型里引入对比学习吗?当然,解决两个关键问题:1、是在某个地方引入对比loss 2、怎么构造正例。在ranking阶段做对比学习可能不像在召回阶段这么直观,因为召回模型天然是个双塔结构,对比学习系统也是个双塔结构。但在ranking阶段就不那么直观了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值