1 Intro
- 目前最先进的CV模型,大部分是现有一个定义好的类别的集合,然后模型通过预测这些提前定义好的类别,从而完成模型的训练
-
这些提前定义好的类别会大大简化问题本身
-
但采用了这种有限制性的监督信号,也大大限制了模型的泛化性(尤其是识别新物体时)
-
——>直接从自然语言(文本)里面得到一些监督信号,是一个promising的方向
-
这个监督信号涵盖的范围就很广,只要是语言描述过的物体,就有可能让视觉模型识别这个物体,而不是之前事先定义好的类
-
-
-
直接从原始文本数据去预训练一个模型,已经在NLP领域取得了成功(bert、gpt)
-
不论是掩码,还是完形填空,都是一种自监督的方式
-
目标函数和下游任务无关,只通过预训练得到非常泛化的特征
-
-
随着计算资源、计算数据的增多、模型的变大,模型的能力在稳健地提升
-
面对下游任务的时候,不用费尽心思去研究一个输出头,直接zero-shot即可
-
——>这些结论说明了文本进文本出,利用自监督的信号去训练整个模型的框架下,这种大规模的没有标注的数据,是要比手工标注的、质量更好的数据集好使
-
- CLIP的思路是:
-
用一个非常简单的预训练任务,就可以非常高效、可扩展地学习图像表征
-
给定一张图片+给定一些句子,模型判断哪个句子和图片是配对的(训练样本是图片-文字对)
-
预训练完成后,自然语言被用来去引导视觉模型做物体的分类(prompt)
-
分类任务可以扩展到新的类别(可以在下游任务上直接做zero-shot 的推理)
-
不需要任何数据集专门训练的情况下,和之前完全用有监督方式训练的模型打平手(甚至更高)
-
2 CLIP
- 对比学习预训练
- CLIP预训练的过程中使用的是图片-文本对
- 正样本:配对的文本对(特征矩阵对角线上的是正样本,其他的是负样本)
- CLIP预训练的过程中使用的是图片-文本对
- zero-shot的推理
- 直接用单词抽取特征也行,为什么要prompt template呢?
- 预训练的时候,图片每次看到的都是一个句子,如果推理的时候把文本从句子都变成了单词,那就和训练的时候看到的文本不太一样了,效果就会有下降(一个原因是distribution gap)
-
怎么从分类的单词变成句子?
-
prompt engineering /prompt esemble 这两种方式进一步提高模型的准确率
-
- 推理的时候不论来了什么照片,只要把照片扔给预训练好的图片编码器即可
- 图片的特征和文本的特征做cos 相似性
- 和哪个文本特征最相似,文本特征对应的句子挑出来,完成分类任务
- zeroshot的方式,即使不在imagenet中的图片/类,也可以分类出来
- 之前严格按照1000类去训练的分类头,模型永远不会判断出之前类没有的类
- 比如,“三轮车”是没有的类,之前的方法可能智能识别出“车”or“自行车”
- 之前严格按照1000类去训练的分类头,模型永远不会判断出之前类没有的类
- ——>训练还是推理的时候,都不需要提前定好的标签列表
- 直接用单词抽取特征也行,为什么要prompt template呢?
2.1 NLP监督
- 方法核心——利用自然语言的监督信号去训练视觉模型
- 之前nlp使用ngram和topic model的方式,不是很好学习
- 随着transformer、自监督训练方式的出现,NLP的模型逐渐变得又大又好、泛化的也越来越好
- ——>为多模态训练铺平道路
- 为什么用自然语言的信号去训练视觉模型?
- 1 不需要标注数据
- ImageNet 需要先定好1000个类,下载照片,清理数据集,标注。。。
- 使用图片-文本对的话, 数据规模扩大
- 监督信号是文本,而不是标签,模型的输入输出自由度大很多
- 2 训练的时候图片和文字绑定在一起,特征不在仅仅是图片特征了,而是图片+文字特征(多模态特征)
- 很容易做zero-shot的迁移学习
- 如果是只用单模态、视觉的特征学习(比如mae),只能学到视觉得特征,无法和自然语言联系在一起,很难做zero-shot的迁移
- 1 不需要标注数据
2.2 建立数据集
- 之前标注质量好的数据集——>规模太小
- 大的数据集——>标注质量差
——> 论文收集了400million 图片-文本对(4亿的样本)
2.3 选定预训练方法
- 为什么选择对比学习进行预训练?
- 给定一张图片,如果目标是预测对应的文本
- 1)需要逐字逐句预测问题,这就太难了。
- 2)对于一张图片来说,有不同的描述方式——》歧义性
- 给定一张图片,如果目标是预测对应的文本
- 如果把任务变成一个对比学习任务(判断文本和图片是否配对)
- 任务就简单很多了
- 约束也就放松很多了
- 根据论文中的实验,仅仅把预测性的目标函数变成对比性的目标函数,训练效率以下提高了四倍
2.4 CLIP 伪代码
2.5 Prompt
- 为什么使用Prompting(用句子而不是单词进行文本embedding)
- 多义性问题:
- 一个单词很多含义,如果只用标签的一个单词,就有可能面临这个问题
- 比如boxer,是拳击手还是狗?
- 预训练的时候,图片每次看到的都是一个句子,如果推理的时候把文本从句子都变成了单词,那就和训练的时候看到的文本不太一样了,效果就会有下降(一个原因是distribution gap)
- 多义性问题:
- prompt ensemble
-
加很多上下文的修饰,将他们做多次推理,将结果 综合起来
-
-