暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

如何利用噪音数据:对比学习在微博场景的应用

布洛卡区 2021-05-10
444
对比学习最近一年比较火,它的应用范围,已经从最初的图像领域,逐步拓展到了自然语言处理以及多模态等很多其它领域。本文介绍微博在自然语言处理以及多模态方面,应用对比学习的经验。
后文将要介绍的两个模型:CD-TOM和W-CLIP,是我们在今年春节前后做的,CD-TOM是关于纯文本方面的对比学习模型;W-CLIP是关于<文本,图片>多模态数据方面的对比学习模型。两个模型的具体技术方案并不复杂,应该说主要受到了SimCLR和CLIP模型的启发(当然,其实CLIP模型明显也受到SimCLR模型的影响)。从后面介绍可以看出,文本类模型CD-TOM基本是图像领域里的SimCLR模型应用到文本领域做的改造,<文本,图片>类模型W-CLIP在结构上基本就是CLIP模型,只是做了一些小改动。在模型结构上,其实目前大多数对比学习系统都差不太多,很多模型差异来自于训练数据的正例、负例构造方法或损失函数定义上(关于经典对比学习模型知识,可参考:对比学习(Contrastive Learning):研究进展精要。我们这里提到的两个模型,和SimCLR或CLIP相比,模型结构差异不大,主要差异体现在采用的训练数据特性方面的差异。
我们知道,SimCLR是个纯自监督的任务,通过对无标注图片做不同的图像增强来构造训练数据的正例;而CLIP尽管叫做对比学习,它其实是个有监督的训练过程,它的正例来自于经过各种挖掘手段净化过的,比较干净的4亿<图片描述,图片>数据对。我们后文将要提到的两个模型采用的训练数据正例,可以理解为处于两者之间:既不像SimCLR,属于纯粹自监督的任务,也不像CLIP那样使用的是比较干净的数据对,而是以包含大量噪音的数据作为对比学习模型的训练正例。
我当时比较关心的其实是下列问题的答案:如果我们有海量的数据对<数据A,数据B>,这两个数据之间并非完美语义对应,里面包含大量噪声,但是两者之间又有一定程度的语义关联。那么,是否可以采取一定的技术手段,把这种数据用起来并取得好的效果呢?
怎么理解上面说的海量含噪声数据的意思呢?这里以微博的<文本,图片>数据来做阐述。
很大比例的微博带有图片,我们希望带图片的微博,最好文本和图片能够表达相同的语义,就像上图展示的例子一样(尤其是右图的例子),文和图有一一对应的关系。若能如此,无疑这是训练多模态模型的高质量训练数据。但是,现实往往是骨感的,像上图中这种好例子,只占了带图微博中比较小的比例,相当部分的带图微博很难有图文语义一一对应关系。
很大比例的带图微博,其实是上面这种情况,比如是字图或者复杂场景,很难找到文本和图片之间的语义对应关系。
还有不少是如上图所示例子的情形,图片质量看着不错,但是文本里根本没有提到图片包含实体的相关词汇,或者文本和图片都出现了很多不同的实体,这样的<文本,图片>数据对,也难以建立起文本和图片之间的精准语义映射关系。
我们说的带大量噪声的数据,就如上面这些例子所展示的,只有一定比例的数据在<数据A,数据B>之间有相对良好的语义映射关系,除此外包含大量噪声。这里举的例子是图文数据对,微博的<文档,话题(HashTag)>数据对,也包含了很多噪音数据,不过比起图文质量还是要好一些。
那么,能把这些海量带噪声的数据用起来么?我们先从对比学习模型谈起。


对比学习模型:CD-TOM & W-CLIP

我们先从面向<文档,话题>数据对的对比模型说起。所谓“话题”是什么意思呢?上图给了两个例子,微博中用户打在##符号内的内容,一般在Twitter上管这个叫HashTag,我们内部称之为话题。话题往往是用户使用几个单词组成的,对博文内容进行概括性描述的短语。微博中大约40%的博文是带有用户打上的话题的,但是用户打的话题质量良莠不齐,存在大量蹭热点话题的现象,博文内容和话题不匹配或弱相关的情况较为常见。上图两个例子分别展示了高低质量话题这两种情形。本文说的“文档”,指的是去掉话题的博文内容,后文有时也会称为“微博正文”。也就是说,我们会把微博内容分离成文档和对应的话题两部分。
我们希望使用同一微博带有的<文档,话题>数据对作为训练数据,使用对比学习,构造一个表征学习系统,将微博正文和话题映射到同一个语义空间中,在表示空间内,语义相近的正文和话题距离较为接近,而语义不相似的正文和话题距离较远。以此来获得一个针对微博内容的编码器和话题编码器,希望这两个编码器能够给微博内容和话题打出高质量的Embedding。我们称这个利用<文档,话题>数据的对比学习模型为CD-TOM模型(Contrastive Document-TOpic Model),它其实是SimCLR的自然语言处理版本。
上图展示了CD-TOM模型的整体结构。仿照SimCLR模型,它由对称的上下两个分枝(Branch)构成,上下两个分枝主体都由Bert模型构成,是基于Bert预训练模型的双塔结构。
我们随机从带有话题(#HashTag#)标记的微博训练数据中取N个构成一个Batch,对于Batch内某个微博 来说,在Aug1和Aug2里分别是微博正文和对应的微博话题 ,数据对<, >互为正例,而博文和Aug2里除之外的其它任意N-1个话题都互为负例。同样的,话题和Aug1里除之外的其它任意N-1个微博正文都互为负例。这是CD-TOM模型的正例和负例构造方法,可以看出,采用了典型的Batch内负例。
因为上下分枝是对称的,我们仅以博文侧Aug1所经过的上分枝来介绍文本表示映射过程。Aug1内的正文数据,首先经过Bert模型对文本内容编码(这里以函数代表):目前很多研究表明,在做文本表示时,用Bert的[CLS]来表征文本内容效果不佳,所以常常会用Transformer最高层单词对应的Embedding编码(注:如果同时用第一层和最高层单词Embedding效果更好),句中每个单词对应Embedding累加后求均值(TAP, Token Average Pooling),形成博文表示向量。目前对比学习模型研究表明:将原始数据映射到单位超球面,一般这样做效果更好。所以接下来,我们对博文表示向量做L2正则,将其映射到单位超球面上,这样来完成博文的表示映射过程。下分枝的Aug2过程类似,通过相同手段将话题映射到单位超球面上。通过双塔结构,我们期望将博文和话题映射到相同表示空间内。这里,上下分枝Bert采取了共享参数的做法。在模型结构方面,我们曾尝试完全仿照SimCLR,经过Bert表示后,再引入另外一个非线性映射过程,但是实验结果表明第二个非线性结构会导致负向效果,所以在最终结构中,把第二个非线性映射结构拿掉了,我认为这应该是SimCLR和CD-TOM正例构造方法不同导致的模型结构差异。
在表示空间内,我们希望正例距离较近,负例距离较远,以此来将表达相同语义的正文和话题映射到一起。我们对博文表示向量和话题表示向量进行点积,以此作为度量函数,来衡量单位超球面上任意两点的距离:
而损失函数则采用对比学习常用的InfoNCE,某个例子对应的InfoNCE损失为:
其中,<, >代表两个正例相应的表示向量。从InfoNCE可以看出,这个函数的分子部分鼓励正例相似度越高越好,也就是在表示空间内距离越近越好;而分母部分,则鼓励任意负例之间的向量相似度越低越好,也就是距离越远越好。是温度系数超参,用来调节数据在单位超球面上的分布均匀性。这样,在优化过程中,通过InfoNCE损失函数指引,就能训练模型,以达成我们期望的目标,将表达相同语义的微博正文和对应话题映射到空间中接近的地方,和正文表达不同语义的话题在表示空间内尽量推远。
上面介绍的是博文-话题的对比学习模型CD-TOM的结构,可以看出,这是一个基于对比学习的,双塔Bert模型Fine-Tuning过程。其实,只要稍加改造,就可以对同一微博内很多不同元素相互之间进行比较与映射,比如我们还可以对博文-图片来进行表示学习。除了正例构造方法和模型小细节外,博文-图片多模态模型的整体结构和CLIP比较接近,所以,我们将这个使用包含大量噪音微博文图数据的多模态模型称为W-CLIP(Weibo-CLIP)。
博文-图片对比学习系统W-CLIP的模型结构如上图所示。整体运行机制和CD-TOM模型基本一致,主要区别有两点:首先,构造正例的时候,不再是用同一个微博内包含的<正文,话题>数据对,换成了带图片微博里对应的<博文,图片>数据对,如果一个微博里包含多张图片,则同时构造多个正例。其次,上下分枝由对称结构改为非对称结构。因为图片和博文模态不同,所以下分枝不能使用Bert预训练模型,这里我们采用经过ImageNet预训练的ResNet101模型作为图片的特征抽取器,为了能和文本侧的表示向量进行内积计算,在ResNet最后一层FC之上,套上了一个线性映射层,使得图像表示的维度保持和文本表示维度一致。除此外,整个计算流程和CD-TOM类似。
我们经过实验证明,放大Batch Size对于模型效果有较为明显的正向效果,所以通过LAMB优化器,并结合Gradient Checkpointing优化技巧,放大Batch Size到1664。关于大Batch Size技巧可以参考:Training on larger batches with less memory in AllenNLP,这里不赘述了。
上面介绍的是表示学习模型在训练时的模型结构,在做具体应用的时候,我们需要的是几个经过预训练的特征抽取器:比如对于<正文,话题>数据对相关应用来说,我们得到了基于Bert的编码器,它既可以对博文进行特征编码,也可以对话题进行特征编码。而对于<博文,图片>数据对,我们得到两个编码器:基于Bert的博文编码器以及基于ResNet的图像编码器。在实际使用的时候,对于新的博文、话题或者图片,只需要使用对应的编码器,将博文、话题、图片,打成对应的Embedding,就可以放在Faiss里相互查找了。
我们训练模型用的数据量:话题模型大概3000万左右,多模态模型大约1500万微博左右。在几个应用场景里效果比较好,这其实是超出我预期的,主要在做之前,我不确定这种包含大量噪音的成对数据,是否能训练出高质量的模型。而事实证明:海量包含噪音的数据+对比学习,可以比较充分利用和挖掘这种不完美匹配数据中隐含的复杂语义映射关系。我觉得主要有两个原因:一个是无论Bert还是ResNet,因为模型足够复杂,所以特征抽取器表达能力足够强;另外一个,应该是数据量大。实践表明,当数据量足够大的时候,采用类似上面的对比学习模型,并不需要数据对之间精准对应,对于微博这种两者语义对应关系并不精准的场景下,只要数据量足够大,效果也是有保障的。
下面我们对于一些应用场景,给些例子。

效果示例:文本类应用

微博中大约40%的博文是带有用户打上的话题的,而另外60%博文,则不带有话题,有些应用场景有使用微博话题的需求,所以需要靠模型给这60%未包含用户话题的微博打上合理的、能够表征博文主题思想的话题,或者给带有用户话题微博打上质量更高的机打话题。这是一个典型的文本类的需求。
当我们如上所述,利用对比学习模型CD-TOM训练好话题Encoder和博文Encoder(在博文-话题对比学习中,是同一个Encoder)后,可以使用这个Encoder解决上述问题。我们把这个应用场景称作“博文话题预测”,其流程如上图所示。首先,我们把历史上的话题集合,里面每个话题,通过话题Encoder进行表示编码,并将所有话题编码存入Faiss;然后,对于某个要预测话题的博文,根据博文Encoder对博文进行表示编码;再之后,从Faiss里查询相似度最高的话题,设定一些过滤阀值,取Top K话题作为模型预测的话题。如此这般,就完成了话题预测任务。
我们评估,通过CD-TOM模型给博文打上的话题,整体质量是比较高的,已应用在某些业务场景。在用对比学习模型之前,我们尝试过基于Encoder-Decoder的生成模型,以及单纯的话题分类模型,效果都比较糟糕,基本不可用,而采用CD-TOM模型后,质量有大幅度提升,促进模型效果达到实用化水准。
其实,从CD-TOM模型的两个分枝来看,一侧是博文,一侧是用户打上的话题,模型的目标是将两者在映射空间里对齐。一般而言,用户打上的话题类似于对微博内容用几个单词组成的简短概述,<正文-话题>的关系,有点像文章及其对应的摘要的关系。所以,采用CD-TOM的明显好处是:这种方式给博文打上的Embedding,容易加强文中关键实体及关键事件,也就是说会突出博文主旨,不太受到与博文主旨无关的细节信息干扰,比较关注文中最关键的语义内容。
下面我们给些例子。
上图展示了一些有代表性的例子。表中所指的“原始话题”栏,指的是用户打上的话题,后面三列展示了模型匹配的最相关的Top 3话题。在做模型预测或匹配的时候,如果博文中包含用户话题,我们会先去掉用户话题,然后让模型去预测,如果博文不包含用户打的话题,则模型直接预测。从上述例子可以看出,通过CD-TOM模型打上的博文Embedding,比较关注主旨内容,有些博文非常长,也可以正确匹配关键信息,不受细节信息干扰。除此外,模型还具备一定的语义抽象能力,比如最后一个例子,文中并未出现地点“济南”,但是通过趵突泉等典型景点名称,可以匹配出济南或山东相关话题。
另外一类典型的文本应用则是以文找文:就是根据某个博文,寻找和它主题相同或者相近的博文,比如“看了又看”或“相关推荐”等场景,这可采取上图所示结构来解决这类问题,比较直白不再阐述过程。下边也给些例子。
上图展示了几个与原始查询博文相似性比较高的以文找文例子,可以看出,匹配排名靠前的查询结果,在关键语义上,和原始查询匹配度非常高。当然,不同的应用场景可能对于这种相似性要求不同,比如有些场景可能希望相似性不要太高,具备一定发散性,这可以通过卡相似性阀值来实现。因为上面的博文Encoder是通过CD-TOM模型训练出来的,所以仍然具备突出博文主旨的特性,即使是相似性不太高的内容,往往文中的关键实体能够保持一致,很少出现看不出相关性的情形。

效果示例:多模态类应用

目前微博有相当比例是带有图片和视频的,所以不同模态内容之间互相查找,或者多个模态进行融合就很有必要。这里介绍两个W-CLIP相关的应用例子。
上图展示了一个以文找图的应用场景,比如可以给微博文本内容推荐一些能够表征其语义内容的图片。我们可以把所有图片,经过图片Encoder进行编码,并存入Faiss;然后对于某个博文,使用博文Encoder进行内容编码,通过Faiss做相似查找,推荐Top K图片作为匹配结果。
下面给些从DEMO系统截取的例子。
这是知名明星的实体查询,输入明星名字,可以找到对应明星的图片,可以看出,如果是知名明星,博文到图片搜索准确性是有保证的。
上面是热门影视剧或者POI景点对应的文图搜索结果,热门影视剧一般会返回对应的剧照,至于POI景点,以上面的庐山瀑布为例,肯定可以返回瀑布照片,至于是不是庐山瀑布就存疑了。
上面展示了针对不同风格流派油画的搜索结果,可以看出,文本和对应的图片确实在投影空间里聚到了一起。
除了能对常见实体精准查询外,物体的一些属性比如人物性别(男性/女性)、年龄段(儿童/青年/老年etc)、物体颜色、数量关系(一个/两个/一群etc)等常见属性也能够有效被模型习得。上面展示了汽车外观颜色属性的例子。
上图几个例子说明了:模型可以对人物性别以及头发颜色属性,在文本-图片空间进行投影对齐。
如果我们分别用春夏秋冬分别形容不同场景对象,其文图查询结果如上图所示。
当我们不断拓展实体,逐渐加入新的描述属性或事件,逐步拓展出完整的句子时,从上图可以看出,对应查询出的图片也会不断变化,体现出比较完整句子的语义。这说明模型学会了句子级别的文本-图片语义对齐及映射。
上面两图给出了更复杂些的文本句子逐步扩充过程,可以看出搜索出的对应图片也不断调整,并体现出文本句子中描述的场景。
和上述的以文找图相反,我们也可以根据图片,给它匹配语义相似的文本,整体流程如上图所示,比较直白不解释。一样的,我们给些例子。

(查询图片:阿凡达)

(查询图片:足球比赛)

(查询图片:火影忍者)

(查询图片:瀑布)
从上面几个例子可以看出,如果图片有比较强的区分性和特点,则查询出的对应微博文本内容,可以比较精准地表征图片所示内容。但是,总体而言,由图查文效果不及由文查图。
上图查询图片为“宝马汽车”,其对应查询出的文本如图所示,可以看出5个检索结果里,有两个是宝马,其它三个尽管匹配内容是汽车,但是品牌无法正确识别,分别对应了奔驰和奥迪汽车的文字描述。
上图查询图片为“火锅”,其对应查询出的文本如图所示,可以看出5个检索结果里,有三个是火锅相关的文字描述,其它两个被错误匹配为烤肉相关文字,这可能是由于火锅和烤肉场景图片比较相似导致的。
上图查询图片为“迪丽热巴”,其对应查询出的文本如图所示,可以看出5个检索结果里,尽管大都谈到了某个女明星及礼服礼裙,但是具体明星都识别错误。这说明细粒度的图片特征没有被模型捕获,或者也可以把锅甩给:明星长得太像了。

海量噪声数据+对比学习:广阔天地大有可为

从上面给出的博文-话题或图片-博文相互查询的例子,我们可以看出:尽管我们使用的数据并非完美对齐的训练数据,其中包含了大比例的噪音或干扰数据,但是如果我们训练模型使用的数据量足够大,再加上使用对比学习模型,是可以较好地学会数据对之间的映射关系的。
我们放松了对数据的要求,只需要数据对有一定语义相关性,而非完美对应,而满足这种弱相关条件的实际场景数据,其实是非常多的。这意味着如果数据量足够大,引入对比学习,满足这两个条件的话,类似场景都可以采取相近的方法,来获得好的应用效果。
上图给了几个不同场景的例子,比如对于短视频应用来说,也天然地包含<文字描述,HashTag>以及<文字描述,封面帧>这两种弱语义相关的数据对;对于电商场景来说,按理说都会有比较成熟的商品标题中核心产品词抽取模型,那么<产品词,商品标题>以及<商品标题,商品图片>就是类似上文讲述的两种弱语义相关的数据对。其实对于电商应用来说,数据对之间的相关性还是比较强的,相对信息流类的数据,相关性会好很多;再比如,我们可以这么看一篇新闻:可以构造<新闻内容,新闻标题>以及<新闻标题,新闻图片>数据对,这样构造出的数据对,也基本满足弱相关语义的条件。
上面只是拿几个典型场景举例,其实还有很多应用场景,都可以类似地构造弱相关数据对,而在这种包含噪声的数据条件下,只要数据量够大,再使用对比学习,我相信仍然会有较好的应用效果。
致谢:本文的技术方案是和杜则尧同学讨论得出,具体算法实现也是以他为主完成的,在此表示感谢。

文章转载自布洛卡区,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论