一、背景知识——文本图像生成的现状
先介绍一下背景知识。大家对于文本-图像的生成模型应该已经相当熟悉了,诸如"imagen"、"stable diffusion"、"dalle2"以及"midjourney"等一系列模型已经取得了很好的成绩与显著进展。这些模型在很大程度上能够生成与给定文本高度契合的图像,很多时候这些生成出的图像充满了想象力。它们所创造的图像通常难以在网络上找到。比方说下面这张图片:
两个机器人在巴黎铁塔前举杯庆祝,这样的场景在网络上并不容易获取,只有通过生成模型才能创造出来。
然而,尽管这些模型表现出色,但它们目前还面临一个问题,即它们主要依赖于文本作为唯一的可控制信号。然而,文本在某些情况下并不能完全满足需求,尤其是在描述某些细节方面存在局限性,比如物体的位置、角度和姿态等,这些方面难以用自然语言精确描述。
另外,有些情况下生成个体或者场景,虽然可以使用自然语言进行描述,但结果并不总是精确的。如果需要生成指定场景或物体时,诸如“我家的狗”或者“我自己的书包”之类的情况,目前的模型还很难胜任,因为它们只能依赖文本作为唯一的控制信号。因此,这里涌现出一个非常有趣的研究领域,即生成模型的个性化,其关注点主要在于如何使生成模型创造出更具个性化特点的内容。其中,一篇备受瞩目的论文叫做"Dream Booth",其核心思想是,假设你有一个特定的主体对象,比如一只狗,你可以提供几个示例,然后尝试让图像生成模型在不同场景和状态下生成这只狗的图像。
这意味着你可以在不同的背景和情境中生成个性化的图像,比如上图中根据左边的狗的图片生成右边这只狗在特定场景中的图片,或者其他类似的情况。赋予模型在生成过程中更强的可控性,这是一件很有趣的事情。本次分享探讨的主题就是如何进一步增强个性化生成的可能性。
然而,值得注意的是,尽管"Dream Booth"取得了不错的效果,但它并非一种万能的解决方案。其方法相当简洁,见下图:
它的基本思路为:假设有一个指定的物品,对其进行多次拍摄,通常是3到5张照片,然后用"stable diffusion"等模型进行梯度下降的微调,这个微调过程可以持续一千步左右,最后保存微调后的模型。通过微调,模型会对指定的物品有所了解,因此在生成与这个物品相关的其他场景图像时,效果会相当好。在微调过程中,模型通过梯度下降等方式逐渐适应了指定物品的特征,这是其表现出色的原因之一。
另外,还存在另一种方法Textual Inversion,与"Dream Booth"非常相似,但稍有不同。
这个方法不需要对整个模型进行微调,而是针对一个专门的嵌入向量(embedding)进行调整。首先为指定的物体设计一个特殊的嵌入,然后将模型其他参数固定,只调整这个特殊嵌入,这个特殊的嵌入能学习到如何表示主体物品。最后在生成图像时,你可以使用调整后的embedding来指导生成过程。
嵌入(embedding)就好比是一个适配器(adapter),可以使生成的内容带有特定主体的特征。实际上,这是一种parameter efficient tuning的方法,尽管仍然需要微调,但相比之下,内存需求降低了很多。然而,这个方法也有一个不足之处,就是其效果明显不如"Dream Booth",这是因为调整的参数较少,导致生成效果受限。目前来看,这两种模型都存在一些致命问题,即微调过程非常耗时,而且需要大量的GPU内存。另外一个问题是,每个主体都需要进行微调,并保存其检查点。如果使用"stable diffusion"等模型,一次微调需要保存大约10GB大小的检查点,若有100个主题,那么所需的存储空间将超过1TB。这种情况下,模型的扩展性会受到极大的影响。
这些方法的共同点在于,它们都试图在模型中引入关于指定物体的特定信息,从而使模型在生成相关图像时更加准确。无论是通过微调整个模型还是调整特殊嵌入,都是为了增强模型在特定个体生成方面的表现能力。
二、动机——为何需要语境学习的图像生成模型
在本次演讲中,我将介绍如何避免上述问题,即在不进行微调的情况下,仍然能够实现生成模型的个性化。这主要依赖于我的两篇论文,其中一篇《Subject-driven Text-to-Image Generation via Apprenticeship Learning》,目前仍在等待编辑处理(ARCHIVE)中,另一篇是已经收录在ICLR 2023的一篇论文《Re-Imagen: Retrieval-Augmented Text-to-Image Generator》。
现在,让我们来初步探讨一下我们的目标。在语境学习方面,大家都比较熟悉了。自然语言处理的大型模型主要采用的就是语境学习方法,也就是所谓的"in-context learning"。其优点在于,你无需为不同的任务构建不同的模型,而只需使用一个模型,并通过不断的提示(prompt)或者在上下文中进行示例,让模型学习如何根据示例来进行泛化,从而解决未见过的任务。这样的学习方式可以实现零样本学习,对于自然语言处理中的大模型(如GPT系列),这种语境学习非常成功,它不需要任何梯度下降等训练方法,就能够解决许多具体的问题,这反映出了未来一个大的趋势。
假如我们能在个性化图片生成领域使用语境学习,那就会非常有益。例如,如果我们提供一些关于某个小狗的示例图片,将这些示例图片输入给一个新的扩散模型,再输入一个文本,文本指定这只狗在新环境中的动作,那么这个扩散模型就可以生成出这只狗在新环境下的图像。
这种方法会避免微调模型,同时也不需要存储各个主题下的扩散模型副本,只需一个模型即可,且推理时间也会比之前更快,至少提速了十倍以上。
但是,如何实现这种理想情况呢?我们需要探索图片生成模型和自然语言生成模型之间的区别。自然语言模型中的语境学习源自预训练,通过大量自然语句(由一个个连续的token组成),根据当前tokens让模型预测句子中下一个token的机制来实现。这样大型语言模型能够自动获取上下文学习能力,这似乎是一种非常神奇的现象。虽然有不少研究在讨论这一现象,但为何模型在预训练后会自动具备这种能力仍然不太清楚。然而对于图像生成模型而言,目前并没有类似的能力。其预训练过程只关注单个文本和图像的配对学习,没有多个连续的图像文本作为输入,因此缺乏上下文信息。在这样的预训练下,图像生成模型无法实现语境学习能力。
要想训练一个具备这种语境学习能力的扩散模型,就需要进行一些改进。首先,网络架构需要进行调整,因为现有的网络结构仅能够接受文本作为控制信号。而现在,我们还有其他的演示和上下文示例,我们需要想办法将它们输入到网络结构中,这需要一些新的网络架构设计。
其次,训练数据也需要调整,就像文本一样,需要多个连续相似的图文示例,这样模型才能获得上下文学习的能力。因此,我们需要在数据方面进行改进。接下来,我们将探讨如何设计这个新的网络架构。
三、设计——如何让现有的模型能够做语境学习
1、设计-网络架构
标准的文本图像生成模型架构通常由UNet组成,如上图所示。该UNet首先对一个加入噪声的图像进行卷积和下采样,直至获得较小的特征图,然后再进行上采样,加上其他的一些卷积操作,最终将特征图恢复到与输入图像相同大小的空间。这两个步骤主要是在模拟去噪的过程。
这个UNet与通常的UNet有所不同,它加入了注意力机制,用于捕获文本控制信号,然后利用文本信息引导到扩散过程。在这个过程中,我们要考虑如何将图文示例加入到这个UNet中。
实际上,这是非常简单的,你可以看到,UNet实际上具有编码器(encoder)的功能。它左边部分通过下采样将大图像压缩成特征图,可以将其视为编码器。右边部分可以看作解码器(decoder),该编码器可以将图像和相关文本编码为特征图。因此,我们可以将图文示例,通过相同的方法,仅使用这个下采样的编码器(encoder)来压缩到特征图中。
当有多个图像和文本对时,可以分别进行处理,然后将多个特征图连接起来,这样就可以得到neighbor(指某些同一主题的图文对示例组成的一个类,类中的图文因为主题一致,在主题上相互之间可认为具有相邻的关系,有点类似邻域的意思。)的表示。
这样做的好处是,你在复用UNet编码器时,可以将这些信息投影到相同的特征空间中。这样模型更容易关注这些信息。因此,最终的网络架构类似于下图这样。
将图像去噪为之前的图像,之前只是用文本进行控制,现在我们做的是,为它增加了一些上下文示例。只需复用UNet编码器对示例进行编码获得特征图,注意力机制不仅仅会关注文本,还会关注新的上下文示例的特征。
因此,我们所做的实际上非常简单,只是在网络中添加了一个额外的注意力层,让它能够关注其他控制信号,比如用来参考的图像和文本示例,这就是我们的新架构。然而,目前我们还无法训练这个网络,因为我们没有关于某个主题或者主体的多个图像和文本对数据。
因此,接下来我们要考虑的是如何获取这种新的训练数据。
2、设计-训练数据
理想情况下,图像和文本的上下文学习(ICL)数据应该具有相似的结构。每个数据对应由文本和图像构成,例如TEXT1-IMAGE1、TEXT2-IMAGE2、......、TEXTN-IMAGEN等,其中这些图文对都有一定的相似性,比如说他们都描述了一样的主体,或者说他们能描述了一样的风格,把它们放在一起,其中一些作为示例,然后生成新的这个关于这个主体的图片。这样训练的模型在生成图片时,会自动参考输入的示例。
所以我们需要一堆由TEXTN-IMAGEN组成的聚类图片。每个类保证它其中的所有图片是关于某一个主体的,或者他们都有一个专门的主题。但目前google内部不存在这么理想的数据。从网上爬下来的数据都是独立的图文对数据,他们是没有按主体、主题归类的。给他们归类也是一件非常困难的事,基于clip的一些策略可以做,但是效果非常差。
最终,我们的工作涉及以下几个方面,我们重新爬取图像文本配对数据,根据URL将这些图像和文本进行聚类。我们假设源自同一网页的图像和文本具有较强的相关性,尤其是电商网站上这种情况会很明显。例如在同一网页上销售的鞋子是在不同场景下拍摄的,我们认为这种资源非常有价值。然而也存在一些特殊情况,比如一个网页中可能包含各种杂乱无章的图像,它们之间毫无相似之处。在这种情况下,相关性较差,那应该如何处理?为了解决这个问题,我们实施了一些过滤措施。我们通过计算不同图像组内图像之间的CLIP分数进行过滤和筛选,以此来评估图像之间的相似度。
随后,若图像对应的CLIP分数低于特定阈值,我们将排除那些具有较低相似性的图像文本聚类,不过,需要指出的是,我们的过滤措施相当严格。尽管如此,由于我们的数据集规模庞大,即便在过滤掉90%的内容之后,仍然保留了数十兆级别的可用数据。
另外,我们还注意到从网络上爬取的图像文本配对,其组类中文本的噪声较大,难以有效反映不同聚类中图像的共性特征。有时候,这些文本内容可能非常杂乱,与图像关联性较弱。为了克服这一问题,我们采用了Google的预训练语言模型为这些图像重新生成描述文本,利用Palm等方法对这些描述进行进一步的清理,使得生成的描述更加与图像内容相符。
下面通过范例来说明,这是我们自动构建的图像数据集(ICL数据集)的两个样例。
范例中展示了图像聚类示例,每个示例中的不同图片有不同的文本标签,这些图像和文本标签是由Palm生成的。从第一个example中可以看到不同场景下同一个壶的样子,图片底下的文本是它们的标签。第二个 example的主体是一只狐狸,它们有不同的标签。需要注意的是,这个示例仅用于展示,实际数据中的噪声要比示例中高得多,这里只是为了给大家一个大致的印象。
在获取了这些图像之后,我们最初尝试了一种简单的方法,使用前两个图像作为样本,然后让模型生成第三个图像。然而,实验证明这种方法的效果非常差,模型在训练完成后往往会陷入简单的复制粘贴模式,无视输入文本内容,直接复制一个样本作为输出。主要原因在于我们构建的图像文本群组中的图像和文本过于相似,导致模型倾向于执行无创新性的复制操作。在大部分情况下,模型认为这些图像之间几乎没有区别,因此将一个图像直接复制到另一个图像的位置。针对这一问题,我们进行了长时间的思考,希望找到方法来避免模型陷入这种局部最优状态。然而,我们发现很难找到一种非常直观的方法来解决这个问题。
首先,我们需要考虑如何确保所生成的目标图像以及相关联的其他示例具有足够的差异性。这意味着无论是图像还是文本,它们在特征上都应该具有显著的差异。以上图中第一个和第三个壶为例,它们之间存在相当大的相似性。然而,如果其中一个图像呈现了明显的差异,比如一个人端着一个物体的场景,这种情况下模型将被迫根据文本标签来生成这种差异,这种数据在实际爬取过程中非常难以获取。因此,为了解决这一问题,我们采用了合成的方法。
具体而言,我们首先从这些聚类中提取文本,并使用大语言模型生成出不同场景下的文本描述,例如“a man holding a teapot”。接着,我们使用Dream Booth生成这些目标图像,尽管Dream Booth的使用会有较高的代价,不适用于最终模型,但它作为一种生成数据的手段非常有效。
我们的方法包括以下步骤:首先从这些聚类中选择文本描述,然后利用大型语言模型生成新的文本描述,接着在这个类上训练Dream Booth,通过训练好的Dream Booth生成这些新的目标图像。需要指出的是,尽管Dream Booth在生成图像方面非常出色,但仍存在很多失败案例。因此,在生成了大量的Dream Booth图像后,进行了大量的过滤,包括一些启发式的过滤和基于CLIP分数的过滤。最终,我们仅保留了约20-30%的生成图像,其余被认为质量不够高而被丢弃。在经过一系列处理后,我们最终得到了包含几十万个聚类数据的数据集,这为后续模型的训练提供了数据基础。
进一步的训练流程如下所示:
首先上图展示了一个样本,左边是示例,右边是目标图。训练过程如下图:
总的来说流程如下,通过复用图中的encoder,将多个示例通过encoder编码得到特征图,然后将特征图(feature map)联合起来(concatenate),目标图片在右边做为去噪的目标。首先对目标图片加噪,接下来将目标图像作为去噪目标,添加噪声后使用同一解码器进行去噪操作。此外,我们还引入了目标图像的文本描述以增强模型的控制性,这在图中未画出来。
我们将这个模型称为"SuTI",即"Subject-Driven Text to Image Generation"。此训练所采用的数据集为ICL V2数据集,它是由Dream Booth生成的数据,需要注意的是,尽管输入的示例是现实的图片,但输出的目标是通过精心设计来生成出来的图片,这样可以提高训练的可控性。在训练SuTI模型时,尽管我们拥有约500K个训练数据,但发现模型训练过程并不需要很长时间,大约一天的时间模型便能够在约几十万步迭代之后达到相当高的水平。
四、结果和展望
在模型的训练过程中,我们采取了一种方法,将三个示例作为neighbor,提供给图像生成模型。通过这种方式,模型能够通过注意机制关注这三个示例,从中获得关于主体外观的信息,最终生成目标图像。在训练SuTI模型后,我们观察到该模型具备几种技能。首先是风格化技能,允许我们将不同的艺术风格应用于某个主体、将主体其放置在不同的环境中,甚至可以为主体赋予不同的动作。我们还可以从不同的视角观察主体,并对其进行一些属性变化,例如颜色等,还可以为主体添加各种配件和服饰。我们的实验参数如下:
模型输出示例如下所示:
例如,我们的输入的图片主体是一个鸭子玩具,我们试图在生成阶段中使用文本指定要生成的主体风格,如使用Picasso、Rembrandt的艺术风格。我们的模型能够生成出具有不同艺术风格的图像,对于艺术不甚了解的我来说,画得似乎相当不错,例如小黄鸭融合了梵高的"星空"风格以及其他一些细节。再比如图中的狗,模型可以生产各种方向的视图,如从上看、从边上看、从后看的视图,这些都在模型输出中得到了体现。生成的速度非常快,大概 20 到 30 秒钟就可以让它生成出来。
此外,模型也能够处理主体的情感,例如我们可以使狗变得沮丧、高兴、瞌睡等。另一方面,我们也能够改变主体的一些属性,例如将其颜色更改为蓝色、绿色、紫色、粉色等。
我们还尝试增加配饰,例如给狗穿上厨师服、警察服、护士服等,这些生成的图像在模型的控制下表现出高度的逼真性和合理性。
此外,我们的研究还涉及大量的人类评估,我们为此编写了220个独特的提示,针对30个不同的主体进行测试。
首先我们要评估模型在图文指导下生成的图像与给定主体对齐程度。主体对齐指的是生成图像中的主体与原始主体的相似程度。我们将这种对齐度量表达为一个分数,根据评价者对图像的相似性进行评分,从0表示不相似到10表示完全相似。最终,我们计算这些分数的平均值,以获取主体对齐的度量。
第二个评分指标,即生成结果对文本标签的忠实程度,如图21中生成的小狗对于描述中的 "chef outfit" 或 "police outfit" 等内容是否完整准确地体现。它是否可能忽略文本内容,而仅仅将狗的图像直接复制粘贴。
此外,第三个评分指标在于图像的真实性。是否存在任何伪造痕迹(ARTIFACT)等现象。
在我们的评估系统中这些生成的图像都呈现出相对真实的特征。我们在整个基准数据集上,将上述不同的评分指标进行汇总。通过计算不同样本在这些指标上的平均分数,我们可以获得一个总体的百分比得分。这些评分考虑了许多基线模型,包括Textual inversion、Null-Text Inversion、Imagic、Dream Booth、Stable Diffusion和Re-Imagen、InstructPix2Pix方面的表现。美元符号表示有些模型在微调时需要占用空间、时间。Imagic需要70mins才能做完一个主题的适配,但是对我们的模型只需要30s。尽管我们的模型在速度方面可能不及 "Instruct Pix2 Pix"那般迅捷,但其效果明显优于后者。例如,在主题方面,我们的模型已经超越了 "dream Boost",且在文本对齐方面表现更为优异。我们的模型在 90% 的情况下能够与文本完美地结合。同时,我们的模型生成的图像在视觉逼真性方面达到 92%,几乎没有PS痕迹。然而,"Dream Booth" 在这一层面上表现更佳,约有 98% 的情况下不存在任何伪造痕迹,图像相当真实。相较于 "Textual Inversion",我们的模型稍胜一筹。
这三个方面分别考虑后,我们对其进行了综合评分,类似于一个整体评价分数。若图像在这三个方面都取得满分,也就是得分为一。最终,我们计算了平均分数,以获得最后的综合评价。值得一提的是,从整体评分上看,我们的模“SuTI”目前在市场上表现最为出色。与 "Dream Booth"相比,我们的模型高出7个百分点。与其他模型相比,优势更为明显,接近 40% 以上。
综上所述,我们的模型显示出了出色的性能,在谷歌内部也引起很多关注。
然而,正如之前所述,尽管我们在个性化生成上取得了显著的进展,但我们的图像逼真度(photorealism)仍未达到最佳状态。当前,我们的逼真度评分为92%。仔细观察这些图像,你会发现它们在某些程度上仍存在失真现象。例如,在某些狗的图像与背景结合的情况下,与真实原图相比,仍存在一些差距。相比之下,与"Dream Booth"相比,我们的模型在自然性方面稍逊一筹。这种情况反应出了我们模型的局限性,特别是在处理人脸和文字细节表达方面,效果相对较差。
目前我们的主要目标是将该模型扩展至更大规模以解决上述问题。此外,我们计划在SuTI技能中增加更多功能。尽管我们目前已经具备五项技能,如样式化(stylization)、重上下文化(recontextualization)等,但我们希望能够进一步添加一些技能,例如将姿态(pose)内容整合进去,添加边界框等,类似于Control Net。甚至,我们计划引入一些具备组合能力的技能,使图像能够在变换风格的同时,将其置于新的场景中,当前模型尚无法实现此类复杂任务。我们致力于不断提升模型性能,通过扩大数据集和模型规模,使其具备更多的技能。我们的目标是将各种控制信号加入模型中。最终,我们希望将整个系统构建为一种指令微调(instruction tuning)的格式。值得注意的是,由于之前模型存在版权问题,我们已经进行了重新训练,目前已基本完成。在7月份,我们计划将该模型发布到Google Cloud,与大家分享。您可以在Vertex AI平台上找到该模型,类似于"Palm 2"。只要注册到Google Cloud,就可以体验我们的模型。基本的生成操作是免费的,只有在超出一定使用量后才会收取费用。
五、问答环节
Q1:非常感谢陈文虎老师的分享,内容非常有趣。现在进入问答环节,我注意到评论区已经有一些问题了。第一个问题是,根据训练数据,我们只能获得图像和文本的对齐,为什么在应用时我们可以获得风格、角度等属性的增强?
A1:在我们的训练数据中,实际上也包含了这些风格等属性。例如,对于TEAPOT这样的提示语,可能会是“生成毕加索风格的TEAPOT图像”。然后通过"Dream Booth",它可以生成具有毕加索风格的TEAPOT图像,这只是一个示例。此外,在构建提示时,我们使用了大型语言模型,它生成的提示非常多样化,涵盖了各种属性,如风格、视角等。比如,提示可能包含特定的风格、特定视角,如从下方视角看的TEAPOT。而"Dream Boost"生成的图像在成功的情况下,会呈现从底部视角看的TEAPOT,这是其有效性的原因。
Q2:所以,我们的训练数据实际上已经包含了这些图文对和生成序列。
A2:是的,训练数据已经相当丰富,已经包含了这些所谓的技能。
Q3:那么,如果我们增加这些数据集,是否可以进一步提升模型性能?
A3:是的,您说得对。我认为,这个框架的优点之一是它没有任何限制,不必局限于特定的技能集。只要有一种方法可以将新的技能集打包成输入输出的形式,我们就可以使用相同的训练方法对模型进行训练。
Q4:好的,接下来是第二个问题,就是关于SuTI的技能点如何与具体的网络结构设计相对应。
A4:我认为我刚才已经在回答这个问题了。我们的网络结构可以看作是一个注意力机制,它根据输入的指令和输出来自适应地进行调整。不同的技能通过输入输出的方式传递给模型,然后模型自己进行泛化。这可以类比为一种指令调整的感觉,你提供不同的指令,就会得到不同的输出。网络结构本身并没有太多变化,它仅仅是一个正常的扩散模型。
Q5:事实上,我认为更好的方法是技能实际上是由数据来定义的,而不需要在结构上进行特殊处理。
A5:对,技能就是这样的,实际上这个网络结构可以被视为是一个很广义的注意力机制。不同的技能被打包成输入输出格式,并提供给模型,然后模型就可以进行相应处理。当然,这个问题会在后面进一步讨论,对吧?目前这五个技能不需要对网络结构进行特殊的调整。但是对于我们新增加的一些技能,可能需要进行结构上的调整。比如说,如果要为人物提供一些关键点(key point)或面部网格(face mesh),这些新的控制信号需要用新的编码器进行编码,不能再使用之前Unet的下采样层。因为在这种情况下,我们的网络假设你输入的控制信号是一张正常的图像,但是如果存在其他信号,如坐标等,那么网络架构可能需要进行重新调整,添加新的注意力机制以处理这些新的控制信号。
Q6:是的,这实际上也解答了我想问的问题。确实,如果将其与Control Net等工作结合,可能会产生更多有趣的结果。
A6:事实上,我们当前的模型版本已经能够与Control Net结合。尽管在这篇论文中还没有详细描述,但例如,对于一些小黄鸭这样的对象,它们可能只有一种姿势,与控制相关可能不太有意义。然而,对于一只狗这样的对象,由于它可能有多种姿势,我们可以绘制出类似于在空中的躯干形状,然后我们的模型可以将主体与这个躯干连接起来,从而呈现出特定的姿势。
Q7:好的,还有最后一分钟。接下来我提出最后一个问题,这里是关于使用同一编码器将文本图像对齐到同一领域的方法。除此之外还有其他方法吗?
A7:还有其他方法吗?还有一个方法,就是不使用相同的编码器。例如,你可以使用其他的编码器,如CLIP、BLIP等。然而,我们的实验发现,这些方法的效果并不是特别好。当然,我们之前使用的那些编码器的参数量并不是很大,但是现在有一些更大的编码器,如22B的[1]等等,可能会有更大的特征图,使模型能够在一个共同的领域内进行attention。因为我们的模型复用了相同的编码器,它们共享了原始模型的encoder,所以它们通过这个特征图,基本上是在相同的特征空间中进行操作。