Learning Vision from Models Rivals Learning Vision from Data

Learning Vision from Models Rivals Learning Vision from Data

论文:https://arxiv.org/abs/2312.17742

TL; DR:只使用机造数据进行训练达到了与真实数据训练相当的效果。本文提出了 SynCLR。首先使用 LLM 来根据视觉概念词生成图像描述,再用文生图模型来生成来根据每个图像描述生成多张图像,这样就构造出了纯机造合成的数据集。然后在该数据集上,将同一个描述生成的图像视作正样本对,进行对比学习训练。模型性能与全部用真实数据的模型相当。

导言

在现如今的通用大模型时代,大规模且高质量的数据无疑是决定模型性能的关键。尤其是随着半监督/自监督学习的兴起,数据的规模动辄上亿。人工标注监督数据的方式已不可行,往往需要从网络上爬取一些弱监督数据(如图像文本对 -> CLIP),或者构建一些自监督任务(如实例判别 -> SimCLR、MoCo)。而网络数据的质量自监督任务的粒度又会限制模型的性能。如何组织高质量且带有合理粒度监督信号的数据称为一个关键问题

近两年,语言生成大模型(LLMs)和视觉生成模型(DIffusion Models)发展迅速。在图文领域生成式模型的高质量生成结果,使得机造数据称为一种可行的方案。本文提出了一种使用生成式模型机造数据,并进行训练的方法,称为 SynCLR。相比于以前的“从数据中学习”(learning from data)的范式,作者称这为“从模型中学习”(learning from models)。

在这里插入图片描述

使用模型机造数据的这种方式有一个很大的优势:我们可以通过控制隐变量、生成条件或者超参数,来控制生成出的数据。“生成条件”就是一种天然的监督信号。并且其监督粒度也可以随我们设置。

下图对比了自监督(SimCLR)、有监督和本文方法(SynCLR)监督信号粒度的对比。自监督方法认为每一张图片一个单独的类别,监督信号要求每一张图片的特征都要分开。这没有考虑到图中主体语义(狗)是相同的,监督粒度过于细。传统的有监督方法认为只要主体是狗的图片,都是同一类。这没有考虑到图像的其他细节、背景的语义会有很大的不同,监督粒度太粗。而本文方法是以一段自然语言的 “图像描述” 作为分类的依据,这样既保证了同一类内图片内容语义,又不会把类别分的太细,监督信号的粒度最合适。

在这里插入图片描述

方法

数据构造

本方法的目标是在不使用任何真实图像和文本数据的条件下,构造一个机造合成数据集,并使用图片描述作为分类别的监督信号,来训练一个图像编码器。本方法数据构造的过程中要用到三个关键资源:一个大语言模型 g 1 g_1 g1、一个文生图模型 g 2 g_2 g2、一个视觉概念列表 C C C

整个方法的数据构造和训练共三个步骤:

  1. 使用 g 1 g_1 g1 来生成一组图像描述 T T T。它涵盖了 C C C 中全部的视觉概念
  2. 对于 T T T 中的每个图像描述,使用 g 2 g_2 g2 生成多个多张图片。从而得到一个合成图像数据集 X X X
  3. X X X 上进行训练出一个视觉编码器 f f f

具体来说,本文使用的 g 1 g_1 g1 是 LLaMa 2 7B, g 2 g_2 g2 是 SD1.5。关于使用大语言模型,根据视觉概念词生成出图片描述的构造方式、prompt 等具体细节这里不再赘述,可参考原文。

下图是不同的图像描述生成的多张图像示例。

在这里插入图片描述

视觉表征学习

数据构造完成后,我们要以图片描述为粒度来进行视觉表征对比学习训练。训练的方法与 StableRep 类似。这里的一个关键点是我们的每个图片描述对应了多张生成图像,在训练时,他们彼此之间都是正样本。也就是说,我们这里的损失是一个多正例的对比学习损失。

其他的,还用到了很多对比学习表征训练的技巧:

  1. 掩码图像建模:预测掩码掉的图像块,来自 iBOT;
  2. Sinkhorn-Knopp 算法:替换掉 softmax-centering 方法,来自 DINO-ENT;
  3. EMA:动量更新编码器,来自 MoCo;
  4. Multi-crop:结合局部特征和全局特征,来自 SwAV;
  5. Projection-head:多接一个映射头,很多对比表征学习方法都用了,最早来自 SimCLR。

其他具体的视觉概念词、超参等设置参考原文。

实验

原文的消融和对比实验很详实,有兴趣可以去看。这里看一个最主要的结果,SynCLR 与其他方法在分类任务上的对比。可以看到,SynCLR 在平均结果上达到最高,但在 ImageNet 上比 DINO-V2 还是稍差一些。要注意,SynCLR 是完全没有用任何真实数据的。

在这里插入图片描述

总结

笔者最近一直在思考多模态的数据飞轮。图生文/文生图模型可以生成原始数据(可以加一些互联网真实数据),而 CLIP 又能过滤低质数据(可以加一些人工标注),高质量的数据又反过来可以用来训练图生文/文生图/CLIP模型,如此往复迭代,是否能实现数据质量和模型性能的共同提升呢?

这篇文章在机造生成数据作出了一些探索。没有用任何真实数据,仅凭生成模型机造数据,就达到了视觉表征学习 SOTA 的性能。虽然最终训练的目标不是 CLIP 类的图文相关性模型,但是还是从机造数据训练模型的角度给了多模态数据飞轮的很多参考。很有意义。

回想对比 OpenAI CLIP 用的 WIT400M 数据集的构建可以分为 1.收集 metaword 和 2.根据 metaword 从网络上爬取相关图片两步。本文则是机造 caption 和机造图片两步,本来爬虫干的活改成模型来干。

在多模态汇总,模型生成数据+模型过滤数据,其中有无信息增益,这个过程能否反复迭代,飞轮能否转起来,还需要更多的研究。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/623099.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WEB 3D技术 three.js 点光源

本文的话 我们来设置一下点光源 点光源其实最直观的就是可以做萤火虫 也可以做星光 点点的效果 我们可以直接在官网中搜索 Pointlight 大家可以在官网这里看一下 其实 SpotLight 聚关灯中的属性 Pointlight 点光源也有的 我们先编写代码如下 import ./style.css import * a…

Codeforces Round 768 (Div. 1) D. Flipping Range(思维题 等价类性质 dp)

题目 思路来源 官方题解 洛谷题解 题解 可操作的最短区间长度肯定是gcd,记为g,然后考虑如何dp 考虑g个等价类,每个等价类i,ig,i2*g,... 每次翻转长度为g的区间,会同时影响到g个等价类总的翻转的奇偶性, 性质一&…

SpringCloud.04.熔断器Hystrix( Spring Cloud Alibaba 熔断(Sentinel))

目录 熔断器概述 使用Sentinel工具 什么是Sentinel 微服务集成Sentinel 配置provider文件,在里面加入有关控制台的配置 实现一个接口的限流 基本概念 重要功能 Sentinel规则 流控规则 简单配置 配置流控模式 配置流控效果 降级规则 SentinelResource…

模拟器安装XPosed框架教程

Xposed框架下载(搞不懂就先看完本篇教程再下载) 99%的情况只需要下载里面的XPosed鸭就行了 安卓8及以下XPosed框架 - 多开鸭模拟器安装XPosed框架图文视频教程 关于本站XPosed框架的说明 XPosed框架(即XP框架),由rovo89开发。适用于安卓7以…

把模板作为元函数参数传递。

C模板元编程是一种典型的函数式编程,函数在整个编程体系中处于核心的地位。 这里的函数与一般C程序中定义的函数有所区别,其更接近数学意义上的函 数——是无副作用的映射或变换:在输入相同的前提下,多次调用同一个函数&…

Rsync远程同步,删除大量文件

目录 什么是文本传输? 文件传输工具: Rsync工具介绍 rsync的作用 命令格式 实验配置rsync源服务器 先检查是否有rsync工具 建立/etc/rsyncd.conf 配置文件 为备份账户创建数据文件 给数据文件添加权限 保证所有用户对源目录/var/www/html 都有读…

C练习——杨辉三角

题目: 打印近似杨辉三角,行数n自选 百度找的杨辉三角,参考一下: 解析: 把它的全部元素左对齐,就可以看成近似杨辉三角的样子 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 …… 每个数等于它上方两数…

CMake tasks.json launch.json

hehedalinux:~/Linux/cmake/cmakeClass$ tree . ├── CMakeLists.txt ├── include │ ├── Gun.h │ └── Soldier.h ├── main.cpp └── src├── Gun.cpp└── Soldier.cpp2 directories, 6 files hehedalinux:~/Linux/cmake/cmakeClass$ launch.json&am…

Flutter 小技巧之升级适配 Xcode15

美好的 2024 从「适配」开始,按照苹果的尿性,2024 春季开始大家将不得使用 Xcode15 来构建 App ,另外根据《2024 的 iOS 的隐私清单》 要求,使用 Flutter 的开发者是无法逃避适配 Xcode15 更新的命运。 另外,众所周知…

K 个一组翻转链表(链表反转,固定长度反转)(困难)

优质博文:IT-BLOG-CN 一、题目 给你链表的头节点head,每k个节点一组进行翻转,请你返回修改后的链表。 k是一个正整数,它的值小于或等于链表的长度。如果节点总数不是k的整数倍,那么请将最后剩余的节点保持原有顺序。…

优先级队列(Priority Queue)

文章目录 优先级队列(Priority Queue)实现方式基于数组实现基于堆实现方法实现offer(E value)poll()peek()isEmpty()isFull() 优先级队列的实现细节 优先级队列(Priority Queue) 优先级队列是一种特殊的队列,其中的元素…

Spring Boot - 利用Resilience4j-RateLimiter进行流量控制和服务降级

文章目录 Resilience4j概述Resilience4j官方地址Resilience4j-RateLimiter微服务演示Payment processorPOM配置文件ServiceController Payment servicePOMModelServiceRestConfigController配置验证 探究 Rate Limiting请求三次 ,观察等待15秒连续访问6次 Resilienc…

【Python小技巧】安装ImageMagick配置环境变量解决moviepy报错问题

文章目录 前言一、报错ImageMagick 找不到二、解决步骤1. 安装ImageMagick2. 配置IMAGEMAGICK_BINARY环境变量 总结 前言 抽空玩玩moviepy,结果合成视频时报错,看着网上的解决办法,真是复杂,这里就给出个简单便捷的方法。 一、报…

Puppeteer让你网页操作更简单(1)屏幕截图

网页自动化设计爬虫工具 中就使用了Puppeteer进行对网页自动化处理,今天就来看看它是什么东西! 我们将学习什么? 在本教程中,您将学习如何使用JavaScript自动化和抓取 web。 为此,我们将使用Puppeteer。 Puppeteer是一个Node库API,允许我们控制无头Ch…

Clickhouse表引擎之CollapsingMergeTree引擎的原理与使用

前言 继续上次关于clickhouse的一些踩坑点,今天讲讲另外一个表引擎——CollapsingMergeTree。这个对于引擎对于数据量较大的场景是个不错的选择。注意,选择clickhouse的一般原因都是为了高效率查询,提高用户体验感,说白了就是以空…

MySQL单表的查询练习

作业要求: 作业实现: 首先,创建worker表并插入相关数据 CREATE TABLE worker (部门号 int(11) NOT NULL,职工号 int(11) NOT NULL,工作时间 date NOT NULL,工资 float(8,2) NOT NULL,政治面貌 varchar(10) NOT NULL DEFAULT 群众,姓名 varc…

OpenJDK 和 OracleJDK 哪个jdk更好更稳定,正式项目用哪个呢?关注者

OpenJDK 和 OracleJDK:哪个JDK更好更稳定,正式项目应该使用哪个呢?我会从,从开源性质、更新和支持、功能差异等方面进行比较,如何选择,哪个jdk更好更稳定,正式项目用哪个呢,进行比较…

关于java类与对象的创建

关于java类与对象的创建 我们在前面的文章中回顾了方法的定义和方法的调用,以及了解了面向对象的初步认识,我们本篇文章来了解一下类和对象的关系,还是遵循结合现实的方式去理解,不是死记硬背😀。 1、类 类是一种抽…

【InternLM 大模型实战】第五课

LMDeploy 大模型量化部署实践 大模型部署背景模型部署定义:产品形态计算设备 大模型特点内存开销巨大动态shape相对视觉模型,LLM结构简单 大模型部署挑战设备推理服务 大模型部署方案技术点方案云端移动端 LMDeploy 简介高效推理引擎完备易用的工具链支持…

环境配置注解 @PostConstruct作用以及在springboot框架中的加载时间

作用 PostConstruct 是 Java EE 5 引入的一个注解,用于 Spring 框架中。它标记在方法上,以表示该方法应该在对象的依赖注入完成后,并且在类的任何业务方法被调用之前执行。这个注解的主要用途是进行一些初始化工作。需要注意的是:…