Fork me on GitHub

张俊林:对比学习在微博内容表示的应用

图片

分享嘉宾:张俊林博士 新浪微博
编辑整理:李桂荣 中南财经政法大学
出品平台:DataFunTalk

导读: 深度学习的成功往往依赖于海量数据的支持,根据训练数据标记与否,可以分为有监督学习和无监督学习/自监督学习。监督学习技术已相对成熟,但是对海量的数据进行标记需要花费大量的时间和资源。自监督学习旨在自主发现数据中潜在的结构与知识,不仅节省时间以及人力标注资源,而且可以充分释放海量数据的潜力。对比学习可以看作是一种新型的自监督学习范式,具备广阔发展前景。本文会和大家分享一下对比学习在微博内容表示的应用,主要内容包括:① 什么是对比学习;② 典型对比学习模型(图像/NLP/多模态);③ 对比学习在微博内容表示应用。

01 什么是对比学习

首先和大家分享下什么是对比学习。

1. 渊源与谱系

图片

目前,对比学习并没有一个非常明确的定义。综合来看,对比学习跟以下两个目前比较流行的技术关联较深。

  • Bert采用的自监督学习。Bert采用自监督学习,节约了大量的人工标注成本,可以有效发挥海量数据的潜力。对比学习借鉴了自监督学习的思路,旨在充分利用海量的无标注数据;
  • 度量学习。度量学习的基本思路是让正例特征编码内容距离拉近,负例编码结果距离推远。其中的正例一般是源自有监督数据。对比学习主体思路跟度量学习接近,最大的区别在于其正例是由自监督方式得来。

综上,可以认为对比学习是一种自监督版本的度量学习。

2. 一个抽象的对比学习系统

一个抽象的对比学习系统的构造方式如下:首先,利用自监督方式,构造好一些正例,一些负例(即正样本,负样本);之后,将样本输入encoder进行编码;然后,将样本编码之后的结果投影到一个单位超球面。

对比学习系统的优化目标是:如果输入样本为正例,则希望在投影空间中样本之间的embedding越近越好,反之,为负例时两者距离越远越好。

为实现优化目标,常见做法是利用损失函数来达成。损失函数是机器学习的驱动力,它决定系统的学习方向。对比学习系统中最常用的损失函数为InfoNCE函数,如图所示,InfoNCE的分子部分表征正例,分母部分表征负例,由此可以达成优化目标。

图片

在构造对比学习系统时,有以下三个关键问题需要解决。

  • 正例和负例分别如何构造?这是对比学习和度量学习的主要区别。一般对比学习的负例大多可以通过随机抽取构造,所以对比学习中最核心的问题是如何构造正例。
  • 样本到特征的映射函数f如何设计?对比学习中样本通过encoder之后,经过映射函数f将其投影至单位超球面。所以,投影空间的选择和投影函数的设计构造也是一个关键问题。
  • 损失函数如何设计?前文所说InfoNCE是一个具体损失函数,在实际应用时并非一成不变,应该根据使用场景灵活设计。

在做具体系统时,把这几个关键问题实例化即可,不同实例化方法导致不同技术方案。

图片

3. 典型例子-SimCLR

SimCLR是facebook提出的对比学习模型。接下来,我们利用SimCLR模型,对照上面说的对比学习系统三要素来进行具体解释。SimCLR本身是一个双塔结构,分为上下两部分。第一个问题:如何构造正例负例?取一个batch图像,对其中每个图像利用多种变换方式组合进行变换,形成正例,这是自动化构造的方式,所以说是自监督模式的;负例则是在该batch中通过随机抽取方式形成。第二个问题:特征映射函数如何构造?SimCLR的映射函数f包括两个子结构,分别为encoder和projector,对应的作用分别为编码和映射。第三个问题:损失函数。SimCLR用损失函数InfoNCE来度量不同输入经过编码和映射之后在单位超球面中的距离,如果是正例则希望在空间中相似性越高越好,即距离越近越好,负例则反之。

图片

4. 怎样是一个不好的对比学习系统?

当对比学习系统不好的时候,容易出现模型坍塌问题。模型坍塌指映射函数在将输入映射到单位超球面时,无论是正例还是负例,都无差别映射至球面上同一个点。即:映射函数f对所有输入进行无差别编码,如此一来,模型无法学到任何有用信息。

图片

5. 怎样是一个好的对比学习系统?

好的对比学习系统实际上包含两方面要素:Alignment和Uniformity。Alignment指相似实例有相近的特征,在映射之后,距离相近;Uniformity指的是模型应该保留尽可能多的信息,输入数据在经过映射之后,在单位超球面上的分布尽可能均匀。模型坍塌是一种极度的分布不均匀,所以使得样本在投影空姐分布均匀可以解决模型坍塌问题,这可以理解为:分布均匀使得每个个体例子保留了自己的个体信息,均匀的本质是促使样例在经过编码和投影之后尽可能保留更多个性信息。

图片

好的对比学习系统可以用一个线性平面把不同类别的数据全部区分开。线性可分证明经过对比学习后,分类难度比直接对原始数据进行分类更为容易。

图片

6. SimCLR怎么防止坍塌的?

防止坍塌是对比学习最关键的一个出发点,SimCLR通过InfoNCE和负例来防止坍塌:通过正例来保证Alignment原则,正例相似度越高,在单位超球面中距离越近;通过负例实现均匀Uniformity,在单位超球面之中负例之间互斥,距离越远越好,由此实现防止坍塌。所以,SimCLR是通过负例来解决模型坍塌的,这是一种典型做法。目前得到的一个共识是:负例越多,学习效果越好。

图片

02 典型对比学习模型(图像/NLP/多模态)

1. 图像对比学习

SimCLR是一个典型的通过负例防止模型坍塌的模型。对于一个batch内的某个图片而言,正例是唯一的,其他所有图片都可以作为该图片的负例。如此处理的优点是简单,可以快速得到负例,缺点是在做深度学习的时候,由于算力受限,batch不能太大,因此会限制负例数量,无法大量增加负例,影响模型效果。

图片

为增加负例数量,需要抛弃在batch内取负例的做法,典型模型为MoCo V2。MoCo V2主要结构跟SimCLR一样,也是双塔结构。与后者的核心不同之处在于:下面的分支结构不同;MoCo维护了一个负例队列以增加负例数量。下面的分支采用动量更新来进行模型参数更新,除了自身的参数更新外,还将上面分支的参数纳入考虑,综合来进行参数更新;同时负例改为从负例队列中选择,因为负例队列没有大小限制,减少了batch负例的大小限制。

图片

基于负例的对比学习方法主要以MoCo和SimCLR为主,它们之间相互借鉴。MoCo模型最早出现,有两个特点:动态维护负例队列和模型参数动量更新。SimCLR在batch内取负例,创新点为引入projector和利用多种图像变换方法结合生成正例。MoCo V2借鉴SimCLR,引入projector,并且加入复合图像增强。MoCo V3将encoder从ResNet换为Transformer,增加了模型的复杂度。SimCLR V2 将encoder变成更深更广的ResNet。

可以看到,基于负例的对比学习方法相互借鉴,互相拓广。总结下,目前研究达成了以下共识:网络结构采用双塔结构,映射函数F为Encoder+Projector,并且特征编码器Encoder越来越复杂。

图片

接下来介绍一些除了基于负例的对比学习模型之外的其他对比学习模型。SwAV是一个对比聚类模型,是目前图像对比学习模型效果最好的模型之一。结构前半部分与SimCLR结构类似,主要区别为在得到输入图像的embedding之后,会在Prototype做一个聚类,每个类对应一个类中心编码。其优化目标为:正例之间所属聚类,尽可能聚到一起。SwAV利用隐含的基于负例的方式解决模型坍塌问题,在模型之中非正例的聚类之间的中心距离越远越好,所以用聚类后的正例和负例来替代了SimCLR例子中的正例和负例。

图片

SwAV看似没有明确地利用负例来解决模型坍塌问题,实质上是以隐含的方式利用了负例。那么,能不能不依赖负例来解决模型坍塌问题呢?可以的,我们可以采用非对称结构,例子为BYOL,这也是目前效果最好的模型之一。模型前半部分跟MoCo类似,利用图像变换得到正例,并且经过Encoder和Projector,利用动量更新机制更新下分支参数。BYOL对于MoCo最大的改进在于加入了Predictor,导致上下分支结构不对称,可以理解为如果去掉Predictor,则模型对称,如果不像MoCo一样引入负例,则模型容易坍塌。但是关于为何只用正例依然可以防止坍塌,目前并没有确切解释。

图片

非对称结构的SimSiam是对BYOL结论的再次验证,证实了只用正例构造模型是可行的,由于Predictor的存在使得模型上下分支不对称,的确可以防止模型坍塌。由此说明,Predictor的存在,引入结构不对称性,对于只包含正例的模型至关重要。

图片

最后一个典型模型为冗余消除Loss-Barlow Twins,由于其设计了一个新的损失函数,可以实现只用正例,并且结构对称的时候依然能够有效防止坍塌。由此说明,损失函数的定义对于对比学习来说也很关键。

图片

那么,如此众多的对比学习模型,哪个效果最好呢?通过下面列出的实验结果,我们可以看出:BYOL、DeepCluster和SwAV在各种环境下表现突出,这三者差异不大,与其他模型差距较大。

图片

图片

2. NLP领域的对比学习

关于NLP领域的对比学习,此处介绍两个模型:SimCSE和Self-Guided模型。

SimCSE可以理解为NLP版本的SimCLR,其结构与SimCLR一致,区别在于正例的构造方法。SimCSE将同一个输入样例放进模型两次,在Encoder中设置不同的Dropout,因此同一个输入会产生两个有差异的输出,将其作为正例,batch内其他样例作为负例。SimCSE最大的特点就是这个简洁的正例构造方式,而且效果很好。

图片

而Self-Guided则从模型结构上可以理解为SimCLR+动量更新,时间原因不展开介绍了。

图片

3. 多模态对比学习

关于多模态对比学习,此处也给出两个模型。

CLIP可以视作SimCLR模型的多模态版本。不过它的正例是人工清洗过4亿 <文本,图片> 数据对,所以严格意义上来说,CLIP不能算是对比学习模型,非自监督而是有监督的。由于图片和对应的文本描述一一对应,上分支结构利用Bert作为文本的Encoder,下分支结构利用ResNet作为图像的Encoder。Batch内的其他样例作为负例,正例要求相似性越高越好,负例相似性越低越好。

图片

WenLan本质上是MoCo模型的多模态版本。上分支图片部分用ResNet进行编码,下分支文本部分用Bert进行编码。此外,对图片和文本分别维护一个较大的负例队列。

图片

03 对比学习在微博内容表示应用

最后跟大家分享下对比学习在微博内容的表示应用及一些具体应用场景。

1. 微博文本表示应用场景:微博话题(Hash Tag)识别

微博话题,英文一般称为Hash Tag,一般将带 # 的内容命名为话题,话题本身是微博的简短概述。

微博中很多用户自己会给发的微博打Hash Tag,如果用户打上的Hash Tag可以表征文本主体思想,则为高质量话题,反之则为低质量话题。从统计角度看,相当比例用户打上的话题质量并不高,是包含了大量噪音数据的。

图片

尽管一部分微博用户会自己打上Hash Tag,但是大多数微博是不带主题信息的,所以“微博话题识别”任务的需求是:利用对比学习,给没有打上话题的用户微博打上准确体现微博主题思想的微博话题(Hash Tag)。

问题:如何使用对比学习,给每个微博打上靠谱的Hash Tag?

为解决该问题,我们提出了CD-TOM模型。它实质上是SimCLR的多模态改进版本。我们利用用户已经打上了微博话题的内容作为正例,将微博内容拆开,微博正文部分作为上面分支的输入,用户打上的话题作为下面分支的输入。上下结构对称,都利用Bert作为Encoder,TAP的作用是实现用Bert最上层的单词的Embedding的平均池化作为微博内容的表达,在经过L2 Norm之后进行相似度计算,模型使用的损失函数为InfoNCE.

图片

接下来通过例子说明如何利用CD-TOM模型做具体应用。当CD-TOM模型训练好之后,把微博历史上出现过的所有话题通过对比学习的下分支得到对应的话题Embedding,并存入Faiss库。当有新的微博出现的时候,将微博内容通过CD-TOM模型的上层分支的Encoder,将其得到的Embedding与库中Embedding进行比较,得到相似度最高的TOP 3,作为该博文对应的话题。

图片

以下是实验实例,通过实验可以看出:尽管训练数据是包含噪音的,但是最终学习到的模型效果很好。

图片

接下来介绍CD-TOM的另一个应用场景——相似博文:即利用博文找到相似的博文。具体做法为将所有微博文本,通过CD-TOM模型上分枝,输出Embedding并存至Faiss库;当新微博出现的时候,类似地将其文本生成Embedding,然后在Faiss库中找到相似度最高的Embedding,作为相似博文。

图片

CD-TOM模型最大的特点是将微博文本信息向其抽象概括语义靠近,可以提取出文本中最关键的因素,有点像微博文本的简短摘要,相比单纯做文本相似性匹配可以得到更好结果。

图片

2. 微博文本表示应用场景:微博多模态(文本-图片)

最后介绍以下微博的多模态领域怎么使用对比学习。很多微博是同时带有文本和图片的,对于这种文本+图片模式的微博,理论上我们可以认为文本和图片的语义一一对应,是对同一事件不同维度的描述。但是实际上,微博数据噪音很大,即存在大比例的图文语义不相关的内容。

图片

微博中存在一部分图文关系明确的数据,对其加以充分利用可以解决微博多模态问题的难点。

图片

问题:如何使用对比学习,给微博文本和图片打上靠谱的Embedding?

为解决上述问题,我们提出了W-CLIP模型。将同时带有图文的微博图文拆开,分别作为上下两个塔的输入,上面为文本塔,利用Bert作为特征抽取器;下面为图片塔,利用ResNet作为特征抽取器。优化目标为图文相关的微博图片和文本的相似度高,其余Batch内任意文本和任意图片可以作为负例,在投影后的embedding空间内,距离尽可能远。

图片

W-CLIP的典型应用场景为博文配图片。将大量微博图片通过图像Encoder之后得到的Embedding存入Faiss库,当有新博文出现时,将其文字内容通过文本Encoder之后形成embeddding,和Faiss库中图片内容进行匹配,得到相似度最高的对应图片。

图片

以下是具体应用实验效果示例。可以看出输入文本实体,对于具体概念和抽象概念来说,文匹配图效果都较好;W-CLIP可以学会实体颜色、年龄、性别等属性,由此可以实现多维度信息匹配;而且,W-CLIP对于文本整体语义的表达效果也较好;通过与图片搜索引擎的对比,可以发现W-CLIP更强调句子整体的语义。具体例子可以参考下面图片展示的内容。

图片

图片

图片

图片

图片

图片

图片

图片

此外,W-CLIP还可以实现用图片匹配博文,做法同用博文匹配图片,只不过过程反过来而已。

图片

通过实验结果可以看到,W-CLIP确实可以学到文本和图片的关系,可以匹配成功。但是,从车的匹配实例中可以看出,车的品牌并没有匹配,这说明W-CLIP对于细粒度的精确语义匹配效果还有待改进。

图片

图片

图片

图片

图片

上面我们说过,用微博数据来训练对比学习模型,本身是包含了大量噪音的,我们在做模型的时候,也没有专门做数据净化,但是可以看出,对比学习能够比较有效地减少这些噪音数据的影响。

04 问答环节

Q:Hash Tag 是生成的还是匹配的?

A:微博历史上有些用户会打上一些hash tag,我们认为用户打上的hash tag是候选集,把hash tag 通过对比学习,打成embedding存到Faiss库里去,然后来了新的微博,可以在库里进行匹配。所以是匹配的。

Q:关于MoCo的问题,提到了说负例越多的模型效果越好,为什么有些不需要负例呢?比如说SwAV和SimSiam,它们表现比SimCRL和MoCo还好?原因是什么?

A:这个问题是个Open问题,目前并没有标准答案,我讲讲我的理解和判断。负例的方法是一种典型的方法,负例越多越好,但是我们对比会发现:之所以聚类的方法SwAV和非对称的BYOL的方法更好,它们各自有各自的特点。SwAV的好处就在于加入聚类的过程,因为对比学习里面希望正例越接近越好,然后把只要不是我构造出来的正例,其他都当作负例。其实你想,这个假设是有问题的,这个问题在于因为是非监督的,所以没有正确的label,你会发现很多当作负例的,实际上是正例,但是基于负例的模型无法知道这一点,所以仍然会把潜在正例当成负例,会把它当作负例推开,这就是基于负例的方式存在的问题。我理解聚类方法比如SwAV其实是在缓解这种问题,因为它把相似性高的都聚到同一个类里的,避免了负例方法这种误判的问题,所以它可以缓解这个问题。

关于只采取正例的BYOL,为什么不需要负例,目前还没有公认的说法,仍然需要探索。

Q:聚类的SwAV是用的什么聚类方法呢?准确率怎么样呢?因为聚类其实很多时候准确率是有问题的。

A:好问题。具体是用的sk聚类,细节我不展开了,可以参考论文。聚类效果在对比学习里不是特别重要,因为每个Batch都要做聚类,所以主要考虑的是速度问题而不是准确率问题。具体算法参考一下论文。

Q:对比学习在NLP中可以用于有监督学习吗?

A:可以。比如说拿SimCSE来说,它可以做无监督的,或者叫自监督的,也可以做有监督的学习,论文其实也做了另一个有监督的版本:就是把带标签的数据集当作正例,将其放入对比学习的模型。不过,有监督的方式实际上已经不是对比学习了,是标准的度量学习的做法。但是现在大家对这种情况不太区分,统一都叫对比学习。


本文地址:https://www.6aiq.com/article/1630369506500
本文版权归作者和AIQ共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出