多模态论文串讲·上【论文精读·46】

- 多模态串讲
根据vilt论文里的figure2, 我们可以得出这样一个结论,我们需要好的visual embed,图像编码器比文本编码器要大,因为图像更为复杂,同时modality interaction也要很好,text embedding已经很成熟,一般用BERT,所以这个很轻量化了已经
因此我们总结出理想化的情况应该是接近下图(c)的情况

我们可以考虑一些常用的loss:
Image text contrastive loss
Image text matching loss
Masked language modelling loss
Word patch alignment (这个在vilt中用到,但是计算很慢,pass)
所以上面前三个loss是比较好用的
因此我们就可以引出ALBEF
- ALBEF (align before fuse)
出发点 - 在multimodal interaction之前我们要align好text and image token,以便于multimodal encoder学习。ALign image and text representation BEfore Fusing (ALBEF) using a contrastive loss, 这是贡献1
贡献2 - Momentum distillation, self-training method which learns from pseudo-targets produced by a momentum model
不同的损失函数其实是在为同一个图像文本对,生成不同的视角,变相地做data augmentation,达到semantic preserving的目的
主体方法:

目标函数:
- ITC loss, image text contrastive loss. 图像和文本分别通过encoder tokenise, CLS token是一个全局特征(图中绿色方块旁边的黄色方块), down sample (786x1 => 256x1)然后 normalisation,然后进行正负样本的学习 (预先存了很多个负样本), 这一步就是align
- ITM loss, image text machine loss. 在multimodal encoder的输出之后加一个二分类头,这里很特别的是,每个batch里我拿一个图片和batch里除了配对文本之外的所有的文本做cosine similarity (借助之前ITC的那个模块),挑一个相似度最高的作为负样本 (hard negative) 来训练,加大难度
- MLM, masked language modeling. 类似BERT的完形填空,mask住一个词语,去预测mask的词语,但是融合了图像的信息
一个小细节,计算ITC和ITM loss的时候,输入的都是原始的image and text embedding (下图橙色的T'表示masked text embedding),算MLM loss的时候,用的是原始的image embedding,但是是masked后的text embedding,因此每一次训练iteration其实做了2次forward,一次用了原始的image and text embedding,另一次用了原始的image和masked的text embedding,因为你要算多个loss函数


Momentum distillation
动机 - 从网上爬下来的图像文本对通常weakly-correlated,即文本并没有很好地描述图像,从而产生了noise

如果可以找到额外的监督信号,那就好了,这里额外的就是momentum model产生的一些pesudo-target,实际上是一个softmax score,当ground-truth有noise的时候,pesudo-target就很有用了
最近很火的一种就是self-training


所以实际上有5个loss,2个ITC,2个MLM,1个ITM,ITM这个loss ground truth很清晰,所以不需要momentum的版本
- VLMo
贡献1 - dual-encoder (双塔模型,如CLIP) 解决了检索问题,而fusion encoder,也叫单塔模型,解决了不同模态之间的交互问题,VLMo就把2种的好处都结合了起来,一个模型,想当双塔和单塔 (论文命名为vision-language expert, language expert, vision expert,其实就是不共享参数的FC层) 用都可以,具体可以看论文的图
贡献2 - stage-wise pre-training, 简单来说就是多模态的数据集不够大,那我就先预训练单独的一个模态

注意这里由于loss的计算,和ALBEF类似,每次iteration也要forward几次