AI绘画很酷,可是..原理是什么?

写此文的初衷是总结一下这几天玩的东西,我比较熟悉对抗生成网络(Generative Adversial Networks,GANs),但对扩散模型(Diffusion Model)则比较陌生,读了其相关的一些论文后,打算总结记录一下,同时也试图站在一个完全不懂 AI 的读者视角解答: AI 文字绘画到底怎么做到的?

因为不是论文阅读笔记,所以会尽可能以“How it works?”的逻辑出发,着重在原理和实际怎么做的,其中可能存在不严谨、不合理之处,请谅解。

目录:

  • 图片是如何被 AI 生成的
  • 图片生成的几种方式
  • AI 怎么用文字绘画?

一.图片是如何被 AI 生成的

假设我们有十万张图片,包含各种肤色、姿态和表情的真实人脸。

如何用 AI 生成一张不存在的人脸呢?

StyleGAN生成的"不存在"人脸

一个想法是:

  1. 把一张 512x512 尺寸人脸图像 X 送入模型(Encoder),得到一个 1x256 维的浮点数向量 z。
  2. 另一个模型(Decoder)负责将该向量 z 再还原成 512x512 的人脸图片,记做 X’。
  3. 模型训练的目的,是不断调整 Encoder 和 Decoder 各自参数,以降低(X,X’)之间的偏差。

找了张 VAE 结构图作为近似说明:

VAE网络结构

如果模型训练完毕,此时我们得到了所有输入图片 X={x1, x2, …, xn}通过 Encoder 的向量 z,将其可视化一下,结果大概是下图这样:

隐空间(latent space)可视化

图中的每个点都是一张真实人脸图片经过 Encoder 编码后的结果,因为肤色、姿态或者性别被聚成不同颜色的簇。如果我们从上图的可视化空间中随机采样,或者在几个点之间插值,就得到了一个新的 z,用这个 z 再经过 Decoder,就可以生成一张现实中不存在的人脸。

这种方法推广到非人脸生成也是类似的原理,例如我们有一个包含车、森林、船等各式各样图片的大杂烩数据集,用此方法得到的 z 可视化结果大概长这样:

隐空间随机采样

二.图片生成的几种方式

除了上文中提到的 VAE,图像生成还有其他几种方式,这里只介绍 GAN 和 diffusion model。

GAN

生成对抗网络(Generative adversarial networks, GANs)是近几年来最热门、最有趣的一种生成模型,它的思路朴素又巧妙。在讲述之前,容我先虚构一个故事:

假设你是永生者,即被砍头之后又可以带着之前的记忆复活。

此刻你在 1980 年的中国,穷困潦倒。你动了心思,想凭借自己画画的手艺伪造假币财富自由。于是从村口买了几张白纸,把 100 元面值的形状和图案牢记于心。画完一百张,你成了万元户,拿着它们去找村口商店老头、菜市场的小贩买东西,他们都没法辨认真假。

有一天小贩去银行存钱,被验钞机发现了破绽,你被捕了,game over。

你重生了,吸取了上次的教训,从黑市买了台跟县银行一模一样的验钞机,每天捣鼓它鉴伪的原理、改进工艺。终于有一天,假钞放进去不滴滴了,你大喜,假币再次在县城泛滥。

你的产业越做越大,终于引起了当地警方的注意,起因是有职员发现流通货币统计结果存在异常。有关部门意识到现有的验钞技术实在落伍,使用你的假币作为测试样本,很快更换了更先进的验钞机,全国推广,你再次因伪造假钞被击毙。

…

无数的攻防战中,你经历数次生命轮回,造的假钞越来越难以用肉眼辨伪,除了最新的第 99 代以外,其他旧版验钞机在这些假钞面前溃不成军,它们成了某种无限接近真实的虚假。

这便是 GAN 的核心思想,如果从理论的角度阐述,大概是:

  1. 给定一个真实世界的数据集,图片尺寸均为 512x512,以及一个生成器(Generator,以下简称 G)和一个判别器(Discriminator,以下简称 D)。生成器 G 负责生成假的图片(伪造假钞),判别器 D 负责鉴别一张图片是否为真,并输出 0/1 二分类结果(验钞机)。
  2. 随机初始化一个 1x128 维度的向量 z,G 以 z 作为输入生成一张 512x512 的图片 X’,从真实数据集中随机一张图片 X,将(X, X’)这两张图送进 D,由它来判断哪张图是真的,哪张是假的。并把判断依据反馈给 G。
  3. G 的目的是不断生成更像真实数据集里的图片以企图骗过 D,而 D 学习如何判断送过来的两张图片哪张是真的、哪张是假的。

在不断的攻防战中,Generator 生成的图像就会无限逼近真实数据集。

GAN原理图

这里其实有个很有趣的前提,就是 D 在早期其实也不知道如何辨别真假,它也在根据 G 的伪造结果一步步学习,正因为它有可能鉴别错误,才给 G 提供了可以钻空子的余地。倘若一开始 D 就像第 99 代验钞机那么先进,G 可能永远摸不着门道如何造假,直接放弃了(模型崩溃)。

Diffusion Model

和 GAN 基于对抗的思路不同,Diffusion Model 想法是: 给一张真实的图像不断增加高斯噪声,直到它最终的分布就是高斯分布,然后逆序从高斯分布重建这张图。

假设 x0 是一张真实图像,那么不断叠加高斯噪声 T 次,得到的图像序列(x1, x2, …, xt-1, xt)会越来越模糊,直到 xT 完全符合高斯分布,模型学习如何从 xt->xt-1 的“降噪”过程,如下图所示:

Diffusion原理图

三.怎么用 AI 实现文字绘画

截止到目前位置,无论是 GAN 或是 Diffusion Model,都只是一个单纯的图像生成工具,和文字没有任何关系。想打造一个根据某段描述文字绘画的模型,还缺了点东西将二者联接起来。

在当前节点它是 CLIP。

CLIP

CLIP(Contrastive Language–Image Pre-training) 是 OpenAI 在 2021 年提出的一个模型,它给自己的定位是连接文本与图片(Connecting Text and Images),通俗一点的解释是把图片和与其内容相符的文字描述关联起来:一张图片和一句文本描述越贴切,其 CLIP 下的相似度越高。

CLIP模型结构

CLIP 模型使用分类器来提取图像的标签,例如上图中图片里包含了狗,如果文字里出现了"dog",二者的 embedding 在某个维度相似度就很高,尽管其他维度可能差异较大。这种训练方式减少了对大量{图像,文字描述}配对数据的依赖。

终于可以开始画了

既然可以计算一张任意图片和一句任意文本间的 CLIP 表征相似度,就可以开始用 GAN/diffusion 模型来实现 AI 绘画。以 Disco Diffusion 为例,思路如下:

  1. 给定一句文本,通过 CLIP 模型得到其表征 embT。
  2. 使用 GAN/diffusion 模型,随机生成一张图像(比如噪声),并通过 CLIP 得到其表征 embI。
  3. 计算(embT, embI)二者的相似度,并不断迭代修改这张图片,使(embT, embI)更接近。

整个过程不需要训练任何模型,CLIP 和 GAN/diffusion 模型的参数均是固定的,唯一要做的是不断进行类似下图的迭代过程以生成更符合文字描述的图片。

我手绘的Disco Diffusion运行示意图

结尾

附上一些我改装的disco diffusion(模型是 guided diffusion + CLIP)生成不错的效果图:

躺在废墟中的玻璃鲸鱼

山随平野尽,江入大荒流

五颜六色的立方体冰块漂浮在火山的湖泊中

奇异森林,铅笔画风格