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)生成不错的效果图

躺在废墟中的玻璃鲸鱼

山随平野尽江入大荒流

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

奇异森林铅笔画风格