CLIP是入门多模态的最佳选择,后续多模态模型基本上都延续了它的思想:分别用图像编码器和文本编码器将图像和文本编码到一个共享的特征空间中,然后通过多模态融合方法将配对的图像文本特征向量拉进。
[1] 给定
↳ 一个包含3个文本-图像对的小批量数据(OpenAI 使用了4亿个文本-图像对来训练其原始CLIP模型)。
处理第一个对:"big table"
[2] 🟪 文本 → 2个向量(3维向量)
↳ 使用word2vec查找词嵌入向量。(word2vec可以使用Google提供的预训练模型)
[3] 🟩 图像 → 2个向量(4维向量)
↳ 将图像分成两个块。
↳ 将每个块展平
[4] 处理其他对
↳ 重复步骤 [2]-[3]
[5] 🟪 文本编码器 & 🟩 图像编码器(红框内的编码器参数通过训练得到)
↳ 将输入向量编码为特征向量
↳ 在这里,两个编码器都是简单的单层感知器(线性 + ReLU)
↳ 实际中,编码器通常是Transformer模型。
[6] 🟪 🟩 均值池化: 2 → 1 个向量
↳ 通过对列进行平均,将2个特征向量平均为一个向量
↳ 目标是用一个向量来表示每个图像或文本
[7] 🟪 🟩 -> 🟨 投影(投影矩阵通过训练得到)
↳ 注意,编码器输出的文本和图像特征向量维度不同(3维向量 vs. 4维向量)。
↳ 使用线性层将图像和文本向量投影到一个2D共享嵌入空间。
🏋️ 对比预训练 🏋️
[8] 准备矩阵乘法
↳ 复制文本向量(T1,T2,T3)
↳ 复制图像向量的转置(I1,I2,I3)
↳ 它们都位于2D共享嵌入空间中。
[9] 🟦 矩阵乘法
↳ 将T和I矩阵相乘。
↳ 这相当于计算每对图像和文本向量之间的点积。
↳ 目的是使用点积来估计图像-文本对之间的相似度。
[10] 🟦 Softmax: e^x
↳ 将e提升为每个单元格中的数的幂
↳ 为简化手动计算,我们将e^□ 近似为3^□。
[11] 🟦 Softmax: ∑
↳ 为 🟩 图像→🟪 文本 求每行之和
↳ 为 🟪 文本→ 🟩 图像 求每列之和
[12] 🟦 Softmax: 1 / 总和
↳ 将每个元素除以列总和,以获得 🟪 文本→🟩 图像 的相似度矩阵
↳ 将每个元素除以行总和,以获得 🟩 图像→🟪 文本 的相似度矩阵
[13] 🟥 损失梯度
↳ 相似度矩阵的“目标”是单位矩阵。
↳ 为什么?如果I和T来自同一个对(i=j),我们希望最高值为1,否则为0。
↳ 使用简单的[相似度 - 目标]公式来计算双向梯度。
↳ 为什么这么简单?因为当Softmax和交叉熵损失一起使用时,数学计算会神奇地如此简化。
↳ 这些梯度启动了反向传播过程,以更新编码器和投影层的权重和偏置(红色边框)。
CLIP简单的融合方法使其非常适合检索任务,而不适合生成任务,后续的一些模型为了提升融合效果,常采用Transformer编码器作为融合模块,为了具备图生文本的能力,后续模型也都增加了Transformer解码器;或者为了提升效率,则干脆直接使用训练好的大模型作为编解码器,然后使用一个适配器作为衔接。
多模态模型:
CLIP
ViLT
ALBEF
VLMO
BeiT v3
BLIP
CoCa
Flamingo
BLIP-2
IMAGEBIND
Meta-Transformer