下图是一张噪声图像,也许你可以理解成由计算机的随机数生成,实际它也可以由一张图像慢慢加噪得到。
对一张图像加噪的过程,架起了图像生成的桥梁。计算机学习加噪的逆过程,就能慢慢掌握从噪声到图像的规律。类比物理学中的热扩散方程,热扩散和图像噪声化有异曲同工之妙,两者都是一个从有序到无序的熵增过程。你可以这样理解:将图像每个像素点的明暗程度看作热运动的粒子,那么一张图像中那些有序的高热量区域就会向低热量区域扩散,最终达到热平衡的噪声状态。扩散方程是离散化的:
从原图到噪声图,使用扩散方程给图像加工的过程,可以分为t个时间步。模型可以逐步的学习去噪。扩散模型的训练,主要可以分为两个阶段。
1.首先是向前扩散
:控制每一步加入多少噪声的参数,通常 ,越大当前添加的噪声越多,一般在添加过程中,设置随着t增大,逐步增大,直到得到完全噪声图像。
对于 则表示从正态分布中采样出来的随机噪声。正态分布或高斯分布,是描述自然界大量随机事件的普遍规律。所以你可以把 理解成计算机生成的一组随机数。得益于框架,在实际应用中这个变量可以调用很简单的代码生成,如下:
c_t=torch.randn_like(x_t)#标准高斯分布采用
我们得到了一组形状和原始图像相同的随机数 再代入这个扩散方程中,就能根据前一步的图像,计算出后一步的图像。在实际要求中,我们想要求任意时间步的 也不用这样一步步的求,可以直接令 等于 1 减去 的累积乘积,直接从 求出 。
----->
到了这里我们的第一阶段就结束了,我们来到第二阶段。
2.逆向扩散过程
逆向扩散过程的目的是想办法将一张纯噪声图 逐步去除噪声,最终恢复出一张清晰的有意义的图像
x_t->去...噪->x_0
如何才能做到呢?之前我们根据扩散方程可以从 计算 ,现在要去除噪声就是要反过来从 求 把公式变一下就是像下面这样:
现在式子里 因为是提前设定好的,我们是知道的。所以求 的关键就在于这个 但问题是它是个随机数,每次生成的都不一样,我们是没办法通过什么数学公式来求出它的。
不过这恰好是我们万能的神经网络的拿手好戏,既然数学上很难求出它,那我们就训练一个神经网络,把它预测出来不就行了。现在我们需要找一个神经网络,比如U-Net。给它输入带噪的图像 和当前的时间步 ,让它输出 然后计算它和实际添加噪声 之间的均方误差作为损失函数,最后通过大量的样本训练网络,最小化这个损失,就可以得到一个能够预测每一步噪声的AI模型了,这样给模型一张纯噪声图 就能根据它所预测的噪声 一步一步还原出清晰的图像 了。
从本质上来说,模型学习的是如何从噪声中还原出原始数据的概率分布,它通过预测出每一步的噪声,间接学会了如何从 中剥离掉一部分噪声得到 。
那么我相信很多人和我有一样的疑惑,拿一张图片加了噪声再去除噪声有什么意义呢?这不是脱了裤子放屁吗?这就涉及到了扩散模型的下一个核心问题就是条件生成。模型从一张噪声图中去除一部分噪声绝对不是随意的,而是受到了额外信息的指导。也就是说在训练阶段,我们不仅要给模型提供带噪图像 和时间步 还需要提供与原始图像 相关联的条件信息 。这个条件信息 就是模型学习的目标或者指引,我们下面用文生图模型来举例说明。
"一只可爱的猫咪"
在文生图模型中,条件信息 就是描述图像 的文本标签或者提示词。例如训练图片是一只猫,对应的 可能就是 "一只可爱的猫咪" 的提示词。而在图生图模型中, 就是另一张图片或者草图中的信息。不过在训练的过程中,我们必须实现条件信息与生成图像的精准对齐,只有这样才能保证生成的图像完全符合提示词的要求。
接下来我们来介绍如何整合条件信息,在文生图中常用的神经网络模型如U-Net是如何工作的呢?
假设现在有一张带噪图像 将它输入U-Net后会先经过一个下采样的过程,这个过程就像把高清大图缩小成低分辨率小图一样,同时提取图像中的关键信息(关于U-Net可以自己问大模型,也可以关注我后续的博文),例如轮廓和结构特征。在技术方面,下采样可以通过步长卷积来实现,经过下采样的图像形状发生了改变,虽然分辨率降低了,但是通道数达到了最高。
(128x128x3)....>(64x64x64)....>(32x32x128)....>(16x16x256)
而接下来也会进行另一个核心过程:交叉注意力层 。
该层将会实现提示词和图像特征的对齐,交叉注意力层有3个较为重要的参数,分别是 。其中 是经过下采样的图像特征, 和 则是我们的提示词输入文本编码器 CLIP 后被编码成的两个向量。你可以将 理解成提示词信息的标识符,将 理解成提示词文本的具体内容,他们就像一本书的目录和正文,这时候我们可以拿图像特征 和目录 进行对照看看能否对得上,如果对上了我们就把具体信息 加入到这个对上的区域,这个对照的过程可以用 和 的点积套上一个激活函数来表示:
其中 是一个防止梯度爆炸的参数,如果 和 非常匹配,那么 的结果将会趋近于1,和 相乘后将会把 的文本信息给代入到特征图中。而如果 和 不匹配值将会趋近于0,和v相乘后将不会被代入到这个特征区域中。
这时候,我们已经经过了下采样,经过了交叉注意力层,接下来将特征图进行上采样:
上采样和下采样相反,是将缩小后的图片恢复到原来的尺寸,最后输出预测噪声
再举一个例子:
假如我们想生成一张猫咪的图片,现在已经有了一张带猫咪轮廓的噪声图 ,这个图像经过下采样后,得到一张特征图 ,我们的提示词经过 CLIP 编码后输出了 和 的两个向量序列。其中 包含“猫””灰色“等语义向量特征, 则包含猫的具体毛发细节等语义信息,那么我们希望将 中的细节只加入到猫所在的区域,我们拿猫轮廓特征图 逐个像素点的分别和向量 进行点积运算。计算得分高的区域,就说明和提示词关联性强,再与 相乘就将 的语义信息标记到了这个特征区域,就能精准的将提示词信息给注入到图像的不同区域,这时候再将整合后的特征图用反卷积进行上采样,最后预测出一个和 形状相同的噪声 然后再根据扩散模型公式将这个噪声 剥离,就得到了更像猫的图片,经过多次迭代,就能生成一个完整,清晰的猫咪图像。
当然扩散模型也可能不能一次就生成正确结果,仍然需要大量的训练。
下面就说说扩散模型的一些局限性:
例如,在训练的过程中对细节的学习不够充分,模型本质上学习的是像素的概率分布,所以对于一些自然规律它可能无法把握。
不过这些问题未来一定能解决,目前的文生图模型总体上来说已经好多了,不过未来可能也会出现全新的框架来取代扩散模型。