# VIT(transformer 用于图片的良好案例)

将 transform 思想运用于视觉问题

# 核心

  • 将图片切为 patch,对应 token
  • 增加可学习的位置编码
  • 头部增加 token,类似 cls,用于分类

# 关于结果

  • patch size 越小,序列越长,效果越好

  • 数据集越大,效果越好

  • 比 resnet 快!成本低节省算力

# 关于 embedding

  • 用 1024 个卷积核为每个 patch 卷积

由于 cnn 操作本身就会带来归纳偏置,及:

  1. 局部性
  2. 平移不变性

所以 VIT 比 resnet 学的慢

# CLIP(图文匹配,首次将图文两个模态良好结合)

训练一个模型对任意类别预测,不用人工标注

使用 image encoder 和 text encoder,然后 分别经过一个线性投影层 ,对特征 L2 正则化,最后将两个向量对齐(计算 cos)

使用图文配对任务训练,使用一个类似交叉熵的 Loss

# 关于 image encoder

  • 模型深度、宽度,图像分别率同时增加计算量更好,不要光增加一个维度

# 关于推理

  • nlp 生成 label text

image-20251224130210820

  • prompt ensembling,多个 label 模板分别计算相似度,最后取平均

image-20251224130413087

# MOCO(前置技能,对比学习 & 动量思想)

# 对比学习

为了使用无监督学习,对比学习是一种很有效的方式,尽量拉开特征的距离,模型就学到了知识

对比学习的核心思想:使用正例对、负例对学习样本的特征表示

因为构造方法简单,所以无监督,成本低


MOCO 的要点是

  1. batch 尽量大;防止不同 batch 把不同类别的 feature 放在同一特征空间位置
  2. 然而显存有限,batch 不可能无限大,那我们可以把过去的 feature 存下来,用于后续每一轮进行负例对学习,但是每轮参数更新后模型会改变,原先生成的 feature 也会改变、过时

综上,如果希望效果好,我需要

  • 负例尽可能多
  • 负例尽可能一致

于是我们引入动量模型

# 核心

  • 使用 EMA 作为动量模型(教师模型),用来生成 key

  • 损失函数为 InfoNCE

  • 使用温度系数,温度高 softmax 后越平均;温度低 softmax 后越差异

# ALBEF(预训练、理解)

根据前人工作,我们总结了多模态理想框架的要求:

  1. 图像、文本应该分别先编码
  2. 图像编码器的参数量应该比文本大,因为 token 附带更多语义
  3. 融合编码器不能太简单

# 核心

image-20251224173218321

  1. 对于 encoder 获取的特征,先使用 clip 思想对齐;具体做法时,两个 encoder 工作前都会为数据序列开头加一个 [cls] ,以表示全局特征
  2. 使用 moco 思想,用动量模型生成负例,进行对比学习(特征对齐损失 ITC)
  3. 用难负例(相似度最高的负例对)进行 图片文本比配任务 (ITM)
  4. 引入 带掩码的语言模型任务 (MLM)

# 动量蒸馏

有时训练数据的 label 不一定最合适,所以不光考虑采集数据中的 label,更考虑动量模型的结果,即把动量模型看作教师模型

即对 ITC 和 MLM 引入 KL 散度计算 Loss

# BLIP(初步多模态生成)

  1. 又检索(encoder)又生成
  2. 解决图文对数据的质量问题(噪声)

# 核心

image-20251224174803404

  • label smoothing,答案是土豆,但是也可以是马铃薯,可以是洋芋;用 α\alpha 探索,让答案不那么唯一

image-20251224175240846

  • captioner 生成、filter 判断,两个模型对抗,用更好的数据结果重新训练一遍
  • h 是人工标注的好数据,w 是网络中的有噪音数据

# Flamingo(图文混排、利用预训练好的模型)

few-shot 模型

利用已有视觉模型与大语言模型

# 核心

image-20251224205747396

  • 通过 perceiver resampler,将视觉 encoder 的结果作为 kv 喂给 cross attention,最后输出长度为 64 的视觉 token

image-20260604233242299

注意:此处的 cross attention:

# x: 可学习的隐变量 (Latents),形状为 [R, d],作为 Query
# x_f: 注入了时间编码并展平的视觉特征,形状为 [T*S, d]
x = x + attention(q=x, kv=concat([x_f, x]))

一步到位(融合 Self-Attention 与 Cross-Attention)

  • 用 tanh gating 的 decoder 逐渐从 0 给文本生成器注入视觉信息
  • Loss 就是预测 token 的交叉熵函数

Flamingo 答完题之后,怎么判断它答得好不好?要看题目是哪种类型

第一种:开放题(让它自由作答)
比如给张图问 "图里在干嘛?",它得自己组织语言说一句话。这种就像问答题 / 作文题,没法只看对错,得有个评分标准去打分。

第二种:选择题(答案就那几个选项)
比如答案只能从 A/B/C/D 里选。这种情况下 Flamingo 不自己写答案,而是把每个选项都试一遍,看自己对哪个选项 "最有把握",就选那个。

那 "最有把握" 怎么衡量?模型内部对任何一句话都能算出一个 "这句话有多顺、多像该出现的话" 的分数(其实就是它训练时一直在算的那个概率)。哪个选项分数高,就选哪个。这就是所谓的 "评分函数"—— 其实就是模型自己的 "觉得顺不顺" 的概率。

一句话:选择题用模型自己的 "信心分" 挑答案;问答题用外部的评分标准给作文打分。

# BLIP2(利用已有预训练模型,先对齐再生成)

# 对齐阶段(ITC+ITM+ITG)

image-20251224210439116

  • 融合编码器直接用 bert,cross attention 随机初始化

  • 因为参数量小,batch 大,就不用动量模型了

  • 图像编码器使用 VIT,但是删了一层 transformer

  • 第一阶段的 ITG(Image-Text Generation)目的在于 “逼迫” Q-Former 提取有用的视觉特征,而不是为了得到一个强大的文本生成器。

# 生成阶段

image-20260605015436944

# LLaVA(强 SFT 数据 + 简单结构 = 奇迹)

# LLaVA 1

  • 用 GPT4 构建 SFT 数据:

image-20260605131740298

image-20260605131827533

  • 最简单的网络结构

image-20260605131930631

  • 两阶段训练
  1. 特征对齐的预训练

冻结视觉编码器和 LLM,仅训练线性投影层。

CC3M 数据集筛选至 595K 对图像 - 文本对。

简单描述图片问答。

  1. 端到端微调

冻结视觉编码器,训练线性投影层和 LLM。

GPT4 生成的 158K 视觉指令跟随数据。

# LLaVA 1.5

  • 模型结构微改,投影层的一层 MLP 改两层

image-20260605132248241

  • 使用更多训练数据,训练数据总量从初代的 158K 扩展到了 665K,特别引入了面向学术任务的 VQA 数据(如 VQAv2、GQA 等);并在不同测试数据集(不同任务)上用不同 prompt

  • 提升分辨率

image-20260605132641025

作者的思考:

  1. 多模态的幻觉问题可以通过提高图片分辨率大大缓解
  2. 多模态大模型可以组合分项能力,不需要你构建融合各种能力的训练数据

# LLaVA-NeXT

更高图像分辨率,更高质量的用户指令数据,更大的 LLM

分为 7B、13B、34B

# LLaMA 3.2

# 复杂的图片编码器

先建立直觉:只用普通 ViT 的位置编码是不够的。因为 4 个 tile 如果共用同一套 "patch 在 tile 内的位置编码",那么 Tile0 的 p0 和 Tile3 的 p0 看起来一模一样,模型就分不清 "这块到底是大图的左上还是右下"。所以要分两个层级:

编码 回答的问题 依赖什么
Token (patch) 位置编码 "我是 tile 内部的第几个 patch?" token 序号 i
Tile 位置编码 "我这个 tile 在大图里排第几(左上 / 右上 /…)?" tile 序号 t + 布局 id

而 Tile 位置编码又分 pre(进 Transformer 前)post(出 Transformer 后) 两次加,目的是前后都强化 "块间相对位置" 这个信息。


一个 batch 里:

  • 图 A 是 2×2 → 4 个 tile
  • 图 B 是 1×2(瘦长图)→ 只有 2 个 tile

但张量必须对齐成同样形状,所以统一 padding 到 max_num_tiles = 4 。图 B 就被补上 2 个全是 0 的假 tile

图B 真实: [Tile0, Tile1]
padding后: [Tile0, Tile1, (pad), (pad)]
有效标记:  [  1  ,   1  ,   0  ,   0 ]   ← 这就是 aspect_ratio_mask

注意力是 "跨 tile 全局" 的,为了防止模型 "注意" 那两个 padding 假 tile 的垃圾内容,污染结果。所以要 mask。在 attention 时,把 padding 位置写 -\infty

image-20260605135405466

  1. 进编码器前要加 Tile 位置编码 P(tanh 门控,一个 tile 一个)
  2. 然后加 cls,然后加 Token(patch) 位置编码(E 和 T,其中 E 只看 token 序号;T 每个 tile、每个 token 位置一套;两者互补门控,系数和为 1)
  3. 在编码器的 attention 中用 mask 控制注意力位置
  4. 进局部编码器(32 层的那个)出来的 hidden state,再 tile 位置编码 P(另一个门控),然后进全局编码器(最后 8 层)

# 对齐 & 后续 LLM

  • 把视觉特征喂给一个简单的线性投影,然后 cross attention,作为 KV

  • 和 Flamingo 一样,每个 token 只能看到上一张图(或者没有图)

总访问量:加载中...更新于

谢谢你请我喝[茶]!(๑OvO๑)♪

柳小寒寒子 微信支付

微信支付