DALL·E 2 论文阅读笔记

news2025/7/7 6:19:43

《Hierarchical Text-Conditional Image Generation with CLIP Latents》

Paper: https://cdn.openai.com/papers/dall-e-2.pdf

Project: https://openai.com/product/dall-e-2

Author: OpenAI


闲言碎语

时间线:2021.01推出DALL·E,2021年底推出GLIDE,2022.04推出DALL·E 2

DALL·E 2的能力:“DALL·E 2 can create original, realistic images and art from a text description. It can combine concepts, attributes, and styles.”

  • 生成原创性的图片

  • 组合concepts、attributes,and styles

DALLE 2 的hierarchical:先生成64*64小分辨率图片,再利用一个模型上采样到256*256,再利用一个模型上采样到1024*1024。

DALLE 2就是: CLIP模型+GLIDE模型(一个基于diffusion model的文本图像生成方法);

DALLE2 暂时不开源,不全面开发API,github上有dalle-mini库(但跟DALLE2 好像没太大关系)


前置知识

图像生成的一些方法回顾:

  1. GAN

GAN的思想其实就是左右手互博,同时训练两个网络:生成器G和判别器D。

  • 优点:因为GAN的目标就是以假乱真,所以其生成图像的保真度比较高

  • 缺点:

  • 1)训练不够稳定,因为要同时训练两个网络;

  • 2)因为是以保真度为目标,所以生成图像的多样性较差;

  • 3)不是概率模型,它的生成都是隐式完成的。你不知道它做了什么,不知道遵循了什么分布,因此GAN在数学上不如后续的VAE、扩散模型优美。

  1. AE(Auto-encoder)

自编码器是很早的技术,目的是将高维的信息通过encoder压缩到一个低维的code内,然后再使用decoder对其进行重建,关于它的细节可参阅之前的文章:Auto-encoder系列。

  1. VAE(Variational Auto-Encoder)

无论是AE,DAE,还是MAE,核心上都是学习bottleneck处这个特征的,然后去做目标检测、分割、分类这些下游任务,并不是去做生成的。原因就是中间特征c并不是一个概率分布,我们没法对它采样,它是一个用于重建的特征。因此就有了VAE,中间不再生成一个特征,而是生成一个分布(高斯)。

因为VAE学到的是一个概率分布,从分布里去抽样生成图像的多样性就会好很多。

VAE的本质思想是学习一个分布,而不是一个特征。后续的诸多工作也是基于这一本质思想进行展开的。

关于VAE的细节也可参阅之前的文章:Auto-encoder系列。

  1. VQ-VAE(Vector Quantized Variational Auto-Encoder)

VQ-VAE 的核心思想是将连续的高维向量编码(例如语音信号、图像、视频等)离散化,从而减少模型的复杂度和存储需求。具体来说,VQ-VAE 通过将连续的编码向量映射到一组离散的“码本”(codebook)中的最近邻,从而将高维连续编码转换为低维的离散编码。在解码器中,这些离散编码被解码回原始的高维向量。

VQ-VAE就是将特征进行量化的VAE。相对于VAE,优化起来相对容易。codebook可以理解为聚类中心,有K*D个聚类中心。

但是VQ-VAE学习的是一个固定的codebook,因此无法像VAE一样做随机采样,因此VQ-VAE更像是VQ-AE。若想像VAE那样,就需要有一个prior网络。在VQ-VAE中,prior网络是一个用于生成离散码本(codebook)的神经网络。离散码本是一组预定义的离散向量,用于将连续的向量空间映射到一个离散的向量空间。这种离散化的表示方式使得VQ-VAE可以对输入数据进行高效地编码和解码。

具体来说,prior网络的输入是由编码器生成的连续向量,输出是一个由离散向量组成的码本。prior网络的训练目标是最小化输入向量和最近的码本向量之间的欧几里得距离,从而实现向量量化。在训练过程中,prior网络不仅学习生成码本,还学习将连续向量映射到码本中最近的向量。通过将编码器生成的连续向量量化为码本中最近的向量,VQ-VAE可以保留输入数据的局部结构信息,并且可以在编码和解码过程中实现高效的计算。因此,prior网络在VQ-VAE中起着非常重要的作用。

VQ-VAE 已经在许多领域得到了应用,包括图像生成、音频压缩、语音识别、自然语言处理等。DALL·E 第一版就是基于VQ-VAE做的。

  1. DALL-E

对于一个图像文本对,文本用BPE编码生成256维的特征,图像用现成的VQ-VAE(codebook)编码为32*32维的特征,然后将这两个特征拼接成一个1280维的序列,再输入至GPT中。

训练时,将1280维序列的部分遮住,让GPT进行预测。

推理时,只需要输入文本的特征(256维),让GPT自回归的做预测就行。

  1. Diffusion model

1)扩散模型的方法

扩散模型分为 forward diffusion 和 reverse diffusion 两个阶段。对于一个图像,forward diffusion 做的就是往中不断添加噪声,一共添加T次,最后得到

为什么叫“扩散”,这启发于热力学。热力学中有一个名词叫“diffusion”,如果有两个物质分别是高密度和低密度的,那高密度的物质会慢慢地向低密度的做扩散,最后达到一种平衡。在Diffusion model 中,这种“平衡”的体现就是 forward diffusion 过程最后得到的趋近于各向同性的正态分布

reverse diffusion过程要做的就是训练一个模型,使得从恢复至,然后再训练一个模型,使得从恢复至,以此类推直至恢复至。在reverse diffusion 过程中所有使用到的模型都是共享参数的,也就是说整体其实只有一个模型,只是需要抽样生成很多次。 因此扩散模型目前最大的不足就是:相比于其他生成模型,训练很慢,且推理是最慢的。因为对于一个随机采样的噪声,要往前推T次才能生成Image。此外,目前reverse diffusion 过程中的网络大部分选用的都是U-Net。

2)扩散模型的发展历程

扩散模型这个想法在2015年就有人提出来了,但是并不能训练很好,生成图像的效果并不如其他的生成模型,比如GAN等。直至2020年有一篇论文——DDPM对扩散模型的思想进行了改进,使得训练更方便,其核心思想是:在 reverse diffusion 过程中,给定,不去直接预测(训练起来很难),而是预测使变为的噪声。这将扩散模型的问题简化了很多,直接让网络去预测一个噪声即可(类似于ResNet中去预测一个残差),比如对于正态分布而言,就是预测均值和方差,DDPM作者还发现,将方差设为一个常数,只去预测均值的话,就已经可以使扩散模型生成很好的图像。

给U-Net中加入temporal embedding,目的是使 reverse diffusion 是一个 coarse-to-fine 的过程,让模型知道目前处于哪一步,希望在最开始先生成一些粗糙的信息,最后快结束时再生成一些细致的信息,即高频的信息(比如物体的边边角角)。损失函数就是:就是U-Net网络,t是temporal embedding,是前向过程中添加的噪声,是已知的,因此可以拿来当作Ground truth,目的是希望U-Net在每一步预测的噪声与前向过程中的相同。

DDPM与VAE其实是有相似之处,比如DDPM 也可以看做的一个 encoder-decoder 结构,分别对应forwar、reverse的过程。但他们也有不同,如下:

  • DDPM的前向过程是固定的,而VAE的encoder是学习的;

  • DDPM的每一步的特征维度都是相同的,而VAE的bottle neck的维度是比输入小很多的。

  • 扩散模型有 step 的概念,有很多步;VAE没有;

在DDPM 证明了扩散模型可以work很好之后,后续出现了很多工作,比如2021年OpenAI的这篇论文《Diffusion Models Beat GANs on Image Synthesis》。在这篇论文出现之前扩散模型生成的图像已经很逼真了,但是在各项指标上还比不过GAN,然后这篇论文提出了一个Classifier guidance方法来引导模型生成图片,使得生成的效果更好,并且只做25次采样即可实现。

Classifier guided diffusion的意思是:在训练diffusion的同时,再去训练一个图片分类器(classifier,一般是在ImageNet的加了noise的图片上训练)。这个classifier的作用是:有了后,就可以丢给classifier计算一个类别损失,也就是计算出了一个梯度来辅助U-Net的训练过程。这个梯度中暗含了中是否有这个物体,或者说当前的这个物体真不真实的信息,以此来告诉U-Net要在生成的图片中在颜色、纹理等要跟真实的物体匹配上。

这个操作的核心思想是利用梯度来引导diffusion的生成,它牺牲了一定的diversity,来换取生成图片的逼真性。这种思想提出来之后,后续有人思考不用classifier来当作引导信号,而是用CLIP来进行引导,这样文本和图像就可以联系起来了,不再用梯度,而是用文本来引导引导diffusion的采样和生成。所有的引导都是目标函数中的y,也就是输入不只是和t,同时还有一个condition(y),至于是什么就看你往里加入什么。

但是Classifier guided diffusion这类方法也有一个缺陷,就是:必须用另外一个模型来进行guidance,要么是pre-trained,要么是再训练一个,这样的话成本较高且不可控。因此就出现了后续的Classifier free guidance方法,GLIDE、DALLE·2、Imagen都是基于这类方法的思想。Classifier free guidance方法不想用之前的那种guidance,而是希望找到另外一种指导信号。它的思想就是在训练时同时做两个输出,一个有条件的,一个没条件的,最后就会知道二者的差距是多少,这样在测试时,在没有条件引导的情况下,也可以推测出有条件引导的输出是多少。但是这种训练成本也很高,同时要有两个输出。

GLIDE采用了classifier free guidance的扩散模型,可以实现很好的图像生成。OpenAI也因此摒弃了DALL·E用VQ-VAE的思路,在DALL·E 2中转而使用扩散模型来进行图像生成,也就是基于GLIDE,并在其之前加入了prior网络,以及一些层级生成的技巧等。


摘要

像CLIP这些对比学习的模型已经可以学习到很稳健的图像特征,既能捕捉语义信息,又能捕捉风格信息。这种良好特征只用来做分类就很可惜,因此为了借助于这种良好特征来完成图像生成任务,我们提出了一个两阶段的模型:a prior (给定一个文本,先用现成的CLIP模型生成对应的textual embedding,然后接下来用这个textual embedding生成image embedding的过程就叫做prior),and a decoder(基于image embedding生成图像)。此外,由于是text-to-image任务,因此可以基于CLIP,可以实现zero-shot。

作者发现: 显式地生成图像特征的这种方式(就是先从文本生成image embedding,再将其解码为Image),可以很显著地提升生成图像的diversity(多样性)

引言

对于一段话,DALLE 2是能够捕捉其中的层次关系,并在画图时也考虑进来的。比如给出下面这句话,DALLE 2 生成的图片,是真的把熊画在滑板之上了,也就是说捕捉到并解码出目标之间的关联关系的。

在DALLE 2这篇论文里,CLIP这个模型是锁住的,只是被用,没有被训练。DALLE 2模型的整体框架如下,虚线之上是CLIP 模型,虚线之下才是DALLE 2模型。unCLIP是指:CLIP的目的是从文本、图像中获取特征,本文的方法是为了从特征中还原出图像,因此叫unCLIP。

DALLE 2的训练数据是图像文本对(x, y),过程分以下两个阶段:

  • Prior阶段:对于一个文本x,经由fixed CLIP可以产生一个texual embedding(蓝色)和Image embedding(红色),产生的texual embedding经过 autoregressive或difussion的prior模型生成Image embedding,这一个阶段用刚才CLIP中生成的Image embedding对其做监督。这样做的目的是:等在做推理的时候,即使只有文本特征,也可以生成比较好的图像特征。

  • Decoder阶段:用于从Image embedding中解码出图像。

如果DALLE 2的输入是图像的话,会通过CLIP生成文本特征,然后再经过prior、decoder生成图像。

方法

训练集是图像x-文本y对。分别是图像x经过CLIP输出的image和text embedding。DALL-E 2的数学描述如下:

与x是一对一的关系,因为CLIP是锁住的,给定一个x,就只会输出一个。P(zi|y)对应的是prior网络,P(x, zi|y)对应的是decoder。

在decoder阶段,使用的是 CLIP 引导的diffusion,然后技巧使用了 classifier free guidance。用的只是CNN,没有用attention。

在prior阶段,作者尝试了两种方案:Autoregressive prior和Diffusion prior。值得注意的是在两种尝试中作者都使用了classifier free guidance,证明这种方法对生成任务确实有效。

Autoregressive prior:输入是文本特征,也有CLIP输出的图像特征,然后与DALL-E、GPT类似地把他们拼接起来,然后将图像特征遮住,去自回归的预测。但是OpenAI在CLIP的文章中就已提到,这种自回归做预测的模型,训练效率太低。

Diffusion prior:训练了一个 decoder-only Transformer,输入有很多,具体请看原文~

应用

DALL·E 2的几种应用场景:

  1. text-to-image

DALL·E 2可以生成各式各样的沙发,变换颜色、样式、位置

  1. image-to-image

给定一个图像,可以生成很多风格类似的图像(整体语义信息不变):

  1. 通过对两个图像的特征做内插,生成新图像

  1. 通过对两个文本的特征做内插,生成新图像

不足

1)DALL-E 2不能很好的将attribute绑定到 object 上。

比如下面这个图,object就是方块,属性就是颜色。给一句话:“a red cube on top of a blue cube”,GLIDE的效果要比DALL-E 2好很多。

作者解释很可能是使用CLIP的原因。虽然使用CLIP后可以是图像和文本的联系更紧密,这使得更容易去做文本生成图像的任务。但是CLIP模型学习的时候,只是考虑相似性,它只是去找红方块、蓝方块来把相似性提升到最高就行了,但是CLIP模型不了解"on top of"这种东西,不了解什么叫做“上下左右”,它从头到尾都在找物体间的相似性。

因此在做CLIP特征做下游任务的时候,就不能很好的区分object和其对应的attribute。

此外,在对图片进行重建时,decoder会将object的attribute混淆。

2)直接生成文字,效果很差

作者解释可能是使用BPE编码的原因,这种是词根词缀编码。但可能还有其他原因。

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

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

相关文章

锦正茂风冷系列电源JCP-10-80的技术参数

JCP-10-80为高稳定度的双极性恒流电源,广泛应用于电磁铁、亥姆霍兹线圈等感性负载的励磁。电源采用线性电源结构,输出电流稳定度高,纹波和噪声低。电源输出电流可在正负额定电流*值之间连续变化,电流平滑连续过零,可使…

引出生命周期、生命周期_挂载流程、生命周期_更新流程、生命周期_销毁流程、生命周期_总结——Vue

目录 一、引出生命周期 二、生命周期_挂载流程 三、生命周期_更新流程 四、生命周期_销毁流程 五、生命周期_总结 一、引出生命周期 生命周期: 1.又名:生命周期回调函数、生命周期函数、生命周期钩子。 2.是什么:Vue在关键时刻帮我们调…

centos安装 jenkins

目录 一、安装 jdk 二、安装 maven 三、安装 jenkins 官网地址:Jenkins 一、安装 jdk 首先检索包含 java 的列表 yum list java* 检索1.8的列表 yum list java-1.8* 安装 1.8.0 的所有文件 yum install java-1.8.0-openjdk* -y使用命令检查是否安装成功 …

Git图解-IDEA中的Git操作

目录 一、配置Idea 二、项目克隆 三、文件状态识别 四、Git操作 4.1 git add--添加暂存区 4.2 git commit--提交本地仓库 4.3 git push--推送远程仓库 4.4 git pull--更新本地仓库 五、完整开发流程 5.1 步骤1:克隆项目 5.2 步骤2:创建自己开发…

呆头鹅批量剪辑软件,一天制作1000+视频过审神器,0基础批量操作

当我们需要处理大量的视频时,怎么样才能够让工作变得更加简单?可以来试试呆头鹅批量剪辑软件,软件功能非常强大,支持批量剪辑视频,剪辑的过程中可以设置输出的位置和分辨率,同时可以对视频进行一些编辑处理…

CentOS定时任务——crontab

crontab Linux crontab 是用来定期执行程序的命令。 crond 命令每分钟会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。 注意:新创建的 cron 任务,不会马上执行,至少要过 2 分钟后才可以,当然你…

软件测试16

在桌面上打开终端窗口, 执行如下操作: 将根目录下所有文件的详细信息输出到 demo 文件中查看 demo 文件前 5 行内容查看 demo 文件后 5 行内容将 ping www.itheima.com 的信息输出到 ping_log 文件中重新开启一个终端窗口, 动态查看 ping_log 文件中的信息 查看日志文件内容…

unity3D基础操作之01--unity3d窗口界面介绍

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录最常使用5种窗口1、Scene场景编辑窗口2、Game游戏运行窗口需要注意的是3、Hierarchy场景物体列表窗口4、Project项目资源列表窗口需要注意的是5、Inspector属性编辑列…

4.Spring Cloud (Hoxton.SR8) 学习笔记—Nacos微服务治理、Nacos配置管理

本文目录如下:一、Nacos微服务治理Nacos 下载 与 启动Spring Cloud 集成 NacosIDEA 同一个 Application 启动多次Nacos - 配置集群Nacos - 设置负载均衡Nacos - 设置服务实例的权重二、Nacos 配置管理Nacos - 合理的把配置信息迁移到 Nacos 中Nacos - 如何使用 Naco…

自然语言处理中数据增强(Data Augmentation)技术最全盘点

与“计算机视觉”中使用图像数据增强的标准做法不同,在NLP中,文本数据的增强非常少见。这是因为对图像的琐碎操作(例如将图像旋转几度或将其转换为灰度)不会改变其语义。语义上不变的转换的存在是使增强成为Computer Vision研究中…

【Java开发】设计模式 03:建造者模式

1 建造者模式介绍建造者模式使用多个简单的对象一步一步构建成一个复杂的对象。当一个类的构造函数参数个数超过4个,而且这些参数有些是可选的参数,考虑使用构造者模式。📌 场景当一个类的构造函数参数超过4个,而且这些参数有些是…

【论文研读 上】基于开源软件的无人机飞行仿真 鹿珂珂,刘登攀,王超

基于开源软件的无人机飞行仿真 摘 要 飞行控制算法设计和仿真是无人机研制的关键步骤。为了缩短无人机飞行控制算法设计周期和试验成本,对无人 机纵向和侧向控制算法进行了设计,并基于开源软件开发了固定翼无人机可视化的飞行仿真系统, 固定…

Kafka入门教程

1 Kafka安装 1.1 压缩包安装 1.1.1 JDK环境安装 Kafka是依赖JDK环境的,所以需要事先安装好JDK 下载JDK安装包: Oracle JDK8下载SSH上传到想要安装的目录,比如 /opt.然后使用tar -zxvf jdk-8u351-linux-x64.tar.gz命令解压 添加环境变量 vi /etc/profile,输入如下内容保存后…

【9.数据页结构】

概述 InnoDB 的数据是按「数据页」为单位来读写的,也就是说,当需要读一条记录的时候,并不是将这个记录本身从磁盘读出来,而是以页为单位,将其整体读入内存。数据库的 I/O 操作的最小单位是页,InnoDB 数据页…

【Linux内核三】网络丢包debug案例

👉个人主页:highman110 👉作者简介:一名硬件工程师,持续学习,不断记录,保持思考,输出干货内容 目录 前言 测试环境 测试现象 ​编辑 定位过程 ​编辑 优化手段 1、加大ring buffer …

X86ARM @Linux平台cache eviction功能测试

经典的ARM处理器高速缓存工作原理: 高速缓存内部结构:

Qt样式表

1>样式表介绍 样式表可通过 QApplication::setStyleSheet()函数将其设置到整个应用程序上,也可以使用 QWidget::setStyleSheet()将其设置到指定的部件或子部件上,不同级别均可设置样式表,称为样式表的层叠。样式表也可通过设计模式编辑样…

vue中render函数的作用及解析

在vue脚手架的main.js文件中,存在这样一段代码: 意思是对vue实例的配置,其中render函数的作用是,将h创建的Node节点信息return返回给Vue.js底层处理文件中的beforeMount()生命周期钩子函数,让其将Node节点信息在界面中…

智能优化算法之蚁群算法

1、蚁群算法概述 蚁群算法(Ant Colony Algorithm, ACA) 由Marco Dorigo于1992年在他的博士论文中首次提出, 该算法模拟了自然界中蚂蚁的觅食行为。 蚂蚁在寻找食物源时, 会在其经过的路径上释放一种信息素, 并能够感知…

配对变量t检验

区别双变量t检验,见:https://mp.csdn.net/postedit/100640098 配对变量为两两相关的变量:如敷药前后体重变化。 要求:两变量服从正态分布。 SPSS演练 打开数据文件:ptest.sav 载地址:https://download.c…