1、序言
大家好,欢迎来到AI手工星的频道,我是专注AI领域的手工星。AIGC已经成为AI又一个非常爆火的领域,并且与之前的AI模型不同,AIGC更适合普通人使用,我们不仅可以与chatgpt对话,也能通过绘画模型生成想要的图片。很多朋友都想去深入的了解和掌握AIGC的原理,但是AIGC需要一定的学习成本,其入门门槛较高。因此手工星制作了这一系列的入门教程,希望能够帮助到有需要的朋友。大家注意哦,由于AIGC的范围较广,而手工星的能力有限,因此这一系列的入门教程将限定在适用于图像、视频生成的扩散模型领域,手工星将围绕扩散模型的原理,环境搭建、使用、改进、数学推导等多个方面来帮助大家入门。注意到这里手工星将数学推导放在了最后,那是因为手工星觉得对于扩散模型一开始就讲解数学推导,会令很多朋友索然无味,早早放弃。我们先通过感性的方式认识扩散模型,使用扩散模型,了解了一些基本概念,有了一定的实践基础之后,再去推导数学公式就水到渠成了。总之,这个系列的规划大致就是这样子的,可能的文章顺序大概是这样的(不排除编写过程中做调整):
- AIGC入门系列1:感性的认识扩散模型
- AIGC入门系列2:如何控制扩散模型生成我们想要的内容
- AIGC入门系列3:什么是潜在扩散模型
- AIGC入门系列4:扩散模型的应用(文生图、图生图以及图像编辑)
- AIGC入门系列5:扩散模型环境搭建(diffusers)
- AIGC入门系列6:在diffusers上尝试文生图、图生图以及图像编辑
- AIGC入门系列7:DreamBooth
- AIGC入门系列8:ControlNet
- AIGC入门系列9:扩散模型的数学原理
- AIGC入门系列10:扩散模型的改进
- AIGC入门系列11:扩散模型的展望
由于手工星工作比较忙,出教程的速度可能无法保证,还请大家多多见谅。如果你喜欢手工星的频道的话,记得点赞收藏哦。
2、什么是扩散模型?
2.1、污水的扩散
本期教程作为AIGC入门系列的第一篇,我们来聊聊什么是扩散模型。当然,我们限定在感性认知的前提下。首先想到扩散,我们很容易想到这是一个由小到大,或者由浅入深的过程。例如,工厂偷偷向湖泊里面排放污水,污水会逐渐扩散,最后将整个湖泊都污染了,使得我们原来干净透彻的湖水变得面目全非。
那么如果我们要治理污水,恢复湖泊本来的面目。我们可以怎么做呢?第一步,我们可以先用化学试剂与污染物起反应,消除掉一部分污染物,此时河面会稍微清澈一些。然后我们可以往河水里加入絮凝剂,又可以沉淀掉一些污染物,河水也更干净了一些。最后我们可以种植一些能够吸收污染物的绿色植物,将湖泊里的污染物彻底清理干净。自此,前面扩散的污染就被全部清理干净,湖泊恢复了本来的面貌。(注意哦,手工星完全不懂治污流程,上面的过程纯粹是瞎编的!)
通过上面的流程,我们其实就已经经历了扩散与逆扩散的过程。工厂偷偷排污,以致于污染了整个湖泊,这就是一个污染物扩散的过程;而治理污水就是一个逆扩散的过程,将扩散出来的污染物一点点的清除掉。有了这个感性的认识,我们再来看看AIGC当中大名鼎鼎的扩散模型。
2.2、扩散模型的概念
如果我们对一张干净的图片进行“排污",这里我们用高斯噪声作为污染物,所以"排污"就是对图片加噪的过程。那么随着持续的加噪,噪声扩散的强度越来越大,使得我们原来干净的图片变得逐渐模糊,以至于最后面目全非,完全分辨不出是一个骑行的小姐姐了,如下图所示。
如果此时我们训练一个“治污模型”,它能够将图片恢复,就像上面的湖泊“治污”流程那样,一步一步的治理污染,去除噪声,慢慢的将面目全非的图片恢复到干净的原始图片,如下图所示。
那么这个“治污模型”就是一个非常好用的生成模型了。为什么这么说呢?这个“治污模型”不只是把一张被污染的很严重的图片给恢复了而已吗?它并没有生成新的图片啊?这个思考非常棒,也很有代表性。那么既然它没法生成新的图片,为什么手工星称它已经是一个非常好用的生成模型呢?其实它确实具备了生成图片的能力。因为当你把一张图片持续加噪,得到一张面目全非的图片,那么这张面目全非的图片,实际上跟我们直接从高斯分布随机取一张噪声图,是等价的。也就是说,当有了一个“治污”模型之后,我们直接送给他一张随机生成的噪声图,它也能通过一步一步的去噪流程,生成一张符合我们审美的图片了。amazing!是不是很神奇,这样的话,我们是不是确实可以称它为“生成模型了”。
2.3、时间步的概念(time-step)
前面的流程我们一直在强调一步一步的加噪或者一步一步的降噪。为什么没法一步到位,直接进行一步加噪和一步降噪呢?想象一下我们湖泊污染过程,污水是慢慢扩散到整个湖泊的,而不是瞬间就把整个湖泊给污染了。同样的,治污过程也不是一蹴而就的,没法直接快速的将所有污染治理干净,一般都是一步一步,一点一点的治理的。这在直觉上很好理解,一步一步的操作总要比一步到位简单很多,同样的在扩散模型中也是一步一步的降噪比一步到位的降噪更容易学习。因此也会有更好的效果。所以扩散模型中一般都有时间步的概念(time-step),就是事先定义好花多少步将一张图片完全加噪为面目全非的随机噪声,同样也对应着降噪过程花多少步慢慢的恢复到正常图片。当然,这里的时间步会存在一个矛盾,就像治理污水一样,步数太多,虽然每一步的效果比较容易保证,但是需要的步数太多,流程太慢。而步数如果定义的太少,那么虽然效率提升了,但是并不容易得到好的恢复效果。不过最后,手工星还是要友情提醒一下,这里是我们感性认识扩散模型的部分,实际上的加噪过程是可以通过数学公式简化,实现一步到位的。但是对于目前我们入门来说,可以暂时先不考虑优化。另外这个时间步通常是很大的,例如可以是1000步,所以当前阶段,大家只要要时间步的概念,并且知道它通常是比较大的就行了。
3、扩散模型的训练
我们都知道,AI是基于学习的方法。AIGC也不例外,扩散模型也不例外。学习就意味着需要提供很多数据。那么我们需要如何准备数据才能训练出一个治污高手模型(去噪模型)呢?这里我们使用一个例子来说明。手工星非常喜欢宠物狗,手机壁纸都是狗子的图片,每次锁屏都想看到不一样的狗子,奈何手机里面狗子的图片不多。因此想用扩散模型方法训练一个去噪模型,这样就能生成无穷无尽的狗子图片。
首先是搜集狗子的图片,并且越多越好,于是手工星从网络上爬取了大量的狗子图片,做成了一个狗子数据集。
然后我们开发一个“排污”程序(加噪程序),它的作用就是按照前面介绍的加噪方法,给正常图片一步一步的加入噪声,直到图片面目全非。然后从加噪过程随机选择一些“时间步-噪声-加噪后图片”组成的训练三元组。
有了这些训练三元组,我们就可以很方便的训练去噪模型了。对于去噪模型来说,输入就是加噪后的图片以及时间步,输出就是去噪模型预测的噪声。我们训练的目的就是让去噪模型在每一个时间步预测的噪声和真实噪声尽量接近。当经过几万、几十万次的训练后,我们的去噪模型预测的噪声已经和真实噪声非常接近了。
4、扩散模型的推理
有了上面训练出来的狗子去噪模型,下面就是激动人心的时刻了,我们可以使用去噪模型生成狗子图片了。首先我们从高斯分布中随机采集一张高斯噪声图片,然后送入到去噪模型当中,假设我们的时间步设置的是1000,那么就将高斯噪声图片经过去噪模型的1000次降噪,最后就会得到一个狗子图片了。而且这个狗子图片和我们训练数据中的狗子图片不一样,完全是去噪模型生成出来的,就像是我们的大脑脑补出来的图片一样。并且当我们采集的高斯噪声不同,生成出来的狗子图片也完全不同,此时我们就已经实现了一个能够生成无穷无尽狗子图片的“生成模型”了!
5、总结
这一期的感性认识扩散模型到这里就结束了,是不是并没有想象相中的那么难!我们从湖泊的污染和治理说起,引申到图片的加噪与去噪。最后介绍了如何用去噪模型生成图片。下一期我们将介绍扩散模型中的文本控制。大家有没有发现我们现在的生成模型缺少控制能力。例如上面介绍的狗子去噪模型,它训练完之后确实能生成狗子的图片,但是假如我想生成一张黄皮肤、大眼睛的狗子图片,我们的狗子去噪模型就无能为力了。因为它生成的图片具有一定的随机性,虽然是一只狗子,但是狗子的属性我们完全无法控制。而在很多生成领域,我们其实是希望能够具体控制模型生成的效果的。因此下一期将介绍如何通过文本描述来控制模型生成一张符合我们要求的图片,喜欢的朋友可以收藏手工星的频道“AI手工星”,我们下期见吧。