CoOp
通过可学习提示向量实现 CLIP 模型的参数高效微调,仅需少量数据即可适配新任务
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
通过可学习提示向量实现 CLIP 模型的参数高效微调,仅需少量数据即可适配新任务
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
你有没有遇到过这样的困扰:手里的 CLIP 大模型明明能力很强,但用它来处理一张新的图片分类任务时,光是设计合适的文本提示词(Prompt)就让人绞尽脑汁。写 'a photo of a [CLASS]' 效果一般,换成 'a picture of a [CLASS]' 又未必更好,而且同一个提示词在 ImageNet 上好使,换到医疗影像上可能完全失效。
这就是 CoOp 要解决的核心问题——用机器学习的方式,让模型自己学会「该问什么」,而不是靠人工反复试错。
CoOp 的全称是 Context Optimization(上下文优化),由南洋理工大学 S-Lab 团队(Kaiyang Zhou 等)于 2021 年提出,发表在 IJCV 2022 和 CVPR 2022 上,至今已获得超过 2200 颗 GitHub 星标。
CoOp 源于一个观察:CLIP、ALIGN 等视觉语言模型在预训练时依赖海量的图像-文本对,其中文本提示词(Prompt)是引导模型理解图像的关键。但在将模型迁移到特定下游任务时,人工设计 Prompt 本质上是一种离散优化——你只能从无限多种表述方式中枚举尝试,且缺乏理论保证。
传统方法用 'a photo of a [CLASS]' 这样的硬编码提示词,CoOp 的核心创新是将提示词从离散文本空间迁移到连续向量空间——模型不再输出「photo」或「picture」这样的词,而是学习一组可优化的连续向量(称为 Context Vectors),直接输入到 CLIP 的文本编码器中。
CoOp 的方法可以概括为两步:
第一步:冻结视觉编码器,只训练文本侧。 CLIP 的图像分支(Visual Encoder)保持冻结,因为它已经学到了强大的视觉特征。真正要适应新任务的,是 CLIP 的文本侧(Text Encoder)。
第二步:用 M 个可学习向量替代离散的文本 Token。 在原始 CLIP 中,输入文本被 Tokenizer 成离散的词元(Token)。CoOp 的做法是:用 M 个维度为 D 的连续向量(记作 c=[c1, ..., cM])直接替代文本 Embedding 的对应位置。这 M 个向量通过反向传播自动优化,目标是最小化下游任务的分类损失。
在实验中,M=16(即 16 个可学习向量)的 CoOp 就能在 11 个数据集上平均提升 CLIP 准确率 2-3 个百分点,个别数据集提升超过 10 个百分点。更重要的是,CoOp 在 few-shot 场景(每类仅 1-16 张训练图)下表现尤为突出,这正是它相对于全量微调的显著优势——只需极少的训练样本,就能实现有效的任务迁移。
CoOp 还提出了一个可选设计:Class-Specific Context(CSC),即每个类别学习独立的 Context 向量。这在某些任务上可以进一步提升准确率,但参数量也会相应增加。
CoOp 的代码库构建于 Dassl.pytorch 框架之上,这是一个专门为迁移学习设计的 PyTorch 训练框架。整体代码结构清晰,主要模块如下:
| 模块 | 说明 |
|---|---|
train.py | 入口脚本,支持多参数配置(数据集、backbone、训练轮次等) |
trainers/coop.py | CoOp 核心 Trainer,定义连续提示的 forward hook |
trainers/cocoop.py | CoCoOp(Conditional CoOp)Trainer,扩展为图片条件化提示 |
trainers/zsclip.py | Zero-shot CLIP 基线(用于对比) |
datasets/ | 11 个标准数据集的数据加载器(ImageNet 及其变体、Caltech101 等) |
configs/ | YACS 格式的配置文件,支持 RN50、RN101、ViT-B/16、ViT-B/32 等多种 Backbone |
scripts/coop/main.sh | 主流训练脚本封装,包含 6 个核心参数 |
核心配置项包括:
N_CTX:Context 向量数量(默认 16),M 值越大表达能力越强,但过拟合风险也越高CSC:是否启用 Class-Specific Context(默认 False)PREC:精度模式,支持 fp16/fp32/amp(默认 fp16 加速训练)CLASS_TOKEN_POSITION:Context 向量与 [CLASS] Token 的相对位置,支持 end(前拼接)、middle(中拼接)、front(后拼接)以 Caltech101 数据集为例,运行 1-shot CoOp 训练的命令为:
bash scripts/coop/main.sh caltech101 rn50_ep50 end 16 1 False
这条命令使用 RN50 作为 Backbone,在文本末端拼接 16 个 Context 向量,每类仅用 1 张训练图。
主要优势:
参数效率极高:整个适应过程只优化 Context 向量(参数量仅 16 x 512 = 8K),相比整个 CLIP 模型(数百亿参数)微调成本极低。
Few-shot 适应能力突出:在每类仅 1-2 张图的极端少样本场景下,CoOp 仍能稳定收敛并超越 Zero-shot CLIP。
泛化到未见类别:后续工作 CoCoOp 在 CoOp 基础上加入了图片条件化机制,进一步提升了从基类(Base Classes)泛化到新类(Novel Classes)的能力。
主要局限:
对 CLIP 架构的强依赖:CoOp 本质上是对 CLIP 文本分支的微调,理论上可以迁移到其他视觉-语言模型,但实际效果未经充分验证。
超参数敏感性:Context 向量数量 M 的选择对最终效果有显著影响,不同任务的最优 M 值差异较大,需要调参。
缺少端到端优化:图像编码器完全冻结,无法利用下游任务的视觉信号来调整视觉特征,这也是后续工作重点改进的方向。
CoOp 提出了 Prompt Learning 在计算机视觉领域的第一个系统性框架,催生了大量后续研究:
据 Google Scholar 统计,CoOp 原论文(arXiv:2109.01134)已被引用超过 5000 次,是视觉-语言模型适应领域的基础性工作。
该项目作者 Kaiyang Zhou 现为香港浸会大学计算机系助理教授,其个人主页可见其持续活跃于多模态大模型研究领域。

图1:CoOp 作者 Kaiyang Zhou(香港浸会大学助理教授)
总结:CoOp 将自然语言处理领域的 Prompt Tuning 思想引入计算机视觉,通过将离散文本提示词转换为可学习的连续向量,实现了 CLIP 等视觉语言模型的高效任务适应。它不仅是一个有影响力的学术工作,更为后续多模态大模型的高效微调研究奠定了方法论基础。