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

写此文的初衷是总结一下这几天玩的东西我比较熟悉对抗生成网络(Generative Adversial NetworksGANs)但对扩散模型(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 各自参数以降低(XX’)之间的偏差

找了张 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 维度的向量 zG 以 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)生成不错的效果图

躺在废墟中的玻璃鲸鱼

山随平野尽江入大荒流

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

奇异森林铅笔画风格