多模态(图文)EBET易博app预训练及实践

  新闻资讯     |      2023-10-01 22:17

  从bert/transformer出世以来,除了在文本语义上使用外,近两年开始在图像以及多模态问题上发力,相关研究很多,这部分介绍下常用的多模态预训练模型。

  预训练模型,简单来说,就是通过非监督语料,设计一些任务(task),能够学到比较好的语义/图像表示。BERT是文本方面的集大成者,那针对图文多模态,就是在文本基础上,在预训练中增加了图像任务,且增加了图文的交互性。

  这样得到的预训练模型,就可以用于各种下游任务,比如图文匹配、视觉推理、视觉问答等,用少量的标注数据finetune就能得到不错的效果。下游任务这块开源数据集,后面也会做简单总结。

  常用的多模态模型,从模型框架上,可以分为单流模型和双流模型两种,主要是两种模态的交互方式会有出入。

  在单流模型中,language信息和vision信息在一开始便进行了融合,直接一起输入到encoder(transformer)中。

  单流模型代表的模型有ImageBERT、 Unicoder-VL(2020)、VL-BERT、VisualBert等,这里不再一个个去细讲,以其中一个为例,观其大概,后面会对此类模型做整体说明。

  这里说明下,后面两个模型稍稍有凑数之嫌,虽然backbone肯定也算是双流(因为不是一开始就交互的),但是MCAN我理解不算预训练模型,是直接用于VQA(Visual Question Answering)问题;而WENLAN的Pre-train task设计思路,和其他几个模型不太一样,简单来说就是其他模型基本都是文本, 图像这样的输入,wenlan的模型输入是正文本,正图像,负文本,负图像,有多个图文对形成计算InfoNCE(参考),具体参考论文,不赘述。

  单流、双流的划分,其实是从backbone上去区分的。但笔者看来,除此之外,多模态预训练模型里面有3个需要关注的点,下面一一说明;

  这里对以上模型的task做个小结,涉及6个task,主要的task上面的也都提到了,看英文解释应该能理解差不多,不再一一分析。

  但值得说明的是,其实task是和数据息息相关的,mlm、itm、mrfr是常规任务,基本都能满足,mrc和mrc-kl其实是一个任务,就是让模型去学mask掉的图像roi的类别信息,前者算分类,后者算kl散度,只是两种loss方式,都需要有roi的label信息,是需要数据包含的。VQA是问答任务,也需要看图问答类的数据。

  task之间是会相互影响的,比如文本端有“dog”,但如果图像dog部分直接被mask掉,这时候mrfr任务是很难学出来的。对于这种情况,一般用conditional mask,至少保留一种模态的该部分信息;

  task loss是如何训练的,直接loss相加整体一起训练,还是分开来训练。如果是前者,loss之间存在量级差异,需要再训练过程中做缩放;如果是后者,则需要考虑task循环训练设计方案,防止模型倾斜到某个task上。

  文本部分比较简单,一般都直接用token,图像部分的表示也要对应到一个或多个的token表示,传统的方法就是用Faster-RCNN。

  Faster-RCNN会对图片抽取多个候选roi(region of interest),每个roi就是一个box,都可以得到一个向量表示。此时,每个roi天然的可以当做token输入bert模型。在有些模型中,比如LXMERT,除了选用36个置信度最高的roi之外,还用了box的位置信息,四个坐标也输入作为roi的embedding输入。当然,还可以给box以一定规则编号码,这样就有了position信息。这些原始的embedding输入都是可以取舍的,根据实际需求。

  图片一般为实景图,就是现实生活中的实拍图,但是当你的数据集存在大量的素材图,比如简笔画、手抄报、动漫画、简谱等,抽取的roi质量可能并不高。

  文本描述尽量是强相关的(entailment),客观精准。比如针对图5,强相关的客观描述:水果蛋糕上有一些蜡烛在燃烧;但弱相关的主观描述:祝你生日快乐,许个愿吧!这两种描述对roi这种方式的图像表示的交互强度是不一样的。

  图5 强相关(客观描述):水果蛋糕上有一些蜡烛在燃烧;弱相关(主观描述):祝你生日快乐,许个愿吧!

  结合这两点,笔者认为,在实景图数据+强相关文本描述的情况下,使用Faster-RCNN抽取图像表示做预训练,EBET易博真人模型效果是比较好的。

  除了Faster-RCNN之外,针对面临的具体任务,可以探讨其他的方式来抽取图像表示。在2021年中Wenlan2.0发布的模型中,就使用了切割的方法,比如图像切割成1*1(不切割)、2*2和5*5,就可以得到30个区域,使用开源vgg、resnet模型,就可以得到全局和不同粒度局部的特征,输入到预训练模型中。

  切割的方法,优点是相比Faster-RCNN速度快,且不同的切割兼顾了全局和局部的图像信息;但可能也存在一些问题,比如切割可能把实体切开了,比起Faster-RCNN得到的roi,我理解图像和文本的互动性会变弱;同时,由于不同切割区域的存在,在做MRFR任务时候可能存在信息泄露的问题,不是从文本侧学习到mask掉的实体图像信息,而是从其他切割的图像信息中获取,最终导致结果还是图文互动变弱。这部分笔者也没有做实验,本段文字是个人理解。

  不同的业务,针对的数据不一样(数据类型、数据量、应用场景等),对图像特征的抽取模型选取及方式选取,就需要相应的调整。在笔者做面对的任务上,使用Faster-RCNN基本是不合适的。因为数据量巨大到几十亿的级别,且有很多非实景的素材图,即便用小部分训练,最终也无法全量使用该模型,抽取和存储特征的成本过高。

  这里放一些开源的训练数据,之前做过简单的总结,直接放这里。数据基本都是英文的,有些自带fsater-rcnn抽取好的特征,对业务可能不适用,但拿来run模型还是挺好的。欢迎补充。

  以上三个方面,是笔者认为在多模态预训练模型中比较重要的,基本这三个部分确定了,再加上模型backbone,整体的训练就定下来了。根据自己的业务场景、训练数据,可以综合考虑自己来调整方案。

  上一部分主要在讲How to Train的问题,这部分主要讲How to Use的问题,这里主要是指如何应用于搜索引擎系统中。

  在How to Use的问题上,会分为两个部分,第一部分是一些理论性的方法,第二部分会不涉及具体业务的情况下,把自己实践的一些结果case展示说明,便于大家理解。

  预训练模型在搜索引擎中应用,方法比较多样的。除了直接作用于搜索的召回和排序阶段,还可以通过其他方式间接优化排序效果,比如利用预训练模型做sequence-to-sequence 任务,根据doc文本来生成query,丰富doc信息。

  这里,我们主要介绍应用于召回和排序任务的几种主流方法。整体可以分为两个方向,dense和 sparse,下面分开做简要介绍。

  通过图7,我们可以看到预训练模型在下游搜索场景下的作用方式,该图截取自COIL论文,一图胜千言。

  在MS MARCO Passage Ranking任务上,效果最好的是ColBERT,但同时ColBERT的计算量是也是最大的。针对不通过的业务场景可自行选择。

  这里主要讲下DeepCT的做法。DeepCT对预训练模型finetune后计算文本中的term重要度,这里涉及如何finetune的问题,DeepCT设计了一个比较好的finetune目标,即如何得到doc中term的重要度label。

  如图8所示, 对于一个doc中的term,可以根据每个term在query中的出现频次比例,作为其数据的label。这样我们就可以训练一个计算文本序列中每个term重要度的下游模型。

  整个finetune任务是很简单的,可以使用开源的各种bert初始化模型,在少量数据上就能获得很不错的结果。然后可以将term importance应用于计算match rank、BM25等常用的传统匹配特征中,甚至还可以应用在倒排索引(inverted lsit)中,调整倒排链中doc的排序。

  在How to use问题上,从整体指标来看,dense类方法效果是优于sparse类方法的,但dense类方法也有自己的问题,比如在可解释性上,针对某个case上,为什么没召回效果不好,很难解释(这里不涉及深度模型可解释性相关研究,只谈直观理解),也很难针对具体case去调优;但sparse就相对直观很多,权重没学好,重点学到了哪,是比较一目了然的。

  此外,二者在计算量、是否便于离线计算等,sparse也是优于dense方法的。

  实践分享主要包括两部分,1、训练多模态预训练模型;2、多模态预训练模型在deepct任务上的效果;

  这里训练细节会涉及针对内部数据和业务的模型修改,对读者意义不大,因此只分享一些不错的结果说明,希望对大家有所启发。

  这里简要说明下图像特征,主要使用了全局信息和人脸特征,而没有选用Fast-RCNN。具体原因上面也分析过,还是基于业务和成本考虑。

  特征确定后,笔者使用了单流模型的整体框架,训练了多模态的预训练模型,命名为TiBERT。模型效果可以通过demo的效果有个认识。

  图11中展示了2个task,上半部分是对输入文本做mlm,然后做预测,可以看到“武”字预测正确,“秋”字预测为了“景”,放在这里也不违和;下半部分是针对整个句子,生成的全局图像特征,在候选集中选取最相近的图片(死链图片是展示问题,忽略吧)。

  这两个任务其实并不严谨,和预训练输入不完全一致,只是为了能对整体模型效果是否符合预期,在训练过程中选用中间ckpt前向,能够直观感受。

  有了预训练的多模态模型,就可以做很多下游任务了。这里用deepct效果,来说明多模态在图片任务中的一些优势。选用deepct其实也是sparse的优势,dense需要整体指标,但deepct在term weight任务上,用一些例子就可以很好的说明效果。

  图12中的图片是我们业务下真实存在的一个doc,title文本是“高考来了本周末分水部分路段封道公告,请互相转告”,这种图文部分相关的doc在业务中是很常见的,单纯从文本来讲,是很难判断哪部分term更重要。

  我们通过对比BERT-WWM和TiBERT在相同数据集上,做deepct的finetune后的模型效果,得到了token weight可以看到,TiBERT可以很好地判断出来,针对这张图片而言,“高”“考”是更重要的信息,和后面的路, 段,封, 道没有强相关。而单纯的文本模型是很难判断到这一点的。

  在预训练中,我们还使用了人脸特征。在图13中,可以看到,使用了多模态模型后,“周星驰”得到了加强,相应的其他两位明星的分值都有降低。其实这个case中,笔者尝试互换了三个明星短语位置,发现位置变化对Bert-WWM的finetune模型影响较明显,但对TiBERT影响不大。说明人脸特征在交互中,确实提供了信息。

  其实,上面两个示例对Bert-WWM是不公平的,因为TiBERT使用了图像信息,而Bert-WWM只使用了文本信息。这里只是想通过这两个case,来说明使用的全局和人脸特征在多模态预训练中起到了作用。

  此时,我们就可以使用DeepCT得到的term weight用来优化排序、倒排索引等。

  本文主要总结了多模态预训练的常用方法,并对其中关键点的思考做了总结;同时,关于预训练模型在搜索任务中的应用做了总结,并以deepct为例,展示了我们在实际业务中的case效果,希望对大家能有所启发。