经过encoder得到一个小纬度的特征然后输入decoder中进行解码,目标是重建x(即让
x
′
x'
x′尽可能地与
x
x
x相似)
Denoising Auto Encoder(DAE):将x打乱输入,重建x。效果提升明显,得到的特征更稳健且不容易过拟合,强化模型抓住本质特征的能力。原因在于图像像素的冗余性很高,所以即使在图像上添加一定的污染,模型仍然能够抓住本质,将原始图像重建出来。(同样的思路例如Masked Auto Encoder)
方法:与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编码器做多模态的任务。
假设每一步都向之前的图像加入很小的噪声,当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)和预测噪声的差值
使用classifier guided diffusion,在训练扩散模型的同时额外训练一个图像分类器,将输入
X
t
X_t
Xt交给分类器计算分类损失,得到的梯度辅助采样和生成。因为梯度隐含了图像的一些信息(例如有无物体,是否真实),指导U-Net生成的图像要更像某一类物体。使得生成的图像逼真了很多,实验结果在数值上超越了GAN
后续工作: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等各种技巧