Hierarchical Text-Conditional Image Generation with CLIP Latents
1. Background
- 根据文本生成原创性图像,没有在训练集中出现过,学习特征然后进行组合
- 根据文本对已有的图像进行编辑和修改,可以任意添加或移除已有物体(因为使用的是“扩散模型(diffusion model)”的结构,所以生成的图像可以是很多,即一对多),而且能够符合现实生活的规律
- 即使在没有文本输入的情况下,仍旧能够根据已有图像和风格生成类似的图像而不改变已有的语义
- 一系列工作
看这个架势,扩散模型有取代GAN的趋势
2. Introduction
- CLIP提取的特征很好,很稳健,而且可以在一系列视觉文本任务上表现很好。
- 扩散模型在图像和视频的生成上也有十分出色的表现。扩散模型是在一个概率分布中进行采样,因此生成的内容多样性很高,但是保真度无法媲美GAN,因为GAN是基于“以假乱真”的优化方式,因此非常逼真,在细节上做得很好。但是20年以后一些研究人员将扩散模型的保真度提上来了,能够在数值上和GAN不相上下
- 在DALL E2的模型中CLIP的参数是不被优化的(freezing)
- 使用两阶段训练方式,prior和decoder。因为作者发现直接学习多模态特征的方式(即通过一个大模型去学习文本到图像的映射)不如 先由文本生成文本特征,再由文本特征生成图像特征,最后通过图像特征生成图像的效果好
- 过程:文本通过CLIP得到文本特征,输入prior学习对应的图像特征(CLIP对应的图像特征为ground truth,训练时有text-image pair),然后将图像特征输入decoder中生成图像。本质上就是CLIP和GLIDE模型的合并
3. Related Work
GAN
- 训练:训练一个生成器
G(z)
和判别器D(x)
,生成器的输入是随机(随机性带来一定的多样性)噪声z,输出一张图像;判别器的输入是生成图像和真实图像x,输出真假(二分类网络)。在优化过程中,生成器和判别器不断优化,最后能够生成以假乱真的图像。 - 损失函数以及优化
- 缺点:1)训练不够稳定,因为需要同时训练两个网络,存在平衡的问题,容易训练坍塌。2)不够多样。由于GAN的优化目标是真实,因此生成的图像多样性较低,主要来源于噪声的输入。3)隐式生成。不是概率模型,因此生成的图像并不知道是遵循什么分布,因此在数学上不够优美
AE:Auto Encoder
经过encoder得到一个小纬度的特征然后输入decoder中进行解码,目标是重建x(即让
x
′
x'
x′尽可能地与
x
x
x相似)
- Denoising Auto Encoder(DAE):将x打乱输入,重建x。效果提升明显,得到的特征更稳健且不容易过拟合,强化模型抓住本质特征的能力。原因在于图像像素的冗余性很高,所以即使在图像上添加一定的污染,模型仍然能够抓住本质,将原始图像重建出来。(同样的思路例如Masked Auto Encoder)
- 目的:学习bottelneck特征做下游任务。
VAE: Variational Auto Encoder
AE无法做生成任务,因为学习到的是特征并不是概率分布,因此无法进行采样。但是这种encoder-decoder的结构是一种很好的学习框架。VAE就是利用encoder-decoder这种结构来进行图像生成。
- 方法:与AE的区别在于中间并不是学习一个特征而是学习一个分布,假设是一个高斯分布(可以用均值和方差来描述)。encoder的输出加一个fc层预测均值和方差,然后基于此采样 Z Z Z输入decoder生成图像。在训练好VAE之后,不用encoder, Z Z Z可以从高斯分布中采样,输入解码器生成图像。
- 优点:由于是生成的分布,因此生成图像的多样性会高很多
VAVAE:Vector Quantised Variational Auto Encoder
- 对VAE做量化,因为现实中很多任务都是分类任务(离散化);而且VAE的方式学习不容易将模型做大,分布也相对不好学。因此VQVAE从学习分布转换为学习codebook(可以理解为聚类的中心,大小为 L × D L\times D L×D,L表示聚类中心的个数,D表示每个聚类中心的表示纬度)
- 训练流程:输入图像 x x x经过encoder得到特征图 f f f(尺寸为 c × h × w c \times h \times w c×h×w),将特征图中的向量与codebook进行匹配,选择最相近的聚类中心的编号存入 Z Z Z中,根据编号得到新的特征图 f q f_q fq(尺寸为 D × h × w D \times h \times w D×h×w,即量化后的特征)。 f q f_q fq是可控的,因为总是从codebook中取出来的特征,而非随机的东西从而更好优化。
- 使VQVAE的工作:BEIT用训练好的codebook得到的特征图作为ground truth进行自监督学习;Vision Language BEIT 也是类似的思路用transformer编码器做多模态的任务。
- 小结:VQVAE学习的是一个固定的codebook,即学习到特征去做high level任务,类似于AE的工作,所以无法采样做生成类任务。作者在这里为了能够进行生成任务,额外训练了一个prior网络(pixel CNN)使用训练好的codebook来生成图像
VQVAE2
- 将VQVAE变成层级式,对局部和全局都尽心建模,同时添加了attention加强了模型的表达能力。将自回归模型 pixel CNN换成了GPT(可以用文本引导图像生成)
Diffusion Model
假设每一步都向之前的图像加入很小的噪声,当T趋于无穷大的时候,最后这张图像将会变成真正的噪声(正态分布)。整个过程称为前向扩散过程(forward diffusion,diffusion名字来自于热力学)
将上述过程逆过来,输入是随机噪声,通过训练网络将输入恢复到最初图像来生成图像。
q
(
X
t
∣
X
t
−
1
q(X_t|X_{t-1}
q(Xt∣Xt−1就是扩散模型,每一步的参数共享。这也是扩散模型的不足,即训练和推理上比较慢,因为需要一步一步恢复。对于最原始的扩散模型,T一般设置为1000
- reverse diffusion model
需要保证输入和输出的尺寸大小一致,一般使用U-Net
左边是特征提取(Encoder,不断压缩),右边是上采样(Decoder,进行恢复),输入和输出的图像尺寸大小一致。为了让恢复更好,在对应的层之间有一些skip connection进行信息的直接传递可以恢复出一定的细节
DDPM
简化了扩散模型的优化过程。
1)将图像到图像的预测转换( x t − > x t − 1 x_t->x_{t-1} xt−>xt−1)为对噪声( x t − > ϵ x_t->\epsilon xt−>ϵ)的预测。模型的输入为 X t X_t Xt和time embedding(类似于位置编码,告诉模型扩散到第几步了),输出是一个噪声。
- time embedding:加入之后模型的表现提高了很多。因为在每一步的生成过程中使用的是同一个模型,但是需要让模型根据不同的输入生成不同的输出。在开始阶段,我们希望模型的输出是coarse-grained,大致轮廓;在后面阶段,生成更细节的,逼真的图像。time embedding用来告诉模型现在恢复到哪一步
- 损失函数: L = ∣ ∣ Z − f ϵ ( y t , t e ) ∣ ∣ L=||Z-f_\epsilon(y_t,t_e)|| L=∣∣Z−fϵ(yt,te)∣∣,即添加的噪声(ground truth)和预测噪声的差值
2)进一步简化分布的学习,只需要学习正太分布的均值,不需要学习方差。将方差设置为一个常数,最后的效果依然很好。进一步降低了模型优化的难度
小结
- 二者都可以看做encoder-decoder的结构
- 扩散模型在encoder部分是固定的,而VAE是学习特征
- 扩散模型的输入和输出大小是一致的,而VAE的中间特征纬度要比输入小很多
- 扩散模型中有time step,time embedding的概念,且每一步共享参数
- 扩散模型在数学上很优雅,基于高斯分布因此能够做推理证明
improved DDPM
- 学习方差会让模型表现得更好
- 添加噪声策略从线性改为余弦(在理解上类似于学习率的schedule也是从线性到余弦)
- 更大的模型会让扩散模型有更好的表现结果
Diffusion model beats GAN
- 将模型变得更大更复杂。加大加宽,增加自注意力的头,将single-scale attention换成multi-scale attention
- 提出新的归一化方式 adaptive group normalization,根据步数做归一化
- 使用classifier guided diffusion,在训练扩散模型的同时额外训练一个图像分类器,将输入 X t X_t Xt交给分类器计算分类损失,得到的梯度辅助采样和生成。因为梯度隐含了图像的一些信息(例如有无物体,是否真实),指导U-Net生成的图像要更像某一类物体。使得生成的图像逼真了很多,实验结果在数值上超越了GAN
- 这种添加了指导信号的方法非常有效,除了可以用classifier,还可以用CLIP(可以将图像和文本联系起来),image(图像重建作为像素级别的引导,还可以做特征层面或者风格的引导),text等。但是这样就需要额外的模型(pretrain/train),成本较高且训练过程不可控
- 后续工作:classifier free guidance。 f θ ( X t , t , y ) − f θ ( X t , t , ϕ ) f_\theta(X_t,t,y)-f_\theta(X_t,t,\phi) fθ(Xt,t,y)−fθ(Xt,t,ϕ),前者表示指导条件(y)下的输出,后者表示没有指导条件下( 空集 ϕ 空集\phi 空集ϕ)的输出。这样就摆脱了分类器的限制。但是训练成本较高,但这是一个很好用的技巧。
4. Method
- 数据集与CLIP一样也是图片文本对 ( x , y ) (x,y) (x,y),x,y分别表示图像和文本,经过CLIP得到响应的image embedding z i z_i zi 和 text embedding z t z_t zt。模型主要包含两个模块,分别是prior和decoder
- prior P ( z i ∣ y ) P(z_i|y) P(zi∣y) 。这里是transformer decoder,因为输入和输出都是embedding。
- decoder P ( x ∣ z i , y ) P(x|z_i,y) P(x∣zi,y)。这里是GLIDE模型的变体,使用了CLIP的guidance等各种技巧
5. Application && Results
-
图像生成图像:图像输入给CLIP得到图像特征,将图像特征转换为对应的文本特征(这里是怎么做到的),将文本特征输入给prior得到另一个图像特征,最后输入到decoder中生成新的图像。这样生成的图像风格和语义与原始图像类似,对于不太关键的信息(布局样式等)有一定的改变(简化设计)
-
图像的内插:在两张图像之间做内插得到的特征进行生成
-
图像和文本的内插(P图)
-
Results(在COCO数据集上FID分数)
不足和局限
-
不能很好地将物体及其属性结合起来
分析可能是使用了CLIP模型的缘故,因为CLIP更多地考虑的是物体上的相似性,可能并没有理解某些文本的真正含义,例如这里的“on top of”。所以CLIP得到的特征不能很好地区分物体极其属性 -
文字中有表示文字的时候,生成的图像中的文字不正确
有可能是因为文本编码在开始的时候使用的是BPE编码(类似于词根-词缀编码形式) -
不能生成很复杂的场景,无法生成很多细节