1. 读论文
1.1. Generative Adversarial Nets (GAN)——生成式AI的开山之作
1.1.1. Framework
- 同时训练两个模型:生成器G(Generator)和判别器D(Discriminator),生成器G捕捉原始数据分布,判别器D判别数据属于原始数据还是生成器G生成的假数据;
- 训练目标是使D尽可能犯错(即G完全捕捉了原始数据分布,以假乱真);
- G和D完全由MLP定义,无需复杂的马尔可夫状态转移啊,RNN的隐空间传递啊之类的,因此可以完全由反向传播梯度下降得到很好地训练;
- 相较于之前的工作,本文更加聚焦于学习到原始数据分布的期望,即无需知道概率密度函数
,只需得到一组符合
的样本,其期望等于
即可(造假币不需要做得和真币一模一样,只需要让使用者(使用GAN模型的人)和警察(判别器模型)识别不出就好);
1.1.2. 模型详解
- 整个模型的输入为
,是一个随机噪声,服从概率分布
(这个概率分布可以是一维均匀分布、一维高斯分布、二维均匀分布、二维高斯分布、...);
- 生成器
,其中
是生成器参数,输入随机噪声
输出一个假数据样本;
- 判别器
,其中
是判别器参数,输入一个数据样本
,输出
属于原始数据分布的概率(输出在
之间);
- 损失(目标)函数如下,形式有点像交叉熵,目的是为了使
尽可能接近1,
尽可能接近0,训练
使得损失越大越好,给定
训练
使得损失越小越好;
- 这个损失函数无法直接得到解析解,所以需要交替训练
和
直至收敛;
1.1.3. 模型原理的数学理解
- 判别器:
- 在训练的一个iteration中,判别器需要进行
次迭代,至其暂时收敛;
- 目标函数为
, 通过梯度上升将其优化至最大(最接近0);
- 从原理上看判别器的映射函数,对于原始数据分布
和噪声分布
,以及给定的生成器
,目标函数的期望为:
,并可以进一步将
空间映射到
空间,
为原始数据样本
在生成器映射的分布
;
- 因此可以将这个期望的优化再转为目标函数优化,即对任意样本
,判别器都可以将其映射为一个值
,使得
达到最大值,则整体积分也就达到了最大值,而对
求解析解可得,当
时,其整体达到最大值,因此对原始数据分布
和给定生成器分布
,最优判别器为
;
- 在训练的一个iteration中,判别器需要进行
- 生成器:
- 当判别器
给定时,生成器需要调整
,使得损失函数最小(损失函数还是上面的目标函数,只是优化约束和目标变了),变为
,其中
是上一步训练判别器时固定的生成器,因为这里判别器固定不变,所以
固定不变,训练的是第二项的
,因此目标函数也可以简化为
;
- 引入KL散度,则进一步化为
,但这个函数无法利用到KL散度的性质来简化问题,因此对其进行调整为:
,进一步化为
;
- KL散度 (Kullback-Leibler divergence) :给定两个分布
和
,计算二者的非对称度量,
,具体而言,KL散度的公式为:
(离散)和
(连续),通常
和
一个为真实分布,另一个为模型拟合的分布,而KL散度越大则这两个分布的信息损耗越大,当
和
为完全相同的分布时,KL散度最小,为0;
- 通过引入KL散度,可得当
时,
达到最小值,为
,因此通过对损失函数求梯度进行反向传播,生成器生成的数据分布会不断接近原始数据分布;
- 当然也可以从JS散度(Jensen-Shannon Divergence)来理解,公式为
,JS散度也是度量两个分布相似度的,不同于KL散度的是,JS散度是完全对称的,因此若原损失函数不化简第一项,则可以化为
,同样可以得出上面的结论;
- 当判别器
1.1.4. GAN的优缺点
- 优点:
- 交替训练的方法避免了出现“the Helvetica scenario”式的模式崩溃,指的是模型学到了一种生成器会使所有(或大部分)噪声输入都生成了同一张图像,如果这张图像正好符合原始数据分布,则确实可以达到模型收敛的条件,但不符合我们的需要;
- 模型拟合的是分布的期望而不是分布本身,这个思想天然解决了过拟合的问题,并使得模型可以很容易地拟合恶化的、尖锐的分布(马尔可夫链的状态转移需要分布平滑);
- 训练过程不复杂,只需要反向传播和梯度下降;
- 缺点:
- 不能显式表示出数据分布;
- 必须交替训练而不能同步进行;
1.2. Denoising Diffusion Probabilistic Models(DDPM)
1.2.1. 问题定义
- 为了增强图片生成效果,采用一种加噪(前向过程)+降噪(反向过程)的方法,对样本图片进行加噪处理,并使其噪声逐渐满足高斯分布,再学习降噪方法,将样本图片还原,这样让模型掌握利用一定的随机噪音来完成高质量图片生成能力;
- 模型需要学习到的实际上是
能力;
- 此处的
应当是一个分布而不是一个具体的样本,由
推得
的一系列分布,可以使模型的生成效果更加多元化。
1.2.2. 传播过程推导
- 根据贝叶斯公式:
;
- 加噪过程是将
与一个标准高斯噪音加权得到
:
,其中
是标准高斯分布,
(
很小接近于0),在确定输入
的前提下满足
,可得
;
和
不好求解,但是因为
是由
的分布一路推导过来,
,其中
,
,因此可以得到
,
,
;
- 因此贝叶斯公式写作:
,并根据上面的推导可得
,其中
是由众多
计算得来的常数,
是一个
和
的函数,便得到了
,而通过
和
可以得到
,同样会根据分布
算得不同的
;
- 经推导,
(推导过程略),将
带入可以推导得
.
1.2.3. 对模型的理解
- 模型降噪的过程其实可以理解为一个噪音预测模型,输入一个带有噪声的图片,模型可以预测出其中的噪声,再从图片中减去这个噪声;
- 一般该模型的前向传播长度
比较大,取1000常见,因为在前向传播过程中,为了防止信息丢失,每两步之间添加的噪声比较小,即
,其中
(
很小接近于0),但想要最终的
尽可能接近高斯噪声,因此
要尽可能接近0,这就需要
取非常大;
- 为什么要令
?这也是为了最终
可以接近标准高斯分布所做的设计,具体推导过程可以试着推一下
这个式子;
- 因为
,所以似乎有一层关系是
,但不可以通过
直接推算
,这样不符合马尔可夫性,必须一步步传播回去;
2. 各种传统生成式模型详解
2.1. 极大似然估计
2.1.1. 基本思路
- 生成式模型本质是已知数据
,这些数据服从一个隐藏的分布
,而模型可以从中学习一个分布
,并优化模型参数使
尽可能接近
;
- 既然是对分布的学习,进一步可以认为是对参数的学习,则当分布的形式已知时,可以使用极大似然估计来求解参数,即
;
2.1.2. KL散度的理解
- KL散度 (Kullback-Leibler divergence) :给定两个分布
和
,计算二者的非对称度量,
,具体而言,KL散度的公式为:
(离散)和
(连续),通常
和
一个为真实分布,另一个为模型拟合的分布,而KL散度越大则这两个分布的信息损耗越大,当
和
为完全相同的分布时,KL散度最小,为0;
- 极大似然估计也可以理解为,最小化
和
的KL散度,即
,因为
和参数无关,因此可以简化为
,则进一步可以化为
;
- 这里如果直接带入KL散度的离散公式,则为
,但实际上
也是根据统计得来的,或者说,
,因此可以直接写成累加和的形式,即为极大似然估计的优化函数;
2.2. 完全可见置信网络 (Fully visible belief network,FVBN)
2.2.1. 自回归模型
- 自回归模型是最简单的完全可见置信网络,每个生成样本的概率分布都是以其前面所有数据为条件的条件概率分布,而模型要学习的就是这个条件概率分布;
- 线性自回归网络使用线性函数来拟合每一个概率分布,但拟合能力不足;
- 神经自回归网络使用神经网络代替线性函数,拟合能力大大增加,同时还用到了特征重用的技巧,即之前的样本通过神经网络提取了隐特征可以在后面直接被复用,其中比较有代表性的是神经自回归密度估计器,其使用了参数共享的考虑性能进一步提升;
2.2.2. WaveNet
- WaveNet是谷歌提出的自回归语音生成模型,采用的方法是对语音信号值做了特征提取后进行空洞因果卷积;
2.2.3. PixelRNN
- 一般用于图像生成,同样是用模型来拟合条件概率分布,从图像一角的一个像素开始,依次以之前的像素估计下一个像素,这个估计的参数就是模型带训练参数;
2.2.4. PixelCNN
- 和PixelRNN一样用于图像生成,不同的是使用CNN替代了RNN,卷积核扫到的框中有已知像素和未知像素,也有一个待生成像素,使用所有已知像素输入模型得到待生成像素,再继续向下扫描;
- Gated PixelCNN将感受野拆分为水平和垂直两个方向,进一步提升了生成质量,但由于像素之间依然存在依赖关系,无法并行计算,生成效率很低;
2.3. 流模型
2.3.1. 流模型简介
- 流模型是一种想法较为直接,但构建起来比较困难的模型,假设隐变量分布较为简单,观测变量分布复杂,若存在某种非线性变换使得
,则可以通过对隐空间的采样得到生成数据;
- 因为非线性变换会引起空间变形,因此
,而是
;
- 雅各比矩阵的计算是流模型构建的一大难点,因此流模型常常使用多个映射函数
近似,则总的雅各比矩阵行列式可以用每层雅各比矩阵行列式相乘得到,这个思想类似于多层神经网络的计算,但流模型使用更加显式的概率计算模型进行每层的映射,根据每层映射的方法分为多种流,下面介绍两种基本的流:
- 仿射流(affine flow):
,将观测变量的分布映射到近似标准正态分布,方阵
的行列式即为雅各比矩阵;
- 元素流(element-wise flow):每层映射逐元素进行,即
,雅各比矩阵为对角行列式
;
- 仿射流(affine flow):
2.3.2. NICE
- NICE模型是一种先进且易构建的流模型,其逆变换
由多个加性耦合层和一个尺度变换层组成:
- 加性耦合层:将观测样本
按照维度划分为两个部分
和
,例如可以设
,
,而每个加性耦合层的计算方法为:
,其中
可以是任意函数,但是需要保证输出维度和
相同,则其反变换为
,雅各比矩阵为
,行列式为1,这样的多个加性耦合层串联可以兼具计算的简易性和信息混合的充分性;
- 加性耦合层的函数
可以用神经网络+激活函数进行拟合;
- 尺度变换层:直接用最后一层加性耦合层的输出
逐元素乘以一个全元素非0的放缩向量
,逆运算即为除以这个向量,雅各比矩阵为该向量元素的对角矩阵;
- 加性耦合层:将观测样本
- 基于NICE思想的衍生模型也有很多,例如OpenAI的Glow在耦合层中引入卷积操作以捕捉图像数据的分布,但流模型固有的计算成本大的问题无法解决,因此比VAE、GAN等模型应用少一些;
2.4. 变分自编码器(VAE)
2.4.1. 模型表示
- VAE是将概率图模型的思路(变分推断)和神经网络相结合的模型;
- 在VAE之前的生成模型中,主流思想是一种autoregression的方法,即一种补全的思想,例如捕捉图像中像素点之间的相关性,使用一个随机的像素生成一整张图,本质上是用观测变量的一个或多个维度生成全部维度;
- VAE则是一种LVM(latent variable models),即引入高阶隐变量,基于高阶隐变量的建模
,使得模型直接从隐变量
中采样即可得到生成的数据,更好地学习到显示的数据分布,十分优雅;
- 要使模型学习到
,就需要计算后验概率
,使其最大化的过程中学习
,但因为隐变量
的维度很高,因此直接计算
非常困难,因此就需要用到变分推断的方法;
- VAE模型可以认为是
的高斯混合模型(GMM),而隐变量
设为服从高斯分布
,实际问题中为了简化,可以设
;
- 对于隐变量到观测变量的生成过程,可以将模型参数化,即
,即每个样本
都有对应一组参数
对应一个高斯分布,而该样本的隐变量服从这个唯一的高斯分布,每个高斯分布的参数都可以用神经网络拟合;
- 因此,VAE模型引入两个假设:
- 预设定隐变量
是个高维标准高斯分布;
- 对于一组模型参数
,
;
- 预设定隐变量
- VAE模型结构也由编码器和解码器组成:
,学习
;
,学习从随机抽取的隐变量
映射到新生成数据的参数;
2.4.2. 模型训练
- 根据EM算法和变分推断中的推导,对模型参数
进行推断,就是最大化
的迭代过程,同时也是最大化变分下界ELBO的过程,因此模型目标函数即为
;
- 对ELBO的第二项,基于两个假设,可得
,没有需要学习的参数,
,分别用两个神经网络拟合均值和方差的对数(方差恒大于0,其对数的值域是全体实数,更符合神经网络的训练,无需再用激活函数什么的限定),完成编码器的训练;
- 对ELBO的第一项,因为一个样本
对应一个隐变量
,因此
应当是一个尖锐的单峰分布,所以
,无需对所有z求期望,简化了无限维z无法求积分的问题,而最大化
的过程类似于分类/回归任务,输入为Z输出为X,若X服从离散分布则视为分类任务,使用交叉熵作为损失函数,若X服从连续分布则视为回归任务,使用MSE作为损失函数,完成解码器训练;
- 但VAE存在一个问题,当通过编码器得到隐变量
的分布后,从该分布中随机采样得到一个生成的隐变量样本,送入解码器生成数据,但此时编码器的信息会丢失,即采样得到的这个新的
与已知的
解耦,失去了联系,不知道
是从哪个分布中得到的,同时解码器和编码器各自训练,反向传播断开,使得生成效果会很差;
- 为了解决上述问题,使用重参数化技巧,即通过编码器得到某个分布
后,放弃原本的随机采样策略,引入一个误差项
,而新生成的隐变量
,如此反向传播被打通,编码器和解码器可以同步训练,生成效果提升;
2.5. 玻尔兹曼机
- 作为一种显式传统概率模型,基于能量的思想提出,现在已经很少引起关注,有点累了之后再补……
3. 生成对抗网络GAN
3.1. 目标函数优化
- 该部分内容在1.1.中详细介绍,可以往上参考;
- 在实际训练中,GAN的训练过程可以表示如下:
- for 训练 epoch:
- 固定生成器,训练判别器
- for 一个epoch中训练 k 步判别器:
- 从
中采样N个隐变量,用生成器生成
- 根据目标函数
计算梯度,训练判别器
- 从
- 固定判别器,训练生成器
- 从
中采样N个隐变量,用生成器生成
- 根据目标函数
计算梯度,训练生成器
- for 训练 epoch:
- 在训练早期,因为生成器能力较差,而判别模型比较容易训练,所以
很容易接近0,则生成器的训练梯度较小,收敛缓慢,为了解决这个问题,可以在训练的前期使用非饱和形式的损失函数
,使梯度更大,但其后期梯度变小,需要改为原来的目标函数;
3.1.1. 最小二乘GAN(Least Squares GAN,LSGAN)
- GAN训练的梯度消失问题:除了上文中提到的训练初期生成器梯度较小以外,在训练中也可能出现梯度消失问题,即某个epoch生成器训练完成后,虽然其并不能拟合真实分布,但出于采样的某些巧合,判别器无论怎么训练也无法分辨生成数据,此时模型进入假性收敛,再训练生成器时其梯度会很小,或者可以说判别器无法向生成器提供任何信息,使得训练进入死局;
- LSGAN认为,GAN产生梯度消失的原因是对于那些偏离真实分布却碰巧判别为真实分布的生成数据,没有施加合适的惩罚,因此将最小二乘法的思想引入损失函数,即
,其中
是我们希望得到的数值,使得模型训练就是让三个判别结果接近
的过程;
的赋值方案通常有两种:
,思想与原来的GAN一致,使判别器尽可能分辨真实数据和生成数据,生成器尽可能使判别器分类错误;
,这个赋值的思想是,当
时,生成器优化的是
和
之间的皮尔斯卡方散度;
3.1.2. 基于能量的GAN(Energy based GAN,EBGAN)
- DeepLearning大牛Yann LeCun在2006年首次将能量模型的思想引入机器学习,定义一个能量计算函数,每个样本可以输入函数计算一个能量值,能量越高的越活跃,能量越低的越趋于稳定,物质趋向于由高能量态活动到低能量态,例如赋予分类错误的样本高能量,赋予分类正确的样本低能量;
- EBGAN是一种将能量模型应用于GAN的成功尝试,其将GAN中的判别器改为一个能量比较器,判别器会令原始数据位于低能量态,生成数据位于高能量态,因此目标函数变为
,其中m是能量上限,在实际训练中,m取得过大容易造成梯度过大,训练不稳定,过小容易导致生成数据失真,建议从一个较大的m开始训练并逐渐减小;
- 正则自编码器:自编码器的结构是
,从而获得隐变量分布或是数据的紧凑表示
,支撑下游任务,或对数据进行重构以增强数据,但是自编码器很容易训练成一个简单的恒等映射,即
且
没有实际意义,因此需要对自编码器施加正则化约束,使其从数据中学习重要的信息而不是全部的信息;
- 前文中对GAN的理解主要是基于概率模型(Probability-based model,PBM),判别器需要提供的信息是原始数据分布和生成数据分布之间的差异,不管用KL散度,JS散度还是皮尔斯卡方散度的角度,然后让生成器根据这个差异来把生成数据拉回原数据分布,类似一个吸管,而要做到同样的任务还可以用基于能量模型(Energy-based model,EBM)的思想,不再关注
和
之间的通道,而是关注
,使得四面八方的点都向
而来,类似一个磁铁,这种思想可以更好地解决判别器无法提供信息的问题;
- EBGAN的创新是讲判别器改为一个能量比较器,具体来说,判别器的结构是一个自编码器,输入样本数据输出其重构数据,并计算二者的均方误差作为能量数值
,而这个判别器被设定尽量学习真实数据进行训练,因此真实数据重构质量较高,输出的能量值低,其他数据都会输出较高能量,而生成数据也会为自编码器引入正则化惩罚,使其并不会复制原始数据的全部信息;
- 为了避免EBGAN模型只学习到一个样本的信息导致所有生成数据都与这一个样本相似(这也会使模型收敛),可以引入PT项(Pulling-away term)惩罚,即对于输入判别器的样本,我们希望样本经过自编码器后会得到相互不同的表示,因此可以使用余弦相似度量化各个样本表示的差异,作为惩罚项,即
;
3.1.3. f GAN —— GAN的生产车间
- f GAN不是一种新的模型,而是对分布差异进行了讨论,便于判别器从更恰当的角度提供原始数据和生成数据的分布的差异信息,从而提高生成器性能,基础GAN中使用的分布差异度量是JS散度(或KL散度),LSGAN中使用的是皮尔斯卡方散度,而f GAN中提出了更加全面的 f 散度,统一了所有度量函数;
- f 散度:
- 始于对KL散度的一般化
,KL散度只要让
即可;
- 对函数
的要求有三个:
- 非负实数到全体实数的映射;
,反映两个分布完全相同时距离为0;
- 全定义域可导的凸函数;
- f 散度恒正(根据皮尔斯不等式):
;
- f 散度的定义其实并不满足一般公理化的“距离”计算,但影响不大;
- f 散度推导:
- 对函数
在
点处的切线表达式为:
;
- 因为凸函数,函数恒在切线上方,即
;
- 因此可得
;
- 记
,则
和
相关,再定义
,则
,因此通过求解
,可以将任意凸函数近似为一个线性函数,这里的
被称为
的共轭函数,但定义域内的每个
都需要求解一个对应的
,因此可以用神经网络拟合
和
的关系,即
,
;
- 带入 f 散度得:
;
- 对函数
- 始于对KL散度的一般化
- 因此 f GAN不再训练一个分类器,而是训练函数
,使得 f 散度最大,也就是使得对于任意原始数据和生成数据,都可以全函数域寻找
和
最大的差异,从而将
和
分布的差异体现出来,这个寻找的过程是神经网络自动拟合,使得无需手动选择损失函数,就可以根据任意设计的
来自动寻找到最恰当的方式计算原始数据和生成数据的分布差异,同时如果需要特定计算方法也可以预推导
(如下第二张图,激活函数用于限制T函数的值域,使其输出符合规定的计算方法):
3.1.4. Wasserstein GAN(WGAN)
- 分布度量的问题:WGAN发现,GAN在训练时出现梯度消失问题的一大重要原因是,JS散度等传统分布差异度量方法无法提供无交叉分布差异的梯度信息:
- 举例来说,p和q都是直线上的均匀分布,p分布在
,q分布在
,则
,因此当
时,JS散度无法提供梯度信息使得两个分布逐渐靠拢;
- 而当q分布在
时,p和q存在长度为
的交叉部分,则
,此时的JS散度可以提供梯度信息使模型得到学习;
- 但在高维分布中,两个分布很容易出现无交叉的情况,所以无论是JS散度、KL散度或是总变分距离等一般度量,都很容易因为这个原因导致梯度消失现象;
- 举例来说,p和q都是直线上的均匀分布,p分布在
- 有一个解决上述问题的方法是,在两个分布中都添加一定的高斯噪声,使其弥散到更大的空间,极大地增加交叉的概率,并随着训练,两个分布越来越接近,自身产生了更多交叉时,减小高斯噪声的方差,但这个方法并不能高效解决问题;
- Wasserstein距离:
- 先上公式:对于两个分布
和
,二者存在某种联合分布
(
),则它们的Wasserstein距离为
,其中
是所有可能的联合分布
的集合,
则表示在
中找到一种令
最小的
,而该值作为Wasserstein距离;
- 这个公式又叫推土距离,衡量了使
的最小重构距离,使得不重叠的两个分布也可以度量差异,有点类似于下图的推土的过程;
- 先上公式:对于两个分布
- WGAN详解:
- WGAN主要是将Wasserstein距离的思想引入GAN训练中,来解决经典GAN网络中的梯度消失问题,先介绍目标函数:
,有点类似于 f GAN ,也是抛弃了经典基于分类的判别器,改为寻找某种函数
,使判别器可以提供两个分布的差异信息,使生成器得到有效学习;
- 目标函数推导:
- 定义问题中的各个矩阵/向量:
- 联合概率向量:
,是将数据每个维度的联合概率拉平成向量;
- 距离向量:
,与联合概率向量一一对应,因此记
,
(逐元素相乘),则
,以此来计算某一种联合概率分布情况下的两个分布的距离,当这个距离取到最小时即为Wasserstein距离;
- 再定义用于约束的矩阵/向量:设
,则有
,
,因此定义
,使得
,也就是考虑所有可能的
时需要保证边缘概率分布等于数据分布;
- 联合概率向量:
- 根据上面的定义,Wasserstein距离可以被定义为线性规划的形式:
,因为遍历所有可能的联合概率分布计算成本很大,因此可以使用对偶理论求解这个问题,其对偶问题为:
,这个问题是一个强对偶问题,因此原目标和对偶目标可以完全等价,从而将一个K^2维矩阵的求解变成一个2K维矩阵求解,大大简化了问题;
- 因为
是元素对应相乘,所以可以设
;
- K-Lipschitz限制:对于某个函数
,需要
,在上述问题中约束
等价于待求解的
和
需要满足1-Lipschitz条件,因此
,同时
,
;
- 综上,Wasserstein距离的计算等价于
,其中
;
- 由此得到,判别器目标函数为
,而生成器目标函数为
;
- 定义问题中的各个矩阵/向量:
- WGAN引入Wasserstein距离和1-Lipschitz的思想非常先进,但是最终应用到模型中其实只变更了以下四点:
- 判别器去掉最后一层的Sigmoid,即去除其分类功能;
- 使用新的目标函数,其中不含log函数;
- 每次更新模型的参数时将其绝对值截断到一个预设定的固定常数,防止其无限变大;
- 实际训练时不要使用基于动量的优化算法(包括Adam),推荐RMSProp,SGD等;
- WGAN的权值裁剪方法有固定缺陷,首先预设定的常数过大或过小都不利于模型收敛,其次这种粗暴的裁剪方法忽略了数据的高阶矩,可能会判别器关心的数据分布产生影响,因此改进版的WGAN-GP使用了正则化惩罚的思想代替原本的权值裁剪,即其目标函数为:
- WGAN主要是将Wasserstein距离的思想引入GAN训练中,来解决经典GAN网络中的梯度消失问题,先介绍目标函数:
3.1.5. Loss-Sensitive GAN
- Loss-Sensitive GAN(以下简称LSGAN,请区别于上面介绍的Least Squares GAN)与WGAN几乎同时提出,对传统GAN的改进也很类似,可以视为从另一个视角解读Lipschitz限制,LSGAN认为,判别器应该始终输出
与
之间的合理距离,且该距离足够大使其可以为生成器提供足够的信息来拉近
与
,因此其认为应该有一种合理的损失函数使得
,
是输入的生成数据和原始数据的间隔,可以用
等计算;
- LSGAN判别器的目标函数为
,其中
,生成器目标函数为
;
的设计使得
满足时,该项为0,不参与优化,否则会将其加入目标函数使得判别器进一步拉开
和
的距离;
- 在LSGAN中,为了引入Lipschitz限制限制目标函数值域,进一步限制梯度使得模型收敛更快更稳定,在目标函数中引入了正则化惩罚
;
3.1.6. IPM(Integral Probability Metric)
- 类似于 f 散度,IPM同样是度量了两个分布的差异,公式为
,但不同的是,IPM只度量了分布期望的差值,而
,因此是一个伪度量,同时IPM中的
可以由神经网络拟合获得,来计算两个分布期望的最大差异;
- 当将
的取值空间限定在满足1-Lipschitz的函数空间时,IPM的计算就变成了WGAN的目标函数;
- McGAN使用基于IPM的目标函数训练GAN,但该方法不仅考虑期望,还考虑方差,即
;
- f 散度的定义常常面临几个问题,首先是数据维度的增加带来的计算困难,同时当
而
时,
,另外,无论如何定义 f 散度,GAN在很多时候学习到的并不是准确的散度值,而是一个变分下界,这也会带来度量不准确的问题,基于IPM的GAN基本解决了上述问题,且收敛情况几乎不受数据维度和样本选择的影响;
3.1.7. BEGAN
- 重构损失函数经常出现在GAN中,例如EBGAN,而BEGAN也是将重构思想应用于判别器的例子,其判别器本身就是一个自编码器,尽可能使输入和输出一致使其得到重构,因此目标函数为:
,生成器目标函数则为
;
- BEGAN同时还借鉴了控制论的思想,改进判别器的损失函数为:
,其中
,
是松弛因子,和
都是预设定的超参数,使得平衡因子
也得到训练,这样构建出的目标函数类似于控制系统的负反馈,使得收敛过程更加稳定;
3.2. 训练技巧
3.2.1. GAN训练的三个问题
- 梯度消失:在之前有讨论过很多梯度消失的现象,以及从目标函数角度的改进方法,这里再从更一般的角度介绍梯度消失:
- 当数据维度较高时,原始数据很容易成为高维数据的低维流形(简单举个例子,比如二维空间内一个圆心固定的圆上若干点组成数据集,在已知圆心和半径的情况下,只需要角度一个参数就可以确定这个点,也就是二维空间的一维流形),而生成数据当抽样的
维度低于
时,也容易成为高维空间的低维流行(同样的例子,
是角度而
是圆上的二维数据);
- 高维空间的低维流形极大可能不存在不可忽略的相交(比如说三维空间内的xoy平面和yoz平面相较于y轴,但是相较于两个平面,这条轴所占空间极小,是可忽略的),而当此时,很容易训练一个完美判别器可以将原始数据和生成数据完全分开,此时经典的GAN模型基于分类模型和JS散度的判别器将失效,因为其不能从完全分开的两个分布中计算距离,所以返回给生成器的梯度为0;
- 当数据维度较高时,原始数据很容易成为高维数据的低维流形(简单举个例子,比如二维空间内一个圆心固定的圆上若干点组成数据集,在已知圆心和半径的情况下,只需要角度一个参数就可以确定这个点,也就是二维空间的一维流形),而生成数据当抽样的
- 训练不稳定:
- 在GAN类隐式生成模型中,无法探究
的相关信息,只能用神经网络表达
,但这个表达过程是在参数空间而非函数空间中进行,因此其无法满足收敛性所需的凸性等性质;
- 生成器和判别器的对抗交替学习要达到收敛,必须要求生成器和判别器拥有足够的容量,特别是判别器容量不足时会导致对抗的均衡点并不存在;
- 在GAN迭代训练的每一步中,理论上要固定生成器,将判别器训练到最优,再交替训练生成器,但实际问题中要将判别器训练到最优需要很大成本,因此常常固定一个训练次数k,每步迭代训练k次判别器和一次生成器,判别器无法保证训练到了最优,这就会带来一个问题,交替迭代的训练到底是在解决
还是
,这两者是完全不同的,甚至有时会向着相反的方向训练,无法达到纳什均衡点(指博弈过程中二者都难以利用对方进化自身的平衡点);
- 在GAN类隐式生成模型中,无法探究
- 模式崩溃:简单来说就是我们想要GAN生成丰富多彩的图片,但最终模型收敛以后只会输出少有的几种类型,例如我们输入了苹果、香蕉、橙子等多种图片,而模型学习到了只生成橙子的图片依然可以使判别器和生成器各自收敛,但生成效果并不是我们理想的;
3.2.2. 退火噪声
- 该方法用于解决梯度消失问题,且简单而有效,就是在高维空间采样0均值的高斯噪声,与对应两个分布叠加,这样在基本不影响两个分布的情况下将其弥散到整个空间,从而创造不可忽视的交叉;
- 此时可以放心在每次迭代时把判别器训练到最优,此时的最优判别器不可能是完美判别器;
- 同时采用退火思想,在训练时逐步减小噪声的方差,也就是逐渐减小弥散范围,直到两个分布完全重叠时,噪声方差减到0;
- 噪声方差的选择可能会影响训练表现,若方差较大,则与正常不添加噪声的模型一样,若噪声较小,则可能会咱均衡点附近旋转而无法收敛到均衡点,因此对调参要求较高;
3.2.3. 谱正则化
- 特征值和奇异值分解:从特征值角度来看,
可以认为是一次线性变换,而对于一般的方阵
,如果是非奇异的(可逆的,大多数情况),有n个特征向量组成满秩的n维空间,则对任意
可以将
视为
被投影到各个特征向量
,再在各个特征向量方向进行对应特征值的拉伸,即
,再合成新的向量
,如果
不是方阵则可以分解奇异值;
- 谱范数和1-Lipschitz限制:
- 从特征值和奇异值分解的角度,对任意单位向量
,
,其中
是
的最大奇异值,被称为
的谱范数;
- 对于任意
,定义
,其必定满足1-Lipschitz限制,因为
,这个过程被称为谱正则化;
- 从特征值和奇异值分解的角度,对任意单位向量
- SNGAN正是以此为基础,从理论角度,以一种“硬手段”保证1-Lipschitz限制成立,即对每一层网络权重都进行谱正则化,相比与WGAN和WGAN-GP中利用某些“软手段”引入1-Lipschitz限制更加稳定,提高了模型训练效果;
- 但在实际计算中,对模型参数计算奇异值是成本极大的,因此采用一种幂方法近似计算:
- 初始化任意m维向量
和n维向量
,多次迭代计算
,谱范数可以计算由:
,直至收敛;
- 实际过程中通常只需要很少的迭代次数(一次就差不多)就可以得到有效计算结果;
- 初始化任意m维向量
- 谱正则化已经应用于很多GAN模型中,尤其是图像生成任务,且在判别器和生成器都可以使用,但不足之处在于,可能会限制参数空间的搜索范围;
3.2.4. 一致优化
- 欧拉法:对于某个有初始值的常微分方程
,很多时候很难求解方程的形式,则需要逐渐求数值解,此时可以使用欧拉法,根据初始值
和预设定的固定时间间隔
,0
,这个过程非常类似神经网络中的梯度下降法,时间间隔
类似于学习率;
4. 扩散模型(Diffusion Model)
4.1. DDPM(Denoising Diffusion Probabilistic Model)
4.1.1. DDPM的原理概述
- 通过训练一个去噪网络,将一个采样到的随机噪声进行逐步去噪,最终还原为一个清晰的图片(类似于大理石雕塑,核心是精准找到多余的部分给它去掉);
- 每一步的去噪即为训练一个噪声模拟器,通过输入一个带有噪声的图片,以及当前步数,输出噪声预测值,并将带躁图片减去该噪声;
- 相比于GAN等一步到位的模型,Diffusion两大核心改进是逐步自回归和噪声预测,前者在后文中介绍,后者则是认为从噪声中预测一张图和从噪声中预测多余的噪声难度是大不相同的,只预测噪声更加简单和可行,只要再从输入中减去预测的噪声即可;
- DDPM的前向过程是对清晰的图片进行逐步加噪的过程,每一步会得到一个该步的噪声和加噪后的图片,因此产生了去噪网络的训练数据;
- DDPM先加噪再去噪的结构有点像自回归模型,不同的是自回归模型的编码和解码都是单步,且中间变量是隐特征,DDPM采用多步编码和解码,中间变量是噪声,无独有偶,VAE中间产物也是噪声,因此DDPM一定程度上继承了VAE的优秀思想,在后文的数学推导中也会将DDPM和VAE进行比较;
- 为什么DDPM多步生成效果会比VAE的单步生成更好呢? 从NLP的文本生成任务中或许可以找到灵感,传统文本生成中如果自回归模型一次到位生成下半句,可能生成的结果会不合逻辑,例如下图可能会根据概率输出“老员”的结果,但如果分两步生成,先确定一个字,例如确定概率更大的“员”,再结合前后文输出前面的字,就会得到“演员”的答案,更加符合上下文逻辑,这个方法叫“Mask-Predict”被广为应用,同样的问题和思想也在图像和语音中有所体现,使用分步式生成结构,每一步都是上一步的精细化和微调,使得上下文更加通顺和合理;
4.1.2. DDPM数学原理![](https://img-blog.csdnimg.cn/direct/fd622db16f8c45a39e68d353eeb039c8.png)
- 模型原理:
- 事先设定加噪和去噪的步数
,以及一组超参数
(步数越大的参数越小);
- 训练:
- 对每一步
,从标准正态分布中抽样一个随机噪声
:
- 加噪:
(并不需要从
计算得到,这与想象中不同,但由于标准正态分布独立可加性,
,计算效果是一样的);
- 去噪:训练噪声预测器
,输入
和步数
,来预测抽样的噪声
,因此梯度为
;
- 加噪:
- 对每一步
- 推断(生成):
- 从标准高斯分布中抽样出生成所需的噪声
;
- 反向去噪,对每一步
,计算
,其中
可以由
算得(计算方法后面推导中介绍),
是另一组预设定的参数(值远小于1),
则是从标准正态分布中抽样的新噪声;
- 从标准高斯分布中抽样出生成所需的噪声
- 事先设定加噪和去噪的步数
- 为什么DDPM在实际运作时加噪是从原始图像一步到位呢?
- 首先回忆VAE的推导,生成模型的本质是使得生成模型的
尽可能接近原始数据
,而这个目标可以通过最大似然来实现,通过证明可知最大似然等价于最小化两个分布的KL散度(GAN是最小化JS散度,本质不变);
- 在VAE中,因为一个样本
对应一个隐变量
,因此
应当是一个尖锐的单峰分布,所以
,这是ELBO的第一项,可以简化高维
无法求积分来计算期望的问题,其中
是VAE的编码器,因此无需从复杂的
空间计算积分后,最大化变分下界可以直接等价于最大化
;
- 在DDPM中也有和VAE相同的思想,不过解码器是一个分步去噪的过程,其中
是加噪网络分布,
是去噪网络逐步生成的
的分布;
- 因此通过一系列推导,最终可以将DDPM的ELBO化简为下面的式子,第一行的两项与去噪部分无关,因此只需要最小化第二行的部分即可(红色框);
- 在加噪网络中已知
,因此可以利用贝叶斯公式得:
- 因为上面的三个概率分布都是高斯分布,因此经过概率密度函数的一番推导,最终得到
也是一个高斯分布,其均值和方差分别为:
- 接下来最小化ELBO中的KL散度,因为
和
都是正态分布且方差都是固定的(也有论文讨论
方差并不严格固定的问题,但是实际工作验证了可以将其视作固定,不会有大的影响),因此最小化KL散度实际上就是最小化均值之差,而
已知时上面这张图的左侧部分,可以进一步化简由
得最终均值为
,这就是去噪网络每一步想要的图像均值,而去噪网络中的噪声预测器则需要预测均值中的噪声部分,因此有了生成算法中下面红框的式子;
- 回过头来看,为什么加噪过程要一步到位呢,一方面是为了加快运算速度,一方面是为了使
都已知,增加模型可解释性;
- 首先回忆VAE的推导,生成模型的本质是使得生成模型的
- 为什么要在后面再加一个
呢?这个并没有出现非常好的解释,根据台大李宏毅老师的理解,生成模型需要有一定的随机性,例如GPT作为一种自回归生成模型,每次生成文本时会根据前文计算下一个token的概率,并从概率分布中选取下一个token,这个过程中并不会选择概率最大的词汇,因为相关研究发现,用人类的自然语言作为数据来计算每个词根据前文计算出的概率,发现语言本来就不是最大概率的token组合,如果限定了每次都选择概率最大的token,会使得生成结果非常无聊且可能会有重复现象,而且即便没有这两种结果,生成的语音也并不像人类会说出的语言,在语音和图像中也会有类似的情况,生成模型必须有足够的随机性使其更加接近真实世界的数据,而DDPM多步的去噪过程很可能使一开始噪声
中的随机性逐渐失效,因此在每一步加入一些新抽取的随机噪声,当然限定
为一个较小的值;
4.1.3. DDPM改进
- 文生图:将文本提示词一起输入去噪网络训练;
- 现有生成模型(SD、DALLE)通用框架:
- 由文本编码器、生成模型和解码器组成;
- 将文本通过文本编码器,与对应的图片输入生成模型,得到一个中间产物,再将中间产物通过解码器得到清晰的图像结果,有时还可以加入一个图像编码器,将图像编码成小图或是紧凑表征输入生成模型;
- 中间产物有时是肉眼可见的小图,此时解码器的任务类似于小图生大图,有时是肉眼看不懂的隐特征表征图,此时解码器任务类似于逆特征提取;
- 经过实验(Google)证明,文生图模型性能与其中的扩散模型规模关系不大,而是文本编码器的规模会在很大程度影响生成效果;
- DDPM也可以用在语音(WaveGrad)中,几乎不需要在思路上做出改变,只要把噪声改为语音的噪声即可;
- 文本生成中DDPM的应用遇到了阻碍,因为文字常常使用独热编码表示,无法进行加噪使其符合高斯等简单的噪声分布,也无法通过去噪得到生成结果,但也有一些工作探索了词的表征向量的加噪去噪过程(Diffusion-LM、DiffuSeq等),或者其他类型的噪声(使用Mask等);