Post

ALBEF in details

ALBEF in details

参考

https://zhuanlan.zhihu.com/p/619501914

经验主义

pc

  • 融合编码器不能太简单
  • 图像编码器要比文本编码器大一些

    🔧 ALBEF 的核心思想:Align Before Fuse

传统图文模型(如 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 的文本,输出是被遮挡词的预测。

作用:让模型理解图像信息在语言中的作用,学会图文联合建模。


🔁 全体流程总结图

pc

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₁参与训练、梯度反传
动量 encoderf₁⁺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,会导致什么问题?

  1. 训练不稳定
    • f_ig_i 在每一步都在变,softmax 分布难以稳定。
    • 负样本的表示也在跳,梯度很难收敛。
  2. 难以构造 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 动量模型输出
This post is licensed under CC BY 4.0 by the author.