0%

多模态

1. CLIP

image-20240723195758149

数据集总共 400M 图片文本对,使用对比学习的方式训练模型。匹配的图片文本对 Ti 和 Ii 记为正样本,不匹配的图片的文本对 Ti 和 Ij 记为负样本。我们要让正样本的余弦相似度接近1,负样本的余弦相似度接近-1。

通过引入额外的 alt-text 信息,使得模型拥有 open-vocabulary 的能力,在预测的过程中没有种类的约束。只需要把要预测的种类带入到 prompt 中(A photo of a {object}),与要预测的图片算余弦相似度,相似度最高的即为预测结果。

  • 余弦相似度:$cos\theta=\frac{a·b}{||a||*||b||}$

伪代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 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]
# I_e和T_e已经进行了归一化,所以不用再除以模长
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

2. FLIP

image-20240723195711320

FLIP 借鉴了 Bert 中 Mask Language Modeling 的思想,对图片的 patch 进行高比率的 mask,而仅仅只编码可见的patch。FLIP并不会对图像进行重建任务!

image-20240723205622420

mask的比率越高,模型训练的时间越短,同时在同等epoch下正确率较原方法也会有一定的提升(此处50%正确率最高)。由此可以看出,大量的负样本可以提升模型的性能(mask比率高,batch_size就可以增大,相应的负样本也就增多了)。

消融实验

image-20240723214031656

3. MAE

image-20240723221930823

和FLIP有些类似,先对原图像进行 mask,然后仅对未 mask 的图像进行编码。不同的是,MAE对编码后的向量按序加入 mask 标记再进行解码。预训练完成后,仅使用 encoder 进行识别任务。

image-20240724112517262

实验结果和FLIP吻合,高 masking ratio 会带来高正确率。

消融实验

image-20240724113449969

4. ALIGN

image-20240724192444290

和CLIP基本差不多,最显著的不同就是,CLIP使用的数据经过较复杂的人为清洗(400M),而ALIGN直接使用符合网络分布的图像文本对(1.8B)。

5. K-LITE

image-20240724195724682

使用外部知识,例如 WordNet 和 Wiktionary 来扩充文本。

1
2
3
"I like eating apple" 
->
"I like eating apple; apple, fruit with red or yellow or green skin and sweet to tart crisp whitish flesh"

6. LaCLIP

使用 LLM 对图片描述进行重写。

image-20240724205720220

image-20240724210728574

image-20240724211008478

7. VirTex

image-20240724211922575

image-20240724235917075

使用文本监督信号来让 Visual Backbone 更好地提取图像信息。与 CLIP 不同的是,VirTex 使用的是 Captioning Loss。

8. SimVLM

image-20240725113704661

视觉部分参考了 ViT,将图片分割成块。不同的是,这里使用卷积层提取 patch 的特征而非一个简单的线性层,同时文本 embedding 和 图片的 embedding 一起输入到 encoder 中进行 gpt 的自回归预测任务。

9. Coca

image-20240725134229105

image-20240725135410475

伪代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# image, text.ids, text.labels, text.mask: paired {image, text} data
# con query: 1 query token for contrastive embedding
# cap_query: N query tokens for captioning embedding
# cls token id: a special cls token id in vocabulary
def attentional pooling(features, query):
out = multihead_attention(features, query)
return laver norm(out)

img_feature = vit_encoder(image) # [batch, seq_len, dim]
con_feature = attentional_pooling(img feature, con_query) # [batch, 1, dim]
cap_feature = attentional_pooling(img_feature, cap_query) # [batch, N, dim]

ids = concat(text.ids, cls_token_id)
mask= concat(text.mask,zeros_like(cls_token_id)) # unpad cls _token id
txt_embs = embedding_lookup(ids)
unimodal_out = lm_transformers(txt_embs, mask, cross_attn=None)
multimodal_out = lm_transformers(
unimodal_out[:, :-1, :], mask, cross_attn=cap_feature)
cls_token_feature = layer_norm(unimodal_out)[:, -1:, :] # [batch, 1, dim]

con_loss =contrastive_loss(con_feature, cls_token_feature)
cap_loss =softmax_cross_entropy_loss(
multimodal_out, labels=text.labels, mask=text.mask)

10. ALBEF

image-20240808165937872

模型架构和 Coca 的思路类似,但是 Coca 是从头开始预训练,ALBEF 直接使用的预训练模型。

11. Simsam

image-20240808171045221