当前位置:AIGC资讯 > AIGC > 正文

DALL·E 2(内含扩散模型介绍)【论文精读】Hierarchical Text-ConditionalImage Generation with CLIP Latents

1官方对模型的介绍

        大家好,今天我们就一起来看一下两个月之前 OpenAI 刚放出来的一篇力作。DALL·E 2是 OpenAI 一系列文本图像生成工作的最新一篇。去年 1 月份他们先推出了Dolly,然后在年底的时候又推出了glide。然后现在 4 月份刚推出了 DALL·E 2 一出来其实网友就已经炸开了锅。我记得那两天的 Twitter 上或者说 Instagram 上到处都是DALL·E 2生成的图片,所有的论坛上基本都被DALL·E 2刷屏了。虽然网上有很多很好玩的很新奇的生成了一些图片。但是OpenAI这里自己做的这个DALL·E 2介绍更是非常精美。所以我们就先来看看它是怎么宣传达力兔的。作者上来先说 Dolly two 是可以根据这个文本描述去生成这种原创性的真实的图片。

        这个原创性很重要,因为大家经常觉得你这个模型是不是在很多很多的这个数据上训练之后,它其实就是把这些图片记住了,然后接下来它就不停地复制粘贴去生成新的图片而已。但是作者这里认为 Dolly two 是能生成原创性的图片的,也就是说是这种FAKE image 是从来没有在训练机里出现过的图片。然后作者接下来。说, Dolly two 是真的把图片文本里那些特征都学到了,所以说它可以任意的去组合这种概念或者属性,或者这种风格。然后接下来 open i 就举了几个例子,那左边就是这个文本描述,从上到下一共有三行,分别对应的就是这个概念、属性和风格。那比如说我们现在如果选定一个宇航员骑着一匹马,而且是这种写实的风格,那它就会生成像右图这样的图片,我们可以看出这个图片的语义其实和这个文本描述非常的贴切,而且这个细节也非常的逼真。那如果我们现在换一下这些概念或者风格会怎么样?比如说我们现在换一下一碗汤,然后属性变成了去另外一个空间的传送门,然后风格就是一副数字画,然后 Dolly 就能生成这么一张图片真的是让人瞠目结舌。这个其实都可以直接拿去做插画或者当任何广告的这个宣传画了。那最后我们再看一个例子,如果我们把最上面这个概念换成Teddy bear。然后属性就是说。他们正在做最新的这种 AI 研究,然后风格就是在 1980 年代的那个月球上,DALL·E 2就真的能够生成有两只 Teddy bear,然后在电脑跟前做什么工作。而且是在月球表面。这个生成效果真的是非常的不可思议。

        那除了根据文本直接去生成图片之外,那 OpenAI 这里说 Dolly two 还能做的事情就是根据文本去对已有的这个图片进行编辑和修改。它可以任意添加或者移除现在图片里的物体,而且甚至能够把这些阴影光的反射,还有这些物体的纹理全都考虑在内。这里作者又举了几个例子,比如说左边这张图片是一个室内的一个大厅,然后他现在文本就给这对应的这一二三个位置上去添加一只火烈鸟。那现在如果我们把这个火烈鸟添加的位置改成3,那我们可以看一下,诶,就在 3 的这个位置上就生成了两只火烈鸟。而且dollytwo 的这个生成它不是一对一映射关系的。因为它使用的是一种叫扩散模型的结构去做这种图像生成,所以它可以生成任意多的图像,但是大体内容都差不多。只不过具体的细节不太一样。那作者这里还给了很多别的例子,比如说它生成的里头也有一只火烈鸟,或者说还有脖子更长的火烈鸟。而且这里我们可以注意到这里的火烈鸟其实在水里还有倒影。那更神奇的是如果我们把现在火烈鸟添加的位置改成这个位置2。我们就会发现模型其实是在这个水面上放了一个火烈鸟形状的游泳圈。这生成结果其实也是很合理的。因为一般在室内的这种泳池或者水面上不太可能会出现真的火烈鸟。往往是这种火烈鸟形状的游泳圈。那现在如果我们再换一个场景,比如说换到这个室内大厅里面,文本描述是添加一个沙发。我们就会发现DALL·E 2可以生成各式各样的沙发,而且还可以变换颜色。而且还可以变换样式。然后如果我们换一个位置,加到这个 2 的位置,它又会生成新的沙发,但是就是在对应的这个位置之上,瞬间觉得其实以后的这个家装设计,家装装修也没有那么难了。给一个平面图想加什么加什么想在哪加。

        然后Dolly。two 还能干很多事情。即使在没有文本输入的情况下, Dolly two 依旧可以做一些图像生成的工作。比如说这里你给定一张图片,它就可以根据已有的这张图片和它的风格去生成很多类似的这种风格的图片,而不改变已有的这个语义。那比如说这张世界名画经过DALL·E 2的变换之后,就变成了右边这个样子。而且就像我刚才说的一样, Dolly two 这个模型不是一个一对一的影射,它其实是可以生成很多种类似的图片的。比如这里人头的方向改变了,然后这这里头巾的样式改变了。当然人的长相一般也都有微妙的改变。如果这里我们再看另外一幅世界名画,这个星期日的下午。我们就可以看到DALL·E 2真的是真实的模仿了这种风格,然后又生成了很多很多种这样不同的图片。所以说在Dolly two 这个工作出来之后, OpenAI 的 CEO 本人都在。Twitter 上说。他觉得他之前对 a i 的理解可能有都有了错误。因为我们一直觉得 a i 是能够先处理这种就是重复性的工作,体力工作。而这种带有创造性的工作往往是 AI 无法取代的。但在现在看来,这种艺术的创作反而好像已经触手可及了。

2生成效果对比

        那在作者卖完了这些最惊艳的结果之后。作者就把Dolly two 跟大力的这个生成效果对比了一下。那这里这个例子就是用同样的文本生成的两张图片,我们可以看到 Dolly two 可以生成之前四倍的这个分辨率,所以说看起来更清晰也更逼真了。那如果光拿一张图举例,大家可能不信。所以作者这里。又做了另外一个实验。就是他找了一些志愿者,然后让这些志愿者看1000张图片。那分别是Dolly生成的和 Dolly two 生成的。那最后统计的结果就是有70%。的人认为 Dolly two 生成的图片跟这个文本描述更贴切,然后有将近 90% 的人认为达利兔生成的图片要比达利生成的图片要更真实。

3安全性考虑

        最后。又是老生常谈 OpenAI 经常搞这个大模型、大数据这个东西,然后到最后他就跟你来谈一谈这个安全考虑或者道德公平性伦理这种考虑。它这里就说我们暂时还不能开源,也不能 release 我们的模型,我们甚至连API都不开放。目前 OpenAI 就只是把它们的 API 开放给了一小部分用户,然后让他们去做这种内测或者做一些研究,看看DALL·E 2到底有什么缺陷,有什么限制。那其实作者这里说的这些安全考虑,主要就是说怕用户去生成这种带有暴力的或者成人的,或者带有政治色彩的这些图片。当然了,网上收集的这种图像文本对肯定会带有很多这种偏见和公平性的问题。那如果你现在觉得 Dolly two 很吸引你,然后想去玩一下的话,那你就可以加入 Dolly two 的这个waiting list。但是这个 waiting list 应该很长,我也早在一个半月之前就申请了,但是至今没什么消息。从 Twitter 和 Reddit 使用的情况来看, open i 主要是把优先权给了那些大v,说白了就是让他们去给DALL·E 2做这种免费的宣传。那对于大部分。没有排上 waiting list 的小伙伴来说如果你非常想尝试一下大力模型。那这里其实 GitHub 上有一个开源的大力库,叫做 Dolly Mini,目前我们可以看到它的 star 也已经有 9000 个了,虽然它的模型都是在比较小规模的数据集上去训练,而且模型本身也比较小,所以说最后的结果不是那么好。但是玩起来已经很有意思了。这里你。当然可以把他的代码下来,在你本地上去跑,或者你就像他这里说的一样,打开这个Colab,然后在Colab里去用。那再或者最简单的一个方式就是直接用APP。也就是它这里最上面说的这个 hugging face 的这个应用。那 hugging face 大家肯定都不。陌生了。算是现在最流行的 NLP 的开源库,而且已经渐渐有变成 CV 甚至多模态里它最流行的库的趋势。那 hugging face。这边它就提供一个东西叫space,就是一个空间。然后大家可以把它的模型代码上传到这个上面,就可以做成一个APP,然后大家就可以直接来玩儿。比如这里就是一个 Darling mini 的一个应用APP。大家就可以。随意把你的这个文本写在这个文本框里,然后点一下这个wrong,底下就会出来很多这个 Dolly mini生成的图片。这里因为太多人玩了,所以经常排不上队,我就提前体验了一下,我现在可以把我跑的例子跟大家分享一下。比如这里我的第一个例子就是有一只狗在月球上奔跑。我们可以看到这个模型小了确实还是不行,生成的这个画质还是渣了不少。但是它大概生成的这个意思还是在那下一个例子就是一只狗和一只猫在打架。那这些图片。里也基本都有一只狗和一只猫在对峙,但是这里话就比较抽象,没有那么的写实。比如说这里是个狗头旁边接了两个这种身子,一个白色一个黄色,你也不知道他接的是哪个。然后下面这张图看着猫好像是在打架的样子,可是这个猫脸也没有了,对整体上还是比较糙的。然后再来生成一张实物的照片,就是边吃拉面边吃Sushi。这里生成这些图片质量还不错,可能是因为这个例子比较简单,因为它就是两个物体,拉面和 Sushi 都是比较常见的物体,所以说生成的也就比较逼真。然后最后就是在亚马逊 AWS 种西红柿,但是模型应该还不理解什么是AWS,对,它就是把西红柿画出来了。这个在DALL·E 2本文里也有介绍,就是当这个文本太过复杂,场景太过复杂的时候,其实模型还是会选择一个最简单的场景,然后把它生成出来。

4跟进工作

        那不论是。OpenAI 生成的这种精美的高清大图还是我用Dolly mini 生成的这种画质比较糙的小图片,总之 Dolly 系列的工作这种根据文本去生成图像的质量还是非常好的,而且可以说是出人意料的好。所以自从Dolly在 21 年 1 月份出来之后,后续就有一大堆工作进行跟进。

比如说在21 年 5 月份的时候,清华就推出了 cogview 这个模型,它还支持中文去生成图像。 然后到 11 月份的时候,微软和北大就推出了这个女娲模型不光能生成图像而且还能生成比较短的视频。然后到 12 月份。open i 自己又推出了 Glide 这个模型,也就是我们今天DALL·E 2主要基于的这个图像。生成的模型。我们一会也会提到。 然后同样在 12 月,百度也推出了 Ernie Vog 这个模型,它也支持中文,而且它这个模型也非常大,有 100 亿参数,基本跟最开始这个大力 120 亿参数就非常接近了。 然后转眼来到今年 4 月份的时候, open i 又推出。了DALL·E 2。 然后同样在4月,清华又再次推出了 cogview two,紧接着一个月之后,他又推出了 COG video,就专门针对生成视频做的。 最后就在上个月, Google 也不甘示弱推出了他们自己的Imagen。 Imagen 其实相对而言模型要简单很多,而且效果也跟大力不相上下,甚至很多人都觉得 Imagen 的效果更好。但是其实Imagen 和 Dolly two 所用的模型都差不多,它们的底层都是用了扩散模型去做这种图像的生成

        所以说扩散模型真的是一个很火的方向,预感到未来几年基本上它就要取代干的这个位置,因为 Gan 其实已经没有什么可以做的了,已经被人做了五六年了,该挖掘的东西全都已经挖掘完了。扩散模型作为新起之秀,有太多太多可以提高的地方。现在扩散模型的状态基本就跟 1718 年时候那个 Gan 的状态差不多。所以应该至少还有两到三年的时间去充分发挥它的潜力。

5题目 Hierarchical Text-ConditionalImage Generation with CLIP Latents

        那前面说了这么多,接下来我们言归正传,一起来精读一下DALL·E 2这篇论文。首先我们看一下题目。作者说使用 clip 训练好的这种特征来做这种层级式的,依托于文本的图像生成。

这里层级式的意思是因为 Dolly two 的这个模型是先生成一个小分辨类的图片,比如说 64 * 64,然后再利用一个模型上采样到256 *256。然后再使用一个模型上采样到 1024 * 1024,变成一个高清大图。所以是一个层级式的结构。 然后DALL·E 2本身完成的任务就是根据提供的这个文本,从而去生成这个新的图像。那至于使用CLIP 提供的这个特征,其实DALL·E 2这个模型是先训练好了一个 CLIP 模型,然后找到图片和文本对之间的这种相连关系之后,这个时候给定一个文本, CLIP的文本编码器就可以把这个文本变成一个文本特征,然后 Dolly two 就训练一个prior 模型。这个模型的输入是这个文本特征,然后它的输出是这个图像特征。然后再把这个图像特征给接下来的这个解码器,从而生成一个完整的图像。所以说整个大力图模型是离不开CLIP特征的。

        作者团队都来自OpenAI,大家应该都很熟悉了。这里的一作, Adida 其实参与过clip 和Dolly的工作。mark 也是 Dolly 的原班作者,而且它主要是做 Codex 和 GPT 3 的。但是因为大力兔这篇论文,它这个图像解码部分主要用的是 diffusion model,就这个扩散模型,所以说又找了两个扩散模型的这个专家。他们做过iGPT,而且最近刚写过 improved DDPM 这篇论文,也就是 denosing diffusion model,所以把扩散模型玩儿的是很溜。所以一会儿我们也可以看到 Dolly two 这个模型,其实就是 CLIP 模型加上 Glide 模型,而 Glide 模型就是一个基于扩散模型的文本图像生成的方法。那从作者这里也可以看出来,就是 CLIP 的作者加上Glide 的作者。

6论文结构

        那在精读论文之前,我们先来看一下文章的整体结构大力 two 这篇论文其实不长,跟 clip 的四五十页比起来,大力 two 其实只有 27 页。如果你把后面的这些可视化,还有这些参考文献都去掉的话,其实也就十几页,而且全文这些图确实都比较多。

然后论文上来先是说摘要, 然后是引言,然后在引言部分贴了 9 个高清大图,就展示了一下他们生成的这种 1024 * 1024 的这些大图到底画质有多么的好。 然后接下来就是达利兔论文的这个主体方法部分,其实只有短短的两页,然后在这里作者甚至都没有去讲clip,他认为你已经知道 clip 是什么了,主要就讲的是它后面图像生成这一部分。比如说这里它就先讲了一下 decoder 这个解码器。下面就讲了一下这个 prior 先验模型。 然后接下来作者就大概用了四五页的篇幅去介绍一下DALL·E 2到底能干什么? 然后又用了四五页的篇幅去跟别的方法做了一些对比,不光是数字上的对比,还有可视化上的这种对比。 然后最后写了一下相关工作, 最有意思的就是最后几页,他描述了一下 DALL·E 2 two 的这个现在的局限性和不足。其实当我们最后看到这些不足的时候,我们会发现其实DALL·E 2图还有很多需要提高的地方。它远远没有我们看到的那几张图片一样那么惊艳。 接下来是参考文献, 这里是一些具体的这个训练细节, 最后又展示了一下,根据同样一个文本,它能够生成不同的输出,而且每一张输出的图片都非常清晰和逼真。

7摘要

        那接下来我们直接看摘要作者上来说之前的那些对比学习的方法,比如说我们 open i 自己的 CLIP 模型,这种模型已经可以学习到很稳健的一个图像特征。它既能够抓住这个语义信息,又能抓住这个图像的这个风格信息那既然这个特征这么好,这么稳健,那如果你只拿它去做这种分类任务就有点可惜。所以作者接下来说,为了能够借助于这些特征,然后能用来做这个图像生成。我们提出了一个两阶段的一个模型,这两个阶段分别叫 prior 和这个 decoder ,prior就是给定一个文本描述,它能够给我生成一个类似于 clip 的一个图像特征。然后解码器的意思就是说当你给定这个图像特征之后,我能根据这个特征生成一个图像。

        所以这个过程。其实说直白点儿就是给定一个文本,然后我先用一个 clip 模型把它生成一个文本的特征。这一步是固定的,因为这里这个 clip 模型是锁死的。然后接下来就到文章说的这个两阶段的模型,它根据这个文本特征去生成一个图像特征,这一步就叫做prior。当然 clip 模型在这里也有用了,因为 clip 生成的那个对应的图像特征是用来在这里做 ground truth 用。

        然后你一旦有了这个图像特征,我就需要有一个这个解码器去生成最后的这个图像,然后就完成了这个从文本到图像的生成过程。

        然后作者接下来说,他们发现就这种显式的去生成这种图像特征的方式,能够很显著地提升图像的这个diversity,就这个多样性。也就是说加上prior这一步是有好处的。而且对于这个图像的这个写实程度,还有这个跟文本的这个匹配程度都没有什么损失。就是说我生成的这个图又逼真又多样,那这个特性还是非常好的。因为我们大家都知道Gan生成的图像。虽然非常的逼真,因为它本来的目的就是以假乱真,但是它的多样性不太好,生成的图像都长得差不多,不太具备这种原创性。所以这也就是最近的模型,像 DALL·E 2 two 和Imagen,它都使用扩散模型的原因,因为它的多样性好,它有创造力。

        然后作者接下来就。强调了一下他们这个基于扩散模型的这个解码器能够基于给定的这个图像特征,但是生成很多不一样的这个图片。但是这些图片它的这个语义信息和风格都是比较接近,只不过是一些细节不太一样。

        接下来作者又开始卖另外一个点,就说因为我们这个是通过文本生成图像,所以我们就很容易地通过 CLIP 这个模型作为中间那个桥梁,从而达到这个能用文本去直接对图像进行编辑的功能,而且是 Zero shot 的,就是你不需要去训练。你直接拿来这个DALL·E 2的模型你就可以去用了。就跟我们之前展示的那个在大厅里放沙发的那个例子一样。你就可以在任意一个地方去加个沙发,加个椅子,或者把这个沙发去掉,把这个壁画去掉,你可以实时的利用这种文本的信息去引导这个模型去生成各种各样你想要的图片。

        然后作者最后说了一下模型的结构,他说他们的这个解码器用的是这个扩散模型,然后在他们的这个 prior 模型里,它试了这个 auto regressive 自回归模型和这个扩散模型。但最后他们发现。还是这个扩散模型效率又高,最后生成的效果又好,所以整体上DALL·E 2 就是一整个都是扩散模型。我其实没太明白那作者为什么要把这句话当成最后一句话,能作者们觉得这个才是他们最想表达的一个观点。也就是说接下来大家都来使用扩散模型。所以把模型结构这个东西放在了最后,当成压轴的一句话。

8引言

8.1CLIP 学到的这个特征还是非常好的

        接下来我们一起读引言。作者上来说视觉领域最近的一些进展,主要就是使用了更大的这个模型,而且使用了更大这个数据集。这个数据集主要是这个图像文本对儿,也就是带用标题的这种图像,那代表作之一就是他们自己的这个CLIP 模型了。 通过最简单的那种对比学习的方式,就能够学习到一个很好的这个特征。我们之前也讲过 CLIP 这篇论文,首当其冲的就是他们有这个特别好的这个 Zero shot 的能力,就是任何一个图片拿过来,你给一些你感兴趣的这些标签,它就能把这个图片分给其中的一个标签,所以它能够识别很多很多很多的类,远比 image net 1000 类要多,非常的灵活。然后 clip 学到这个图像特征也很稳健,尤其是对这种分布偏移,非常的稳健。但其实上次我们在 clip 论文里也读过,如果真的遇到那种 OOD 的样例。就是完全不在当前的分布之内的话, clip 模型也一筹莫展,就连最简单的 0123456789 它都识别不好。然后作者这里又说 CLIP 还有一个好处,就是说如果你去做这种 fine tuning 的话,它能够在一系列的这种视觉或者文本的任务上取得很好的成绩。就是总体而言CLIP 学到的这个特征还是非常好的。

8.2扩散模型也变成了在这个图像生成领域里一个非常好用的一个工具

        然后接下来作者这个话锋一转。直接说这个扩散模型也变成了在这个图像生成领域里一个非常好用的一个工具,能够在这个图像还有这个视频生成上都达到了这种就是最好的程度。那其实。扩散模型在很早之前就提出了,其实 15 年就提出了,甚至有可能更早就已经提出了,它是一种概率分布模型,所以说它生成这个图片是从一个分布里去采样,所以它的这个多样性非常的好,但是它的保真度比不过GAN。因为干本身就是为了这个以假乱真去优化的,所以说那个干生成的图像就特别的逼真,细节就特别的好。但是扩散模型就做不到这一点,至少是在数值比较上,比如说 exception score 或者说 FID score,在这些上面 Gan 一直都是压着diffusion model 打。

        但是从 20 年开始就有一系列的工作把这个扩散模型的这个保真度做得更好了。比如说刚开始的 DDPM 到后来的 improve 的DDPM。然后到 diffusion model beat again,意识到最新的 glide 和打理two。这一系列的工作采用了很多小的这些技巧,其中有一个比较著名的就是这一个叫引导的技巧 guidance technique,它能够牺牲一部分这个多样性,从而能达到更好的这个保真度,这样的话这个扩散模型一下在数值比较上就跟这个gan不相上下了。所所以这也就造就了扩散模型这两年的火热,因为它也算是SOTA 了。那这样大家就可以去跟进这个工作了,否则老怕过不了深稿人那一关。

8.3高清大图展示生成效果

        那接下来第二页作者就放了一个九宫格,展示了 9 张这个高清大图。我们这里也可以看几个例子。比如说这个图片。就是说一个柴犬带了一个贝雷帽,而且穿了一个黑色的高领毛衣,我们可以看到这个贝雷帽和这个高领毛衣。而且真的这是黑色的,下面是红色,当然是任意生成的。而且这个狗的这个鼻子嘴各种细节都生成。得非常的好。而且甚至这个背景还是。虚化。的,搞的真的跟一个近景拍摄的一个照片一样。然后这张图写的是一个疯狂的一个熊猫科学家,正在把一些冒泡的这个化学物质混合到一起。确实也是栩栩如生。然后最后还有这个一个海豚穿着宇航服在这个土星外面游荡,或者说在这个时代广场上有一个小的熊在这个滑板上。这 DALL·E 2 two 这个模型不光是把。这些物体画出来了,而且真的是把这个泰迪熊画到这个滑板之上。而且他也真的理解这个时代广场长这个样子。所以当大家看到这些图之后,脑海中只能觉得DALL·E 2图这个模型真的是太强了。

8.4模型示意图

        这里我们就不看引言的第二段和第三段了,因为其实就直接看这个图 2 就能知道他们在说什么。

        作者这里把这个图画成了两部分,上半部分其实就说了的是这个clip。下半部分其实才是真正的这个 DALL·E 2 two,那我们一个一个来看。

        首先我们来看上面的这个 clip 模型,我们来复习一下CLIP 模型,就是说我给定一个文本,然后我给定一个对应文本的这个图像,它俩是一个对,然后这个时候我把这个文本通过一个文本编码器得到一个文本特征。然后图像通过一个图像编码器得到一个图像特征,那这两个就应该是一个正样本,那这个文本跟其他的图像就应该是负样本。然后我通过这种方式去做这个对比学习,从而最后把这个文本编码器和这个图像编码器都学得很好。而且这个文本和图像的特征真的就联系在一起了。是一个合并的、多模态的一个特征空间。那一旦这个 CLIP 模型训练好之后,其实这个文本编码器和这个图像编码器就锁住了,就是在 DALL·E 2 two 这篇论文里, CLIP 的这个模型一直都是锁住的,它是不会进行任何训练和fine tuning。

        那接下来就是作者在摘要里说过的这个两阶段的训练方式,第一个阶段就是prior,第二个阶段就是decoder。那其实最暴力的做法就是说如果我要根据这个文本去生成最后的这个图像。那其实我这中间有个大模型,中间反正就去学一些融合的特征,我是直接生成就可以了。但是就像作者在摘要里说的一样,如果中间有这么一个显示的,生成这个图像特征的一个过程(prior)——就是先从文本生成文本特征,然后再生成图像特征,然后再由这个图像特征生成最后的图像,这个效果就会好很多。所以他们才采取了这种两阶段的方式。那具体来说在训练的时候就是首先我给定一个文本,然后通过一个锁住的 CLIP 的这个文本编码器,我就得到了一个这个文本特征。所以说其实这里这个文本和这个文本特征都是固定的,是有一对一映射关系的,然后我想通过这个文本特征得到对应的这个图像特征。那这个怎么学习?作者这里就说因为 CLIP 这边也有这个图像特征。所以在训练的时候我是有这个图像文本对的,我就可以先把这个图像得到这个图像特征,然后拿这个图像特征过来当这个 ground truth 去监督,那意思就是说我要用这个文本特征去预测这个 ground truth 的这个图像特征,通过这种方式就把这个 prior 模型给训练出来了。这样等到真正做推理的时候,也就是说我只有文本没有配对的这个图像的时候,我这个文本先生成一个文本特征,我还是能够通过训练好的这个 prior 模型去得到一个类似于 clip 生成的那个图像特征。那这个图像特征按道理来说应该非常好,它既能够用来生成一个图像,而且它还是能够跟这个文本之间是有对应联系的。

        然后一旦我们训练好了这个 prior 模型,我们拿到了这个图像特征。那接下来就是用一个比较常规的一个扩散模型,一个解码器去生成最后的这个图像而已,具体的细节我们接下来再讲。

        所以我们可以看到,其实DALL·E 2图这篇文章就是把 CLIP 和 Glide 两个模型合在了一起,但是里面有很多值得借鉴的技巧,而且大力奇迹这个效果也非常好,所以DALL·E 2这个工作的影响力还是非常巨大的。然后其实另外一个比较有意思的事情就是,其实在 DALL·E 2 two 这篇论文里,它并没有管自己叫 DALL·E 2 two,它其实给自己的起的名字叫做unclip。那为什么是onclip?因为对于 clip 来说,它是给定文本图像,它最后是想得到这个特征,然后拿这个特征去做图像匹配去做图像检索之类的。所以它是一个从输入到特征的过程,但是对于DALL·E 2来说,它是通过一个文本特征,然后到图像特征,然后最后到图像的过程。所以它其实是一个clip的反过程,它是把特征又还原到了这个数据,所以说作者挂他们整个的这个框架叫做un clip。所以说当你听到别人说 un clip 的时候,不要觉得这是另外一篇新的论文,其实它就是DALL·E 2。

9方法

        那接下来。我们就来看一下文章的主体方法部分。但其实对于DALL·E 2 two 来说,它的这个文章主体方法部分就只有两页,内容非常的少,它主要分为两段,这一段讲的是这个decoder,然后这一段讲的是这个prior。因为 decoder 就是一个升级版的 Glide 模型,所以说它这里主要就写了一下和之前 Glide 模型的这个区别,都是一些实现上的细节。完全没有讲这个方法本身是怎么做的。

        prior 这个章节其实写的也是很简单,里面都是一些实现上的细节。所以如果我们只看 DALL·E 2 two 这一篇文章的话。我们是很难知道这个总体模型到底长什么样。输入输出是什么?这个目标函数是什么?就很多这种问题都无法从这篇论文里得到答案。

        所以鉴于此,在这里我准备先把这个图像生成这块之前的一些工作先大概介绍一下,非常简略的从刚开始的这个 Gan 模型,然后还有 auto encoder, variational auto encoder 就是 VAE 这一系列的工作。然后再到最新的这个 diffusion model 扩散模型以及它的一系列后续工作。

9.1图像生成之前的工作:GAN,好用但是训练不稳定

        那我们先来看Gan, Gan 的话就是左右手互搏,对吧?你要训练两个网络,一个叫做 Generator 就是生成器,一个是discriminator就是判别器。生成器这边就是说你给定一个这个随机噪声z,它就会给你生成一些东西,在这里我们希望它能生成一个比较真实的图片x。然后我们把这个生成的图片x'给这个判别器,同时我们再给一些这个真实的图片x给这个判别器。然后让这个判别器去看到底哪个是真图片,哪个是假图片,所以说后面其实就是一个零一的这个二分类问题。

        然后就通过这个 Generator 和 discriminator 这两个网络之间这个互相较量,然后这个判别器不停的提高自己,然后这个生成器也不停的提高自己,所以说最后能生成这种比较真实的图片。而事实上。因为 Gan 的这个目标函数就是用来以假乱真的,所以说截止到目前为止, Gan 生成的图片这个保真度也是非常高的,就真的是人眼也不好区分它生成的图片是真是假。所以这才有了deepfix 的火爆。然后不光是真实,而且经过这么多年对 Gan 的这个模型改造之后, Gan 其实现在也比较好用。需要的数据也不是那么多,能在各个场景底下使用,所以优点还是蛮多的。

        但它有一个最致命的缺点就是它还是这个训练不够稳定。最主要的原因就是它要同时去训练这两个网络,所以说就有一个平衡的问题。经常如果训练的不好,这模型就训练坍塌了。而且因为 Gan 的这个主要优化目标就是让这个图片尽可能的真实,但是它生成图片的这个多样性就不太好。它的这个多样性主要就来自于刚开始的这个随机噪声,简单点儿说就是它这个创造性还不太好。然后最后它不是一个概率模型,它的这个生成都是隐式的,它就是通过一个网络去完成的,所以你也不知道它做了什么,你也不知道它遵循了什么分布,所以说 Gan 在数学上就不如后续的这个 VAE 或者这些扩散模型优美。

9.2图像生成之前的工作:auto encoder

        那接下来我们看一下 auto encoder 以及到后来的这个 VAE 和VQ VAE。

        那 auto encoder其实非常简单了,也是很早之前的技术了。大概意思就是说你给定一个输入x,然后我过一个这个编码器,然后就能得到一个特征Z,这个特征的维度一般都会小很多,所以说我们也管它叫这个bottleneck。然后再从这个bottleneck 开始,我们过一个这个解码器,然后最后得到一个图像x'。

        然后这个训练的时候目标函数就是说我们希望这个图像能尽可能的重建之前的这个x。因为是自己重建自己。所以说这也就为什么叫 auto encoder,就是自编码器,然后在这个自编码器 AE 出来之后,紧接着就出来了一个 denoising auto encoder 就是个Dae,

        其实说白了它就是先把这个原图进行了一定程度的这个打乱,比如说变成了一个 x c,就是corrupted x。然后把这个经过扰乱过后的这个输入传给这个编码器,然后后续都是一样的,我们还是得到了一个 bottleneck 的特征,然后通过解码器然后最后得到了一个输出。然后我们还是希望这个输出能够重建原始的这个x,而不是说去重建这个经过扰动之后的x。这个改进证明非常的有用,尤其是对视觉这边来说就更有用,会让这个训练出来的模型非常的稳健,也不容易过拟合。其实部分原因就是说因为图像这边这个像素,它这个冗余性太高了。所以你即使把原来的这个图片做一些这个污染,其实模型还是能抓住它的这个本质,然后去把它重建出来的。这个其实也就有点最近凯明这个 Mae 的意思了,对吧?也是 mask 的 auto encoder 这个掩码自编码器。他在训练的时候之所以能够 mask 掉75%,就是这么多的这个图像区域,还能把这个图像很好的重建出来,也就说明了这个图像它这个冗余性确实是高。也就从侧面证明了这种 denoising auto encoder 或者这个 mask auto encoder 它的这个有效性。但其实不论是 AE 还是 DAE 还是MAE。他们主要的目的都是为了去学中间这个bottleneck特征的。然后把这个特征拿去做一些这个分类检测、分割这些任务,它并不是用来做生成的,原因就是其实它这儿学到的不是一个概率分布,我们没法对它进行采样。也就是说这里这个 Z特征并不像 gan 里面那样是一个随机噪声,它是一个专门儿用来重建的一个特征。但是这种encoder decoder 的形式确实是一个很好的结构,那我们怎么能使用这种结构去做这种图像生成?所以这就有了 VAE variational auto encoder。

9.2图像生成之前的工作:VAE,encoder decoder结构被用于图像生成

        那 VAE 其实跟 AE 是非常不一样的。虽然它的整体框架看起来还是一个输入x,进了一个编码器E,然后得到了一些东西,最后出解码器,然后最后得到一个输出x'。

        然后它的目标函数还是让这个输出尽可能的去重建原来的这个x?

        看起来好像一样,但其实有一个非常重要的区别,就是它的这个中间不再是学习一个固定的这个 bottleneck 的特征了,而是去学习了一个分布。在这里作者假设这个分布是一个高斯分布,所以说高斯分布就可以用这个均值和方差来描述。那具体来说就是当我们得到从这个编码器出来的特征之后,我们在后面加一些 FC 层,然后就去预测一个这个均值和方差,然后得到对应的这个均值和方差之后,我们就用这个公式去采样一个 z 出来,那这样 VAE 就可以用来做生成了。因为在你训练好这个模型之后,你完全可以把前面这个编码器直接扔掉,然后你这里Z,就是一个可以从这个高斯随机噪声里去抽样出来的一个样本。然后你给这个解码器你就能生成一张照片了。

        然后因为VAE 这里预测的是一个分布。那从贝叶斯概率的角度来看,那前面的这一过程就是给定x,得到 z 的这一个过程其实就是一个后验概率。然后学出来的这个distribution 其实就是一个先验分布。那至于后面这块儿就是给定了z,然后去预测一张图片 x 的时候,它其实就是likelihood。那其实也就是说。我们这里做的就是maximize likelihood。那从数学上看就干净很多优美很多。而且VAE也有一些很不错的性质,比如说因为它学的是一个概率分布,它是从这个分布里去抽样,所以说它生成的这个图像多样性就比GAN要好得多。这也就是为什么大家接下来做了很多基于这个 VAE 的这个后续工作,包括 VQ VAE,还有 VQ VAE2,以及再后来的这个DALL·E 2第一版模型,其实也就是在 VQ VE 的基础上做的。

9.2图像生成之前的工作:VQAE

        那既然说到了 VQ AE,那接下来我们就来讲一下,那这里上面就是我们刚才说过的这个VAE,然后下面就是我们马上要说的这个VQVAE。其实整体上看来也差不多。那 VQ 这里的含义就是 Vector quantized,就是把这个VE做量化。那为什么要这么做?其实原因很简单。即使现实生活中你的所有的这些信号,包括声音,然后图像可能都是连续的,或者说你大部分任务可能都是一个回归任务,但事实真的当你把它表示出来,真的当你去解决这些问题的时候,其实我们都把它离散化了,图像也是变成像素了,语音也都抽样过了。大部分工作的比较好的模型也都是分类模型,又都从回归任务变成分类任务。所以这里也一样。如果用之前的这种 VAE 的方式,它就不好把这个模型做大,这个图像的尺寸做大,而且这里这个分布也不是很好学。所以说取而代之的是不去做这个分布的这个推测,而是用一个Codebook去代替了。这个Codebook。这里面其实你可以把它理解成一个,比如说聚类的中心,这个 Codebook 的大小一般是 k 乘以d,然后 k 一般是8192,然后 d 一般可能就512。或者768。意思就是有8192 个长度为 d 的这么个向量在这个 code book 里,也就是说我们有 8192 个聚类中心。然后这个时候如果有一个图片经过编码器得到了一个特征图,这个特征图是有长宽的 HW 这种长宽的特征图。然后我们去把这个特征图里的向量去跟这个 Codebook 里的向量去做对比,然后看看它跟哪个聚类中心最接近,然后我们就把那个最接近的聚类中心的那个编码分到 z 这个矩阵里,所以说这里面可能就是一些编号,比如说一啊或者100啊之类的。

        那一旦做完了这个聚类的分配。那我们就不用之前的这个特征 f 了。取而代之的是我们把这个 index 对应的特征,比如说这里这个编号为一,那我们就去把这个编号为一的向量拿出来放到这。如果编号为10,那我们就把编号为 10 的这个向量拿出来放到这,生成一个新的特征图叫做FQ。就是 quantest feature 经过量化后的这个特征。那这个量化后的特征就非常的可控了,因为它永远都是从这个 Codebook 里来的,它不是一个随机的东西。所以说优化起来就相对容易。那一旦你有了这个特征图,其实跟之前所有的这种 autoencoder 或者 VE 就差不多了,你就通过一个解码器,然后就去重构一张图片。那这个目标函数还是让这个 x 撇,尽量跟这个 x 去保持一致。这样就完成了整个 VQVE 的训练。

        VQVE 其实非常有用,它不光是后来用到了DALL·E 2这个项目里头。它用到了视觉这边,用来做自监督学习。比如说 BEIT 这篇论文,它就是把 DALL·E 2 训练好的这个 codebook 拿过去,然后把这个图片全都 context 成这样的特征图,要拿这个要去做 ground truth 自监督的训练一个视觉网络。最近BEIT 又出了VLBIT,就是 vision language 的 BIT 也是大概的思路,只不过是用一个 transform 编码器去做多模态的任务。

        但其实说完了 VQ VAE,我们会发现他这里学习的又是一个固定的 Codebook 了,这也就意味着他又没办法像 VAE 这样去做这种随机采样,然后去生成这个对应的图片了。准确的说它不像是一个VAE,它更像是一个AE。他学的这个 code book 和这个特征是拿去做这种 high level 的任务的,也就是做分类检测的。那如果想让它做生成怎么办?其实对于 VQVE 来说,我们还需要单独再训练一个 prior 网络,那在 VQVE 这篇论文里,作者就是又训练了一个 Pixel CNN 当做这个prior 网络。从而能够利用已经训练好的这个 Codebook 去做这种图像的生成。然后在 V Q VE 之后又有了 V Q V。E 二,那其实这个就是一个简单的改进,它首先把这个模型变成层级式的了,它不仅做这种局部的建模,而且做全局的建模。加上了这种 attention 对模型的表达能力变强了。同时它还根据这个 Codebook 又去学了一个prior。所以这个生成的效果也非常的好。然后 open a i 一看,诶这个很合适。对于 v q v e 来说,它们就是先训练了这么一个codebook,然后又训练一个 pixel c n 去做这种生成,那 pixel c n 其实是一个 auto regressive,就是一个自回归的模型。那还有什么模型是自回归?那就是 open i 的看家本领 ——GPT 系列了,对吧?那 open i 就说,那我就把这 Pixel CN 换掉,换成 GPT 不就能做一个很好的图像生成了吗?而且既然 language 那边又做得这么好,那为什么不想个办法用文本去引导这个图像生成?所以就。有了DALL·E 2。

9.3DALLE2

        其实从模型上来看是非常简洁的,就如果你有一个图像文本对,这个文本先通过 BPE 编码得到一个特征,这个特征有256位。

        然后我还有一个图像,这个图像是 256 * 256,然后我就经过一个VQVE,这个 VQVE 其实就是像上面这种方法一样训练好的一个 code book。在DALL·E 2里它就直接拿过来用。所以DALL·E 2。也是一个两阶段的图像生成器。总之的把原来的图像变成这个图像特征之后,它这个维度就下降了很多,就从这个 256 乘 256 变成了 32 * 32,所以最后一共就有 1024 个token,

        那最后把这个文本特征和这个图像特征直接连接起来,就变成了一个有 1280 个 token 的一个序列。

        那接下来就没什么好说的了,无非就是把这个序列扔给一个GPT。把该遮住的地方遮住,然后让 GPT 模型去预测一个就好了。

        那至于推理。我们只需要提供一个文本,然后这个文本变成这个文本的特征,然后用这个文本的特征直接用自回归的方式去把这个图像生成出来。

        DALL·E 2的论文还有很多的细节,比如说会生成很多很多的图片,那到底选哪一张?其实它会用这个 CLIP 模型去做一个这个排位。然后把生成出来的图片跟这个文本最贴切的那个图片挑出来当做最后的生成图像。还有很多很多的这个工程细节。其实 DALL·E 2 里有将近一半的篇幅都在写怎么才能把这个 12 个billing,也就是 120 亿这么大的参数训练起来,还有就是他们怎样去收集了一个特别大的数据集,能够支撑训练这么一个模型,所以说是沿袭了 GPT 系列工作的特点,就是大力出奇迹。

10扩散模型

10.1扩散模型的网络结构以及它是如何工作的

        那说了 40 多分钟,我们才讲到了今天的主角 diffusion model 叫扩散模型。那这个扩散模型到底是什么呢?其实从概念上来看,这个过程非常的简单,

        扩散模型就是假设说你有一个图片X0,这就一张正常的图片,

        然后假设我们往这个图片里去加噪声。比如说每一步我都往里加一个很小的一个正态分布的噪声,然后得到了这个X1,那这个 X1 其实就是在 X0 的基础上,比如说多点了几个杂的点,然后我再给它加个噪声。然后接着加一直加到最后比如说我一共加了 t 次。那如果这个t特别特别的大。如果是无穷无尽的话,那最终它就会变成一个真正的噪声,它就变成了一个正态分布了。或者更专业一点,就是叫一个各项同性的正态分布。然后整个这个过程就叫做 forward diffusion,就是前向扩散过程。大家可能会想,为什么非要叫扩散模型?其实这个名字是来自于热力学的启发就是thermodynamics。他们那边就有一个名词叫做diffusion。在热力学里它基本描述的过程就是说如果你有一些物质有高密度的和低密度的,那这个高密度的物质就会慢慢的向那个低密度去做这种扩散。比如说你喷了个香水这个香水就会慢慢扩散到整个房间,最后达到一种平衡。那所谓的平衡也就是我们这里最后提到这个各项通性的一个正态分布。这是趋近于随机噪声。所以说视觉这边就沿用了这个名字,那还是叫它 diffusion model。

        那这个跟图像生成有什么关系?那其实如果。你反过来想,那如果我现在的输入是一个随机噪声,也就是 Gan 里面的那个z,那我现在如果能找到一种方式,或者训练一个网络,能够慢慢地把这个噪声一点一点这样再恢复回来,恢复到最初的这个图片,它不就可以做图像生成了?那事实上扩散模型就是这么简单,它就是通过这个反向过程去做这个图像生成的。如果我们现在去随机抽样一个噪声,比如说是这个 XT 或者是之前的任意一步,那我就训练一个模型,把它从 XT 变到XT 减一。然后我再用同样的模型去把 XT 减一,变成 XT 减2,一步一步这样倒推回来。所有这里使用的模型都是共享参数的,就只有一个模型,只不过你要抽样生成很多次,所以这可能也是现在这个扩散模型一个非常大的一个不足。就是说它训练上跟别的模型比起来也是比较贵的。那在推理的时候那就更别说了,它是最慢的一个。因为像 Gan 的话,我只要训练好了这个模型,那我接下来给它一个噪声,它歘就给我出来一张图片,非常的快,就做一次模型 forward 就可以了。可是如果对于扩散模型来说,尤其是对于最原始的那个扩散模型来说的话,一般这个 t 是选的是 1000 步。那也就是说如果你随机选择了一个噪声,那你要往回推 1000 步的话,那就说你要做 1000 次forward,一点一点把这个图像恢复出来,那这个开销是远远大于其他生成模型的。

        但总之我们先撇开这个推理速度不谈,我们先来看一下一般这个 reverse diffusion 过程中使用的这个模型长什么样。因为我们可以看到这个扩散模型的输入输出始终是这个图像,就是说它这个大小始终不变。所以在这种情况下, diffusion model 就采取了一个非常常见的一个模型结构,就是unit,就是一个CNN,它先有一个编码器一点一点把这个图像压小。

        然后再用一个解码器一点一点把这个图像再恢复回来。那前后的这两个图像尺寸大小是一样的。

        然后为了让这个恢复做得更好,这个 unit 里还有一些这种 SKIP connection,就直接把这个信息从前面推过来,这样能恢复一些细节。

        而且后来对这个网络结构还有一些改进,比如说给这个 unit 里也加上这种 attention 操作,会让这个图像生成变得更好。

        而且其实说白了,这里面这个模型也不一定要用unit,你也可以用其他的,但是大部分这个扩散网络都是用了这个unit。

10.2扩散模型的发展历程:DDPM

        那说完了扩散模型大概是怎么工作的?又说了扩散模型的这个网络结构。那接下来就说一下过去两年之间,这个扩散模型的这个发展历程。其实 早在 15 年甚至有可能更早的时候就已经提出来了。但当时只是一个想法,并不能做到很好的这个图像生成。这可能也就跟 20 年前深度学习一样,想法已经有了,只不过缺了很多很多的必要因素,导致他不能训练的很好。

        一直到2020 年6月,也就是整整两年前出来了一篇论文,叫做 denoising diffusion probabilistic model,也就是 DDPM对原始的这个扩散模型做了一些改进,把这个优化过程变得更简单了。那最重要的两个贡献,一个就是之前大家都觉得是要用这个 XT 去预测这个 XT 减一,是做这种图像到图像的转化。但是 DD p m 就觉得这个可能不好优化,我们要不去优化这个图像的转换。我们能不能去预测这个从 XT 减 1 到XT,我们这个噪声是怎么加的?我们只去预测这个噪声行不行?那这个其实就有点 Resnet 的意思了,本来我可以直接用 x 去预测那个y。但是现在你说直接预测 y 太难了,应该把这个问题理解成 y 等于 x 加上一个residual,我们只去 predict 那个残差residual就可以了。那这里面也是一个意思,我们不去预测这个XT减1。我们去预测它加了多少这个噪声,一下就把这个问题给简化了。

        那具体把这个网络结构画出来。就是说如果我们用刚才讲过的这个 unit 的这个结构。那之前这个输入就是 x t 这个图片。那这个输出就是我们想去预测这个 t 减一时候的x,那在 DDPM 这篇论文里,它就不去预测这个 t 减一时候的x,而是去预测它添加的这个噪声。那这个 unit 模型的输入除了当前时刻这个XT。其实还有一个输入叫 timing embedding,主要就是用来告诉这个 unit 的模型现在到了反向扩散的第几步。这里这个time embedding 的形式其实就跟 Transformer 里用的那个位置编码一样,它也是一个正弦的位置编码,或者是一个傅里叶特征。至于这个 time embedding 怎么加到这个模型中来,有很多种方式了,那有的是直接加,有的是拼接起来,还有的就是用更复杂的手段把它加到网络模型里去,它给模型带来的提升也是相当明显。

        那这里为什么要加这么一个 temporal embedding?其实还有一个原因,就因为这里的这个 unit 模型它全都是共享参数的。那你怎样让它根据不同的输入而生成不同的输出,最后从一个完全的一个随机噪声变成一个有意义的图片?这个还是相当难的一件任务。我们希望这个unit 这个模型在刚开始的这个反向过程之中,它可以先生成一些这个物体的大概轮廓一些很粗糙的就是course 的这个图像。不需要很清晰,也不需要很写实,只要有那个意思就可以了。然后随着这个扩散模型一点儿一点儿往前走,然后到最后快生成这个逼真的图像的时候,这个时候我们希望他学到一些高频的一些信息特征,比如说物体的边边角角,还有物体的一些细小的特征。这样就会让生成的图片更加的逼真。

        但事实上我们这里用的所有的这个 unit 模型都是共享参数的,所以这个时候就需要有这么一个 temporary embedding 去提醒这个模型我们现在走到哪一步了?现在这个输出我是想要糙一点儿的,还是想要细致一点儿的?所以加这个 time embedding 对整个图像的一个生成和采样过程都很有帮助。

        那具体到这个目标函数上来说,如果我们现在给定了XT,我们要去预测这个XT减一。我们要算的 loss 就是我们已知的这个噪声和我们现在预测出来的这个噪声的差值。那对于 ground truth 的这个噪声来说,我们是知道的,因为在这个正向的扩散过程中,每一步添加的噪声都是我们自己加的,都是一个固定的过程,所以说是已知的,后面才是我们预测的。

        那这里这个 f 函数其实对应的就是下面的我们这个 unit 网络结构,那这个 x t 就是我们的输入 x t,然后这个 t 就是我们这里输入的这个timing bedding。

        通过计算这个简单的目标函数,我们就能把 DDPM 这个网络。训练起来了。

        然后 DDPM 还做了第二个贡献。具体来说就是如果你要去预测一个正态分布,其实你只要学它这个均值和方差就可以了。然后作者这里发现了,其实你只要去预测那个均值就可以,你方差都不用学你这个方差,只要变成一个常数,最后这个效果就已经很好了。所以这又再次降低了这个模型优化的难度,所以 DDPM 就工作得很好,第一次能够用这个扩散模型生成很好的图片,算是扩散模型这边的这个开山制作。

        那大概介绍完了扩散模型和DDPM,其实这里可以做个总结。DDPM跟这个 VAE 的模型其实还是有很多相似之处的,比如说你也可以把它想象成是一个编码器解码器的结构。不过在这个扩散模型中,它的这个编码器一步一步这样走过来,走到中间的这个 z 它是一个固定的过程,而对于 VAE 来说,它的那个编码器是学习。

        那第二个不同,就是说对于扩散模型来说,它的每一步的这个中间过程跟刚开始的这个输入都是同样维度大小,但是对于一般的这种AE,VAE。这种编码器解码器的结构来说,它那个中间的那个 bottleneck 特征往往是要比输入小很多。

        那第三个区别就是对于扩散模型来说,它有这么步数的一个概念。它从这个随机噪声开始,要经过很多步才能生成一个图片,所以它有这个timestep, time embedding 这些概念。而且在所有的这个 timestep 里,它的这个 unit 模型结构都是共享参数的,而在 VE 里其实就不存在这一点。

        那这个扩散模型一旦做 work 了之后,大家的兴趣一下就上来了,因为它在数学上特别的简洁美观。而且因为不论是正向还是逆向,它都是这种高斯分布。所以也能做很多推理,证明有很多很不错的性质。所以之前大家可能就担心它不能在真实的数据集上去工作得很好,它可能不能适用于很大的模型或者很大的数据集。但结果现在有人把它做 work 了。OpenAI 的人,也就是DALL·E 2,我们之前说过的二座和三座其实就立马来着手研究这个问题了。他们就仔细钻研了一下这个DDPM,提出了一些改进,然后就变成了这个 improve 的DDPM,大概就是在同年 20 年的年底放到 arxiv上的,他这边做了几个改动。其中一个改动就是 DDPM 里说这个正态分布的方差不用学,就用一个常数就可以了,但是他们觉得如果你能把这个东西学了,那可能效果会更好。然后他这边就去学了。然后确实在后面的取样还有这个生成效果上都不错。第二个就是他把怎么添加噪声的这个schedule 改了。从一个线性的schedule 变成了一个余弦的schedule,发现也工作的不错。那这个我就不细说了理解上你可以去跟那个学习率的 schedule 去做一个对比,也是从线性到余弦。

        然后最后一个贡献就是他们简单的尝试了一下,如果用这个大模型,这个扩散模型会表现的怎么样。结果发现这个扩散模型 skill 的非常好,也就是说如果给它上更大的模型,它就会给你更好的图像生成结果,那这对 OpenAI 来说那无疑是个非常好的消息,所以二座和三座立马着手去做这件事儿,所以紧接着几个月之后就出来了这一篇论文,就是 diffusion model Beats gang 就是扩散模型比杆强。

        那在这篇论文里,首先它上来就是说把模型加大加宽。然后增加自助力里这个头的数量attention head。还有 single skill的 tension 不够用了,我们就上 Multi skilled attention,所以总之就是把模型变得又大又复杂。然后他还提出了一个新的一个归一化的方式,叫做 Adaptive group normalization,就是根据这个部署去做这种自适应的归一化,那发现效果也非常不错。而且在这篇论文里,作者还使用了一个叫 classifier guidance的方法去引导这个模型做采样和生成。不仅让生成的这个图片更加的逼真,而且也加速了这个反向采样的这个速度。论文中说他们可以做到就做 25 次采样,就能从一个噪声生成一个非常好的图片。所以说是加速了相当多。那这里说的classifier guidance 方法是什么?然后后续的这个 Glide 模型和 DALL·E 2 two 里用的 classifier free 的 guidance 方法又是什么呢?那在这个扩散模型能打败 Gan 的这篇论文出现之前,其实扩散模型生成的这个图像看起来已经非常不错了,也很逼真,但是它就在算这些 inception score,就 s score 或者 FID score 那些分数的时候,他比不过Gan。如果光让大家看你生成这个图的话,那大家可能就觉得你生成这些图是不是你挑的这个结果就不够那么有信服力?而且这个当然也不好审稿,也不好中论文。所以还是把这个分儿能提上来是比较关键。同时这个扩散模型,这个采样和生成图片过程又这么慢,所以大家就在想怎么能用一些额外的帮助。或者说找一些guidance,找一些这种额外的指导来帮助这个模型进行采样和学习。

        所以就借鉴了一个之前很常用的一个技巧,叫做这个 classifier guidan diffusion。那这里我们先再次把这个反向扩散过程画一下,那现在最开始是XT,也就是最后时刻,也就更偏向于噪声的那个时刻。X0 是最开始这个图片,所以说这个是一个反向扩散的过程,那我们也刚才说了,在这个反向过程中给定义 XT 时刻的输入,我们通过一个 unit 的网络就得到了XT 减1。然后不停地通过这个 unit 取样生成,最后得到这个X0。那classify guide the diffusion 的意思是什么呢?就是说在我们训练这个模型的同时,我们再去训练一个这个分类器。就是一个简单的图像分类器。这个分类器其实在很多论文里就是在 image net 上训练的,只不过它把 image net 的图片都加了很多噪声,因为对于扩散模型来说,它的输入始终都是加了噪声的这些图片跟真实的 image net 图片还是很不一样的。所以说你必须从头再去训练这么一图片分类器。那这个分类器的作用是什么呢?就是说当我有这么一个图片 XT 之后,我把它直接扔给这个分裂器。然后我就能去看它分类的对不对,我就能算一个交叉熵目标函数。对应的就会得到一些梯度,然后我用这个梯度去帮助这个模型接下来进行采样和图像的生成。那这个有什么好处?因为其实这里的梯度就大概暗含了当前这个图片它里面到底有没有一个物体,或者说它现在生成的这个物体真不真实?那通过这种梯度的引导,其实就是告诉这个unit,我现在生成的图片要看起来更像某一类物体。不是说意思到了就行,这个物体的形状、颜色、纹理各种细节都尽量的要跟真实的物体去匹配上,所以说在经过了这个 classifier Guidan 的 diffusion 操作之后,这个生成的图片就逼真了很多,一下在这些IS 或者 FID score 上就大幅度的提升了。也就是在这篇 diffusion model b scan 的论文里。扩散模型第一次在这些分数上超越了之前比较好的一个 Gan 模型,就是 big Gan,虽然文章里说通过这种方式它相当是牺牲了一部分的多样性,然后去换取了这个生成图片的这个写实性。那其实这个取舍还是比较好的,因为它的多样性还是比干要好。然后现在生成的图片的逼真程度也比干要好,那这样一下子就奠定了扩散模型在图像生成里的地位。那这个扩散模型火了之后,而且大家看到诶这种 guided diffusion 非常的有效。那除了这种最简单比较原始的这种 classifier guided diffusion 之外,那我们还能用什么当做这个指导信号呢?那首当其冲的大家就想到我们能不能把一个简单的这个图像分裂器换成一个 clip 模型,那如果换成 clip 模型之后,这个文本和图像不就可以联系起来了吗?那这样我们不光是可以利用这个梯度去引导这个模型的这个采样和生成,我们甚至可以用这个文本去控制这个图像的采样和生成。所以在这个方面也有一些工作,而且确实也是比较有效的。那当然了,分别在图像和文本上也有很多这个引导的工作,比如说在图像这边,你不光是可以利用这个图像的重建去做这种像素级别的引导,你还可以去做这种特征层面的引导,你还可以去做这种图像风格方面的引导,只不过就用一个 gram Matrix就可以了。那文本这边你也可以用那些已经训练得很好很大的一些语言模型做引导,效果也是非常的好。那所有的这些引导其实在这个目标函数里都是后面的这个y。就是说我这个模型的输入不光是x t 和 t 了。同时我还有一个condition,那至于这个条件是什么,那就根据你的应用来选了,然后在加了这个条件之后,就能让这个图像的采样和生成变得又快效果又好。

        但是所有这一系列的方法它都有一个缺陷,就是说它真的都是又用了另外一个模型去做这种引导。要么呢我们拿一个直接 Pre train 好的模型,要么呢我们就还得去训练这么一个模型,不仅成本比较高,而且这个训练的过程也不可控。那所以说这就引出来了后续的一篇工作,它就提出来一个非常有效的技巧,叫做 classifier free。guidance。那意思就是说我不想要这些classifile,我还能不能找到一种指导信号去让这个模型的生成变得更好?简单来说就是它在训练的模型的时候生成了两个输出,一个是在有条件的时候生成了一个输出,一个是在没有条件的时候生成了一个输出。那举个例子。比如说你训练的时候用的是图像文本对儿,那这个时候你想用文本去做你的这个 guidance 信号,也就是说这里这个 y 就是一个文本。然后你在训练的时候用这个文本 y 去生成了一个图像,然后随机的把这个条件去掉。就是说我不用这个文本,我用一个空集就是一个空的序列,再去生成另外一个输出。那假设我们现在有一个空间,那刚才生成的两个图片分别是没有用这个条件的,生成了一个x,用了这个 y 这个条件生成了一个 x y,那我们就知道有一个方向能从这种无条件最后得到的输出成为有条件得到的这个输出。通过训练我们最后就会知道它们两个之间大概的这个差距是多少。那等到最后去做这种反向扩散,去真正做图像生成的时候,当我们有了一个没有用条件生成的这个图像输出的时候,我们也能做出一个比较合理的推测,能从一个没有条件生成的 x 变成一个有条件生成的x,这样就摆脱了这个分类器的限制,所以说叫 classifier free guidance。但是这个方法其实在模型训练的时候也是非常贵的。因为扩散模型本来训练就已经很贵了,结果使用这种 classifier free guidance 的方法它在训练的时候。还要生成两个输出,一个有条件的,一个没条件的,所以又增加了很多训练的成本。但总之 classifier free guidance 一经提出,大家就觉得它真的是一个很好用的方法,所以说不光是在 glad 这篇论文里用到了,而且之后的 DALL·E 2 two 也用到了,还有最新的 Imageen 也用到了。而且这几篇论文里都说这是一个非常重要的技巧,所以感兴趣的同学可以再去看一下细节。

        总之,在融合了之前这么多技巧之后, glide 模型终于是一个用扩散模型能够做很好的这种根据文本去生成图像的任务了。它只用了3。 5 billion 的。这个参数但是生成的。效果就直逼之前的 DALL·E 2 模型,而 DALL·E 2 模型是有 12B 列,就比它大四倍。但是 Glide 模型不论是从分数上还是从这个感官上得到的这个图片效果都比DALL·E 2好。open i 一看,诶,这个方向确实靠谱,那我也就不顺着DALL·E 2,也就是 DALL·E 2 1 的那套系统用 VQ VE 去做了。我接下来就用扩散模型来做了。所以它在这个glide 的基础上又加了很多东西,比如说在前面加了一个prior,比如说它又使用了这种层级式的生成,就从 64 到256,再从 256 到1024,就使用了很多最新的一些技巧,最终就成为了DALL·E 2。

DALLE2的主体方法部分

        那做了一个小时的铺垫。那接下来我们回到DALL·E 2的原文,我们会来先看一下它这个主体的方法部分很短就一页多,然后接下来看一下DALL·E 2能干什么啊?它列了很多很有意思的应用,然后最后还有一些数值上的结果,那作者上来先说他训练数据集长什么样。他说他们的这个训练数据集里面也是这种图像文本对儿,就跟CLIP模型一样。那如果我们给定一个图片x,然后我们用这个 z i 去表示这个 clip 出来的图像特征,然后用这个 z t 去代表这个 clip 出来的文本特征 i 就代表image, t 就代表text。那整个这个DALL·E 2的网络结构就被分成了两个部分。我们之前在引言的时候也讲过,一个是 prior 模型,一个是decoder 模型。那 prior 模型。就是说根据这个文本y,我去生成一个图像的这个特征 Z i,而这个编码器的输入就是这个ZI,有的时候也会带上这个文本y,但其实也可以不要,总之就是通过这个编码器,那么把这个 ZI 恢复成一个图像x,这样就完成了从文本到图像的这个过程。

        可能跟刚才我们讲引言时间隔得也比较久了,那我们就再来回顾一下这个图 2 里,作者就是说DALL·E 2图这个模型,它相当于是先是有一个 CLIP 模型,然后再训练这个DALL·E 2图的图像生成模型。那一旦你这个 CLIP 模型训练好之后,你任意给定一个文本,它就可以通过这个文本编码器去得到一个文本特征。然后我就用这个 prime 模型把文本特征变成一个图像特征,然后再通过一个解码器就把这个图像特征变成了这个图片。所以是一个两阶段的图像生成器,完成了最后这个文本到图片的生成过程。

        然后作者杰霞还用公式给你讲了一下,我为什么能用一个两阶段的方式来实现这个东西。那首先刚开始这个公式的意思是说给定一个文本,我要去恢复出来最后这个x。那其实它可以先写成这种概率的形式,就是给定一个文本,我去生成 x 和ZI。ZI 是这个图片的特征,它跟这个图片本身是一对一的关系,因为你这个 CLIP 模型训练好之后,它的参数是锁住的,所以你给定一个图片就会生成一个固定的ZI,所以说这里 ZI 和 x 就是对等的,所以说这个概率是可以写成这里这种概率的。然后作者这里再利用 chain rule 就能把这个概率写成这种形式。那写成这种形式之后,我们就可以明显看出来,这个就是给定文本去生成ZI这一步——就是prior。然后给定 y 和 z i 之后用这个图像 embedding 去生成x——就是decoder。所以作者这里其实就是想跟你说,我做这种两阶段的图像生成不是没有依据的,从概率上来讲是完全行得通的。

        那既然两阶段的设计是合理的,作者接下来就分别去讲了这个decoder和这个prior。

        那在decoder这边我们之前也说过,它其实就是一个 Glide 模型的变体,改动并不大。首先它用了这种 CLIP 模型的guidance,我们之前也说过,那有用 classify guidance,有用 CLIP guidance,他们这里就用了 CLIP guidance,只不过使用的形式在这个具体的操作上稍微有一些变化。这里我就不细说了,因为如果不看代码的话。这里描述的技术细节其实都不太好说出来。然后第二段作者就是说他们也用了这种 classifier free的guidance。具体来说他们的这个 guidance 信号要么是来自于这个 clip 模型,要么是来自于这个文本。所以在这里它就随机,比如说有 10% 的时间它就把这个 CLIP 的特征设成0。还有就是说在训练的时候,有 50% 的时间就把这个文本特征直接就扔掉了。所以也就是说在DALL·E 2这篇论文里,它基本是把能用的全都用了。就是包括 CLAP guidance,还有这种 classifier free guidance,它全都用了。其其实 classifier free guidance 就像之前说的一样,它是比较贵的一个操作。但是 OpenAI 向来是不怕贵。效果怎么好怎么来。所以说在做完classifier free guidance 以后,第三段它又做了这种级联式的生成。就是说我怎么能生成这种 1024 的高清大图去吸引公众的目光。所以我就先从 64 * 64 变成256256,然后我再训练一个模型,从 256 到 256 生成这个 1024 * 1024。那在这里为了训练的稳定性,作者在训练的过程中还加了很多这个噪声。然后这里还有一个比较值得注意的点,就是我们听起来好像这些大模型应该是Transformer,但其实就像我们说的一样,这个扩散模型大部分时候是unit,是一个CNN的结构。所以作者这里也。强调他们只是用了这种 special convolution,就是用了这个卷积,没有用这种attention layers。所以说在接下来。做推理的时候,它可以用在任何的一个尺寸上。而不需要担心说你这个序列长度必须得保持一致。所以说训练出来。这个扩散模型是直接可以去生成那种更清晰的图片。

        那说完了解码器,接下来我们看一下这个 prior 模型。 作用就是说我给定一个文本,我怎么能去生成一个图像的特征ZI,这样我好把这个 ZI 输给这个解码器,从而你能恢复出来这个图片,那作者这里尝试了两种方案,就是说要么呢用这种 auto aggressive 自归灰的模型去做这个prior model。要么呢就用这种扩散模型去做这个prior model。那自回归模型这里其实就跟打理或者 GPT 这些就很像了,就是说反正我的输入是文本特征,然后我也有从 clip 那边来的图像特征,那我就把这个图像遮住,然后我就去自回归的预测就行了。但是其实OpenAI 从 clip 这篇论文就说过这种自回归的模型,这种预测性的模型,它的这个训练效率太低了,就是为了让这个训练变得更快速,他们还使用了很多技巧,比如说PCA降维之类的,但因为最后他也没有讲太多的这个结果,对这里我们就不太细说这个自回归的这个 prime 模型,我们主要就是来看一下这个 diffusion prior 长什么样。那这里值得注意的一点就是在这一段里,作者这里说,不论我们是用这种自回归的模型,还是用这种扩散性的模型,我们全都用了这种classifier free guidance,因为发现效果好。这个classifier free guidance 这个技术它确实是很有用,所以说接下来 imagey 也用,而且也专门用一个段落证明它的有效性。所以说做生成的同学都可以来试一试。对于扩散 prior 来说,作者这里它训练了一个transformer的decoder。那因为这里它的输入输出是embedding。所以说用unit就不太合适。直接上Transformer去处理这个序列就可以了,然后这里模型的输入其实相当多,从这个文本到这个 clip 的文本的特征,还有这个 timestamp 就这个部署的embedding。还有就是加固噪声之后的这个 clip 的图像特征。ill transform 自己的本身的一个embedding,比如说之前我们说过那种CLS token。然后最终的这个embedding 特征就被拿去预测这个没有加过噪声的 clip 图像特征。然后模型别的方面还有训练技巧,就跟之前的这个扩散模型没什么区别了。有一点比较有意思,就是自从 DDPM 提出来就预测这个噪声之后,大家就一直都是去预测这个噪声。就像我们刚才说的一样,去预测那个残差,发现训练的又快又好,但是作者这里发现对于这种特征的重建。或者对于他们现在要处理的这个任务来说,直接去预测这种没有被污染过的图像特征是要比之前那种预测噪声要来得好的。所以它这里的目标函数这块就不是之前的那个噪声了,反而就是 CLAP 不出来的这个图像特征ZI。

        那其实讲到这儿,文章的主体方法部分就。说完了图像生成这边儿确实各种技巧非常多。经常连一个模型总览图都很难画。出来,所以如果不去直接看代码,是很难。对这个论文有一个整体的把握的。而且这些技巧在我们说完这么多之后,我们也会发现其实它有的时候有用,有的时候也没用,比如之前你说这种预测噪声好使,但是DALL·E 2这里又不去预测噪声,直接去预测ZI 了。还有比如说DALL·E 2这篇论文,它做的是一个两阶段的图像生成,那实际上 image 里面直接上一个 unit 就把这个图像生成解决了。更简单,效果也很好。所以说也不一定非要两阶段,那还有 clip 模型,还有 DALL·E 2 two,都说这种自回归的模型太贵了,然后训练太不高效了。但是也就在我录视频的这两天里, Google 又出了一篇新论文,叫做party用pathways模型,然后去做这种自回归的这个文本,图像生成效果也是直接超越了DALL·E 2图和Imagen。所以到最后看下来,其实都是大力出奇迹,也就是说。只有scale。其他的东西。不论是模型还是训练的技巧都好商量。

达利兔具体能干什么

        那说完了。方法,接下来我们就来看一下达利兔具体能干什么。那文章里这个图 3 举的第一个例子,其实就是说达利兔能够根据一张图片,然后去生成很多很多的类似的这个图片,然后生成图片里的这个整体的这些风格都跟原始用户提供的图片是一致的,而且这个物体也都是一致的。比如说有钟表,有沙漠,然后有一棵树,就是语义信息大体是不变的。但是那些不太关键的信息,比如说这个图片整体的布局,还有这些钟表的各种样式,还有天上这种云,每一张生成的图片都会不一样。那在另外一个例子里,也就是 OpenAI 自己的这个 logo 里,他把这个 logo 输给DALL·E 2,DALL·E 2也能返回来各种各样的logo,那总体而言这个风格也是很一致的,背景都是这种五颜六色的色彩。那前景都是这种交织在一起的这种白色的线条。当然了这种交织的这个模式每个跟每个都不太一样。那达利兔为什么能做到这一点?那其实看这个图 2 这个总览图就能知道了,当用户给定一个图片的时候,它就能够通过 CLIP 预训练好的这个图像编码器去得到一个图像。特征。然后他把这个图像特征变成这个文本特征,然后再把这个文本特征输给下面的 prime 模型,去生成另外一个图像特征,然后这个图像特征就会生成新的这个图片。也就跟这里的这两个柯基一样,都是一个柯基在吹小号。那事实上这个柯基的这个朝向,还有这个背景都不改变。所以这个应用其实挺好玩的,很方便这个。设计者去做各种各样的设计。那比如说现在我们要给一个公司去设计这么一个LOGO,我们可能有一些大概的想法,但是最终也没有定稿,那我们就可以把这个大概的想法先画成一个图片,然后我们就扔给DALL·E 2,DALL·E 2就能返回给我们很多很多不一样的图片,我们可以从中再选一个我们比较喜欢的,然后再把它扔给DALL·E 2,DALL·E 2图又会给我们反出来很多很多不一样的图片。所以你就不用自己去想了,你只要挑图就可以了,大大简化了这个设计的过程。那另外一个比较好玩的例子就是说可以做这种图像的内插,那在图 4 里,作者其实说给了两张图片,而这两张图片分别有自己的这个图像特征,那这个时候我们在这两个图像特征之间去做这种内插。当插出来这个。特征更偏向于这个图片的时候,生成出来的图像,就像这样更多的这个风格。还有里面的物体就是跟这个左图比较类似。但是随着这个内插的这个比例越来越偏向这个右图,那生成出来的这些图像主要的物体就是右面的,比如说这些狗还有房子之类的,就没有这些月亮和星星的物体,而且也不像梵高之言画的这种风格了。

        那下面这个例子也比较有意思,左边是一个。橘黄色的,也不知道是个包还是一个瓷器,右边是一个形状很诡异的一个几何物体。然后随着在这两个图像的特征之间进行插值,这个颜色越来越就从橙色就变成了黑白。而且样式也从一个固定的一个结构变成了这种很诡异的这种几何形状。

        那前面那个图像内差的例子是在两个图像之间去做这种内差,那接下来作者举的这个例子就是在图像和文本之间去做这个内差,比如,比如说这里面就提供了一个文本,原来的文本只是说这是一个猫的图片,但现在他说这是一个动画版的这个猫,而且描述的是一个超级赛亚猫,当模型在这两个文本的特征之间去做这个差值的时候,生成的图片就逐渐也在改变。比如说刚开始就是一个正正经经的猫,慢慢的这头发就炸起来,最后变成超级赛亚猫了。那像第二个例子里,从一个维多利亚风的一个建筑风格,最后就变成了一个现代版的一个建筑,还有就是从一头成年的雄狮变成了一个幼年的小狮子,最后一个例子就是从冬天的景象变成了一个秋天的景象。那这个应用当然也是很有意思了。如果能再做得更细致一点,那其实就有点直接输入文本这个模型就能替你去 PS 一样。那以后再 p 图,那就太简单了,我想改哪,我就直接给模型输入几句话,我想把中间这个人去掉,我想让我的腿长一点,我想让我的脸更白一点。你只要这么打字就可以了。再也不用去学Photoshop 了。

        当然论文还举了几个。别的例子。我们这里就不。一一列举了。我们最后直接来看这个数值对比的表格,那一般在图像生成这边,大家就是在这个 MS Coco 数据集上去比较这个 FID 的分数。那我们主要来看这个表格的下半部分。也就是说做这种 Zero shot 的 FID 分数到底谁最低?那我们可以看到之前像 DALL·E 2 其实还在28。这个水平glide 也就降到了12,降的还是非常多的,也就说明这个扩散模型好用,然后再到他们的这个 on clip,用 AR 去做这个prior,或者用这个扩散模型去做这个prior。我们可以发现这个数字方面这两个模型都差不多,扩散模型稍微好一点点。而且训练上也稍微容易一些。所以整篇论文。其实基本上都是在围绕这个扩散的 prior 在做这个on clip。那毕竟对于图像生成的任务来说,比较这个分数是一方面,最主要的还是让大家看这个生成的效果到底如何。这作者接下来又列了很多这个图像的对比。那从图像生成的结果来看,这个DALL·E 2。确实是不错。比如说第一个文本就有一个绿色的。火车沿着这个铁轨开。过来了。那我们可以看到之前这个 Darling 模型生成的这个绿色火车就非常的像动漫火车,这不真实。glide 模型还不错,但这个火车太大了,也没有展现出沿着铁轨开过来的感觉,但是这个 DALL·E 2这两个图像都生成的不错,然后像后面的这个图像,有一群大象在这个泥水里玩,都可以看到DALL·E 2生成这个模型,这个大象身上还有反光,而且生成的这个细节也非常的好。还有像这个滑雪场景里左上角这种太阳这种亮光,就跟真的这个照相机照出来的一样,非常的逼真,而且生成的这些图片全都跟这些文本是非常符合的。不过当然了,这里面就举了 5 个例子,当然有可能是作者精心挑选出来的,所以说效果确实是不错,

DALL·E 2的这个模型不足和局限性

        那既然展现了一些比较好的例子,作者这里在第七节也很好的讨论了一下他们目前DALL·E 2的这个模型不足和局限性。这个我推荐大家其实都应该去仔细的看一看。这样才知道接下来该怎么去继续提高这个模型。

        比如作者这里说的第一个DALL·E 2图的这个局限性,就是说它不能很好地把这个物体和它的这个属性结合起来。比如说在这里物体就是这种方块儿属性,就是红色或者蓝色。然后现在如果我们给一个文本,就是说有一个红色的方块儿在一个蓝色的方块儿上面,然后你让这个DALL·E 2模型去生成一些图片,然后再让 Glide 也去生成一些图片,我们就会发现 Glide 模型其实还是做得相当不错的,基本上这个红色的这个方块都是在蓝色这个方块上面。正确率是非常高的。但是对于DALL·E 2 two 模型来说,这个就比较惨不忍睹了,错误的结果非常的多。作者这里就说很有可能是用了 CLIP 模型的原因。从一方面,用了 CLIP 模型之后,你这个图像和文本的联系更紧密了,你就更容易或者更好去做这种文本生成图像的任务。但是另外一方面,你这个 CLIP 模型在学习的时候只是考虑这种相似性,比如说对于这个文本来说红方块儿蓝方块儿。那其实就是去找哪些图片里有红方块儿、蓝方块儿,然后把这个相似度提到最高就可以了,其实 CLIP 模型是不了解什么叫 on top of这种东西的。它也不了解什么叫上下左右,什么叫是或者不是。它从头到尾就是在找这种物体上的相似性。所以说当你去用这种 CLIP 模型生成的特征去做这种下游任务的时候,你就不能很好地区分这个物体和它的属性,从而导致这里这个图像生成的结果就非常差了。

        那作者这里举的另外一个例子就是说他。发现当用 DALL·E 2 two 去生成一些图片,当这些图片里有这种文字的时候,这些文字的顺序其实是完全都不对的。比如说它这里的这个提示词 prompt 说的是我想要生成一个提示语,然后上面写的是 deep learning,然后我们可以看出来它生成的这些确实是长的这个提示语这个样子,但是上面完全不是deep learning 可能偶尔有一些这个deep,对吧?但即使是这样,这个拼写的顺序也不对,更别提 learning 基本就完全没有了。而且这不光是这一个例子,我们最后在结论的时候还会给出更多这样的例子。这里说很有可能是这个文本编码器,刚开始这个文本编码的时候,用了这种BPE编码。这种就你就可以想象成是一种词根词缀这种编码形式,所以说它不是整个单词这样去编码了,它是词根词缀,就这种比如说 de 或者 PT 这种东西去编码的,所以很有可能是造成这种结果的原因。但应该还有更多的原因。总之直接去生成这种文字目前还做得不够好。

        那作者这里。举的最后一个例子就是说DALL·E 2还是不能生成就是特别复杂的场景,很多细节它生成不出来。比如第一个图片里说我想要生成一个非常高质量的图片,里面有一个狗在绿草地上玩,然后这个绿草地旁边还有一个小湖。其实这里面。我觉得生成的也已经非常不错了,但是这里面的图片都有点从网上的图片复制粘贴过来的感觉。而且都是近景照,都是直接生成这个狗占了绝大部分的这个空间,完全没有体现出比如说草地旁边有个湖或者说狗在玩这种感觉。当然这个例子我觉得还不错,主要的原因可能是下面这个例子。下面这个例子是说我想生成一张特别高清的一张,就是时代广场的图,你乍一看觉得生成的挺好的,这不就长得像时代广场吗?但其实回头如果你去看DALL·E 2图这篇论文,你把它放大去看的话。它这里广告牌上的东西全都是模糊的,它所有的这些具体的细节图像,这里面的东西也都是随机生成的那种颜色块,就完全没有任何语义信息的,就它只是生成了这种高楼大厦的这个样子而已,这里面的细节缺失是非常严重。当然我觉得这也不能全怪模型,毕竟你给的这个文本太少了。如果你把这个文本写得再长一点,写成一段话,比如说里面有多少个人呐?比如说这个广告牌上写的是哪个公司?我觉得 DALL·E 2 two 也是能够一定程度上去生成这些细节的。

总结

        那最后我们来总结一下这篇论文。其实DALL·E 2这篇论文没有结论这个部分,它直接就用第七段这个局限性和不足就结束了整篇论文。作者说完前几个不足之后,在最后一段就是说所有的这些图像生成的论文,比如说从 DALL·E 2 到后来的这种glide,然后一直到现在DALL·E 2其实最值得关心的一个问题就是这种生成图像里,比如说有不公平的东西,或者有这种有毒害的东西。阿里兔它的性能生成图片的这个真实度虽然说比 glide 更强了,比如说 FID 的分数在 Coco 上从 12 变成 10 了,但是随之而来的这个 risk 也就更高了,因为你现在生成的这个图像越来越像真实的图片了,你越来越找不到,就是说有任何的痕迹,或者说这种标志就告诉你这张图片是 AI 生成的。那也就意味着更多的人可以拿这种模型去以假乱真去生成各种带有政治性色彩的,或者带有歧视性色彩的这种图像或者视频。但是民众都发现不了。所以作者这里就呼吁更多的研究应该是放在这种,就是说安全性上。他们在博客里也说他们内部现在正在做这种研究,去研究这个模型的公平性,扩大生成这种有害图片视频的这种可能性。但是DALL·E 和DALL·E 2真的是开启了这种文本生成图像的这一系列的工作。迅速加快了这一领域这个研究的进程。比如说之前都是半年出一篇比较有影响力的论文,可是最近我们也知道, 4 月份DALL·E 2才放出来, 5 月份 Google 的 image and 就出来了,然后就把这个 FID 分数从十点几变成了七点几,然后 6 月份紧接着一个月之后,这个 Google 的 party 模型又出来了。当然这个 FID 分数还是7左右。但是它用的是自回归模型,而且效果也非常好,模型也非常大,有 20 billion 的参数有 200 亿。所以说这个竞争是越来越激烈了,越来越白热化了。然后除了去做这种图像生成,还有人脑洞大开,觉得可以用这种方式去做这种数据增强。比如说我先写一个prompt,写几个单词,然后我用 GPT 3 模型,哎去帮我把这个作文写完,多写一大段话,然后我再把这段话扔给 DALL·E 2 two,然后让 DALL·E 2 two 帮我生成一个图片。我这不就有一个图像文本对了。然后我就可以无穷无尽的去生成这种图像文本对。然后再用这个图像文本对啊,去生成 CLIP 或者去做DALL·E 2图的这个训练不就完了吗?这个就有点这个左脚踩右脚的感觉了。在 Twitter 上有很多人吵吵着说要做,也有很多人觉得可能 open i 和 Google 已经在这么做了,但是毕竟现在的这个模型规模和数据规模就已经没有人能玩得动了,那再加上这无穷无尽的训练数据,感觉还是得坐看这些大公司之间怎么玩儿。

        然后最近 Twitter 上还有一个很火的帖子。就是说DALL·E 2two 其实它自己有自己的。一套语言。它理解的不是英语,它可以通过一些我们完全看不懂的语言去生成对应的图片。比如说这个小哥就说 DALL·E 2 two 有自己的一套这个秘密语言。比如说这个句子其实是鸟的意思,然后这又是一堆鸟语,其实是说这个昆虫,然后接下来他就给了一句话,就巴拉巴拉巴,这个完全我也不知道该怎么读,但是事实上生成的图片全都是一鸟在吃昆虫。然后除了那个例子之外,作者又发现了很多有意思的例子,比如说这里他如果把这个文本输进去,这有两个农民伯伯在讨论这个蔬菜,而且这张生成的图片最好要带有这个字幕。那我们就会生成这么一个图片,上面有一个标题,这块也有这个人说话的这个字幕。当然了我们之前也讲过,就是说DALL·E 2有这种局限性,这个生成的文字就是谁也看不懂。但是这里作者神奇的发现,上面的这个标题。其实代表的就是蔬菜,下面的这个标题代表的就是鸟。所以说当他们把上面的那个标题,那个看不懂的文字输给DALL·E 2的时候,DALL·E 2就得到了这样的图片,就全是做好的菜,然后把下面的那个人说出来的那句话,然后输给DALL·E 2的时候就生成了很多鸟。所以这也就反映了DALL·E 2的另外一个问题就这个属性对不上。本来这个人说的其实应该是在讨论这个蔬菜,但其实对应过来其实人讨论的是鸟。

        那还有一个更好玩儿的例子,就是说有两只鲸鱼在讨论食物,这个你也要给我生成一个字幕,它就生成了这么一个图片,两只鲸鱼在讨论什么东西,然后又是一串鲸鱼语,然后他们把生成的这个文本抄下来,然后扔给DALL·E 2,然后让它去生成图片。结果诶就生成了很多海鲜,这个就真的很有意思了,那看来这两只鲸鱼啊,还真的就在讨论它们的食物是什么。然后这个作者还尝试了很多别的不同的例子,我这里就不一一说了,他们把他们的这个发现全都总结到他们的这个 ARCHIVE 论文里,在他的个人主页上是可以找到的。然后作者这里也跟 open AI 一样,非常担心这个模型的安全性的使用问题,因为他说之前的这种 NLP 的这种系统,一般都是说会根据这种政策法规去过滤掉一些信息。一般这种过滤系统还是比较准确和高效的。但是他们这里发明的这种达利兔用的黑话或者这种鸟语,谁也看不懂的这种语言。也就是他们这里说的 Gaber 是其实就是垃圾提示词。那就很有可能会绕过这些已经设置好的过滤器,从而产生了一些安全性,还有这种可解释性上的这种问题。总之DALL·E 2的这个图像生成的效果还是非常让我惊讶的,我自己也玩儿了很久那个达利mini。尽管不论是在论文里还是在 Twitter 上,还是在别人的论文里,都说达利兔有这样那样的局限性和不足,但是我觉得以现在这种竞争的白热化的程度,以现在这种做研究的速度,应该很快我们就能看到更完美的一个图像生成的模型了。如果你还没有玩过 DALL·E 2 two,那你也可以去加入那个 waiting list。但如果 waiting list实在排不上,其实也无所谓。反正DALL·E 2图才出来了两个月就已经成爷爷辈儿的工作了。说不定下个月又有新的工作出来,而且说不定又。开园了。

更新时间 2024-04-05