OpenAI DALL·E 3文生图模型技术揭秘(建议收藏)

欢迎来到魔法宝库,传递AIGC的前沿知识,做有格调的分享❗

喜欢的话记得点个关注吧❗


DALL·E 3是OpenAI发布的一款文生成图AI系统,它无缝接入ChatGPT,通过接受文本提示作为输入,生成相应的图像作为输出。先来看看效果:

自发布以来,DALL·E 3一直备受关注,许多人对其背后的技术非常好奇。现在,我们就来探讨一下DALL·E 3的技术细节。

DALL·E 3主要是基于DALL·E 2进行了一些改进 , 研究者们在论文中是这么介绍的:

DALL·E 3 builds on DALL·E 2 by improving caption fidelity and image quality.

因此,在介绍DALL·E 3之前,我们先来回顾一下DALL·E 2的模型架构。

DALL·E 2 介绍

DALL·E 2 这个模型的任务很简单:输入文本提示内容,生成与文本高度对应的图片。该模型主要包括三个部分:CLIP,先验模块prior和decoder模块。 其中CLIP又包含text encoder和img encoder。

如下图所示的是DALL·E 2的模型框架,该模型是分阶段进行训练的。

虚线上方展示了CLIP的训练过程,通过该过程可以学习到一个文本和图像的联合表示空间。

虚线下方展示了文本到图像的生成过程: 首先将CLIP文本embedding输入到一个自回归或扩散prior中,以生成一个图像embedding,然后使用这个embedding来调节扩散decoder,生成最终的图像。需要注意的是,在prior和decoder的训练中,CLIP模型是被冻结的。

CLIP

DALL·E 2的训练数据是由图像x和对应的图像描述y的pair对(x,y)组成。通过训练CLIP能得到图像x的embedding zi和文本embedding zt。

Prior

A prior P(zi|y) that produces CLIP image embeddings zi conditioned on captions y.

给定图像描述文本y,利用CLIP训练好的text encoder将y编码为zt,同时,利用CLIP训练好的img encoder将图像x编码为zi。在训练prior的过程中预期是能够输入zt产出zi,假设zt经过prior输出的特征为zi',那么我们自然希望zi'与CLIP产出的zi越接近越好,通过这种方式来更新DALL·E 2的prior模块。

最终训练好的prior,将与CLIP的text encoder串联起来,它们可以根据我们的输入图像文本描述y生成对应的图像embedding zi了。

prior可使用Autoregressive (AR) prior或Diffusion prior,这两种方式在效果上差异不大,但是Diffusion prior在训练效率上优于Autoregressive (AR) prior。因此,最终DALL·E 2选择Diffusion prior。

Decoder

A decoder P(x|zi,y) that produces images x conditioned on CLIP image embeddings zi (and optionally text captions y).

DALL-E 2使用的decoder是改进的GLIDE模型,这个模型可以根据图像编码zi,还原出与图像x语义相同,但又不完全一致的图像。

Generative Stack

decoder允许根据图像embedding来生成图像,而prior则允许学习图像embedding本身的生成模型。将这两个组件堆叠在一起,就能够得到给定图像文本描述y的图像x生成模型P(x|y):

第一个等式成立是因为zi是x的确定性函数。第二个等式成立是因为链式法则。因此,首先通过prior生成zi,然后再使用decoder从zi中解码出图像x。

DALL·E 3 介绍

DALL·E 3延续了DALL·E 2的模型架构,但是它在DALL·E 2的基础上做了进一步的改进。

在文生图领域中,有一个关键的挑战是确保模型能够理解文本并生成与之相匹配的图像。 通常情况下,文生成图模型可能会忽视给定的文字描述中的词语、词顺序或具体含义,即所说的"prompt following"问题。作者认为这个问题的关键原因在于训练数据集本身的质量不够高。在训练数据集中,很可能存在许多与图像对应的描述不准确、不精细的情况。因此,为了解决这个问题,需要改进训练数据集的质量,以确保准确地捕捉文本与图像之间的关联。

因此,DALL·E 3采用了一种全新的方法来解决prompt following问题,即caption改进(caption improvement)。 首先训练了一个强大的图像-文本描述生成器,这个生成器能够以详细准确的方式描述图像。接着,将这个图像-文本描述生成器应用于文生图的训练数据集,生成更加详细的图像文本描述内容,从而得到了配对质量较高的新数据集。最后,使用这个优质的新数据集来训练文生成图模型。通过这种方法,可以有效地提升文生成图模型的性能和生成质量。

构建图像-文本描述生成器(image captioner)

DALL·E 3通过构建一个图像-文本描述生成器(image captioner) 来合成图像的文本描述内容。这里选用的模型架构是Google的CoCa

该图像-文本描述生成器的目标如下所示:

其中t=[t1,t2,...,tn]代表文本,i代表图像,F(i)是通过CLIP模型产出图像embedding表征的函数,Θ为需要优化的图像-文本描述生成器的参数。

微调图像-文本描述生成器(image captioner)

为了获得更高质量的图像文本描述,OpenAI对预训练的图像-文本描述生成器进行了进一步微调,并生成了两种类型的文本描述内容:

  • short synthetic captions (SSC): 图像的简短文本描述,主要描述图像中的主体内容。
  • descriptive synthetic captions (DSC): 图像精细的文本描述,详细的描写了图像的内容,包含很多图像中的细节。

在下面的样例图像中,我们可以看到原始caption、SSC和DSC之间的差异。DSC描述非常丰富,包含了许多细节,而原始描述则比较简单,质量较低。

OpenAI采用CLIP score来评价image captioner的prompt following能力,从下图可以看出,采用了DSC来计算CLIP score时,模型在整体上的表现要优于SSC和原始caption。

上面的实验已经验证了使用DSC可以显著提升模型的prompt following能力,那最佳的混合比例是多少呢?下图给出了答案,从图中可看出使用95%的DSC时效果最佳,DALL·E 3在后续的训练过程即采用的该方案。

接入ChatGPT

训练数据集中高比例的DSC能够显著提升文生图模型的训练效果,但是95%的混合比例可能会导致模型在训练过程中过分拟合DSC,从而导致用户输入简短的caption时模型的效果不好

为了解决这个问题,OpenAI接入了GPT-4来提升用户输入的caption,使用GPT-4优化后,无论用户输入何种类型的caption,都能得到一个描述更精细的caption。 这样的优化能够解决模型在使用常规短文本输入时图像生成效果下降的问题。下图展示了具体的例子。

参考文献

  • 论文1:Hierarchical Text-Conditional Image Generation with CLIP Latents
  • 论文2:Improving Image Generation with Better Captions
  • 论文3:CoCa: Contrastive Captioners are Image-Text Foundation Models
  • 论文4:DALL·E 3 System Card

如果对AIGC感兴趣,请关注我们的微信公众号"我有魔法WYMF ",我们会定期分享AIGC最新资讯和经典论文精读分享,让我们一起交流学习!!

相关推荐
这个男人是小帅26 分钟前
【GAT】 代码详解 (1) 运行方法【pytorch】可运行版本
人工智能·pytorch·python·深度学习·分类
__基本操作__28 分钟前
边缘提取函数 [OPENCV--2]
人工智能·opencv·计算机视觉
Doctor老王33 分钟前
TR3:Pytorch复现Transformer
人工智能·pytorch·transformer
热爱生活的五柒33 分钟前
pytorch中数据和模型都要部署在cuda上面
人工智能·pytorch·深度学习
爱吃生蚝的于勒2 小时前
C语言内存函数
c语言·开发语言·数据结构·c++·学习·算法
HyperAI超神经2 小时前
【TVM 教程】使用 Tensorize 来利用硬件内联函数
人工智能·深度学习·自然语言处理·tvm·计算机技术·编程开发·编译框架
扫地的小何尚4 小时前
NVIDIA RTX 系统上使用 llama.cpp 加速 LLM
人工智能·aigc·llama·gpu·nvidia·cuda·英伟达
埃菲尔铁塔_CV算法7 小时前
深度学习神经网络创新点方向
人工智能·深度学习·神经网络
ChoSeitaku7 小时前
链表循环及差集相关算法题|判断循环双链表是否对称|两循环单链表合并成循环链表|使双向循环链表有序|单循环链表改双向循环链表|两链表的差集(C)
c语言·算法·链表
Fuxiao___7 小时前
不使用递归的决策树生成算法
算法