前言
本周因为本科毕设要开题了,我的调研重点回到了跨模态检索以及不完备数据集上跨模态检索的问题上,本周更多的在看一些预训练模型的方法,挑出一篇基于CLIP在下游任务上的应用CLIP4CMR和一篇预训练模型方法优化的ALBEF方法进行细致学习
预训练模型的跨模态检索应用CLIP4CMR:
这个工作对于如何将预训练模型更好的用于下游任务以及如何进行更好的多模态对齐都有非常好的参考价值。在毕设的时候调研到了也进行一下学习。
Motivation & Contribution
首先,对于跨模态检索任务,本工作是在实数域内的跨模态检索,其中分为无监督方法和有监督方法,文章将无监督的方法称为跨模态匹配,有监督的方法称为跨模态检索。(确实如果是无监督的方法“匹配”听起来更恰当)
对于多模态与训练模型,现有的VLP已经被训练的可以很好解决无监督的图文匹配问题,但是本文的研究是面向有监督的跨模态检索,旨在充分利用多模态与训练模型和标签监督信息进行学习。本文的motivation主要来自于问题:
- CLIP能否提升CMR任务,为什么能够有如此效果?
- 如何设计学习目标函数来影响检索结果
于是本文基于第一个问题,设计了一个以CLIP为骨干网络的跨模态检索框架;基于第二个问题,调研了现有的检索学习目标函数,其中包括pair-wise和class-wise的损失以及其结合。
此外,为了提高模型的实际应用能力,CLIP4CMR解决了不完备数据训练的问题,也提升了参数鲁棒性。最终提出的基于CLIP骨干网络的方法有如下几个特别的优势:
- 对于模态不平衡的问题,CLIP的框架能够有效的提高在不完备数据集上训练的鲁棒性。
- 在CLIP基础上的跨模态检索几乎对于潜在语义空间对维度不敏感
相关工作
相关工作的调研主要分为两个部分。
首先是对于检索任务的相关调研,无监督的ITM问题中,现在的方法更多的在进行可解释的网络来进行语义的对齐,这类方法使得其能够做更细粒度的,词和图像子区域的对齐(如之前的那个ITM的文章);而有监督的CMR问题中,更多的集中在保留多模态的类间class-wise联系(确实,有类别信息为何不用?)
其次是对于损失函数构建的调研:
- 传统的pair-wise loss和class-wise loss,成对的loss主要是从类内核类间关系学习公共表示空间,如modality invariant loss。其次是基于度量学习的对比学习损失和三元组损失,这种损失函数通过对整体分布的调整,能够最小化类内的多模态对且最大化类间的多模态对(拉近正样本拉远负样本)
- 基于类的loss,采用了proxy的思想,将数据和类的proxy进行对比,最开始是线性回归损失和交叉熵损失,基本思想是投影到一个标签空间中。
- 基于prototype 对比损失(protoNCE),解决模型对未知类的鲁棒性较差的问题。
基本框架
这个框架很简单啊,就随便讲讲,两个模态各有一个CLIP+MLP(不共享参数),然后还有一个对类标签做编码的proxy encoder,训练过程是联合训练,采用类别损失和成对损失的结合,其中跨模态的用成对损失,和类标的用类别损失。
命名定义&模型构建
首先是输入集,输入的数据定义为 Ψ P = { ( x k v , x k t ) } k = 1 N \Psi_P=\{(x_k^v,x_k^t)\}_{k=1}^N ΨP={(xkv,xkt)}k=1N,且在有监督情况下都有泪标签,每个 k k k对应有 y k ∈ { 1 , 2 , … , C } y_k\in \{1,2,\dots,C\} yk∈{1,2,…,C},其中 C C C表示语义标签的类数.
作者这里描述了一下采用的CLIP结构,本博客不赘述,对于输入,经过CLIP的不同模态的编码器后,有 α i = C L I P v ( x i v ) , β j = C L I P t ( x j t ) \alpha_i=CLIP_v(x_i^v),\quad\beta_j=CLIP_t(x_j^t) αi=CLIPv(xiv),βj=CLIPt(xjt)
且
α
i
\alpha_i
αi和
β
j
\beta_j
βj都是1024维表示。然而这个表征还有一些缺陷,因为通过自监督任务预训练的 CLIP 无法捕捉到更复杂的类别级语义辨别。因此,这个特征还需要进行一些转化,于是不同模态都添加了一个MLP,从而映射到class level的表征。采用两层感知机和一个GELU激活函数,有
学到的
v
i
∈
R
d
v_i\in\mathbb R^d
vi∈Rd和
t
j
∈
R
d
t_j\in\mathbb R^d
tj∈Rd是学到的在共有特征空间的特征。此外,在输出层加入一个l2正则化层。
目标函数
成对损失
首先直接来看这个损失函数:
L
c
l
=
1
n
∑
i
=
1
n
∑
j
=
1
n
y
i
,
j
d
(
v
j
,
t
j
)
+
1
n
∑
i
=
1
n
∑
j
=
1
n
(
1
−
y
i
,
j
)
[
Δ
−
d
(
v
j
,
t
j
)
]
+
\mathcal L_{cl}=\frac 1n\sum_{i=1}^n\sum_{j=1}^ny_{i,j}d(v_j,t_j)+\frac 1n\sum_{i=1}^n\sum_{j=1}^n(1-y_{i,j})[\Delta- d(v_j,t_j)]_+
Lcl=n1i=1∑nj=1∑nyi,jd(vj,tj)+n1i=1∑nj=1∑n(1−yi,j)[Δ−d(vj,tj)]+
这是个类似margin loss的损失函数,其中 d d d表示的是两个特征的欧式距离的平方,而 y y y就是标签构建的相似矩阵(有同类为1其余为0),这个损失函数很直观,相同类时拉近距离,不同类时拉远距离到margin。
三元组损失
损失函数如下:
这是当前基于实值的跨模态检索三元组损失最常见的形式,这里不进行赘述
基于类的损失
基于本身损失函数的构造,首先是对于proxy的线性回归损失:
这个损失函数的构造还是挺有趣的,每个类会有个相应的proxy,如果在proxy和多模态特征表示中间加一个线性的投影就能够转化,则证明这个特征更具有类别区分性,能有一定监督效果。
第二个损失函数是交叉熵损失,基本形式如下
这个交叉熵损失的主要目的是拉远一层投影后的一个prediction和真实类标签的交叉熵。分母是所有类的一个线性的权重和偏置的一个伪的类预测,分子是对该实例的计算。
第三个损失函数来自于2021年的PAN的工作中提到的基于prototype的检索方法。这种基于原型的做法思想和proxy有点点类似,每一个类会指派一个prototype(中心),然后将类别中心当作一种特征,对原型和这个prototype通过如下的对比学习损失联合学习
(这里有个问题,是否应该先对这个prototype进行一个warmup的学习?)
最终损失函数
对于成对损失和类别监督损失,本文指出在训练的过程中仅取其二,中间加一个可调参数(似乎对这个参数不是很鲁棒,所以作者说是“carefully selected”
跨模态预训练模型:Align before Fuse: Vision and Language Representation Learning with Momentum Distillation(NIPS 21’)
导入:跨模态预训练模型 & Motivation
VLP预训练模型是现在多模态学习中非常火爆的方法。大部分的**传统VLP方法(LXMERT,UNITER,OSCAR)**都依赖于与训练的目标检测器来提取图像特征和词tokens。而multimodal encoder则用于解决需要联合理解图文信息的任务,如MLM(masked language modeling)和ITM(Image-Text Matching)任务等。
但是,现有VLP方法有若干问题:
- 如CLIP和ALIGN,都是提取到模态自身编码空间的嵌入,导致模态间交互建模能力较差,无法解决细粒度的学习任务。
- 还有一部分方法如UNITER,在学习的过程中需要用预训练的Object detector来进行训练,这会消耗大量计算资源和标注成本。
- 本身收集到的数据很多是包含噪声的,而且会被MLM任务的目标函数所过拟合,导致模型泛化能力较差。
Contribution
于是基于此,提出了ALBEF的方法,基本的做法是先用一个没有目标检测器的跨模态预训练模型。训练过程中,首先用图文模态两个单独的encoder进行编码,然后用一个跨模态编码器,通过跨模态的一个共有Encoder对两个模态上的嵌入进行融合。
此外,在两个模态的单模态编码器上,ALBEF加入了ITC对比学习损失,ITC可以进行跨模态对齐,并且改进了单模态的编码器,使其更好理解图像和文本语义(这部分不是特别清楚,但对比学习来学习跨模态特征确确实实是对的),最后学习一个通用的低维空间嵌入,这使图文匹配的目标函数可以通过对比hard negative来挖掘更丰富的信息。
对于噪声样本的学习,本工作又提出了**动量蒸馏(Momentum Distillation)**的方法,使模型能够利用更大的含噪声的网络数据集。在训练期间,我们通过获取其参数的移动平均值来保持模型的动量版本,并使用动量模型生成伪目标作为额外的监督。使用MoD,该模型不会因产生与web标注不同的其他合理输出而受到惩罚。实验证明MoD能够改进与训练任务以及有干净标注的下游任务。
基本框架
ALBEF的基本框架图如下:
先讲一下整体的组成:对于单模态编码器,图像模态用一个12层ViT-B/16做encoder,权重的warmup用的是ImageNet1k的预训练权重。编码后的嵌入是
{
v
c
l
s
,
v
1
,
…
,
v
n
}
\{\boldsymbol v_{cls},\boldsymbol v_{1},\dots,\boldsymbol v_{n}\}
{vcls,v1,…,vn}。其中第一项是class token。而文本输入用bert-base的前六层作为编码器并且初始化,文本编码器同样将文本的数据编码到文本嵌入
{
w
c
l
s
,
w
1
,
…
,
w
n
}
\{\boldsymbol w_{cls},\boldsymbol w_{1},\dots,\boldsymbol w_{n}\}
{wcls,w1,…,wn}中。然后对于这两个embedding,再输入到多模态编码器进行特征融合。具体地,多模态编码器采用的是bert-base的后六层。在训练过程中,每一层再和视觉嵌入做一个cross-attention的操作。
整个ALBEF的预训练过程的总体目标函数为
L
=
L
i
t
c
+
L
m
l
m
+
L
i
t
m
\mathcal L=\mathcal L_{itc}+\mathcal L_{mlm}+\mathcal L_{itm}
L=Litc+Lmlm+Litm
分别对应的是单模态编码器上的图文对比学习损失,以及多模态编码器上的掩蔽语言建模和图像文本匹配。这里具体讲这三个损失函数的构造:
ITC
首先是对比学习损失函数,将不同模态上的编码器特征做相互模态的一个contrastive loss,如下
用生成的概率模型和对比学习中的one hot ground truth
y
\boldsymbol y
y 进行对比,采用交叉熵损失函数来描述。
MLM & ITM
MLM和ITM的任务如下图所示,MLM在文本模态上进行部分掩蔽,通过图像模态信息生成对与掩盖部分的预测;而ITM则是基于图像模态信息,在文本模态的伪目标中检索出最为匹配的若干项。
对于MLM任务和ITM任务,也有基于one-hot的损失函数有
其中, y \boldsymbol y y同样是onehot的ground truth,对于mlm任务,这是表示词汇分布的one-hot,对于itm任务,这是一个表示ground truth标签的二维one-hot向量。
Momentum Distillation
首先观察之前的损失函数不难发现,前文的方法基本上都是在基于onehot的方法来构造损失函数。作者的举例是在ITC的学习中,区分数据时候是按照instance来的(这也是对比学习的基本思想),但是负样本有可能有更好描述,而正样本的成对性不一定很好,这样反而会导致学习效果变差。
作者认为,ITC和MLM的损失惩罚所有的负标签预测,于是采用了一种知识蒸馏的模式,先构建一个动量模型,然后用这个动量模型去生成伪目标,最后用伪目标进行监督学习。
动量蒸馏
首先将前面的对比学习损失公式(1)进行改写,首先,利用单模态动量编码器计算出多模态的伪的分类头嵌入,然后算出一个新的相似度矩阵并且基于公式得到一个新的loss,然后用一个类似动量的公式,加入一个基于动量的KL散度损失,如下:
同理MLM也有:
为什么要用动量蒸馏方法?首先,动量蒸馏避免了onehot带来的损失,其次,用了知识蒸馏和动量loss的结合方法,让伪标签能够帮忙学习但不完全参与监督,这能够提升一定效果。
互信息最大化
互信息现在作为一个新的损失函数,基本计算公式如下:
但本文方法并没有用互信息,而是借互信息引入对比学习的一个常用损失InfoNCE
(作者说优化这个对比损失是来源于最大化互信息,但我从互信息推过去的过程感觉还是很不自然,更多的思路最后参考了这个文章的推导过程)https://zhuanlan.zhihu.com/p/334772391
经过InfoNCE的重写后,能够得到如下重写的ITC对比损失
注意,这时候的损失函数是已经加入了动量的。
同理,MLM的损失也可以改为softmax形式,有
其中
V
\mathcal V
V是词库,
ψ
\psi
ψ是一个从词库映射到d维特征空间的特征函数。f函数将多模态编码器的最后一层隐藏层提取出来,和
ψ
\psi
ψ做一个softmax,然后用负对数来使得掩蔽的词的输出概率的期望最大化。
综合之前的动量蒸馏,公式6中的KL散度可以改写为下面的公式(注意,动量蒸馏的过程中KL散度是p对q的KL散度,也就是说优化的目标是p,使得p向q近似)
最终重写如下的损失,即可进行训练:
L
=
L
i
t
c
+
L
m
l
m
+
L
i
t
m
\mathcal L=\mathcal L_{itc}+\mathcal L_{mlm}+\mathcal L_{itm}
L=Litc+Lmlm+Litm