ALBEF in details
参考
https://zhuanlan.zhihu.com/p/619501914
经验主义
传统图文模型(如 UNITER)是“先融合后对齐”的:先将图文输入一个 Transformer,然后再训练模型学习它们之间的关系。
ALBEF 的不同之处是:
- 先将图文分别编码并对齐(使用对比学习)
- 然后再送入融合模块进行更复杂的理解任务(如问答、图文匹配等)
🧱 模型架构:三部分组成
ALBEF 总体上包含三个主要模块:
1. Vision Encoder(视觉编码器)
- 通常是一个预训练的 ViT(Vision Transformer)。
- 输出图像的 patch token 表示。
2. Text Encoder(文本编码器)
- 一个 BERT 结构的 Transformer。
- 用于编码输入文本(例如 captions、questions)。
3. Multimodal Fusion Encoder(多模态融合编码器)
- 一个 transformer,用于在视觉特征和文本特征之间建立更深层的交互。
🎯 预训练目标(Pretraining Objectives)
ALBEF 一共使用了 三个主要的预训练任务:
1. 📌 图文对比学习(Image-Text Contrastive Loss, ITC)
- 对每对图文(image-text pair),希望:
- 正确配对的图文对距离更近(embedding 更相似)
- 错误配对的图文对距离更远
- 损失函数:NT-Xent(normalized temperature-scaled cross entropy)
- 输入:图像通过 Vision Encoder → 图像 embedding 文本通过 Text Encoder → 文本 embedding 用 Cosine Similarity 进行比较。
这一步是为了“先对齐”:让图像与其对应的文字在 embedding 空间中靠得更近。
2. 🧩 图文匹配任务(Image-Text Matching, ITM)
- 判断一对 image-text 是否匹配。
- 在 contrastive 训练的基础上,加入 harder negatives(通过 similarity 选出来的不匹配文本),增强区分能力。
- 输入图文先经过各自 encoder,然后送入融合 encoder,再进行二分类(match or not)。
作用:加强跨模态理解,提升对语义错配的敏感性。
3. ✍️ 遮挡语言建模(Masked Language Modeling, MLM)
- 和 BERT 一样,遮挡一部分文本 token,要求模型填空。
- 但不同的是,MLM 在图文融合的上下文中进行 —— 即输入是图像和 masked 的文本,输出是被遮挡词的预测。
作用:让模型理解图像信息在语言中的作用,学会图文联合建模。
🔁 全体流程总结图
1
2
3
4
5
6
rustCopyEditImage --> Vision Encoder ----> ITC loss
\
--> Multimodal Encoder --> ITM loss
Text --> Text Encoder ------> ITC loss
\
--> Multimodal Encoder --> MLM loss
总损失函数
将三个损失加权求和:
1
L_total = λ₁ * L_itc + λ₂ * L_itm + λ₃ * L_mlm
通常:
L_itc
帮助对齐图文语义空间L_itm
帮助理解图文关系(真匹配 vs 假匹配)L_mlm
提升文本建模能力、联动图像上下文
⚙️ 训练机制中的特殊设计
🔄 Momentum Distillation(动量蒸馏)
- ALBEF 使用了类似 MoCo 的 动量编码器:
- 图像和文本各自有一套 encoder
- 为了生成稳定的对比学习样本,encoder 参数使用动量更新(而不是直接梯度)
- 好处是可以从一个大 batch 中构造更多负样本,提升对比学习效果。
🔹 动量 encoder 到底计算什么?
✅ 答案:
动量 encoder 计算的是“用于对比学习的目标 embedding”。
换句话说,它提供了一个 稳定的嵌入空间,我们用这个空间里的向量(图像或文本)作为对比学习的“锚点”或者“目标”。
📌具体来说:
假设你当前有一个图文对 (I₁, T₁)
:
模型 | 图像输出 | 文本输出 | 说明 |
---|---|---|---|
主模型 | f₁ | g₁ | 参与训练、梯度反传 |
动量 encoder | f₁⁺ | g₁⁺ | 只用于生成目标向量,不更新参数 |
我们不会让 f₁
和 g₁
之间对比(因为两个都在变),而是会让:
sim(f1,g1+)sim(f₁, g₁⁺)
或者
sim(g1,f1+)sim(g₁, f₁⁺)
进行对比,作为学习目标。
🚀 总结一句话:
动量 encoder 的输出作为对比学习中的“教师目标”,其嵌入更稳定,不参与反向传播,仅用来构造损失函数。
🔹2. 正负样本怎么选?
✅ 答案:
正样本:同一个图文对(I₁, T₁) 负样本:同一个 batch 中其他的图文错配对(I₁, T₂ / T₃ …)
👀 举个例子:batch size = 3
你有三个图文对:
1
2
3
I₁ - T₁ ✅ 正样本
I₂ - T₂ ✅ 正样本
I₃ - T₃ ✅ 正样本
我们对每一个 anchor 向量(比如图像 f₁
),构建一个 softmax 分母里的多个比较项:
- 正样本:与
g₁⁺
(T₁ 的动量表示)对比 → 希望它的相似度高 - 负样本:与
g₂⁺
,g₃⁺
对比 → 希望它的相似度低
🧠 为什么选错配作为负样本?
因为我们希望训练模型能学会区分什么是语义正确的图文配对,什么是错配的干扰项。
🔹3. 为什么不直接用主模型对比?(即 f_i vs g_i)
✅ 答案:
因为主模型在训练中参数不断更新,每个 batch 的嵌入空间在跳变,构建稳定对比目标会非常困难。
❌ 如果直接用主模型构建 ITC,会导致什么问题?
- 训练不稳定:
f_i
和g_i
在每一步都在变,softmax 分布难以稳定。- 负样本的表示也在跳,梯度很难收敛。
- 难以构造 hard negatives:
- 比如
g₂
和g₃
可能突然变得太相似于g₁
,影响训练信号。
- 比如
✅ 使用动量 encoder 的好处:
项目 | 主模型 vs 主模型 | 主模型 vs 动量模型 |
---|---|---|
训练稳定性 | ❌ 经常震荡 | ✅ 平稳目标嵌入 |
负样本表示 | ❌ 一直变 | ✅ 稳定、可累计 |
蒸馏效果 | ❌ 没有目标 | ✅ 主模型向教师靠近 |
这与 MoCo(Momentum Contrast)和 BYOL 的设计思想是一致的:
“学生模型通过与动量教师学习一个稳定的目标空间”。
✅ 最终总结图解(可参考全体流程总截图)
1
2
3
4
5
6
7
8
主模型 动量模型(不更新)
---------- -------------------
图像 --> f_i ←对比→ g_i⁺ <-- 图像
文本 --> g_i ←对比→ f_i⁺ <-- 文本
同 batch 中其他图文对作为负样本:
f₁ ←→ g₂⁺
f₁ ←→ g₃⁺
所以:
- 正样本:当前图文对自身
- 负样本:当前 batch 其他图文错配
- 对比构造:主模型输出 vs 动量模型输出