文章目录
Zero-Shot Text-to-Image Generation 一. 简介 二. 方法 2.1. 第一阶段:Learning the visual codebook 2.1.1 回顾VQ-VAE 2.1.2 p ψ p_{\psi} pψ是离散分布,不可导的问题 -> gumbel-softmaxZero-Shot Text-to-Image Generation
一. 简介
机构:openai
代码:https://github.com/openai/DALL-E
人们常说自然语言处理是人工智能皇冠上的明珠,这些年transformer以及大规模语言模型LLM的蓬勃发展,让这颗明珠更加熠熠生辉。除此之外,ViT,MAE等方法也充分验证了图像在transformer以及大规模预训练之路上的可行性,那么近一步的思考,就是如何跨越图像,文本等多种模态的鸿沟,让机器真正实现智能?理解人类生活中存在的各种模态?接收人类的指令,与物理世界交互?实现视,听,说,触等人类感知在机器上的应用。这份思考也让多模态这个领域这些年如火如荼,模态可能不只包括图像,文本,视频,音频等,除此之外,人体姿态,3D模型等等都可以视作一种广义上的模态,但一般上更关注图像以及文本,一方面:图像文本是人类世界分布最广的两种媒介,蕴含着巨大的信息,另一方面:各种模态之间往往也可以相互转化,比如音频转化为文本,视频切帧为图像。
就图像和文本而言,有多种benchmark任务建立起两种模态之间的桥梁,包括但不限于多模态检索:文本检索图像,图像检索文本,多模态生成:文本生成图像,图像生成文本,多模态问答:VQA等。其中文本生成图像是一个备受关注的领域,之前的技术路线多是基于VAE,GAN等,在特定数据集或者特定域进行生成,比如CUB或者MS-COCO,生成效果差,细节不逼真,离通用,泛化性强的生成能力还相去甚远,这两年DALL-E的一鸣惊人,加上后来diffusion model的井喷式发展,让人看到了机器拥有艺术创造以及设计的希望,其生成的图像往往能够以假乱真,在真实性,多样性,创造性等方面,远远超过之前的模型。
今天,我们先聊一聊DALL-E。按照中文的谐音,DALL-E 音同 dali,所谓大力出奇迹,在这儿仿佛也算是如其名,有气吞山河山河之势。参考https://mp.pdnews.cn/Pc/ArtInfoApi/article?id=28457810 才知道openai的初衷是"让机器拥有顶级艺术家,设计师的创造力,因此结合了艺术以及机器的两位代表性标杆:艺术家萨尔瓦多·达利(Salvador Dali)
和皮克斯《机器人总动员》中的 WALL-E,用DALL-E向他们致敬。
摘要:
Text-to-image generation has traditionally focused on finding better modeling assumptions for training on a fixed dataset. These assumptions might involve complex architectures, auxiliary losses, or side information such as object part labels or segmentation masks supplied during training. We describe a simple approach for this task based on a transformer that autoregressively models the text and image tokens as a single stream of data. With sufficient data and scale, our approach is competitive with previous domain-specific models when evaluated in a zero-shot fashion.
论文的摘要比较朴实,其指出先前的文本生成图像任务在特定的数据集上展开,往往训练过程伴随着复杂的网络结果,额外的损失函数或者监督信息。而DALL-E用transformer(12亿参数)自回归地建模图像以及文本tokens,当给定足够的数据(文中用了2.5亿网络图文对),往往能以一种zero-shot的方式,与在某个特定域的专精模型相匹敌。当然,笔者其实对这个zero-shot一直打一个天大的问号,也不太清楚为什么DALL-E主打zero-shot这个点。
二. 方法
整体思路借鉴了:VQ-VAE与VQ-VAE2,即对图像并不直接在像素级别上自回归,而是将图像编码为离散的tokens,再进行建模,这样能够降低复杂度以及长序列的建模难度。具体而言,方法分为了两个阶段:
第一阶段:训练一个离散自编码器dVAE,将
256
∗
256
256 * 256
256∗256的RGB图像压缩为
32
∗
32
32 * 32
32∗32个tokens,每个token都有8192个可能的选择,即code book的大小是8192。这样transformer建模的上下文大小从
256
∗
256
∗
3
256 * 256 * 3
256∗256∗3 降低到
32
∗
32
32 * 32
32∗32,压缩了192倍,但视觉质量却没有很大的损失(但其实细节,会有一些损失,比如下图)
第二阶段:将256个BPE编码的文本token,与上面的
32
∗
32
=
1024
32 * 32 = 1024
32∗32=1024个视觉token进行concate,然后用一个自回归transformer建模图像和文本token的联合分布。
那么整体的文本生成图像的优化目标,可以视作优化一个关于图像
x
x
x,文本描述
y
y
y,视觉token
z
z
z的ELB。
其实上面的ELB与VAE的ELB在公式上,长得很相似:
具体公式的推导可以见:
整体DALL-E的方法流程图可见:
2.1. 第一阶段:Learning the visual codebook
训练dVAE,即最大化关于
ϕ
\phi
ϕ和
θ
\theta
θ 的ELB,初始化先验
ψ
\psi
ψ为在codebook vectors上的均匀类别分布。
2.1.1 回顾VQ-VAE
这儿,我们先简单回顾一下VQ-VAE的相关内容:
VQ-VAE是DALL-E的前身,不同于VAE,VQ-VAE将图像编码成离散的token,具体的做法是定义了一个
K
∗
d
K * d
K∗d的code book或者叫做embedding space,其是可以学习的,类似一个nn.embedding层,然后对于一个输入的图像,经过encder得到
z
e
z_e
ze ,它的维度是
m
∗
n
∗
d
m * n * d
m∗n∗d,然后将
m
∗
n
m * n
m∗n个网格的特征,分别与code book里面的K个特征算一个距离,找到最近邻,其code book中的index当作对应位置的离散编码
z
z
z,并填充对应的d维特征,形成
z
q
z_q
zq,当作decoder的输入,并重建得到图像。其为了避免最近邻查找中argmax带来的不可导问题,引入了直通估计来设计其损失函数:
在DALL-E里面,这儿的VQ-VAE也被叫做dVAE,其相关的配置如下
如上所说,训练dVAE就是在最大化
ϕ
\phi
ϕ和
θ
\theta
θ的ELB,初始化先验
p
ψ
p_{\psi}
pψ为在codebook vectors上的均匀类别分布。
目前存在的问题:
2.1.2 p ψ p_{\psi} pψ是离散分布,不可导的问题 -> gumbel-softmax
首先我们介绍一下什么是gumbel分布
它的分布函数是:
F
(
x
;
μ
,
β
)
=
e
−
e
−
(
x
−
μ
)
/
β
F(x;\mu,\beta)=e^{-e^{-(x-\mu)/\beta}}
F(x;μ,β)=e−e−(x−μ)/β
采样:
x
=
F
−
1
(
μ
)
=
μ
−
β
ln
(
−
ln
(
μ
)
)
,
μ
∼
U
n
i
f
o
r
m
(
0
,
1
)
x = F^{-1}(\mu)=\mu-\beta\ln(-\ln(\mu)), \mu\sim Uniform(0,1)
x=F−1(μ)=μ−βln(−ln(μ)),μ∼Uniform(0,1)
标准分布:
μ
=
0
,
β
=
1
\mu=0,\beta=1
μ=0,β=1
gumbel softmax
[1] E. Jang, S. Gu, and B. Poole. Categorical reparameterization with gumbel-softmax. arXiv preprint arXiv:1611.01144, 2016.
针对离散变量采样过程无法求导这个固有性质,上面的文献[1]提出了连续且可导的近似采样替代方案gumbel softmax。
假设离散变量
z
z
z的值域有k个可能的取值
z
1
,
z
2
,
.
.
.
,
z
k
{z_1, z_2, ..., z_k}
z1,z2,...,zk,对应的概率分布向量为
p
=
[
p
1
,
p
2
,
.
.
.
,
p
k
]
p=[p_1,p_2,...,p_k]
p=[p1,p2,...,pk],那么整个采样的过程就变成了
z
=
o
n
e
h
o
t
(
a
r
g
m
a
x
i
[
g
i
+
log
p
i
]
)
z=one_{hot}(argmax_i[g_i + \log p_i])
z=onehot(argmaxi[gi+logpi]),其中
g
i
g_i
gi是从gumbel(0,1)中独立同分布采样得到。然后用连续可导的计算代替argmax近似得到采样向量
y
y
y。
y
i
=
e
(
log
(
p
i
)
+
g
i
)
/
τ
∑
j
=
1
k
e
(
log
(
p
j
)
+
g
j
)
/
τ
f
o
r
i
=
1
,
.
.
.
,
k
y_i=\frac{e^{(\log(p_i)+g_i)/\tau}}{\sum_{j=1}^k e^{(\log(p_j) + g_j)/\tau}} for\ i = 1,...,k
yi=∑j=1ke(log(pj)+gj)/τe(log(pi)+gi)/τfor i=1,...,k