CLIP论文详解

2023-11-05

CLIP论文详解 – 潘登同学的深度学习笔记

前言

CLIP算是在跨模态训练无监督中的开创性工作,作者在开头梳理了现在vision上的训练方式,从有监督的训练,到弱监督训练,再到最终的无监督训练。这样训练的好处在于可以避免的有监督的 categorical label的限制,具有zero-shot性质,极大的提升了模型的实用性能。

  • zero-shot:是指零样本学习,在别的数据集上学习好了,直接迁移做分类;

这篇文章中作者提到早在2017年之后就陆续有工作提出和本文类似的想法,但是他们的数据大小都太小了,导致没有很好的结果。作者单独收集了一份含有4亿份数据的大数据集,才得以得到很好的效果。这种现象最近好像在机器学习领域越来越突出,力大砖飞,这无疑降低了benchmark的可信性,而且增加了小工作组的压力。

此外作者提到prompt engineering and ensembling也是一个值得研究的方向,也就是生成的template如果能够结合对应的dataset的特征,相当于给予模型额外的信息;

为什么CLIP要采用对比学习的方法

  • OpenAI是一家从来不愁计算资源的公司,他们喜欢将一切都gpt化(就是做生成式模型);
  • 但是以往的工作表明(ResNeXt101-32x48d, Noisy Student EfficientNet-L2),训练资源往往需要很多,何况这些都只是在ImageNet上的结果,只是1000类的分类任务,而CLIP要做的是开发世界的视觉识别任务,所以训练的效率对于自监督的模型至关重要;
  • 而如果任务改为给定一张图片去预测一个文本(或者给定一个文本去预测一张图片),那么训练效率将会非常低下(因为一个图片可能对应很多种说法,一个文本也对应着很多种场景);
  • 所以与其做默写古诗词,不如做选择题!(只要判断哪一个文本与图片配对即可);
  • 通过从预测任务改为只预测某个单词到只选出配对的答案,模型的训练效率一下提升了4倍;

在这里插入图片描述

整体架构

在这里插入图片描述

  • 作者团队收集的4亿的图片文本对作为训练样本,称之为WIT(因为以往有的数据集要么是规模太小, MS-COCO,Visual Genome,要么是数据标注质量太差YFCC100M);
  • 在一个batch中输入32768个图片文本对, ( I 1 , T 1 ) (I_1,T_1) (I1,T1),则是第一个图像文本对,模型的目的是使这两个特征尽量相似,而与别的特征尽量远离;

Pre-train

训练阶段
在这里插入图片描述

  • 一个图片经过Image_encoder得到特征 I f I_f If,一个文本经过text_encoder得到特征 T f T_f Tf;
  • 两个特征分别经过不同的FC层(目的是将单模态的特征转化为多模态,因为图片的特征可能本身就与文本的不一致,需要转换,但是这里没接激活函数,因为作者发现在多模态下接不接都一样);
  • 再做一次L2归一化;
  • 计算余弦相似度,得到logits;
  • logits与GT计算交叉熵目标函数;
  • 而这里的GT就是一个单位阵(因为目标是配对样本之间相似性最强为1,而其他为0);
  • 最后将图片的loss与文本的loss加起来求平均即可;

主干模型

  • 在文本方面就是Transformer;
  • 在图像方面选择了5中ResNets(ResNet-50,ResNet-101,3个EfficientNet的变体,ResNet-50x4,ResNet-50x16,ResNet-50x64)和三种VIT(分贝是VIT-B/32,VIT-B/16,VIT-L/14)

Zero-shot

CLIP 文章的核心 = Zero-shot Transfer

作者研究迁移学习的动机:

  • 之前自监督or无监督的方法,主要研究 frature 学习的能力,model的目标是学习泛化性能好的特征,虽然学习到good-feature,但down-owrk中,还是需要有标签数据做微调。作者想仅训练一个model,在down-work中不再微调。
    推理阶段
    在这里插入图片描述

  • 将要做的分类以填空的形式填进一句话中,以ImageNet为例就是1000句话输入Text Encoder得到输出;

  • 将要识别的图片经过Image Encoder得到图片输出,比较文本的输出与图片的输出,选择最相似的那句话就是图片的类别;

与之前Zero-shot模型的对比
在这里插入图片描述

Prompt 方法在什么时候用

  • Prompt是提示的意思,对model进行微调和直接做推理时有效;

为什么要用 prompt engineering and ensembling

  • 由于一个word 具有多义性,图片和文字匹配容易出错,所以作者将word放在语境中,来提高匹配度;
  • Prompt不仅能做匹配;
  • 一旦加入这个prompt engineering and ensembling,准确度上升了1.3%;

最后在CLIP中,总共用了80个prompt template之多;

实验

大范围数据集结果

做了27个数据集的分类任务,baseline是ResNet-50,ResNet-50是有监督模型在各个数据集上训练好的, 然后两个模型在其他数据集上zero-shot;

在这里插入图片描述

在大多数分类任务,给车、食物等做分类的问题上CLIP都表现的很好, 但是在DTD这种纹理进行分类或CLEVRCounts给物体计数的任务,对于CLIP无监督模型来说就很难了;

所以作者认为在这些更难的数据集做few-shot可能比zero-shot更好;

few-shot与zero-shot的对比

few-shot也是将back-blone冻住,训练分类头;

在这里插入图片描述

横坐标是指在每个类别中选出了几个训练样本,纵坐标就是模型的准确率了(在20个数据集上的平均结果,因为有7个数据集中有些训练样本不足16个);

  • 因为别的模型不是多模态的,所以只能从1-shot开始;
  • 其中,BiT-M是google中bit transfer的一个模型,专门为迁移学习量身定做的,而zero-shot的CLIP直接与few-shot的BiT-M打成平手;
  • 而CLIP可以从zero-shot开始;
  • 可以看出当学习样本很少的时候CLIPfew-shot的表现还不如zero-shot;

Representation Learning

为了证明Pre-Train的成功,CLIP将预训练好的模型在下游任务中做了Linear probe,就是模型主体冻住,只调Linear分类头,因为这样不用太多的调参,也能证明模型的特征学的好不好;

在这里插入图片描述

  • 其中横坐标是一次前向过程的计算量,纵坐标是分类准确度;
  • 可以看出CLIP是在计算量与准确度方面trade-off做的最好的一个模型;

模型的泛化性

当数据有distribution shift的时候,模型的表现如何,这是CLIP最惊艳的结果:
在这里插入图片描述

  • 可以看出CLIP在数据分布的偏移样本上,远远超过ResNet101,而且结果保持地依旧稳健;

与人进行对比

将CLIP与人进行zero-shot,one-shot,two-shot的对比,分类的物体是37种狗和猫的图片;
在这里插入图片描述

  • 可以看出人在zero-shot与one-shot的差别是很大的,表明人学习的能力是很强的;
  • 但是人的one-shot与two-shot区别不大,说明了人在没有先验知识,只是通过样本学习,不一定能学的更好;

除此之外,作者还将这些类的分类结果列了出来
在这里插入图片描述

  • 可以看出在人判断准确率较高的类别上,机器的准确率也高;
  • 在人判断不准的类别上,机器判断也不准;
  • 说明人与机器学到的数据分布很接近;

局限性和不足

  • 平均来看,CLIIP可以和机械模型(ResNet-50(在ImageNet上训练))持平, 若继续增加数据集和model规模,CLIP性能可以继续提高,但是代价很大(需提高计算和数据的高效性;但与Noisy Student的88还是有很大差距;
  • zreo-shot结果并不好
    1. 在细分类数据集上,CLIP效果低于(有监督训练)ResNet-50(baseline网络);
    2. CLIP无法处理抽象概念,如数数任务,或者判断一个监控画面是正常还是异常;
    3. 在很多领域,CLIP性能和瞎猜差不多;
  • 若数据集中的data 已经 out-of-distribution,那么CLIP-model泛化照样差;(在MNIST数据集上,CLIP准确率仅有88%; 因为作者收集的数据集有4亿个样本,但没有和MINIS长得像的,所以MINIS数据集对于CLIP来说就是out-of-distribution数据集);
  • CLIP这个模型没什么大不了的,和普通的DL-model差不多,都很脆弱。
  • CLIP不能高效利用数据
    1. 训练了epoch = 32,每个epoch过4亿个图片,跑了128亿张图片,如果一秒一张需要405年;
    2. 数据用量多,作者希望减少数据用量,(三种方案: 数据增强,自监督,伪标签)
  • 用所有数据进行训练,调整很多次模型结构和超参数,才得出好结果,且每次用ImageNet数据集作为指导。所以CLIP并非做出真正的zero-shot工作。(选择偏差)
  • 爬取图片未清洗和审查(有社会偏见,OpenAI不开源经典借口)
  • 语言无法描述太复杂的概念

作者想要:

  • 把一切都GPT(生成式模型)化,因为CLIP还是根据给定的1000个选项去选择到底是那个类比,作者更像直接一张图片,然后生成对应的标题。但受限于计算资源,作者没法做成 ” 自动生成模型 “ 的网络。(以后的DALL)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CLIP论文详解 的相关文章

随机推荐

  • WSL2 使用 docker

    一 下载docker 这篇文章发布的时候正式版的docker 仍然不支持docker wsl 因此需要下载edge 版本 下载地址 https docs docker com docker for windows edge release
  • 献给Python初学者,零基础学习Python能学会吗?

    零基础 学习 Python 能学会吗 这个问题几乎是所有初学Python的小白都会问到的问题 其实Python是非常适合初学者入门的 相较于其他主流类编程语言 Python具有更好的可读性 因此上手更容易 而且即便你是零基础也一样能学会 零
  • 【深度学习】(二)神经网络:激活函数、MNIST

    感知机需要人为设定符合预期输入输出的权重 神经网络可以自动地从数据中心学习到合适的参数 质朴感知机 指单层网络 激活函数使用了阶跃函数的模型 多层感知机 指神经网络 使用平滑的激活函数的多层网络 激活函数 激活函数是将输入信号的总和转换为输
  • sql语句中not in 不好使的原因之一

    场景说明 查询某表中的某字段的值没有在另外一个表中对应的字段中出现过 比如现在有两个表 一个产品表product 一个优惠券批次表coupon coupon中的product code字段与product中的product code形成一对
  • 基于selenium实现UI自动化

    目录 一 Selenium简介 1 Selenium工具组件介绍 2 Selenium WebDriver 介绍及实现原理 二 Selenium WebDriver基于Python实现脚本 1 Selenium 环境安装 2 Seleniu
  • 将Vscode添加右键打开文件夹功能

    将Vscode添加右键打开文件夹功能 文章目录 将Vscode添加右键打开文件夹功能 前言 1 将Vscode添加右键打开文件夹功能 1 1 第一种方法 1 2 第二种方法 总结 前言 想要鼠标右击文件或者文件夹 可直接用VSCode打开
  • 探讨递归这个引人入胜的领域

    又回来念一念递归的经 编程之旅上有笔直的大路 也有盘一盘的递归 今天探讨递归是引人入胜的思想 递归也许是上帝做工的方式 函数调用自己则体现了内在统一的秩序 递归究竟是什么 每年我们都会长一岁 试试定义一个函数 deltaYear只做一件事情
  • 【PyQt5】connect时可以为槽函数传递参数的方法

    本文参考 PyQt5 为槽函数传递额外参数的方法 简书 如题 一般在使用connect时若在槽函数中添加参数 在运行时会报错 unexpected type NoneType 在csdn中搜了好久都没搜到解决方法 于是特意将方法搬到这里来
  • python——pickle模块的详解

    pickle模块详解 该pickle模块实现了用于序列化和反序列化Python对象结构的二进制协议 Pickling 是将Python对象层次结构转换为字节流的过程 unpickling 是反向操作 从而将字节流 来自二进制文件或类似字节的
  • vue展示json数据,vue-json-viewer的使用

    一 安装 yarn add vue json viewer 二 引入项目 src目录下plugins下的jsonViewer js文件 import Vue from vue import JsonViewer from vue json
  • springboot 集成druid 报错Communications link failure

    最近线上的定时任务出现一个问题 晚上12点执行的时候出现数据库连接失败 具体堆栈信息如下 2019 12 03 22 16 00 208 ERROR 24832 ryBean Worker 1 c a druid pool DruidPoo
  • Qt链接Mysql数据库

    方法一 直接通过MySQL的驱动加载数据库 1 在qt项目文件中加入sql 2 加入sql头文件 include
  • 图论1(Leetcode547.省份数量)

    答案 class Solution public int findCircleNum int isConnected int n isConnected length int arr new int n int ans 0 for int
  • Ubuntu Linux Host 用adb shell:error: insufficient permissions for device: user in plugdev group; are

    热插拔usb设备的文件的访问权限 简单解决 cd etc udev rules d sudo vim 50 android rules 在文件中添加一行 SUBSYSTEM usb ENV DEVTYPE usb device MODE 0
  • SbS001——VMware Workstations 14 安装与配置教程(Windows平台)

    一 介绍 VMware Workstation 是一款优秀的虚拟PC软件 利用VMware工作站 可以在现有的操作系统上虚拟出一个或多个新的硬件环境 相当于模拟出多台新的PC 以此来实现在一台机器上同时运行多个独立的操作系统 VMware
  • 【泛微ecology】两个下拉框字段选了A下拉框字段自动带出B下拉框字段对应位置数据

  • flutter技术解析与实战!史上最强vue总结来了,威力加强版

    背景 坐标广州 五年iOS开发经验 最近面试了一位工作12年的程序员 这位老哥有3年java开发经验 2年H5 7年iOS开发经验 简历上写着精通Java iOS 熟悉H5开发 没有具体的技术点 说实话我很期待这位老哥的面试 于是让人事邀约
  • 百分比问题,SQL给你答案(百分比计算)

    题目 下面有两张表 交易表 和 产品信息表 假如交易金额大于等于10万 认定为大单 统计产品ID 产品名称 大单数量 大单数量占比 解题思路 思路 先通过分解步骤一步步求出必要字段 再通过分解步骤 最后解决题目要求 即统计产品ID 产品名称
  • 机器学习之线性模型

    定义 线性模型非常常见 但详细了解其中原理是必要的 一般将样本特征进行线性组合达到预测的目标 如表达式 y f X W
  • CLIP论文详解

    CLIP论文详解 潘登同学的深度学习笔记 文章目录 CLIP论文详解 潘登同学的深度学习笔记 前言 整体架构 Pre train Zero shot 实验 大范围数据集结果 few shot与zero shot的对比 Representat