在之前的四篇 “[Generative AI 新世界](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg5Mzg1NDc2NQ==&action=getalbum&album_id=2674381074877399043#wechat_redirect?trk=cndc-detail)” 中,我们带领大家一起探索了[生成式 AI(Generative AI)](https://dev.amazoncloud.cn/column/article/6413095e3d950b57b3f9f63d),以及[大型语言模型(LLMs)](https://dev.amazoncloud.cn/column/article/64411c1dfed6cd33add92882)的全新世界概览。并在文本生成(Text Generation)领域做了一些概述、相关[论文解读](https://dev.amazoncloud.cn/column/article/641c329888a713631101349a)、以及在[亚马逊云科技的落地实践](https://dev.amazoncloud.cn/column/article/6454e7f282781d3c03b23673)和动手实验。
从本期文章开始,我们将一起探索生成式 AI(Generative AI)的另一个进步迅速的领域:**文生图(Text-to-Image)领域**。我们将用三个系列文章的篇幅,来一起洞察在文生图(Text-to-Image)领域的前世今生、相关论文解读、以及在亚马逊云科技的落地实践和实际代码实现展示等。
# CLIP:基于对比文本-图像对的预训练
2021 年之前,在自然语言处理 (Natural Language Processing) 领域有很多预训练方法都获得了成功。例如,GPT-3 的 175B 从网上搜集了近 5 亿 tokens 进行预训练,在很多下游任务上实现 SOTA (State-of-the-Art) 性能和 Zero-Shot Learning。这说明从海量互联网数据 (web-scale) 中学习,是可以超过高质量的人工标注 NLP 数据集的。
但是在计算机视觉 (Computer Vision) 领域的预训练模型还是主要基于人工标注的 ImageNet 数据进行训练。由于人工标注的工作量巨大,许多科学家们开始设想:如何构建更为高效、便捷的方式用于训练视觉表征模型呢?
2021 年 OpenAI 发表的论文++《Learning Transferable Visual Models From Natural Language Supervision》++提出了 CLIP (Contrastive Language-Image Pre-training) 模型,并在论文中详细阐述了如何通过自然语言处理监督信号,来训练可迁移的视觉模型(其原理架构如下图所示)。
- 《Learning Transferable Visual Models From Natural Language Supervision》
https://cdn.openai.com/papers/Learning_Transferable_Visual_Models_From_Natural_Language_Supervision.pdf?trk=cndc-detail
![d7c273a57f7f527f18bb3cbde5d36975.png](https://dev-media.amazoncloud.cn/5623d255ea9a4848a0a6b376d413d7b9_d7c273a57f7f527f18bb3cbde5d36975.png "d7c273a57f7f527f18bb3cbde5d36975.png")
Source: https://github.com/openai/CLIP?trk=cndc-detail
对于 CLIP,OpenAI 是在 4 亿对图像-文本对上进行训练。关于 CLIP 论文,会在下一期和其它文生图(Text-to-Image)领域的重要论文一起集中解读。以下先简单展示下论文的主要结论(如下图所示)。论文的实验经过 ImageNet 数据集的重新筛选,制作了几个变种的版本。基于 CLIP 训练出来的模型效果非常理想:
![58b25f51a914b2c3842c012996582633.png](https://dev-media.amazoncloud.cn/1a666e8238ae4ec0b514b8bd66e520fd_58b25f51a914b2c3842c012996582633.png "58b25f51a914b2c3842c012996582633.png")
Source: https://github.com/openai/CLIP?trk=cndc-detail
在 ImageNet 数据集上训练出来的 ResNet 101 模型准确率是 76.2%,用 CLIP 训练出来的 VIT-Large 模型准确率同样是 76.2%。然而当我们换成其它数据集,严格按照 1000 类的分类头再次训练,ResNet 101 得出的模型准确率却下降得很快。特别是使用上图中最后两行样本(素描画或者对抗性样本)时,ResNet 101 准确度仅为 25.2% 和 2.7%,基本属于随机猜测,迁移效果惨不忍睹。对比使用 CLIP 训练出来的模型,准确率仍然不错。
这说明:**因为和自然语言处理的结合,所以导致 CLIP 学出来的视觉特征,和用语言所描述的某个物体,已经产生了某种强烈的联系**。CLIP 这种基于文字-图像对的预训练模型对后续生成式AI的重要影响,论文的作者自己在当时都没有足够意识到,从此拉开了生成式 AI 文生图(Text-to-Image)领域波澜壮阔的大幕。
那么 CLIP 是如何训练的呢?
CLIP 是根据图像及其标题的数据集进行训练的。想象一个有 4 亿对的“图像-标题”对的数据集:
![26cbaaa5871a5706f99c00cfe948475c.png](https://dev-media.amazoncloud.cn/34c16e15c79e4dcbbd2b2a131ceaa94d_26cbaaa5871a5706f99c00cfe948475c.png "26cbaaa5871a5706f99c00cfe948475c.png")
图像及其标题的数据集
Source:https://jalammar.github.io/illustrated-stable-diffusion/?trk=cndc-detail
实际上,CLIP 是根据从网络上抓取的图像以及其 “alt” 标签进行训练的。
CLIP 是图像编码器和文本编码器的组合,我们分别使用图像和文本编码器对图像本身、图像标题进行编码,如下图所示:
![b5dd12ef6813e5840ed73d1767722feb.png](https://dev-media.amazoncloud.cn/b71b938830a742fb9f0987aeb623b24a_b5dd12ef6813e5840ed73d1767722feb.png "b5dd12ef6813e5840ed73d1767722feb.png")
Source: https://jalammar.github.io/illustrated-stable-diffusion/?trk=cndc-detail
然后,我们使用余弦相似度(cosine similarity)比较生成的嵌入向量(embeddings)。当我们最初启动训练过程时,相似度可能会很低,即使文本实际上已经正确描述了图像的内容。
![ba8d17f962c3871ef8cc69e98386ac90.png](https://dev-media.amazoncloud.cn/b597b276b73b447ab45bb33c64964509_ba8d17f962c3871ef8cc69e98386ac90.png "ba8d17f962c3871ef8cc69e98386ac90.png")
Source: https://jalammar.github.io/illustrated-stable-diffusion/?trk=cndc-detail
接下来,我们将更新这两个模型,以便下次嵌入它们时,生成的嵌入是相似的。
![d5a37ada114f0183982349a59be70f2e.png](https://dev-media.amazoncloud.cn/e5cfe32284024d228eb60f4cfb287b79_d5a37ada114f0183982349a59be70f2e.png "d5a37ada114f0183982349a59be70f2e.png")
Source: https://jalammar.github.io/illustrated-stable-diffusion/?trk=cndc-detail
通过在数据集中重复这一点并进行大批量处理,我们最终使编码器能够生成狗的图像和 “a picture of a dog” 句子相似的嵌入向量。另外还需要考虑的是,训练过程还需要包括不匹配的图片和文本的负面示例,并且模型需要为它们分配较低的相似度分数。
## OpenCLIP:CLIP 的开源实现
CLIP 使计算图像和文本的表示形式以测量它们的相似程度成为可能。CLIP 模型以自我监督的方式在数亿或数十亿图像-文本对上进行训练。例如:LAION-5B 数据集,包含 58 亿个密切相关的图像-文本对。2022 年 9 月,LAION 利用这个数据集的 OpenCLIP 项目,对 CLIP 论文完成了开源实现。
- OpenCLIP 的 GitHub 网址:
https://github.com/mlfoundations/open_clip?trk=cndc-detail
LAION 使用 OpenCLIP 训练了三个大型 CLIP 模型:ViT-L/14、ViT-H/14 和 ViT-g/14(与其他模型相比,ViT-g/14 的训练周期仅为三分之一左右),并在其官方网站上称它自己是当年开源 CLIP 模型之最佳,如下图所示:
![818943a36650c5d2b707a6651dcaa336.png](https://dev-media.amazoncloud.cn/c846afa0bd084ac9b4938e51f5067df8_818943a36650c5d2b707a6651dcaa336.png "818943a36650c5d2b707a6651dcaa336.png")
Source: https://laion.ai/blog/large-openclip/?trk=cndc-detail
Stable Diffusion v2 版本的文本编码器就是用 OpenCLIP 训练的文生图(Text-to-Image)模型。该文本编码器由 LAION 在 Stability AI 的支持下开发,与之前的 V1 版本相比,它极大地提高了生成的图像的质量。此版本中的文生图(Text-to-Image)模型可以生成默认分辨率为 512 x 512 像素和 768 x 768 像素的图像,如下图所示:
![8a2d95f3688f7dbed7de1c39a086a148.png](https://dev-media.amazoncloud.cn/1ec86c8a44624d31a5db8e762d420be0_8a2d95f3688f7dbed7de1c39a086a148.png "8a2d95f3688f7dbed7de1c39a086a148.png")
Source: https://stability.ai/blog/stable-diffusion-v2-release?trk=cndc-detail
OpenCLIP 得以发展起来的重要原因,我觉得离不开开源这个重要话题。**尽管 Open AI 的 CLIP 模型是开源的**(共享了模型权重),在其包含 4 亿对图像-文本对的内部数据集上训练了许多模型变体,**但没有共享用于训练的数据集**。
而 OpenCLIP 这个开源实现,可以让研究人员在研究和优化模型时获得更大的透明度,这有利于生成式 AI 生态的长期健康发展。
# DALL-E-2 模型概述
还记得在 2022 年 4 月,第一次读完 DALL-E-2 论文++《Hierarchical Text-Conditional Image Generation with CLIP Latents》++,那时的感觉是:惊为天人。只不过没想到在之后的一年里,这个文生图(Text-to-Image)领域发展得如此之快。
DALL-E-2 论文我们下集再展开分析,这次先带大家看这篇论文里结构图里面的名词,是不是有些术语我们有些熟悉呢?是的,就是 CLIP。
- 《Hierarchical Text-Conditional Image Generation with CLIP Latents》
https://arxiv.org/pdf/2204.06125.pdf?trk=cndc-detail
![41e0e8bf11b26e2bac1e92d232360676.png](https://dev-media.amazoncloud.cn/806a3b22f2ce4f2489130636b2fd198d_41e0e8bf11b26e2bac1e92d232360676.png "41e0e8bf11b26e2bac1e92d232360676.png")
Source: https://arxiv.org/pdf/2204.06125.pdf?trk=cndc-detail
上图是 DALL-E-2 模型主要架构。
上部是一个 CLIP,输入为文本图像对,文本信息和图像信息分别经过文本编码器和图像编码器提取文本特征 C 和图像特征 C,文本特征 C 和图像特征 C 也是成对存在。
下方作为 DALL-E-2 主体部分,主要由 prior 和 decoder 两阶段。首先,文本信息经过文本编码器提取文本特征 D,然后 prior 根据文本信息 D 生成图像特征 D。训练过程中,图像特征 C 作为图像特征 D 的 ground truth 进行训练,也就是说训练时 DALLE2 生成的图像特征 D,会参考 CLIP 生成的对应文本的图像特征 C。最后通过一个解码器 decoder 根据图像特征 D 生成图像。
为了把 DALL-E-2 说得更加通俗易懂,我找到了这样的一张图:
![8cf76e5d3c42023ff6b4f5b6fa98a361.png](https://dev-media.amazoncloud.cn/c65a2fd787e1444985f0e720833c0a45_8cf76e5d3c42023ff6b4f5b6fa98a361.png "8cf76e5d3c42023ff6b4f5b6fa98a361.png")
Source:https://mp.weixin.qq.com/s/fkXxES4ikvOHMzmsXJwGzg?trk=cndc-detail
概括而言,DALL-E-2 训练了 3 个模型来完成文生图(Text-to-Image):
1. CLIP 模型:**负责将文本和视觉图像联系起来**
2. GLIDE 模型:**负责从视觉的描述中产生图像**
3. PRIOR 模型:**负责把文本描述映射到视觉描述**
这里再次强调我们在第一集中,就提及的 Transformer 模型的重要性。
Transformer 模型是上面提到的三个模型的知识底座。因为首先要找出图片和文字的重点,才能够搭建 CLIP 模型,然后才有之上的 PRIOR 先验模型和 GLIDE 扩散模型。
# Stable Diffusion 模型概述
## 1.Stable Diffusion 的组件概览
来自 Stability AI 的 Stable Diffusion 是一个由多个组件和模型组成的系统。它不是一个单一的模型。其主要组件如下图所示:
![31b064d0ec2f67b58de6f8e4d1c24dcd.jpg](https://dev-media.amazoncloud.cn/5d14cca5b24d4d718c6331398ca422b9_31b064d0ec2f67b58de6f8e4d1c24dcd.jpg "31b064d0ec2f67b58de6f8e4d1c24dcd.jpg")
Source: https://jalammar.github.io/illustrated-stable-diffusion/?trk=cndc-detail
我们从高级视图开始,我们将在本文后面详细介绍更多细节。首先,这个文本编码器其实是一种特殊的 Transformer 语言模型(技术上:CLIP 模型的文本编码器),它接受输入文本并输出代表文本中每个单词/标记的数字列表(每个标记的向量)。
然后,该信息将呈现给图像生成器,图像生成器本身由几个组件组成。
![b8f3af9cd2b63d8092dbd32a7557f11e.png](https://dev-media.amazoncloud.cn/cf2b87fa93bb4bc09bb7330753e05fce_b8f3af9cd2b63d8092dbd32a7557f11e.png "b8f3af9cd2b63d8092dbd32a7557f11e.png")
Source: https://jalammar.github.io/illustrated-stable-diffusion/?trk=cndc-detail
图像生成器经历了两个阶段。
### 第一阶段:图像信息创建者(Image Information Creator)
这种组件是 Stable Diffusion 的秘诀。与以前的模型相比,它在性能上有很大提升。此组件运行多个步骤以生成图像信息,这是 Stable Diffusion 接口和库中的步骤参数,通常默认为 50 或 100。
图像信息创建者完全在图像信息空间中工作,这个空间还有一个更学术的词:潜在空间(latent space)。此特性使其比以前在像素空间中运行的扩散模型(Diffusion Models)更快。用技术术语来说,这个组件由一个 **UNet 神经网络和一个调度算法(scheduling algorithm)** 组成。
“扩散”(diffusion) 一词形象地描述了该组件的作用,即对信息的分步处理。最终将由下一个组件图像解码器(image decoder),去生成高质量的图像。
![8c4a697f186f303669a7c91a785efd12.png](https://dev-media.amazoncloud.cn/3c350764d51a4e6c9532e77a57dbf4c3_8c4a697f186f303669a7c91a785efd12.png "8c4a697f186f303669a7c91a785efd12.png")
Source: https://jalammar.github.io/illustrated-stable-diffusion/?trk=cndc-detail
### 第二阶段:图像解码器(Image Decoder)
图像解码器根据从信息创建者那里获得的信息来绘制图片,如下图所示:
![49bd933be06af633c313bff044b663fc.png](https://dev-media.amazoncloud.cn/a9fead1562bc4de881ecdb6418dc0d62_49bd933be06af633c313bff044b663fc.png "49bd933be06af633c313bff044b663fc.png")
Source: https://jalammar.github.io/illustrated-stable-diffusion/?trk=cndc-detail
接下来,我们来看看构成稳定扩散的三个主要组成部分(每个组成部分都有自己的神经网络):
- **ClipText:用于文本编码**
输入: 文字/文本
输出: 77 个 token 嵌入向量(embeddings vectors),每个向量的维度为 768
- **UNet + Scheduler:逐步处理/扩散信息(潜在)空间的信息**
输入: 文本嵌入(text embeddings)信息,和由噪声组成的起始多维数组(数字的结构化列表,也称为张量 tensor )
输出: 经过处理的信息数组
- **Autoencoder Decoder:使用处理后的信息数组绘制最终图像**
输入: 处理后的信息数组(维度:(4,64,64))
输出: 生成的图像 (维度: (3, 512, 512) which are (红/绿/蓝, 宽 ,高)
![405247776737c728a092a8d38775d4b4.png](https://dev-media.amazoncloud.cn/da2033f3776649b391e1465413026577_405247776737c728a092a8d38775d4b4.png "405247776737c728a092a8d38775d4b4.png")
Source: https://jalammar.github.io/illustrated-stable-diffusion/?trk=cndc-detail
## 2.扩散(Diffusion)概览
写到这里,可能有读者会问:在 Stable Diffusion 中提及的扩散(Diffusion),到底是什么呢?
扩散是发生在粉红色 “图像信息创建器” 组件内部的过程,如下图所示:
![81f23b896fbd9b16ae0176782868f1f0.png](https://dev-media.amazoncloud.cn/c4adcb15f4a948aebd9ea81a73dba2a4_81f23b896fbd9b16ae0176782868f1f0.png "81f23b896fbd9b16ae0176782868f1f0.png")
Source: https://jalammar.github.io/illustrated-stable-diffusion/?trk=cndc-detail
通过使用表示输入文本的标记嵌入和随机的起始**图像信息数组**(image information array),也称为**潜在数组**(latents)。该过程会生成一个信息数组,图像解码器使用该数组来绘制最终图像。
这个过程是分步进行的,每个步骤都会添加更多相关信息。为了直观地了解这个过程,我们可以检查随机潜在数组(random latents array),看看它是否会转化为视觉噪声(visual noise)。在这种情况下,视觉检查是通过图像解码器(image decoder)进行的,如下图所示:
![f2ceb827a414985093c961f723b2f432.png](https://dev-media.amazoncloud.cn/829787b774614ed98c68442d6bab3de1_f2ceb827a414985093c961f723b2f432.png "f2ceb827a414985093c961f723b2f432.png")
Source: https://jalammar.github.io/illustrated-stable-diffusion/?trk=cndc-detail
扩散分多个步骤进行,每个步骤都对一个输入潜在数组(latents array)进行操作,然后生成另一个潜在数组,该数组希望更相似于输入文本和从模型训练的所有图像中获得的视觉信息,如下图所示:
![d4180fe213229f248b083965d100de32.png](https://dev-media.amazoncloud.cn/9b76a18d4bf6447c9e2220961909f76a_d4180fe213229f248b083965d100de32.png "d4180fe213229f248b083965d100de32.png")
Source: https://jalammar.github.io/illustrated-stable-diffusion/?trk=cndc-detail
我们可以将其中一组潜在数组可视化,以查看在每个步骤中添加了哪些信息。
![34a2a95886126af7e9b99535e3c14298.png](https://dev-media.amazoncloud.cn/a092d7932e5b41229954e4b3c94dd779_34a2a95886126af7e9b99535e3c14298.png "34a2a95886126af7e9b99535e3c14298.png")
Source: https://jalammar.github.io/illustrated-stable-diffusion/?trk=cndc-detail
关于 Diffusion Model 背后的工作原理,会涉及到一系列的论文研究成果,比如:DDPM、DDIM、Stable Diffusion 的论文等,我们会在下一篇的论文解读专题中做详细探讨。
![1683774477245.png](https://dev-media.amazoncloud.cn/ae89586f4fff4f028478020e4eefcffe_1683774477245.png "1683774477245.png")
本期文章,我们开始探讨生成式 AI(Generative AI)的另一个进步迅速的领域:文生图(Text-to-Image)领域。本期简述了 CLIP、OpenCLIP、扩散模型、DALL-E-2 模型、Stable Diffusion 模型等基本内容,希望读者对接下来对我们详细解读相关论文,以及最后进行文生图(Text-to-Image)领域的动手实验,有一个原理上的初步了解和基础知识储备。
下一期内容将进行文生图(Text-to-Image)方向的主要论文解读,敬请期待。
请持续关注 Build On Cloud 微信公众号,了解更多面向开发者的技术分享和云开发动态!
### 往期推荐
[#机器学习洞察](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg5Mzg1NDc2NQ==&action=getalbum&album_id=2674381074877399043#wechat_redirect?trk=cndc-detail)
[#开发者生态](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg5Mzg1NDc2NQ==&action=getalbum&album_id=2779048236715360257#wechat_redirect?trk=cndc-detail)
[#亚马逊的开源文化](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg5Mzg1NDc2NQ==&action=getalbum&album_id=2779048236732137474#wechat_redirect?trk=cndc-detail)
![6d816ee8fbf75372bf327e3f442166be.jpg](https://dev-media.amazoncloud.cn/380434d0b9944f8f9e536c8770e3ae48_6d816ee8fbf75372bf327e3f442166be.jpg "6d816ee8fbf75372bf327e3f442166be.jpg")