论文地址:Hierarchical Text-Conditional Image Generation with CLIP Latents
赏析大师
Hierarchical Text-Conditional Image Generation with CLIP Latents
看一下标题啊,使用CLIP出来的特征来做一个层级式的文本到图像的生成器。
我们可以获得三个线索:
-
用到了CLIP模型
CLIP模型作为DALL·E 2的基础,先找到图片文本之间的关联。真个DALL·E 2模型都离不开CLIP。
-
在DALL·E 2中给定一个文本,CLIP就可以对文本编码获得对应的特征。
-
DALL·E 2有一个prior模型,输入是文本特征,输出是图像特征。
-
把获得的图像特征传给DALL·E 2的解码器,就可以生成图像了。
CLIP对DALL·E 2来说很重要,不了解的可以先看一下介绍CLIP的文章:[CLIP打通文本图像壁垒,为AI图像生成打下
-
-
层级式
层级式是因为DALL·E 2先生成一个64×64的图像,再使用一个模型上采样生成一个256×256,你以为这就完了吗,还有一个模型继续上采样到1024×1024,所以最后DALL·E生成出来的是一个1024×1024的高清大图。
-
文本到图像生成
这个就没什么可说的了,现在text to image生成的工作发展地如火如荼。
DALL·E 2是什么
之前OpenAI的CLIP已经做的挺好的了,既能获取到文本对应图片语义信息又能获取到图片的风格信息,既然信息已经可以抽取地这么好了,那只拿着它去做分类是不是很可惜,所以能不能多加利用呢?
为了能充分发挥CLIP的优势,所以作者尝试使用CLIP获得的特征去做图像的生成,因此他们做了一个两阶段的模型。
-
prior:给定一个文本caption产生一个和CLIP模型类似的图像嵌入表示(image embedding)
-
decoder:通过图像嵌入表示解码生成对应的图像
prior
prior要做的是拿到一个caption之后将其转换为文本嵌入,然后再将其转化成图片嵌入。
这里用的是一个预训练好的CLIP模型(图片虚线的上半部分)。我们知道CLIP模型是有两部分的,一个文本编码器和一个图像编码器。
看一下图片虚线的下半部分:
-
caption → text embedding
这一步用的是CLIP的文本编码器 -
然后prior的另一部分的作用是
text embedding → image embedding
CLIP的图像编码器出来的结果在这里作为prior出来的结果的ground truth。
作者在这里提了一下,使用prior生成image embedding可以提高图像生成的多样性。此外prior的设计还有一个原因:对于同一个caption,可能会有无数的图片与之对应,因此CLIP两个编码器输出的内容并不是完全一致的,因此在这里需要一个单独的prior模型将文本嵌入“翻译”为可能与之相匹配的图像嵌入。
decoder
这一部分就是用的扩散模型。使用扩散模型可以保证图像生成的多样性。基于给定图像的特征可以生成多种多样的图片,还能保证语义信息和风格。
在这里作者是做了实验,尝试使用了自回归模型和扩散模型,最后还是发现扩散模型比较香,效率又高生成效果又好。
论文方法介绍
数据集
令 和CLIP模型一样,训练数据集也是图片和文本对$pair(x,y)$。给定图片$x$,令$z_i$是CLIP出来的图像嵌入表示,$z_t$为CLIP出来的文本嵌入表示,整个DALL·E 2模型就可以拆解成两部分:
-
prior:$P(z_i|y)$,根据输入文本$y$产生图像的嵌入表示$z_i$。
-
decoder:$P(x|z_i,y)$,根据文本$y$和prior得到的图像嵌入表示$z_i$重建图片$x$。当然文本$y$也可以不加的。
整个过程的数学表示为:
$$ P(x \mid y)=P\left(x, z_i \mid y\right)=P\left(x \mid z_i, y\right) P\left(z_i \mid y\right) $$
decoder
Guidance
对于扩散模型,为了提高其评价指标的数值表现和加速采样,研究人员已经探讨出多种多样的引导扩散的技巧,集体可以看这里:Guidance,让扩散模型的指标更能打
在DALL·E 2的decoder中用的方法是CLIP guidance + classifier-free guidance。就是说DALL·E 2中的guidance可能来自于文本,也可能来自于CLIP模型, 在这里随机将10%的CLIP的特征表示设置为$\phi$,在训练过程中随机去掉50%的文本caption。
层级式生成
这里就是为了提高生成图片的质量,先用模型生产64 × 64 的小图,再使用两个上采样模型,使分辨率逐步提高到256 × 256,1024×1024。
为了提高训练的稳定性,训练过程中加了很多噪声。在网络结构上,由于用的都是U-Net,使用的都是卷积操作,不是使用Transformer,因此训练出来的模型可以用在任意大小的图上, 而不再需要考虑图像编码的长短。
prior
作者在这里使用了两种模型:
自回归模型(autoregressive) prior:
自回归是输入文本特征,加上CLIP的图像特征去做生成,这样不断去预测就可以了。但是之前讲CLIP的时候我们就提到,OpenAI的人已经意识到训练预测式的模型效率很低。为了让训练变得更快速,他们还用了很多加速技巧。总之就是很麻烦,论文中也没详细写,这里就不多赘述。对于自回归模型为什么不太行以及不了解CLIP的可以看:CLIP打通文本图像壁垒,为AI图像生成打下基础
扩散模型(Diffusion) prior:
因为prior的输入输出都是embedding,所以在这里扩散模型的网络用的就不是U-Net了,而是直接训练的一个只用decoder的Transformer,用来处理序列信息。
这里的输入很多:
-
encoded text:编码之后的输入文本
-
CLIP text embedding:CLIP 模型计算的文本的嵌入表示
-
embedding for the diffusion timestep: 当前扩散模型的时间步
-
noised CLIP image embedding:带噪的CLIP 图像嵌入表示
-
a Transformer embedding:Transformer 自己的嵌入特征表示
这些所有的输出组合起来,拿去预测没加过CLIP嵌入特征的图像的表示。其他的就和普通的扩散模型完全一样了。
目标函数用的是:
$$ L_{\text {prior }}=\mathbb{E}{t \sim[1, T], z_i^{(t)} \sim q_t}\left[\left|f\theta\left(z_i^{(t)}, t, y\right)-z_i\right|^2\right] $$
这里发现最后算目标函数用的是$z_i$,而不是预测噪声,因为在DALL·E 2中作者发现很有趣的一点是DDPM之后优化了扩散模型,大家都从预测图像转变到了预测噪声上,但是在这个实验里作者发现直接去预测特征得到的效果会更好。
以上就是整个DALL·E 2 模型的方法介绍。图像生成这边的模型很难画框架,不看代码的话很难把握整体方法,所以感兴趣的可以自己去再去过一下代码。当然了,不用找代码了DALL·E 2不开源,所以大家只可意会了。