万字浅析视频搜索系统中的多模态能力建设

万字浅析视频搜索系统中的多模态能力建设
FesianXu 20240331 at Tencent WeChat search team

前言

视频搜索是天然的富媒体检索场景,视觉信息占据了视频的一大部分信息量,在视频搜索系统中引入多模态能力,对于提高整个系统的能力天花板至关重要。本文将对在视频搜索系统中落地多模态能力(特别是视觉)进行讨论,同时为了让部分无相关背景的读者补充一些背景知识,笔者将会对典型的搜索系统进行介绍。笔者入行未深,道行浅薄,如有谬误请见谅并联系指出,本文遵守CC 4.0 BY-SA版权协议,转载请联系作者并注明出处,谢谢

∇ \nabla 联系方式:

  • e-mail: FesianXu@gmail.com

  • github: https://github.com/FesianXu

  • 知乎专栏: 计算机视觉/计算机图形理论与应用

  • 微信公众号:机器学习杂货铺3号店

请访问github page以获得最佳阅读效果:https://fesianxu.github.io/2024/06/30/video-retrieval-multimodal-20240630/


温馨提示:在阅读此文之前,笔者建议读者先阅读之前的博文 《视频与图片检索中的多模态语义匹配模型:原理、启示、应用与展望》[5] 一文,本文的应用技术基础原理很多都在该文进行过详细介绍,会对读者理解本文的思路有很大的帮助。

通用搜索系统

视频搜索系统是一种垂类的搜索场景,在具体讨论多模态能力在视频搜索场景中落地之前,我们有必要对搜索系统进行粗略的了解。之前笔者在博文[1-2]中也简单分享过一些典型的搜索系统组成部分,搜索系统非常复杂,从算法与策略的角度上看可以大致分为以下几个关键步骤:

- 信息爬取:

主要通过爬虫技术从广袤无垠的互联网中爬取信息,内容是信息检索的前提,没有良好的内容基础就谈不上信息搜索。然而现在互联网上可供爬取的好内容逐渐萎靡,很多用户生产的好内容作为不可爬取的私域流量沉积在众多app中了,如小红书有着众多优秀的笔记资源、知乎有着很多大V创作专业的知识内容分享,B站、抖音有着很多顶流up主创作原创视频等。在公域好内容资源逐渐衰弱的情况下,大厂也自己下场,作为生产者去生产内容(如长视频平台,网飞等),或者作为平台供给用户去生产内容(如抖音、快手等),现在是内容为王的时代,再怎么注重内容积累都不为过。说回到爬虫技术,其也是一个非常复杂的技术,需要从数以亿计的网页中挖取好资源、新资源,意味着需要内容去重,嗅探新资源的发布等,这些可参考张俊林老师的《这就是搜索引擎》[3] 的介绍,笔者就不过多累述了。

- 内容建库:

爬取了资源就需要对这些资源进行建库并且构建索引,如Fig 1.1所示,通常爬虫系统对互联网资源进行爬取后会落盘到一个资源池里,这个资源池的资源量可能数以千亿、万亿计,由于爬虫系统会无时无刻对互联网的数据进行爬取,每天都会爬取到非常多的更新更好的资源,因此这个资源池的资源也会定期进行汰换,以保证资源池的高质量和高时效。不同业务需要的资源其实都是不同的,比如视频搜索和图片搜索、网页搜索需要的资源类型截然不同,这个时候最好的做法是每个业务自行从资源池里挖需要的资源(即是资源筛选),然后建立业务特有的索引库,后续的资源检索都将发生在这个资源库中。当然,为了保证用户的时效需求,这个业务自行建立的索引库也是会进行定期分片汰换的。

fig_1p1_spider_index

Fig 1.1 资源爬取、建库和建立索引,为了效率通常会按照资源的质量、时效性等进行分层建库。

即便业务自行建库,在一些大型业务里面这个库的规模也是数以百亿计的,因此通常需要按照资源质量和时效,进一步对这个库进行切分,分成不同的库层。如Fig 1.1所示,这是一个典型的金字塔结构,自上而下的库层资源数量逐级递增,质量和时效性逐级递减,在一次请求发起过来的时候,会首先对高质量库层发起小流量查询,如果能检索到的满足资源太少,就进一步穿透后面的库层。注意到能被网络爬虫公开爬取到的资源是有限的,很多资源(比如车票信息、天气信息、快递号等)都是各个企业私有的,我们称之为深网(Deep Network),有一些深网信息能符合很多用户的垂类需求,比如查询快递号、车票信息、航班信息等,因此会考虑会和各个公司达成合作进行数据互通。

- query分析:

一个搜索系统需要有入口让用户表达需求,而最为广泛使用的入口就是文本描述了,用户的检索词被称之为query,query分析就是尝试通过算法去分析用户通过文本表达的潜在需求。自然语言处理被誉为人工智能的明珠,自然语言具有歧义性、不同用户的教育背景、文字使用习惯等又存在差异,这些都提高了分析query的难度。按照博文[4]中的介绍,如Fig 1.2所示一个query分析管道可分为以下几大部分,其中涉及到query的预处理,基础分词,query纠错,需求扩展等等。对于中文query而言,分词是非常重要的,不同的分词策略有可能会导致一个query的语义发生巨大变化,比如“武汉市/长江/大桥”和“武汉/市长/江大桥”就完全不是一个意思。在进行完分词后,对分词的词组(term)进行重要性和紧密度分析也是很重要的,query与doc的关键词命中有很多种情况,比如

query: ABC

doc_A: ADBAC

doc_B: ABCAD

doc_C:CBAAD

即便query的所有分词结果都在doc_A和doc_B、doc_C中命中了,但是显然直觉上query和doc_B的匹配程度会更好,这是由于ABC整个词组都在doc_B中连续命中了,而在doc_A中属于散乱命中,在doc_C中则属于乱序命中了。不难发现,此处的命中类型判断依赖于对query的分词、term重要性分析和term的紧密度分析,这些都是query需求理解的基础。当然,在query分析除了利用传统的统计方法去建模外,目前更主流的是利用基于深度学习的语言模型(如BERT、ERNIE等)进行分析,具体query分析的方法笔者也了解不多,读者如有兴趣可参考博文 [4]。

fig_1p2_query_analysis

Fig 1.2 一个经典的query分析管道示意图。

query的需求类型可以分为很多类型,典型的一些需求如下所示,不难发现不同的需求有着不同的时效性和权威性需求,当然这个和具体的query也有关。

编号需求类型解释时效性需求强度权威性需求强度
1知识类科学技术常识,各领域的专业知识等
2影音类电影,视频,音乐,动漫等
3素材类图片需求,各种范文
4医疗类药品相关知识,病理相关,在线问诊等
5生活类生活中的疑难问题,比如手工制作,更换灯泡注意事项等需求
6财经类财经理财类需求,金融经济分析等
7汽车类汽车相关需求,包括测评,购车,保养,维修等
83C类消费电子类需求,对消费电子的测评,介绍等
9情感类情感类话题,男女关系,亲情关系等
10小说类小说类需求
11法律类法律咨询类
12IP类明星,知名人物,动漫形象等
13体育类体育资讯,体育人物,比赛等

- 召回:

对query分析完后,就知道了用户的需求,以及query的分词、term重要性、term紧密度、query扩展等等很多基础信息,此时就可以根据这些基础信息发起信息检索了,此时的信息检索通常称之为第一阶段检索(first stage retrieval),业界也称之为召回阶段。召回阶段直接面对了我们刚才提到的业务自建的库,没有一台单独的计算机能够储存数以百亿计的资源,因此都是将资源分片储存在不同的机器上。如Fig 1.3所示,召回阶段会在倒排索引库和ANN索引库总同时发起召回,倒排索引依赖于字词匹配和倒排拉链归并等,而ANN召回则依赖于向量化召回技术。基于倒排的召回和向量化检索的召回已经在各个大厂广泛使用,这两者的特点如下:

  • 基于倒排的召回:主要基于query和doc的字词匹配,优点在于计算速度快,具有较高的可解释性,且对全文搜索、精准匹配等需求友好;缺点则在于难以对语义匹配需求进行建模。我们可以认为基于倒排的召回主要依赖于基础相关性的建模,当然也可以引入doc维度的质量信号或者用户互动信号,但是是否合理就视具体业务而言了。
  • 向量化召回:对query和doc进行向量化表达成 f ( q ) , g ( d ) f(q), g(d) f(q),g(d),然后定义度量 s = h ( f ( q ) , g ( d ) ) s = h(f(q), g(d)) s=h(f(q),g(d))计算query和doc的相似度,通常是余弦相似度。向量化召回有着强大的语义匹配能力,在实际应用中通常还需要结合ANN(Approximately Nearest Neighbor,近似最近邻)技术均衡召回率和计算复杂度,对于精准匹配等需求较为乏力,容易出现核心词丢失等问题。同时,向量化召回由于受限于落盘doc侧向量的成本代价,通常每个doc只能落盘少量的向量表征。

在实际系统中,为了引入语义匹配能力和精准匹配能力,通常会同时引入这两种召回技术,采用多队列召回的方式,同时召回多种不同需求的队列后传给排序模型进行排序。当然,此时召回的资源数量可能还是太多,向量化召回可以直接通过相似度进行排序后截断,而倒排召回则可以构建一个召回模型进行打分后排序截断,召回模型通常可以是一个树模型,如GBRank,其输入特征可以是一些统计类的基础相关性特征,如CQR、CTR等。

fig_1p3_recall_stage

Fig 1.3 召回阶段会同时召回倒排索引结果和ANN结果。

- 排序

从召回传上来的资源可能在数以千计的级别,如果这些资源同时参与精细的排序,对资源来说是一种巨大的压力,因此通常排序阶段又会进一步分解为粗排阶段和精排阶段,在这两个阶段采用的排序特征粒度会各有差异,“召回是负样本的艺术,而排序是特征的美学”这句话是有一定道理的。如Fig 1.4所示,排序阶段通常都会考虑多种目标,比如相关性、质量性、权威性、用户的后验行为预估等等目标,通常这些维度的目标又可以继续细分成很多子目标,由不同的模型进行建模,最后由树模型进行目标汇总,比如相关性就可以大概细分为以下三种:

  • 基础相关性:描述了query与doc之间的字词匹配级别的相关性,会结合文本字词的重要性和紧密度等进行打分,这是一种先验的相关性建模。
  • 语义相关性:描述了query与doc之间的语义匹配级别的相关性,当前主流是采用语言模型如BERT、ERNIE等进行建模,这些语言模型通常都是经过大规模预训练后,在业务数据上进行微调得到。对于语义匹配的建模,又可以细分很多特征域,比如query-title匹配,query-title-content匹配,甚至是query-vision匹配、query-audio匹配等,后者也属于多模态语义匹配。这是一种先验的相关性建模。
  • 感知相关性:用户行为,如点击行为通常可以一定程度上反映query与doc的匹配关系,在一些高频的query下面,通过历史上的用户行为可以建模出感知相关性。这是一种后验的相关性建模。

质量的建模也可以分为以下几种维度考虑:

  • 硬低质量问题:对于网页来说,就是一些网页排版,网页配色等质量问题。对于视频来说,可能是马赛克,黑边,清晰度等视觉上会直接影响用户消费体验的因素。通常来说,硬低质量问题比较容易定义,可以通过很多子模型,如清晰度检测模型、马赛克检测模型、黑边检测模型等进行打分,然后通过树模型汇总。
  • 语义质量问题:主要考虑这个网页或者视频的内容是否具有价值,比如是否有一定的知识增益,是否视频剪辑、分镜等吸引人等。通常来说,语义质量问题定义较为模糊,难以像硬低质量问题一样细拆到各个子维度,因此一般有两种解决思路:一是通过用户的行为反应建模,比如用户在某个视频下的浏览时长,评论,是否快划等,但是这种有着充分的用户行为的视频都是较为稀少的,更多的视频是用户行为稀疏的,这个时候可以考虑第二种方法,采用端到端的方式将原始特征进行输入,通过深度学习的方式学习视频质量标签,这个时候模型有机会学习到蕴含在质量标签背后的语义质量问题,当然前提是质量标注的标准得同步上这个需求。

fig_1p4_rank_model

Fig 1.4 排序模型通常有多个目标(相关性、质量性、权威性、后验目标等)组成,每一个目标又可以通过树模型进行多种不同粒度的特征组合。

- 多目标排序:

多目标排序同时建模相关性、质量性、权威性、时效性、用户点击行为等众多目标,虽然在排序阶段可以将这些目标的特征都作为树模型的输入进行建模,但是大部分时候权威性、时效性和用户点击行为(CTR)这些特征,学习出来的权重占比都太过于小,因此树模型不能很好的建模。为了建模这些特征,一是可以在树模型组建样本的时候,对时效性、权威性或者CTR等目标组建偏序对样本,即是在样本满足标注都在同档位的前提下,进行其他目标的偏序对组建。其次,我们也可以考虑以特征公式加权的方式进行建模,如下所示:
S r e r a n k = S s a t + ∑ i ∈ { f r e s h n e s s , a u t h , c t r } g a t e i ∗ S i (1-1) S_{\mathrm{rerank}} = S_{\mathrm{sat}} + \sum_{i \in \{\mathrm{freshness, auth, ctr}\}} gate_{i} * S_{i} \tag{1-1} Srerank=Ssat+i{freshness,auth,ctr}gateiSi(1-1)
其中的 g a t e i gate_{i} gatei表示门控,其次的 S i S_i Si表示时效性、权威性和ctr的打分。通过这种方式,能够更及时更灵活去解决这些维度的bad case。

视频搜索系统与多模态能力建设

视频搜索 vs 通用搜索

以上讨论的是通用的搜索系统经典的结构,那么对于视频搜索来说有啥异同呢?首先,视频搜索系统是通用搜索系统的一个垂类应用,因此这些基本的阶段都是有的。但是视频媒介和网页媒介毕竟差别巨大,视频是天然的多模态媒介,有着丰富的时空视觉信息、音频信息和文字信息,而网页媒介大多还是集中在文本信息和图片信息,笔者曾经在博文 [5] 一文中讨论过视频和图片视觉上的区别,有兴趣的读者可以移步讨论。如Fig 2.1所示,网页落地页(移动应用中)的信息元素大概有:标题、作者信息、发布信息、内容信息和交互区(评论,点赞等)等,而视频落地页的信息元素也是类似的,但是在内容信息上形式大有不同,视频的内容信息主要集中在了以下几点:

  1. 视频的视觉信息:视频视觉是最为开门见山的,在大部分情况下,视觉信息承载着视频的主要内容,有很多文本内容难以描述的信息,通过几张图片就能简洁明了地说明。
  2. 视频的文本信息:视频的文本信息主要体现在视频的字幕、台标或者作者logo、以及内容中的文本等,通常来说由于字幕域通常是视频制作者的文案,因此对整个视频内容的概况能力会更好些,而内容文本则充满着噪声。可以通过OCR(Optical Character Recognition)技术对文字进行提取后,按照需求进行分域。
  3. 视频的音频信息:视频的音频信息又可以分为自然音频信息和说话人的音频信息,后者则通常是视频的文案配音,通常可以称之为speech,可以通过ASR(Automatic Speech Recognition)技术进行提取。通常来说,视频的ASR信息也是重要的内容信息,在很多时候可以视为是对字幕域OCR的补充。
  4. 视频标题:视频标题是一个视频的“门面”,由于标题通常都是作者自行取的,因此其对视频的内容概括能力是比较强的,在视频搜索中经常使用。
  5. 视频标签:有些作者会给视频手动进行打标签,或者添加话题元素,如\#是时候去趟博物馆了# , \#微博春日读书会#之类的,这些也可以视为是视频的主题。
  6. 用户交互信息:用户的评论,弹幕也是间接地描述视频内容的信息,虽然噪声很大,但是可贵在可以引入用户的外部知识,对视频的内容进行验证。

fig_2p1_video_vs_webpage

Fig 2.1 网页落地页与视频落地页的信息元素比较。

OCR信息和ASR信息可以视为视频内容的一种文字表达,对应网页内容中的文字,在视频搜索中可以作为内容域进行建模,广泛地在召回和排序中使用。这些文本会比较冗长,字符长度很容易达到上千,对于模型建模来说并不友好,因此在一些工作中会考虑对长文本内容进行提炼 [6] 后使用,可以视为是一种关键句提取。同时,OCR信息和ASR信息通常是一种互为补充的存在,因此也可以用OCR/ASR去补充另一者的内容缺陷后使用。视频的标题也是一种概括性很强的文本,在视频搜索中也是经常使用的文本信息,无论是OCR/ASR还是标题都在视频搜索的召回和排序中广泛使用,这些属于基础的(文本)单模态能力建设,因此也不在本文的讨论范围内。

为什么是多模态

那么只采用这些文本信息是否足以描述整个视频的内容,从而为我们之前提到的搜索过程中的种种目标建模呢?笔者看来,这些文本信息能够在很大程度上描述视频的内容,但是视频中一些更为细致的内容则需要通过视觉信息进行描述。如Fig 2.2的例子所示,“蜘蛛人”一词可能存在多种含义,如高空作业的工作人员可以称呼为“蜘蛛人”,而电影角色蜘蛛侠形象也可以称之为“蜘蛛人”,这两者在视频中的视觉信息差别很大,但是文本差别并不是很大,此时多模态建模能够帮助视频搜索中排序得更合理,这可视为是多模态建模在相关性方向的一种应用。当然,读者也可以反驳道,“我看这文本信息也有一定的区分度啊,为何就一定需要多模态的能力呢?”。笔者看来,的确就举的例子而言文本信息有所差别,如果文本模型建模地足够好,应该是能捕捉到区别,但是我们要考虑到整个视频库中很多视频的文本信息缺失(特别是小视频,还有就是用户随手录制的vlog等,这些视频的可用文本信息通常都很少),此时视觉信息可能是唯一能利用的内容信息。此外,文字信息的区别度在某些情况下(比如就我们举的这个例子)区分度可能远不如视觉差别来的大,如果能将视觉能力也利用起来,将能大幅度减轻文本模型迭代的压力。

fig_2p2_vis_diff

Fig 2.2 “蜘蛛人”这个词在不同语境下含义不同,既可以是高空作业的工作人员也可以是电影中的蜘蛛侠形象。

当然,多模态能力不仅能对相关性进行赋能,同时对质量建模也是作用匪浅的,如下所示:

  1. 题文不符视频的判断:视频搜索中有着不少题文不符的例子,即是视频的标题和其实际内容不一致,这种视频如果只依靠文字去进行建模,有些难case将难以解决,如果引入视觉信息将会对这类型的视频有着更全面的描述。
  2. AIGC视频的判断:随着生成式模型的广泛应用,现在很多AIGC的视频充斥在搜索引擎内容库中,这些视频的视频内容来自于各种来源的自动拼接,声音则是采用了TTS生成的机械音,在很多情况下都是属于低质量的视频。如果光从文字的角度上看,其文案可能一点毛病都没有,甚至可能比UGC内容还更加流畅,光靠文字模型是难以解决这种case的。一些高频的视频可以采用用户后验行为、用户互动行为去判断,但是对于一些缺乏用户消费的视频来说,只能通过多模态的能力去辅助判断这类型的视频质量问题了。
  3. 内容价值的判断:内容价值较高的视频其剪辑风格、分镜,包括视频的调色等都有着特定的模式,这种类型的视频也是适合多模态能力切入的场景。

多模态能力由于是对视频的一个更为全面的描述,其也很适合对用户的交互行为和后验行为进行建模,比如在预测用户的消费时长建模上赋能。从我们以上的讨论不难看出多模态能力对于视频搜索的重要性,在很多细致的场景中,光靠文本能力无法很好地满足用户的需求,因此建设合适的多模态能力对于视频搜索来说是非常有必要的。

笔者之前曾在博文 [5] 中介绍过一些基础的视觉多模态技术,如Fig 2.3所示,我在博文中将多模态的匹配分成了语义对齐(semantic alignment)和语义融合(semantic fusion)两个阶段,其定义如下:

  • 语义对齐:指的是将文本中的视觉实体,属性描述,进行对应视觉元素的映射。此处的图文映射关系可称之为基础视觉语义。
  • 语义融合:在语义对齐的基础上,对基础视觉语义进行融合、组合,从而形成复杂的复合视觉语义。复合视觉语义包括视觉关系,更为抽象的视觉氛围等。

在笔者看来,在视频搜索这个业务场景中,视觉多模态能力的收益点主要有两块:

  1. 视觉信息为文本信息作为补充,丰富文本信息的表述。 这种角度下,我们是以文本为中心去思考的,这样做的原因很简单,用户表达需求的手段也是以文本为中心的检索词query,因此这个时候文本信息才是居于核心地位的。假设我们的模型 f ( ⋅ ) f(\cdot) f()能够将视觉概念都映射到文本语义空间,那么此时视觉信息的引入相当于就是引入了更丰富的文本。这是多模态建设的基础要求。
  2. 视觉信息在描述视频本身的内容,而与文本语义无关。 在这种角度下,视觉应该描述一些视频固有的结构,比如剪辑风格、画风、调性、色彩风格等等,这些视觉概念可能很难用简单的文本语义表示,但是确实是决定一个视频之所以有趣、有价值与否的重要视觉因素。这是多模态建设中锦上添花的过程。

具体更多细节此处不展开,建议读者可以移步 [5] 中去讨论。

fig_2p3_alignment_and_fusion

Fig 2.3 建立跨模态语义桥梁的两个阶段:语义对齐和语义融合。

多模态建设的架构

在多模态能力的建设和落地中,作为视频内容理解特征的一环,通常都需要对视频库里的视频进行计算特征后离线落盘(数量通常都以10亿起步计算),如果一次迭代只能给一个下游业务使用,那么就会显得成本高昂。一种更经济的手段是,对视频进行多模态向量提取并且落盘后,能够供给给多个业务and多个项目使用,提高多模态能力的产出投入比(ROI),因此我们希望多模态能力是一种分阶段的且通用的。如Fig 2.4所示,笔者构想中的多模态能力建设框架图应该是一个三层架构:

  1. 基础数据层:包含了业务的人工标注数据(万的级别),大规模预训练常用的视频数据(亿的级别)、视频文本对数据(亿的级别)、图片文本对数据(10亿的级别)等,这些数据通常都是采集自用户的点展日志,通过一些过滤规则得到。
  2. 基础模型层:基础模型层主要对多模态模型进行建模,最终目标是对每一个视频进行多模态特征的提取。笔者在这层主要分出了三种类型的模型:自监督模型,跨模态模型和稠密向量稀疏化模型。
  3. 业务模型层:在基础模型层产出了对应的视觉内容理解向量之后,可以交给业务模型进行使用,比如相关性模型,质量性模型等。

fig_2p4_vmm_framework

Fig 2.4 搜索中的多模态能力建设框架构想图。

视觉跨模态建模

笔者想先从基础模型层的视觉跨模态建模开始讲起,“跨模态”指的是跨越视觉和文本两个模态,给视觉建立与文本关联的语义信息,这也就是在建模笔者所认为的收益第一点“视觉信息为文本信息作为补充”。跨模态建模的最为经典的工作之一,当属21年诞生的CLIP(Contrastive Language Image Pretrain)[9],该工作采用大规模对比学习让视觉模型对齐文本语义概念,取得了显著的成功。如Fig 2.5 (a)所示,CLIP是一个双塔模型,分为图像编码器和文本编码器两大部分,其损失函数采用的是双向的infoNCE损失,整个计算过程可以由以下的伪代码示意,具体细节可参考 [5] 的介绍。

# image_encoder - ResNet or Vision Transformer
# text_encoder - CBOW or Text Transformer
# I[n, h, w, c] - minibatch of aligned images
# T[n, l] - minibatch of aligned texts
# W_i[d_i, d_e] - learned proj of image to embed
# W_t[d_t, d_e] - learned proj of text to embed
# t - learned temperature parameter
# extract feature representations of each modality
I_f = image_encoder(I) #[n, d_i]
T_f = text_encoder(T) #[n, d_t]
# joint multimodal embedding [n, d_e]
I_e = l2_normalize(np.dot(I_f, W_i), axis=1)
T_e = l2_normalize(np.dot(T_f, W_t), axis=1)
# scaled pairwise cosine similarities [n, n]
logits = np.dot(I_e, T_e.T) * np.exp(t)
# symmetric loss function
labels = np.arange(n)
loss_i = cross_entropy_loss(logits, labels, axis=0)
loss_t = cross_entropy_loss(logits, labels, axis=1)
loss = (loss_i + loss_t)/2

为何CLIP能如此成功地进行跨模态语义对齐呢?笔者曾在 [5] 中进行过这个问题的讨论,此处为了上下文连续性,在此再进行简单讨论。CLIP有两个关键的优化点:

  1. 大量数据:采用了大量的互联网带噪数据,数据量达到了4亿对图文对数据。
  2. 超大batch_size: 通过all_gather机制汇聚来自于多张GPU中的特征,使得batch size达到了32k之多。

如Fig 2.5 (b)所示,在数据量足够大且batch_size足够大的时候,一次计算就可以厘清正样本和多个负样本的概念区别,这也是被称之为对比学习的原因,这让高频视觉概念的语义对齐变得极其高效。当然,一些低频的、组合型的视觉概念难以通过对比学习的方式进行对齐,这个时候要依靠后续的语义融合模型建模了,我们在业务落地时候,可以考虑把这块放到了业务融合模型中进行。

在这里插入图片描述

Fig 2.5 CLIP的模型框架示意图,由文本编码器和图片编码器共同组成。其采用的对比学习方式,使得能够在一次对比过程中,有效厘清正样本和负样本中的视觉语义概念。

看到模型选型方面,视觉编码器和文本编码器都可以统一采用Transformer架构进行统一建模,如视觉编码器可采用ViT,文本编码器采用BERT、ERNIE,这样有几点好处:

  1. Transformer的尺度效应(scaling law)已经被广泛证实,其模型容量和模型设计可以支撑起海量数据的训练。
  2. Transformer可以做到高度并行化,并且有很多成熟的性能优化工作,视觉端和文本端统一使用基于Transformer的模型,后续部署的时候可以复用性能优化的经验。
  3. 采用Transformer架构对视觉建模,需要对输入进行分块(patch),其输出可以视为是多个视觉稠密的令牌(token),这有利于后面会谈到的视觉向量的稀疏化。

在数据这块,我们从线上的点击数据中,不难获取海量的用户检索词query和点击的视频video的二元组<query, video>,但这不意味着文本塔只能输入query。用户query是用户表达需求的产物,query通常是抽象的,而且query中很可能会存在弱视觉语义的表达,什么是弱视觉语义呢? 笔者在博文 [5] 中曾经介绍过,在此再解释下。我们之前谈到的图文对数据,在理想情况下都应该如同Fig 2.6的左图所示,文本对图片中的视觉元素进行客观地描述,从而模型可以学习到文本与视觉的语义对齐,我们将这种图文对数据称之为强视觉关联(Strong Correlation),笔者也称之为强视觉语义。然而在真实互联网数据中,图文对数据并不是如此的理想,很多时候文本描述并不是在描述画面的视觉元素,而是整张图的抽象含义,如Fig 2.6所示,作为对整个图的视觉描述,理想的本应该是

There are several burning candles on a fruit cake. (加粗的为视觉概念)

但是在实际的互联网数据中,很多是对整个场景的抽象描述,比如

Happy birthday! make a wish.

这种抽象描述没有任何视觉元素(实体、属性、关系等),因此我们称之为弱视觉关联(weak correlation),笔者也称之为弱视觉语义。单纯依靠弱视角关联数据,显然模型无法将没有任何视觉语义的文本对齐到图片中的视觉元素中。而用户的query,很多时候就是这种弱视觉语义文本。

fig-strong-weak-correlation

Fig 2.6 强关联样本中Query的视觉概念容易识别,弱关联样本中Query更为口语化和抽象,难以直接抽离相关视觉概念。

这也解释了如果我们直接用<query, video>去训练CLIP,其loss会下降得缓慢的现象,正是因为query过于抽象,难以直接映射到视觉中的实体概念。一种可行的方法是参考ERNIE-VIL 2.0 [12-13] 中的方法,在CLIP训练时采用多视角的文本信息去辅助抽象语义、弱视觉语义的学习,所谓多视角的文本信息,即是描述同一个视频的多种不同来源的文本信息,成对的<query, video>中的query是其中一种,视频本身的标题、OCR、ASR、标签信息都属于是多视角的文本信息。如Fig 2.7所示,一种可参考的方式是,文本塔除了喂入用户query之外,还可以轮流喂入视频的标题,即是输入不光是<query, video>,而且还有<title, video>,当然此时文本编码器是共享参数的。此时通过视觉信息的桥接作用,就有机会通过title中更为具体的信息,去诠释query里面的弱视觉语义概念。<title, video>去训练CLIP的loss下降比起<query, video>会快很多,其实这也很好理解,视频标题毕竟是视频用户自行取的,肯定会比关联的query的相关性强很多,因此模型学习关联起来也会更为容易。

fig_2p7_multidomain_text

Fig 2.7 参考ERNIE-VIL 2.0中采用多视角文本方法,采用<query, video>和<title, video>数据对去同时训练CLIP。

肯定会有读者好奇,“那多视角文本那么好,是不是尽可能都把视频里面的文本信息,如OCR都给用上去做多视角对比学习呢?”。在笔者看来,OCR信息过于嘈杂,且长度都很长,里面包含有很多视觉元素信息,当然还有更多的非视觉元素信息。从本质上说,我们的文本编码器无论采用什么多视角学习方法,终究还是为了query理解服务的,query和OCR的分布差别过大将不利于实现这个目的。OCR确实也包含有很多视觉信息,我认为一种较为可行的方式,如Fig 2.8所示,是从视频中挑选出足够代表整个视频主题的若干关键帧,这些关键帧需要富含强/弱视觉语义概念,同时提取这些关键帧的OCR信息进行学习。

fig_2p8_select_frame_ocr

Fig 2.8 从视频中挑选富含有视觉概念的关键帧以及对应的OCR信息,给模型进行学习。

整体来看,CLIP是一个视频-文本的双塔模型,对于视频塔的输入,我们可以有两种考虑:

  1. 纯视觉输入:只输入视频的视觉信息,也就是视频帧的信息。
  2. 混合输入:除了视频的视觉信息外,还可以同时输入视频侧的文本信息,比如标题、OCR等。

我们应该在CLIP中去建模整个视频的信息吗?笔者倾向于不要这样做,有几点原因:

  • 避免“文本短路”(text shortcut):当视频塔中混合了标题、OCR等文本信息后,文本塔通常输入的是用户的query,<query, video>属于跨模态匹配,难度通常比同模态的<query, title><query, ocr>匹配困难很多。而且考虑到,我们的样本来自于用户的点击样本,点击样本来自于搜索有展现的样本,已经经过了现有系统(基本上依赖于文本的匹配能力)的漏斗筛选了,因此query和title、ocr之间的匹配会强很多。如Fig 2.9所示,如果视频塔中同时存在视觉信息,文本信息,那么模型很容易学到query与文本之间的匹配关系,从而忽视query与视觉之间的匹配关系,而后者才是我们的建模目标,这就是笔者所谓的“文本短路”,这种现象也在一些论文中有所报告 [10-11]。

  • 提高多模态特征作用的独特性:即便有办法缓解“文本短路”现象,笔者也不建议在视频塔中引入视频的文本信息。视频塔产出的稠密向量是会供应给下游的业务模型,比如排序、召回模型使用的,而排序、召回模型中主要输入又是文本信息,在视频塔这块如果过多考虑文本信息,收益很容易被下游模型给掩盖掉。在语义对齐阶段,应该尽可能只做好语义对齐这一件事情,而不要去过多沾染语义融合,因为很可能后者的建模导致前者没建模准确。

fig_2p6_text_shortcut

Fig 2.9 如果视频塔中同时存在标题、OCR和视觉信息,由于query和标题、OCR同属于文本模态,而且大概率会同时命中多个关键词,因此会存在“文本短路”的现象,导致视觉信息学习效率降低。

虽然视频和图片都是视觉媒体,但视频不同于图片,视频是具有时空特性的视觉媒体。在视频搜索场景中需要将时序信息组织到何种程度,这也是一个值得思考的问题。在基于动作识别的视频理解研究中 [9], 很多方法都会考虑建模视频的光流信息,这属于“稠密”的序列信息建模,通常都需要比较稠密的帧采样策略,才能对特定动作的上下文进行建模。如Fig 2.10所示,稠密的抽帧方法会密集地抽取一小段时间内(大部分是几秒钟内)的帧,从而才能跟踪动作语义单元的在帧间的变动,从而为动作识别提供基础。

而在实用的视频搜索场景中,笔者认为更需要的是“稀疏”的序列信息建模,如Fig 2.10的视频A和视频B所示,在视频搜索中,更需要通过序列信息去建模这个视频的主题,以及判断这个视频是“主题密集”的,还是“主题稀疏”的。以视频A [16] 为例,这是一个用户拼接多个搞笑视频而成的合集,这种视频如果均匀抽帧的话,会发现其帧间的主题差异是巨大的,而且上下文之间可能语义关联很弱,因此是主题稀疏的。视频B [17] 则是一个精心制作的视频,主要介绍一个巨大的鲶鱼的烹饪做法,因此会发现其上下文的主题是很一致,语义关联很强,属于是主题密集的。在视频搜索中,视觉序列建模的意义正在于此,可以判断这个视频的主题属性,从而为下游业务赋能,比如在视频质量建模中,通常会认为主题集中的视频会更有“价值”。

fig_diff_video_cutframe_methods

Fig 2.10 稠密抽帧方法和稀疏抽帧方法,分别适合不同的场景。 视频分别来自[15-17]。

为什么采用稠密向量

最终我们将视觉编码器产出的稠密向量进行落盘,笔者这个时候想起了之前在百度工作时候,和同事的一次闲聊。同事那时候问我,“对视频进行标签分类,与使用视频内容理解的稠密向量,在业务上有啥区别呢?”。这其实是一个相当好的问题,他的意思很简单,在现有的技术框架下,有很多对视频进行分类的工作,比如将视频分为是医疗类、体育类等等,这个取决与具体业务的分类体系,他其实好奇的是采用稠密的多模态向量会带来怎么样的不同。我认为这其实是分类标签(classification label)和语义标签(semantic label)的区别,也是独热表示(one-hot representation)和分布式表示(distributed representation)的区别。笔者曾经在 [5] 中讨论过,我不妨借用下之前的解释。

在分类任务中,我们的标签通常是“硬标签(hard label)”,指的是对于某个样本,要不是类别A,那么就是类别B,或者类别C等等,可以简单用one-hot编码表示,比如[0,1,0], [1,0,0]等,相信做过分类任务的朋友都不陌生。以ImageNet图片分类为例子,人工进行图片类别标注的过程并不是完全准确的,人也会犯错,而且犯错几率不小。那么很可能某些图片会被标注错误,而且图片信息量巨大,其中可能出现多个物体。此时one-hot编码的类别表示就难以进行完整的样本描述。我们这个时候就会认识到,原来标注是对样本进行描述,而描述存在粒度的粗细问题。one-hot编码的标签可以认为是粒度最为粗糙的一种,如果图片中出现多个物体,而我们都对其进行标注,形成multi-hot编码的标签,如[0,1,1]等,那么此时粒度无疑更为精细了,如果我们对物体在图片中的位置进行标注,形成包围盒(bounding box,bbox),那么无疑粒度又进一步精细了。

也就是说,对于标注,我们会考虑两个维度:1)标注信息量是否足够,2)标注粒度是否足够精细。然而,对于一般的xxx-hot标签而言,除了标注其类别,是不具有其他语义(semantic)信息的,也就是说,我们很难知道类别A和类别B之间的区别,类别C与类别B之间的区别。因为人类压根没有告诉他,如Fig 2.11 (a) 所示,基于one-hot标签的类别分类任务,每个标签可以视为是笛卡尔坐标系中彼此正交的轴上的基底,这意味着每个类别之间的欧式距离是一致的,也就是说,模型认为猫,狗,香蕉都是等价的类别,但是显然,猫和狗都属于动物,而香蕉属于植物。基于one-hot标注,模型无法告诉我们这一点。

fig-semantic-one-hot-label

Fig 2.11 (a) 分类标签,通过one-hot编码实现,是一种非语义标签,在one-hot场景中,每个类别标签之间的距离是一致的,但是显然,猫和狗属于动物类别,而香蕉属于植物类别,这种标签无法提供足够的语义信息;(b) 语义标签,如果我们的标签是语义标签,那么此时类别标签之间的欧式距离可以衡量类别之间的相似程度,这点可视为是简单的语义信息。

也就是说,猫和狗,相比于香蕉,有着更为接近的语义,也许Fig 2.11 (b)会是个更好的选择。如果我们的标签不再是one-hot的,而是所谓的语义标签,或者在NLP领域称之为分布式标签(Distributing label, Distributing vector)或者嵌入标签(embedding label, embedding vector),那么类别标签之间的欧式距离就可以描述类别之间的相似程度,这个可视为是简单的语义信息,然而很多高层语义信息都依赖于此。

以上的解释其实就部分回答了我同事的问题,首先,对视频进行标签分类,都是在一个封闭集合(close set)中进行的,也就是所有类别都会落在这个集合中,这势必减少了分类的灵活性,因为无法对开放集合(open set)的类别进行分类。 其次,分类标签是一个非语义标签,我们从刚才的讨论已经明白了语义标签可以度量不同概念之间的关系,稠密的多模态向量就是一种语义标签,其中包含有丰富的语义信息,使得这个多模态特征对比于传统的分类标签会更加的通用,有利于给更多的下游业务赋能。

视觉稀疏化建模

如果稠密向量需要在线上应用,稠密向量的落盘需要占据不少的正排储存空间,这块的成本不容小觑。一个视频级别的稠密向量,可能需要1KB的储存空间,而如果要落盘帧级别的稠密向量,一个视频可能就需要200KB,这是200倍的储存成本增加!!因此在实际应用中,大部分在线的线上应用只能使用视频级别的稠密向量,然而已经有不少实验都证实了帧级别的稠密向量的收益,为了让线上应用也能以某种形式使用到帧级别的多模态语义信息,视觉稀疏化便是一种可参考的方案。

视觉稀疏化,以某种形式将稠密的视觉向量转化为稀疏的ID型特征,以求尽可能保留主要语义的情况下,尽可能减少储存空间。一种可行的视觉稀疏化的方法,就是采用向量量化(Vector Quantization)技术,如公式(2-1)所示,将稠密向量 z e ( x ) ∈ R D z_{e}(x) \in \mathbb{R}^D ze(x)RD在一个训练好的视觉字典 E = { e 1 , ⋯   , e K } \mathcal{E}=\{e_1,\cdots,e_K\} E={e1,,eK}中寻找最近邻,并且将最近邻情况下的词典索引 k k k记为该稠密向量对应的稀疏特征,通过这个稀疏特征 k k k,可以在 E \mathcal{E} E中查表得到其恢复后的稠密向量 z q ( x ) = e k z_q(x) = e_k zq(x)=ek,这个过程就是对 z e ( x ) z_e(x) ze(x)的稀疏化。如Fig 2.12就展示了一个稠密特征图 f ∈ R H × W × D \mathbf{f}\in \mathbb{R}^{H \times W \times D} fRH×W×D如何通过向量量化的方式转成稀疏特征 f ′ ∈ { 1 , ⋯   , K } H × W \mathbf{f}^{\prime}\in \{1,\cdots,K\}^{H \times W} f{1,,K}H×W,并且通过稀疏特征恢复出 f ^ \hat{\mathbf{f}} f^的过程。在最终落盘特征的时候,只需要落盘 f ′ \mathbf{f}^{\prime} f即可,假如词典的 K = 8192 K=8192 K=8192,那么只需要一个int16就可以储存一个id,这意味着只需要原先 1 / ( 2 D ) 1/(2D) 1/(2D)的储存空间即可。

在线上应用的时候,只需要将视觉字典分发给各个业务模型,同时将稀疏特征进行落盘,那么线上的业务模型就能以最小的储存代价,使用帧级别的视觉语义信息了。同时,视觉字典其实就是一个lookup table,和word embedding字典没什么区别,同样是可以由业务模型进行更新的,这给业务建模带来了极大便利。因此,这个过程不妨可以看成是将视觉进行了“文本化”,扩充了一些“视觉token”。
z q ( x ) = e k , w h e r e   k = arg ⁡ min ⁡ j ∣ ∣ z e ( x ) − e j ∣ ∣ 2 (2-1) z_q(x) = e_k, \mathrm{where} \ k = \arg\min_{j} ||z_{e}(x)-e_j||_{2} \tag{2-1} zq(x)=ek,where k=argjmin∣∣ze(x)ej2(2-1)

sparse_token_forward

Fig 2.12 通过最近邻方法在字典里面查找稀疏令牌,作为稀疏编码的结果,然后通过反查字典可以对feature map进行恢复。

从本质上看,如Fig 2.13所示,其实稠密视觉向量量化的方法是将视觉语义进行基础语义的分割,然后尝试进行基础语义聚类的结果,视觉词表 E \mathcal{E} E里面的每一个项都是一个聚类簇中心。当然,只用聚类中心去代表整个类群的实例点,是会带来信息损失,一些视觉细节将会被忽视,然而对于搜索场景而言,这些视觉细节信息并不非常重要。

beit_v2_visualization

Fig 2.13 对视觉字典的可视化结果,可以看出每个词的向量对应的内容都是具有明显的视觉语义的。本质上可以视为是视觉单元的语义聚类。

那么,这里的核心就是这个视觉词表,需要怎么训练呢?这里的方法可以参考VQ-VAE [14],此处的细节也可参考笔者的博文 [18]。 整个框架中有若干参数需要学习,分别是encoder,decoder网络参数和视觉字典的参数。然而稀疏编码的过程由于采用了最近邻方法进行查表,这个过程显然是无法传递梯度的,为了实现编码器的更新,可以考虑将解码器的梯度直接拷贝到编码器中。假设对于编码后恢复的 z q ( x ) z_q(x) zq(x)而言,其每个元素表示为 D i , j , k D_{i,j,k} Di,j,k,那么对于其中某个元素的梯度表示为 ∂ L ∂ D i , j , k \dfrac{\partial \mathcal{L}}{\partial D_{i,j,k}} Di,j,kL,同理,对于编码后的 z e ( x ) z_e(x) ze(x)而言,同样有 ∂ L ∂ E i , j , k \dfrac{\partial \mathcal{L}}{\partial E_{i,j,k}} Ei,j,kL,令 ∂ L ∂ E i , j , k = ∂ L ∂ D i , j , k \dfrac{\partial \mathcal{L}}{\partial E_{i,j,k}} = \dfrac{\partial \mathcal{L}}{\partial D_{i,j,k}} Ei,j,kL=Di,j,kL

那么对于编码器的梯度就可以表示为 ∂ L ∂ W E = ∂ E i , j , k ∂ W E ∂ L ∂ E i , j , k \dfrac{\partial \mathcal{L}}{\partial W_E} = \dfrac{\partial E_{i,j,k}}{\partial W_E} \dfrac{\partial \mathcal{L}}{\partial E_{i,j,k}} WEL=WEEi,j,kEi,j,kL。让我们观察下其损失函数,如(1-1)所示,其中的 s g ( ⋅ ) sg(\cdot) sg()为停止梯度函数,表示该函数无梯度传导。decoder的参数通过第一项损失项进行更新(这部分损失可通过MSE损失 L ( x , x ^ ) \mathcal{L}(\mathbf{x}, \hat{\mathbf{x}}) L(x,x^)建模),称之为重建损失。encoder参数通过第一项和第三项损失进行更新,其中第一项是重建损失,第三项是为了encoder编码产出和视觉词典特征空间进行对齐而设计的,由于此时通过 s g ( ⋅ ) sg(\cdot) sg()函数停止了梯度,因此此时 E \mathcal{E} E的参数不会得到更新。视觉词典 E \mathcal{E} E的参数通过第二项损失项进行更新,通过将encoder编码结果进行停止梯度,我们只对 E \mathcal{E} E进行参数更新。
L = log ⁡ ( p ( x ∣ z q ( x ) ) ) + ∣ ∣ s g [ z e ( x ) ] − E ∣ ∣ 2 2 + β ∣ ∣ z e ( x ) − s g [ E ] ∣ ∣ 2 2 (1) \mathcal{L} = \log(p(x|z_q(x))) + ||sg[z_e(x)]-\mathcal{E}||^2_2 + \beta ||z_e(x)-sg[\mathcal{E}]||^2_2 \tag{1} L=log(p(xzq(x)))+∣∣sg[ze(x)]E22+β∣∣ze(x)sg[E]22(1)

vqvae_framework

Fig 2.14 VQ-VAE的框图,通过梯度拷贝,将decoder的梯度拷贝到encoder中。

在实际场景中,公式(1)中的第一项的损失函数可以依照需求定制,比如基于跨模态匹配的业务可以增加一些语义匹配的损失,强化视觉词典中语义匹配的能力。

视觉自监督建模

以上提到的跨模态语义对齐和视觉稠密向量稀疏化的建模,都是为了语义匹配服务的,由于需要提供成对的文本信息,因此属于弱监督建模。富有语义信息对于相关性建模来说是非常有增益的,但是对于质量建模、用户行为建模来说可能还不够,后者需要多模态更关注与视频本身的“属性”,比如视频的剪辑风格,画风,分镜,色彩色调等等,笔者将其统称为视觉风格,这种纯视觉元素并不是语义匹配建模过程考虑的。如Fig 2.15所示,我们以知识分享类视频为例子,就可能会存在实物演示类风格、真人出镜类、PPT课程分享、动画风格讲解等等不同的风格,如果考虑上视频帧间的分镜、剪辑风格差异等,则会有更丰富和复杂的视觉差异,这些都属于视频本身的视觉属性,不应该通过语义匹配的方式去建模。

在质量建模和用户行为建模中,笔者认为去建模视频本身的视觉属性是非常重要的。以用户行为建模为例,不同类型的用户可能会喜好不同类型风格的视频,很难用语义是否匹配,是否和query相关进行衡量。在质量业务的建模中,语义质量的建模一直是一个难问题,诚然如第一章所述用用户历史交互行为(点赞、点踩、评论、停留等等)进行隐式的建模,但是对于行为稀疏的新视频或者长尾视频就无能为力了,笔者认为,一个语义质量好的视频,在视频的视觉风格上肯定有所特点,如果一个多模态算子能够描述不同视频之间的视觉差异性,我们就可以在用户行为丰富的高频视频中,通过数以亿计用户的行为去挖掘出高质量视频的模式,然后通过模型去挖掘得知哪些视觉风格是高质量的。

从以上的例子我们不难发现,相关性建模的场景,和质量建模、用户行为建模对多模态能力的要求是不同的,前者更需要将视频的视觉信息和文本语义信息进行关联,后者则更关注视频本身的视觉风格,如果前者可以用对比学习进行建模,那么后者应该如何建模呢?

diff_style_teaching_video

Fig 2.15 以知识分享类视频为例,存在着不同风格的类型,比如实物演示类、真人出镜类、PPT课程讲解和动画风格讲解等。

笔者认为,视觉的自监督预训练方式在这种场景中,就是一种很好的建模方式。从Fig 2.15中其实我们不难发现,挖掘视频的视觉风格,可以认为是一种视觉聚类,我们通过设计合适的自监督任务,是可以学习出这种聚类模式的。 笔者提供一个想法,用符号 V q = { v 1 , ⋯   , v N } , v i ∈ R H × W × 3 \mathbf{V}^{q} = \{v_1, \cdots, v_N\}, v_i \in \mathbb{R}^{H \times W \times 3} Vq={v1,,vN},viRH×W×3表示一个具有 N N N帧的视频 q q q,假设同一个视频的视觉风格都是接近的,那么从这个视频中采样得到两个 K K K帧的片段 v i q = { v i , ⋯   , v i + K } \mathbf{v}_i^q = \{v_i, \cdots, v_{i+K}\} viq={vi,,vi+K} v j q = { v j , ⋯   , v j + K } \mathbf{v}_j^q = \{v_j, \cdots, v_{j+K}\} vjq={vj,,vj+K},这两个片段之间的视觉风格应该是相近的,假设视频片段的表征函数为 f ( ⋅ ) f(\cdot) f(),度量函数为 g ( ⋅ ) g(\cdot) g(),那么有 g ( f ( v i q ) , f ( v j q ) ) → 1 g(f(\mathbf{v}_i^q), f(\mathbf{v}_j^q)) \rightarrow 1 g(f(viq),f(vjq))1。 从另一个视频 p p p中采样一个 K K K帧的视频片段为 v i p = { v z , ⋯   , v z + K } \mathbf{v}_i^p = \{v_z, \cdots, v_{z+K}\} vip={vz,,vz+K},假设随机采样的视频 p , q p,q p,q应该具有不同的视觉风格,因此有 g ( f ( v i q ) , f ( v z p ) ) → 0 g(f(\mathbf{v}_i^q), f(\mathbf{v}_z^p)) \rightarrow 0 g(f(viq),f(vzp))0。这个思想参考图示Fig 2.16,可以用triplet loss进行建模,如公式(2-2)所示,其中的 m m m是margin,具体可参考博文 [32]。当然,也可以采用对比学习的思路,采用infoNCE损失进行建模。
L ( v i q , v j q , v z p ) = max ⁡ ( 0 , m + g ( f ( v i q ) , f ( v j q ) ) − g ( f ( v i q ) , f ( v z p ) ) ) (2-2) \mathcal{L}(\mathbf{v}_{i}^q, \mathbf{v}_{j}^q, \mathbf{v}_z^{p}) = \max(0, m+g(f(\mathbf{v}_i^q), f(\mathbf{v}_j^q))-g(f(\mathbf{v}_i^q), f(\mathbf{v}_z^p))) \tag{2-2} L(viq,vjq,vzp)=max(0,m+g(f(viq),f(vjq))g(f(viq),f(vzp)))(2-2)
想必读者能看出来,“同个视频的视觉风格接近,不同视频的视觉风格不同”这个假设是一个很强的假设,在实际中不一定现实,因此这个方法的难点在于如何去挑选合适的正样本和负样本。

simclr_for_video

Fig 2.16 假设同一个视频内的不同片段的视觉风格是接近的,而不同视频间的视频风格存在较大差异,可以采用对比学习的方式进行建模。

多模态的业务应用

简单应用

一旦产出了多模态算子之后,就可以给业务使用了,典型的搜索业务包括排序和召回,建模的子维度又可以分为相关性、质量、用户行为等等,多模态在这些场景中都有所应用。在粗排和精排阶段,多模态最直接的应用形式,就是将query向量和视觉向量匹配的相似度打分(QV打分)直接引入到排序中,作为Fig 1.4中的一维特征。这种做法很直接,但有3个主要缺点:

  1. 打分分辨率较低:采用对比学习训练出来的query向量和视觉向量的匹配打分,通常打分范围都很窄,其提供的分辨率比较低。
  2. 视觉向量的利用率低:QV打分只考虑了query和视频视觉的匹配关系,没有建模视觉与其他视频特征(如OCR、ASR、标题等)的关系。
  3. 使用场景受限:只采用QV打分,无法很好地赋能其他业务方向,比如用户行为估计和质量建模等。

即便如此,QV打分还是能对题文不符和需求不符的case有一定区分能力的,去迭代QV打分对于业务来说也是有所收益的。然而考虑到上线一版视觉向量的成本是很高的,为了迭代QV打分去单独迭代一版视觉向量的性价比太低了,我们可以参考LiT [19] 的做法,将视觉向量固定后,挖掘最新的在线点展数据,通过CLIP的方式去训练,从而只更新query模型。 query模型通常是在线计算的,迭代query模型对于上线来说没有额外的负担,而且可以参考 FILIP [20] 的方式去建模细粒度的query需求。通过固定视觉向量,只更新query模型的方式,我们可以定期(比如一个季度)去挖掘最新的数据,采用更大的batch size(因为最大资源开销的视觉侧已经固定了)去训练query模型,这样query模型能够学习出最新的需求分布。这个也是一个值得参考的迭代方向。

多模态融合

只用QV打分太过于浪费了,很多复杂的语义关系需要融合视觉和文本信息一起考虑,因此更好的做法是将视觉向量融合入到文本语义模型中,形成多模态语义模型。通常,相关性模型就是一个语义模型,主流是采用基于Transformer的模型进行建模,如BERT、ERNIE等,我们可以将视觉向量融入到相关性模型中。问题来了,视觉向量要以什么形式融入到基于Transformer的相关性模型中呢?参考多模态大模型的融合方法,常用的多模态融合方法可以分为以下几种:

  1. Frozen [21]/LLaVa [22]: 采用视觉前缀,直接将训练好的视觉向量拼接到文本的embedding输入上,给LLM进行训练和推理。 视觉前缀可视为所谓的visual prompt,引导模型生成更好的内容。
  2. BLIP2 [24]: 视觉前缀对视频不定长度的媒体不友好,而且视觉前缀的方式也过于粗糙。BLIP2通过引入Q-Former的方式,引入了所谓的learnable query,可视为是一种可学习的prompt,其好处就是,第一阶段的训练,可以单独通过图文对数据对该prompt进行特定模态的优化训练,第二阶段才将该prompt引入到LLM中。因此该visual prompt比起Frozen来说,会更具有适合LLM的视觉语义信息。 可参考笔者的博文介绍 [24]。BLIP2产生的visual prompt,也是拼接文本输入到LLM的,耦合度较低。
  3. Flamingo [3]: 类似于BLIP2,也是引入了可学习的prompt,但是其产生prompt会直接以cross-attention的方式影响到LLM,而BLIP2不会。 Flamingo的visual prompt和LLM的耦合度更高。可参考笔者的博文 [26]。
  4. MetaLM [26] /Kosmos v1 [27] /Kosmos v2 [28]: 将自回归的LLM视为是通用语言能力接口,不同模态通过所谓的『非因果语言模型』进行建模,这种方式将编码器统一成了Transformer,而且特征都是以稀疏化的方式存在的。 这种方式天然对交织数据友好。 可参考博文:[29-31]。

其中第三种和第四种方式,对于搜索场景的多模态语义模型来说可能不太合适,因此笔者比较推荐的是第一种和第二种方式。第一种方式,直白地说就是将视觉向量直接拼接到文本输入上,笔者接下来讨论下一些思考。在Fig 2.4中的视觉跨模态建模中,其实是会产出帧级别的细粒度稠密向量视频级别的粗粒度稠密向量,而在实际线上应用的时候,受限于成本,则通常只能落盘视频级别的稠密向量。为了间接地用上细粒度的稠密向量,如Fig 2.17所示,可以考虑采用Teacher-Student的训练范式,在Teacher模型部分引入细粒度和粗粒度的稠密多模态向量,而用于上线的Student模型只引入粗粒度的视觉向量。由于student模型上的视觉向量只有一个token,直接拼接到文本输入上未免显得太过弱势,为了提高视觉向量的影响面,也可以考虑引入一个“短接”的旁路,直接连到最后的输出层。

teacher_ta_model

Fig 2.17 可以考虑采用Teacher-Student的训练范式,增加视觉向量在线上的效果。

在某些“不幸”的情况下,线上由于某些原因还没法直接拿到视觉向量的时候(可能由于没有建正排库),又急着推动上线,此时也有些比较“tricky”的方法。可以考虑将Fig 2.17中的Student模型视为是“助教模型”,通过这个模型去大规模蒸馏纯文本的student模型,如Fig 2.17的纯文本Student模型所示。读者可能会好奇,对比teacher模型的输入,student模型存在输入上的模态缺损,这样做是否合理且有收益呢?从笔者的实践来看,这样做是有收益的,我觉得也是能解释的通的。首先,我们的视觉向量已经在基础模型层做过了不错的跨模态语义对齐了,可以认为视觉向量和文本信息之间存在语义关联。在大规模蒸馏的过程中,即便student模型没有视觉向量的输入,从而可以利用文本信息去“记住”这些视觉信息。这个实践其实让笔者去思考一个问题,这种视频级别的稠密向量,在语义融合的应用过程中,是以什么形式拿到收益的?笔者认为,视觉向量在此处有两种作用:

  1. 提供文本所缺失的信息量:这一点容易理解,视觉向量是对视频视觉内容的语义理解过程,一些视频文本无法提供的信息,可以通过视觉向量提供。此处提供的信息可以是视觉实体语义信息、视频场景信息等。
  2. 对文本信息的确认: 由于视频文本信息中有一大部分是OCR信息,在Fig 2.1 (b)中其实不难发现,OCR信息是分很多类型的,包括字幕域、背景域、固定域、噪声域等,有时候遇到复杂的视频中可能还会出现表格型、图表型数据等。即便OCR进行了分域,也难以避免OCR中混入噪声,而这会给后续模型的使用带来困扰。采用视觉信息,可以对OCR中关键信息进行“确认和加强”,相当于是同时采用文本和视觉信息去确认同一件事情、实体、活动或者是场景等视频内容。

当然,也可以是上面两种作用的结合。考虑到实际的视频搜索场景中,大部分case所需要的信息,都是由文本信息提供的,因此笔者觉得第二个作用的建模思路可以着重考虑。第二个建模思路要求视觉向量具有两种能力:

  • 上文一直提到的语义对齐能力。
  • 视频结构化内容理解的能力,比如能提供一定的OCR-free的文字识别能力。

如果继续沿着这个思路,在业务模型应用的设计上,也应该考虑以某种机制引入视觉向量对文本信息进行加权的能力,比如交叉注意力(cross-attention)可能就是一个可以参考的方法。

在视觉稀疏化建模一章中,我们介绍过对视觉进行稀疏化建模的方法,通过这种方法可以将稠密的视觉向量转化为稀疏的视觉令牌(token),这些令牌不妨可看成是视觉的“文本化”信息。在业务应用中,我们可以利用这些稀疏的视觉令牌进行更丰富复杂的建模。首先,有了稀疏化视觉向量后,我们可以采用统一的多模态预训练范式。在搜索常用的文本判别式模型中,我们一般采用MLM(masked language modeling)的方式进行预训练,如果引入多模态稠密向量,可以考虑采用UNITER [33] 类似的跨模态MLM损失进行建模 [5]。而如果引入的是稀疏化后的视觉向量,则可以将跨模态MLM损失也一并省掉,直接采用MLM损失就可以统一文本-视觉模态的预训练任务了。

渐渐写得有点长了,受限于篇幅,后续内容以后再补充了。

Reference

[1]. https://blog.csdn.net/LoseInVain/article/details/126214410, 《【见闻录系列】我所理解的搜索业务二三事》

[2]. https://blog.csdn.net/LoseInVain/article/details/116377189,《从零开始的搜索系统学习笔记》

[3]. 张俊林. 这就是搜索引擎. 电子工业出版社, 2012.

[4]. https://www.6aiq.com/article/1588904027930, 《搜索中的 Query 理解及应用》

[5]. https://fesianxu.github.io/2023/03/04/story-of-multimodal-models-20230304/, 《视频与图片检索中的多模态语义匹配模型:原理、启示、应用与展望》

[6]. Ding, Ming, Chang Zhou, Hongxia Yang, and Jie Tang. “Cogltx: Applying bert to long texts.” Advances in Neural Information Processing Systems 33 (2020): 12792-12804. aka Cogltx

[7]. Luo, Z., Zhao, P., Xu, C., Geng, X., Shen, T., Tao, C., … & Jiang, D. (2023). Lexlip: Lexicon-bottlenecked language-image pre-training for large-scale image-text sparse retrieval. In Proceedings of the IEEE/CVF International Conference on Computer Vision (pp. 11206-11217). aka Lexlip

[8]. Radford, A., Kim, J. W., Hallacy, C., Ramesh, A., Goh, G., Agarwal, S., … & Sutskever, I. (2021, July). Learning transferable visual models from natural language supervision. In International Conference on Machine Learning (pp. 8748-8763). PMLR. aka CLIP

[9]. https://blog.csdn.net/LoseInVain/article/details/105545703,《万字长文漫谈视频理解》

[10]. https://blog.csdn.net/LoseInVain/article/details/134842120,《视频检索中的模态均衡方法》

[11]. Wang, Xun, et al. “Modality-Balanced Embedding for Video Retrieval.” Proceedings of the 45th International ACM SIGIR Conference on Research and Development in Information Retrieval. 2022.

[12]. https://blog.csdn.net/LoseInVain/article/details/128160516, 《ERNIE VIL 2.0,多模态模型的一种多视角预训练范式》

[13]. Shan, Bin, Weichong Yin, Yu Sun, Hao Tian, Hua Wu, and Haifeng Wang. “ERNIE-ViL 2.0: Multi-view Contrastive Learning for Image-Text Pre-training.” arXiv preprint arXiv:2209.15270 (2022). aka ERNIE-vil 2.0

[14]. Van Den Oord, Aaron, and Oriol Vinyals. “Neural discrete representation learning.” Advances in neural information processing systems 30 (2017). aka VQ-VAE

[15]. https://www.bilibili.com/video/BV1WF4m1w7YB/, 《【羽毛球新手干货】新手学习羽毛球的练习顺序?打羽毛球需要学会的24个基本动作》

[16]. https://www.bilibili.com/video/BV1jM4m1k7W3, 《完了,今天的功德又笑没了!!!#190》

[17]. https://www.bilibili.com/video/BV1zz421C7Wh/, 《1900买一条几十斤的南方大口鲶,切开金灿灿的,我都震惊了》

[18]. https://blog.csdn.net/LoseInVain/article/details/130524728, 《VQ-VAE的实现方法分析——一种基于梯度回调的方法》

[19]. Zhai, X., Wang, X., Mustafa, B., Steiner, A., Keysers, D., Kolesnikov, A., & Beyer, L. (2022). Lit: Zero-shot transfer with locked-image text tuning. In Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (pp. 18123-18133). Short for LiT

[20]. Yao, L., Huang, R., Hou, L., Lu, G., Niu, M., Xu, H., … & Xu, C. (2021). Filip: Fine-grained interactive languageimage pre-training. arXiv preprint arXiv:2111.07783. short for FILIP

[21]. Tsimpoukelli, Maria, Jacob L. Menick, Serkan Cabi, S. M. Eslami, Oriol Vinyals, and Felix Hill. “Multimodal [few-shot learning with frozen](https://www.zhihu.com/search?q=few-shot learning with frozen&search_source=Entity&hybrid_search_source=Entity&hybrid_search_extra={“sourceType”%3A"answer”%2C"sourceId"%3A3494788518}) language models."Advances in Neural Information Processing Systems34 (2021): 200-212. aka Frozen

[22]. Liu, Haotian, Chunyuan Li, Qingyang Wu, and Yong Jae Lee. “Visual instruction tuning.” Advances in neural information processing systems 36 (2024). aka llava

[23]. Li, Junnan, Dongxu Li, Silvio Savarese, and Steven Hoi. “Blip-2: Bootstrapping language-image pre-training with frozen image encoders and large language models.” arXiv preprint arXiv:2301.12597 (2023). aka BLIP2

[24]. https://blog.csdn.net/LoseInVain/article/details/136013909, 《BLIP2——采用Q-Former融合视觉语义与LLM能力的方法》

[25]. https://blog.csdn.net/LoseInVain/article/details/136072993, 《Flamingo:一种交织图文的视觉语言大模型方法》

[26]. Hao, Yaru, Haoyu Song, Li Dong, Shaohan Huang, Zewen Chi, Wenhui Wang, Shuming Ma, and Furu Wei. “Language models are general-purpose interfaces.” arXiv preprint arXiv:2206.06336 (2022). aka MetaLM

[27]. Huang, Shaohan, Li Dong, Wenhui Wang, Yaru Hao, Saksham Singhal, Shuming Ma, Tengchao Lv et al. “Language is not all you need: Aligning perception with language models.” arXiv preprint arXiv:2302.14045 (2023). short for Kosmos 1

[28]. Peng, Zhiliang, et al. “Kosmos-2: Grounding Multimodal Large Language Models to the World.” arXiv preprint arXiv:2306.14824 (2023). aka Kosmos-2.

[29]. https://blog.csdn.net/LoseInVain/article/details/136161262, 《MetaLM:一种融合因果语言模型和非因果语言模型的方法》

[30]. https://blog.csdn.net/LoseInVain/article/details/136428429, 《Kosmos-1: 通用接口架构下的多模态大语言模型》

[31]. https://blog.csdn.net/LoseInVain/article/details/136459707,《Kosmos-2: 在多模态大语言模型中引入基准和指代能力》

[32]. https://blog.csdn.net/LoseInVain/article/details/103995962, 《一文理解Ranking Loss/Contrastive Loss/Margin Loss/Triplet Loss/Hinge Loss》

[33]. Chen, Y. C., Li, L., Yu, L., El Kholy, A., Ahmed, F., Gan, Z., … & Liu, J. (2020, September). Uniter: Universal image-text representation learning. In Computer Vision–ECCV 2020: 16th European Conference, Glasgow, UK, August 23–28, 2020, Proceedings, Part XXX (pp. 104-120). Cham: Springer International Publishing. short for UNITER

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/759888.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一次关于k8s的node节点NotReady的故障排查

master现象 分析 kubectl get nodes -A 看了下pod的状态&#xff0c;好多CrashLoopBackOff kubectl get nodes -o wide 定位到那个具体node的IP地址&#xff0c;登录对应的IP去查看为什么会这样 node节点 journalctl -xe -f -u kubelet 查看此节点的 kubelet 服务&#xff…

RocketMQ 顺序消息和事务消息及其原理

RocketMQ 顺序消息和事务消息 1、Spring Cloud Alibaba RocketMq 架构图2、RocketMQ 顺序消息2.1、RockerMQ 实现顺序消费2.1.1、顺序发消息2.1.2、顺序收消息 2.2、顺序发送的技术原理2.3、顺序消费的技术原理 3、RocketMQ 的事务消息3.1、RocketMQ 事务消息流程3.2、事务消息…

微服务之服务保护策略【持续更新】

文章目录 线程隔离一、滑动窗口算法二、漏桶算法三、令牌桶算法 面试题1、Sentinel 限流和Gateway限流的区别 线程隔离 两种实现方式 线程池隔离&#xff08;Hystix隔离&#xff09;&#xff0c;每个被隔离的业务都要创建一个独立的线程池&#xff0c;线程过多会带来额外的CPU…

emptyDir + initContainer实现ConfigMap的动态更新(K8s相关)

1. 絮絮叨叨 K8s部署服务时&#xff0c;一般都需要使用ConfigMap定义一些配置文件例如&#xff0c;部署分布式SQL引擎Presto&#xff0c;会在ConfigMap中定义coordinator、worker所需的配置文件以node.properties为例&#xff0c;node.environment和node.data-dir的值将由Helm…

Transformer丨基础Transformer模型和代码详解

笔者在深度学习入门期间自学过Transformer&#xff0c;但是那时碍于急于求成&#xff0c;并未对其进行深度归纳与分享。 近期&#xff0c;笔者观察到不论是自然语言处理模型还是视觉模型&#xff0c;已经几乎从传统的CNN、RNN的网络结构设计全面转向基于Transformer的结构设计…

002-基于Sklearn的机器学习入门:回归分析(上)

本节及后续章节将介绍机器学习中的几种经典回归算法&#xff0c;所选方法都在Sklearn库中聚类模块有具体实现。本节为上篇&#xff0c;将介绍基础的线性回归方法&#xff0c;包括线性回归、逻辑回归、多项式回归和岭回归等。 2.1 回归分析概述 回归&#xff08;Regression&…

Vue3学习(一)

创建组件实例&#xff1a;我们传入 createApp 的对象实际上是一个组件 import { createApp } from vue // 从一个单文件组件中导入根组件 import App from ./App.vueconst app createApp(App) 大多数真实的应用都是由一棵嵌套的、可重用的组件树组成的。 App (root compone…

AI大模型的崛起:第四次工业革命的前奏?

在当今这个信息爆炸的时代&#xff0c;人工智能&#xff08;AI&#xff09;大模型的崛起引起了广泛的关注和讨论。有人将其视为第四次工业革命的前奏&#xff0c;然而&#xff0c;这真的可能吗&#xff1f;本文将探讨这一问题&#xff0c;并对中国AI大模型的发展进行简要分析。…

Android:移动垃圾软件

讲解政策相关,最近升级AI扫荡系统和证书防高风险,回复按留言时间来排,请耐心等待 移动垃圾软件 官方政策公告行为透明、信息披露清晰保护用户数据不要损害移动体验软件准则反垃圾软件政策Google API 服务用户数据政策官方政策公告 ​ 在 Google,我们相信,如果我们关注用户…

DIY智能音箱:基于STM32的低成本解决方案 (附详细教程)

摘要: 本文详细介绍了基于STM32的智能音箱的设计与实现过程&#xff0c;包括硬件设计、软件架构、语音识别、音乐播放等关键技术。通过图文并茂的方式&#xff0c;结合Mermaid流程图和代码示例&#xff0c;帮助读者深入理解智能音箱的工作原理&#xff0c;并提供实际操作指导。…

[图解]分析模式高阶+课程讲解03物品模式

1 00:00:00,280 --> 00:00:03,440 下一个要探讨的模式是物品模式 2 00:00:04,310 --> 00:00:08,300 说是物品模式&#xff0c;实际上更多的说物品规格 3 00:00:09,210 --> 00:00:12,560 首先&#xff0c;我们要区分一下物品和物品规格的定义 4 00:00:14,440 -->…

【C++】C++ 网店销售库存管理系统(源码+论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

抖音直播自动点赞脚本:让点赞变得简单

抖音直播自动点赞脚本&#xff1a;让点赞变得简单 简介 点赞是社交媒体上表达喜爱的一种方式&#xff0c;尤其在抖音这样的平台上&#xff0c;点赞不仅能够增加主播的人气&#xff0c;还能鼓励他们创作更多优质内容。然而&#xff0c;手动点赞往往既耗时又费力。为了解决这个…

算法与数据结构面试宝典——常见的数据结构都有哪些?详细示例(C#,C++)

文章目录 一、逻辑结构&#xff1a;线性与非线性线性数据结构非线性数据结构访问方式 二、数组&#xff08;Array&#xff09;三、链表&#xff08;LinkedList&#xff09;四、栈&#xff08;Stack&#xff09;五、队列&#xff08;Queue&#xff09;六、树&#xff08;Tree&am…

Android高级面试_6_性能优化

Android 高级面试-7&#xff1a;网络相关的三方库和网络协议等 1、网络框架 问题&#xff1a;HttpUrlConnection, HttpClient, Volley 和 OkHttp 的区别&#xff1f; HttpUrlConnection 的基本使用方式如下&#xff1a; URL url new URL("http://www.baidu.com")…

pytest测试框架pytest-random-order插件随机执行用例顺序

Pytest提供了丰富的插件来扩展其功能&#xff0c;本章介绍下pytest-random-order插件&#xff0c;随机设置pytest测试用例的运行顺序&#xff0c;并对随机性进行一些控制。 官方文档&#xff1a; https://pytest-cov.readthedocs.io/en/latest/index.html 适配版本说明&#x…

AI智能客服项目拆解(1) 产品大纲

本文作为拆解AI智能客服项目的首篇&#xff0c;以介绍产品大纲为主。后续以某AI智能客服产品为例&#xff0c;拆解相关技术细节。 AI智能客服是一种基于人工智能技术的客户服务解决方案&#xff0c;旨在提高客户满意度和优化企业运营。利用人工智能和自然语言处理技术&#xff…

如何为数据库中的位图添加动态水印

许多数据库存储了以blob或文件形式保存的位图&#xff0c;其中包括照片、文档扫描、医学图像等。当这些位图被各种数据库客户端和应用程序检索时&#xff0c;为了日后的识别和追踪&#xff0c;有时需要在检索时为它们添加唯一的水印。在某些情况下&#xff0c;人们甚至希望这些…

数字图像处理之【高斯金字塔】与【拉普拉斯金字塔】

数字图像处理之【高斯金字塔】与【拉普拉斯金字塔】 1.1 什么是高斯金字塔&#xff1f; 高斯金字塔&#xff08;Gaussian Pyramid&#xff09;是一种多分辨率图像表示方法&#xff0c;用于图像处理和计算机视觉领域。它通过对原始图像进行一系列的高斯平滑和下采样操作&#x…

istitle()方法——判断首字母是否大写其他字母小写

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 istitle()方法用于判断字符串中所有的单词首字母是否为大写而其他字母为小写。istitle()方法的语法格式如下&#xff1a; str.istitle() …