Diffusion和图像生成的关系

谈到diffusion model那么就不得不谈及AIGC. 在过去几年里里,以Stable Diffusion为代表的AI图像/视频生成是世界上最为火热的AI方向之一. Stable Diffusion里的这个”Diffusion”是什么意思?其实,扩散模型(Diffusion Model)正是Stable Diffusion中负责生成图像的模型。想要理解Stable Diffusion的原理,就一定绕不过扩散模型的学习。

在这篇文章里,我会由浅入深地对去噪扩散概率模型(Denoising Diffusion Probabilistic Models, DDPM)进行一个介绍。

图像生成任务的解决

相比其他AI任务,图像生成任务显然是一个更加困难的事情. 比如人脸识别,序列预测...这一系列任务都有明确的训练集来给出or蕴含一个[标准答案]. 但是图像生成就没有, 图像生成数据集里只有一些同类型图片,却没有指导AI如何画得更好的信息。

过去的解决方案:

GAN对抗生成模型

  • GAN的原理简介

GAN的主要结构,包括一个生成器G(Generator)和一个判别器D(Discriminator),整个训练过程,便是二者的对抗博弈: 给定参考数据集, 希望学习出使得最优化下面的函数:

它的含义其实就是: 对于生成模型, 输入是随机噪声 , 输出为 , 上面第二项就是使 越能够迷惑判别器越好. 判别器 输入真实数据 or 判别器需要对两者进行辨别.

  • GAN存在的问题:

(*) 无法用于解决离散型数据的生成问题, 自然语言处理是一个很典型的例子:

局部信息很重要:图像局部很多细节并不太影响人类的对图像的理解,只要整体到位就 ok,不然也犯不着 CNN 这么多 filter 一层层给你过滤,你破坏少数像素点不影响人类理解。自然语言麻烦在于,在细微处修改一下,就变味了。比如“西瓜汁好喝!”,我稍微改一下“西瓜汁好喝吗?”,尾巴动一点,整个意思都变了。GAN 局部信息重构到底是靠死记硬背训练样本,还是靠神经网络插值“生成”出来的?我反正不清楚,不管如何,针对自然语言这种细节敏感的问题,GAN 不是一个首选方案,不然 n-gram 的 LM 也不会活到今天。

  • 解决办法(引入强化学习RL)

related works SeqGAN

to be continued


VAE (Variational AutoEncoder) 变分推断模型

VAE作为可以和GAN比肩的生成模型,融合了贝叶斯方法和深度学习的优势,拥有优雅的数学基础和简单易懂的架构以及令人满意的性能,其能提取disentangled latent variable的特性也使得它比一般的生成模型具有更广泛的意义。

  • 关于Latent Variable(隐藏变量)的理解

生成模型一般会生成多个种类的数据,比如说在手写数字生成中,我们总共有10个类别的数字要生成,这个时候latent variable model就是一个很好的选择。

为什么呢?举例来说,我们很容易能注意到相同类别的数据在不同维度之间是有依赖存在的,比如生成数字5的时候,如果左边已经生成了数字5的左半部分,那么右半部分就几乎可以确定是5的另一半了。

因此一个好的想法是,生成模型在生成数字的时候有两个步骤,即(1)决定要生成什么数字,这个数字用一个被称为latent variable的向量z来表示,(2)然后再根据z来直接生成相应的数字。用数学表达式来表示就是:

  • 问:那么现在的关键是关于Latent Variable 的 先验概率分布形式 如何取值?

答:很简单,直接设定 满足标准高斯分布就行. 因为任何复杂的分布都可以通过多层MLP映射成标准高斯分布.

  • 问: 如何训练一个VAE

答: 最大化 即可;

  1. 有了的先验分布知识,我们可以使用若干次采样来最大化似然函数

即最大化

然而当是维度很高的高斯分布的时候,这种方法训练十分低效. 直接使用z先验分布来训练低效的原因直觉上是很明显的.因为对于数据集中的一个实例 而言,其对应的隐变量区间 实际上被似然函数采样到的概率是很低的.也就是说有效的训练次数很低.我们需要先假设一个 从此来针对数据集 先得到 来针对decoder训练,这样有效训练次数将大幅提升!

或者换一种说法: 我们需要注意到, 对于采样 所有的 其实都是几乎为0的. 换言之,绝大部分采样得到的的 对于目标函数 的贡献无足轻重. 在换言之,我们只需要关注 更大的部分即可.

那么问题来了, 怎么计算 的后验知识 ?????? 很难的!

  1. 贝叶斯公式巧妙转换

直接得到后验分布 是极其困难的,我们能够得到的只有encoder侧的输出 .我们需要记encoder的输出 ;但是与此同时必须保证 分布相似性.这里用KL散度来衡量:

使用贝叶斯公式对上式化简化繁: (其实贝叶斯这一步是最关键的一步)

可以看见:我们通过使用贝叶斯公式将 巧妙地转换 将问题从encoder一侧转移到decoder一侧 ! 这是最最关键的一步!

于是:

再度化简可以得到

注意到KL散度的非负性,于是有:

我们不妨记作:

ELBO(Variational Lower Bound)记作变分下界;至此,我们近似将问题转化为了最大化变分下界; 既然目标是让变分下界最大化,那么我们就需要仔细研究一下这个变分下界。

  • 首先是第一项,要想最大化 ELBO,那我们自然是想让第一项尽可能的大,也就是 x given z 的概率分布期望值更大。这很明显就是由 z 到 x 重组的过程,也就是 AutoEncoder 中的 Decoder,从潜在空间 Z 中重组 x。模型想做的是尽可能准确地重组.

  • 其次是第二项,要想最大化 ELBO,我们自然需要让这项 KL 散度尽可能小,也就是 潜在空间 z 的近似后验分布尽可能接近于 z 的先验分布!这一项我们可以理解为,模型想让 z 尽可能避免过拟合.


Diffusion模型

扩散模型是一种特殊的VAE,其灵感来自于热力学:一个分布可以通过不断地添加噪声变成另一个分布。放到图像生成任务里,就是来自训练集的图像可以通过不断添加噪声变成符合标准正态分布的图像。但是:

  1. 不再训练一个可学习的编码器,而是把编码过程固定成不断添加噪声的过程;

  2. 不再把图像压缩成更短的向量,而是自始至终都对一个等大的图像做操作。解码器依然是一个可学习的神经网络,它的目的也同样是实现编码的逆操作。

具体来说,扩散模型由正向过程和反向过程这两部分组成,对应VAE中的编码和解码。在正向过程中,输入 会不断混入高斯噪声. 经过 回合的加噪处理之后, 图像 会变成一个符合标准正态分布的纯噪声图像. 而在反向过程中,我们希望训练出一个神经网络,该网络能够学会若干个去噪声操作,把 还原回 .

PART1 加噪过程:

前向加噪过程可以用描述为:

其中 是高斯分布方差的超参数,在扩散过程中,随着 的增大, 越来越接近纯噪声。当 足够大的时候,收敛为标准高斯噪声

不妨设 , , 依次展开 可以得到:

其中 , 由独立正态分布的可叠加性: :

再进一步:

这意味着

加噪过程到此结束.

PART2 解噪过程

实际上, 每一步降噪过程 是难以形式化求解的. 我们的解码器就是为此而来的!其中 就是我们神经网络的参数:

于是有:

注意到(贝叶斯公式又立大功):

第二个等号是因为这是Markov过程,后一个状态只取决于前一步状态.

再次注意到:

整理得到:

其中:

我们 需要拟合的就是上述的 .

于是模型预测的 可以写作:

PART3 训练过程

diffusion本质上是一种特殊的VAE model于是我们可以参考VAE变分推断的变分下界将问题进行转换:

进一步处理可以得到:

注意到加噪过程 是没有可以学习的参数的, 并且 近乎是纯高斯噪声, 于是上述第一项为常量,于是有:

根据多元高斯分布的KL散度求解公式:

代入:

即可进行计算求解训练!


光速进行一个条件化生成的介绍:

作为生成模型,扩散模型和VAE、GAN、flow等模型的发展史很相似,都是先出来了无条件生成,然后有条件生成就紧接而来。无条件生成往往是为了探索效果上限,而有条件生成则更多是应用层面的内容,因为它可以实现根据我们的意愿来控制输出结果

从方法上来看,条件控制生成的方式分两种:事后修改(Classifier-Guidance)和事前训练(Classifier-Free)。对于大多数人来说,一个SOTA级别的扩散模型训练成本太大了,而分类器(Classifier)的训练还能接受,所以就想着直接复用别人训练好的无条件扩散模型,用一个分类器来调整生成过程以实现控制生成,这就是事后修改的Classifier-Guidance方案;

Classifier-Guidance 条件控制方法

无条件生成可以形式化描述为 , 加上条件 和分类器之后改写为 , 于是有:

由于

因此有:

可以看到在经过一系列处理之后, 相比于原来无条件生成,仅仅多出来 一项. 对这一项进行控制, 便可以实现控制生成方向.