机器学习课程学习周报十一
文章目录
摘要
本周的学习主要围绕生成对抗网络(GAN)的数学原理及其在机器学习中的应用展开。重点探讨了似然与概率的区别,GAN与最大似然估计的关系,以及如何通过训练生成器和判别器来最小化生成数据与真实数据的散度。此外,介绍了Wasserstein GAN(WGAN)对JS散度缺陷的改进,以及GAN性能评估的方法,如Inception分数和Fréchet Inception距离(FID)。最后,了解了条件生成模型在生成图像时的应用。
Abstract
This week’s study focuses on the mathematical principles of Generative Adversarial Networks (GANs) and their applications in machine learning. The distinction between likelihood and probability, the relationship between GANs and maximum likelihood estimation, and how to minimize the divergence between generated and real data by training generators and discriminators are explored. Additionally, improvements of Wasserstein GAN (WGAN) over the shortcomings of JS divergence and methods for evaluating GAN performance, such as the Inception Score and Fréchet Inception Distance (FID). Finally, I gained knowledge of the conditional generative model when generating images.
一、机器学习部分
1.1 再探GAN的数学原理
1.1.1 似然与概率
似然函数(likelihood function,通常简写为likelihood),概率(probability)
- 概率是在特定环境下某件事情发生的可能性,也就是结果没有产生之前依据环境所对应的参数来预测某件事情发生的可能性。 比如抛硬币,抛之前我们不知道最后是哪一面朝上,但是根据硬币的性质我们可以推测任何一面朝上的可能性均为50%,这个概率只有在抛硬币之前才是有意义的,抛完硬币后的结果便是确定的。
- 而似然刚好相反,是在确定的结果下去推测产生这个结果的可能环境(参数)。 还是抛硬币的例子,假设我们随机抛掷一枚硬币1,000次,结果500次硬币人头朝上,500次数字朝上(实际情况一般不会这么理想,这里只是举个例子),我们很容易判断这是一枚标准的硬币,两面朝上的概率均为50%,这个过程就是我们运用出现的结果来判断这个事情本身的性质(参数),也就是似然。
通俗来说,似然是:给定一堆数据,假如我们知道它是从某一种分布中随机取出来的,可是我们并不知道这个分布具体的参数,即“模型已定,参数未知”。例如,我们知道这个分布是正态分布,但是不知道均值和方差;或者是二项分布,但是不知道均值。
概率和似然的数学表达:
P ( X ∣ θ ) P(X|\theta ) P(X∣θ)
P ( X ∣ θ ) P(X|\theta ) P(X∣θ)是条件概率的表示方法,表示在 θ \theta θ的前提下,事件 X X X发生的概率。
L
(
θ
∣
X
)
L(\theta |X)
L(θ∣X)
L
(
θ
∣
X
)
L(\theta |X)
L(θ∣X)表示已知结果
X
X
X,参数为
θ
\theta
θ对应的概率,这个式子中
θ
\theta
θ是变量。
求似然的目的是估计 θ \theta θ,如果估计的 θ \theta θ与真实的 θ \theta θ一致,则似然和概率在数值上是相等的:
L ( θ ∣ X ) = P ( X ∣ θ ) L(\theta |X) = P(X|\theta ) L(θ∣X)=P(X∣θ)
两者在这种情况下,数值相同,但意义并不相同。 L L L是关于 θ \theta θ的函数,而 P P P则是关于 X X X的函数,两者从不同的角度描述同一件事。
(参考:概率和似然,终于懂了)
1.1.2 GAN和最大似然估计
最大似然估计:
-
给定一个真实的数据分布,写为 P d a t a ( x ) {P_{{\rm{data}}}}(x) Pdata(x),我们并不知道这个分布的公式不知道这个分布长什么样子,但是我们可以从这个分布中采样出样本(例如我们其实并不知道某一图片数据集中图片的分布,但是我们可以从中任意地抽取样本)
-
然后我们要去找一个分布,写为 P G ( x ; θ ) {P_G}(x;\theta ) PG(x;θ),这个分布的形状是由参数所决定的
-
例如, P G ( x ; θ ) {P_G}(x;\theta ) PG(x;θ)是高斯混合模型, θ \theta θ就是高斯分布函数中的均值和方差
-
我们希望找到一组参数 θ ∗ {\theta ^*} θ∗,能使分布 P G ( x ; θ ) {P_G}(x;\theta ) PG(x;θ)尽可能地接近真实的数据分布 P d a t a ( x ) {P_{{\rm{data}}}}(x) Pdata(x)
-
-
具体的做法为:
- 先从 P d a t a ( x ) {P_{{\rm{data}}}}(x) Pdata(x)中采样一些数据样本 x 1 {x^1} x1, x 2 {x^2} x2… x m {x^m} xm
- 计算每一个数据样本 x i {x^i} xi从 P G ( x ; θ ) {P_G}(x;\theta ) PG(x;θ)这个分布抽出的概率,表示为 P G ( x i ; θ ) {P_G}({x^i};\theta ) PG(xi;θ)
- 找一组参数 θ ∗ {\theta ^*} θ∗使得 P G ( x ; θ ) {P_G}(x;\theta ) PG(x;θ)与 P d a t a ( x ) {P_{{\rm{data}}}}(x) Pdata(x)越接近越好,就是每一个数据样本的 P G ( x i ; θ ) {P_G}({x^i};\theta ) PG(xi;θ)值越大越好,将概率值乘在一起得到这个似然函数: L = ∏ i = 1 m P G ( x i ; θ ) L = \prod\limits_{i = 1}^m {{P_G}({x^i};\theta )} L=i=1∏mPG(xi;θ)
- 找一组参数 θ ∗ {\theta ^*} θ∗,使得上述的似然函数值最大化,则可以估计出真实的数据分布。
-
接下来就是求参数 θ ∗ {\theta ^*} θ∗:
如何确定 P G {P_G} PG这个分布?
例子中,我们假设
P
G
{P_G}
PG是高斯混合模型(Gaussian Mixture Model),这个模型显然有很多限制,不能代表一种普遍的分布。因此在GAN的论文中,我们把
P
G
{P_G}
PG换成一个神经网络。GAN中的生成器就是一个网络,其定义了概率分布
P
G
{P_G}
PG。
图中的 P G ( x ) {P_G(x)} PG(x)就是我们目前的讨论对象,现在这个产生这个分布的不是固定的概率分布公式而是一个生成器网络。而在生成器网络的前端,一般都会有一个采样输入 z z z,这个分布叫做Prior Distribution,图里是正态分布,有人也许会用均匀分布等等,这个分布的选用对最后的影响不大,因为生成器网络会将其转变为各式各样的复杂分布。回到前面讨论的问题,如何找这个分布 P G {P_G} PG,现在的目标就是找的这个 P G {P_G} PG也就是生成器,要让 P G {P_G} PG和 P d a t a {P_{data}} Pdata的散度(Divergence)最小化。
接着问题是 P G {P_G} PG和 P d a t a {P_{data}} Pdata的分布函数我们都是不知道的,因此无法计算Divergence,更无法去最小化这个Divergence。然而GAN的算法能解决这个问题,从数据集 P d a t a {P_{data}} Pdata中采样相当数量的图片,从生成器中采样相当数量的生成图片,然后训练判别器来解决最小化Divergence的问题,训练判别器就是相当于训练一个二元的分类器,希望能将真实图片与生成图片很好地区分开,判别器的训练结果能反应两个分布的散度(差异性),原因是真实图片与生成图片越能很好地区分,判别器的目标函数就大,表明散度很大差异很大,判别器越不能很好地区分,目标函数就小,表面散度很小差异很小。
判别器的目标函数如下所示,目标函数为交叉熵的负数,因此最小化分类器的交叉熵就是在最大化判别器的目标函数,再找出最大化判别器目标函数时的判别器参数 D ∗ {D^*} D∗。最大化目标函数所得到的值与JS散度有关,证明如下:
因此可将 G ∗ = a r g min G D i v ( P G , P d a t a ) {G^*} = \mathop{arg {\min }}\limits_G Div({P_G},{P_{data}}) G∗=GargminDiv(PG,Pdata)中的divergence换成 m a x D V ( D , G ) \mathop{max }\limits_D V(D,G) DmaxV(D,G),从而得到 G ∗ = a r g min G m a x D V ( D , G ) {G^*} = \mathop{arg {\min }}\limits_G \mathop{max }\limits_D V(D,G) G∗=GargminDmaxV(D,G)
使用采样代替期望:
在判别器的目标函数中:
V ( D , G ) = E x ∼ P d a t a [ log D ( x ) ] + E x ∼ P G [ log ( 1 − D ( x ) ) ] V(D,G) = {E_{x \sim {P_{data}}}}\left[ {\log D(x)} \right] + {E_{x \sim {P_G}}}\left[ {\log (1 - D(x))} \right] V(D,G)=Ex∼Pdata[logD(x)]+Ex∼PG[log(1−D(x))]
分别从 P d a t a ( x ) {P_{data}}(x) Pdata(x)中采样 { x 1 , x 2 , … , x m } \left\{ {{x^1},{x^2}, \ldots ,{x^m}} \right\} {x1,x2,…,xm},从 P G ( x ) {P_G}(x) PG(x)采样 { x ~ 1 , x ~ 2 , … , x ~ m } \left\{ {{{\tilde x}^1},{{\tilde x}^2}, \ldots ,{{\tilde x}^m}} \right\} {x~1,x~2,…,x~m},并将 V ( D , G ) V(D,G) V(D,G)写为:
V ~ = 1 m ∑ i = 1 m log D ( x i ) + 1 m ∑ i = 1 m log ( 1 − D ( x ~ i ) ) \tilde V = \frac{1}{m}\sum\limits_{i = 1}^m {\log } D({x^i}) + \frac{1}{m}\sum\limits_{i = 1}^m {\log (1 - D({{\tilde x}^i}))} V~=m1i=1∑mlogD(xi)+m1i=1∑mlog(1−D(x~i))
所以实际上是求 a r g max D V ~ \mathop{arg {\max }}\limits_D \tilde V DargmaxV~
解minmax问题:
假设现在只有3种生成器,3张图代表了3种不同的生成器,图的横坐标代表不同的判别器,图的纵坐标代表 V ( D , G ) V(D,G) V(D,G)的值。先算 m a x D V ( D , G ) \mathop{max} \limits_D V(D,G) DmaxV(D,G) 就是找每个图中 V ( D , G ) V(D,G) V(D,G)的最大值点,然后算 min G max D V ( D , G ) \mathop{\min }\limits_G \mathop{\max }\limits_D V(D,G) GminDmaxV(D,G)就是找这3个点中 V ( D , G ) V(D,G) V(D,G)最小的那个点,找最小是因为 m a x D V ( D , G ) \mathop{max }\limits_D V(D,G) DmaxV(D,G)的数值就代表了 P G {P_G} PG和 P d a t a {P_{data}} Pdata的Divergence。
实际上GAN训练判别器和训练生成器的过程就是在解这min max的问题,解这个问题的目的就是要最小化生成器生成的图片与真实图片的JS散度,使用梯度下降法解这个问题:用
L
(
G
)
L(G)
L(G)代表
max
D
V
(
D
,
G
)
\mathop{\max }\limits_D V(D,G)
DmaxV(D,G),则找最好的生成器是
θ
G
←
θ
G
−
η
∂
L
(
G
)
/
∂
θ
G
{\theta _G} \leftarrow {\theta _G} - \eta \partial L(G)/\partial {\theta _G}
θG←θG−η∂L(G)/∂θG
L ( G ) L(G) L(G)中含有 max D \mathop{\max }\limits_D Dmax,因此这里用分段函数表示,在做梯度下降时 L ( G ) L(G) L(G)是可以微分的,上图的f(x)分段函数是 L ( G ) L(G) L(G)的示例。
梯度下降中,先给定一个
G
0
{G_0}
G0,接下来算
G
0
{G_0}
G0对
L
(
G
)
L(G)
L(G)的梯度,这一步要先找
D
0
∗
D_0^*
D0∗最大化
V
(
D
,
G
)
V(D,G)
V(D,G)(使用梯度上升法),然后得到
L
(
G
)
L(G)
L(G)再算
G
0
{G_0}
G0对
L
(
G
)
L(G)
L(G)的梯度,再得到
G
1
{G_1}
G1。此时再重新找一个
D
1
∗
D_1^*
D1∗,因为在分段函数中可能已经移动了区域,
L
(
G
)
L(G)
L(G)是求max,
L
(
G
)
L(G)
L(G)的函数可能已经变化了,因此是重新找一个
D
1
∗
D_1^*
D1∗找到现在的
L
(
G
)
L(G)
L(G),再算
G
1
{G_1}
G1对
L
(
G
)
L(G)
L(G)的梯度,从而优化
G
1
{G_1}
G1得到
G
2
{G_2}
G2,以此循环往复。
1.1.3 最大后验概率
最大似然估计和最大后验估计有相似的地方,最大后验估计又与贝叶斯公式有关,所以在这里对比着学习。根据贝叶斯公式,后验概率公式为:
P ( θ ∣ X ) = P ( X ∣ θ ) P ( θ ) P ( X ) P(\theta |X) = \frac{{P(X|\theta )P(\theta )}}{{P(X)}} P(θ∣X)=P(X)P(X∣θ)P(θ)
其中 P ( θ ∣ X ) P(\theta |X) P(θ∣X)表示后验概率,分子上的 P ( X ∣ θ ) P(X|\theta) P(X∣θ)的数值等于似然 L ( θ ∣ X ) L(\theta |X) L(θ∣X),分子上的 P ( θ ) P(\theta) P(θ)是先验概率, P ( X ) P(X) P(X)是边际似然,边际似然表示观测数据 X X X在所有可能参数值下出现的总概率,边际似然的计算对于连续参数来说: P ( X ) = ∫ P ( X ∣ θ ) P ( θ ) d θ P(X) = \int {P(X|\theta )P(\theta )d} \theta P(X)=∫P(X∣θ)P(θ)dθ对于离散参数来说: P ( X ) = ∑ θ P ( X ∣ θ ) P ( θ ) P(X) = \sum\limits_\theta {P(X|\theta )P(\theta )} P(X)=θ∑P(X∣θ)P(θ)
在进行最大后验估计的时候,会把分母省略,只对分子部分求最大:
a r g max θ P ( θ ∣ X ) = a r g max θ P ( X ∣ θ ) P ( θ ) \mathop{arg {\max }} \limits_\theta P(\theta |X) = \mathop{arg {\max }}\limits_\theta P(X|\theta )P(\theta ) θargmaxP(θ∣X)=θargmaxP(X∣θ)P(θ)
最大后验估计的优化目标是 P ( θ ∣ X ) P(\theta |X) P(θ∣X),即给定了观测值 X X X之后使模型参数 θ \theta θ出现的概率最大。相比于最大似然估计方法,最大后验概率考虑了参数 θ \theta θ的先验概率 P ( θ ) P(\theta) P(θ),所以就算似然概率 P ( X ∣ θ ) P(X|\theta) P(X∣θ)很大,但是如果参数 θ \theta θ出现的概率小,也更倾向于不考虑模型参数为 θ \theta θ,这是二者的区别。
似然函数与后验概率在表示上有相似的地方:
似然: L ( θ ∣ X ) L(\theta |X) L(θ∣X)
后验概率: P ( θ ∣ X ) P(\theta |X) P(θ∣X)
计算似然: L ( θ ∣ X ) L(\theta |X) L(θ∣X) = P ( X ∣ θ ) P(X|\theta ) P(X∣θ)
1.2 WGAN
JS散度同时也存在问题,JS散度的两个输入 P G {P_G} PG和 P d a t a {P_{data}} Pdata之间的重叠部分往往非常少。
- 这是因为图片其实是高维空间里的低维流形,因为在高维空间中随便采样一个点,它通常都没有办法构成一个人物的头像图片,所以人物头像图片的分布,在高维的空间中其实是非常狭窄的。以二维空间为例,图片的分布可能就是二维空间的一条线,也就是 P G {P_G} PG和 P d a t a {P_{data}} Pdata都是二维空间中的两条直线。而二维空间中的两条直线,除非它们刚好重合,否则它们相交的范围是几乎可以忽略的。
- 从另一个角度解释,我们从来都不知道 P G {P_G} PG和 P d a t a {P_{data}} Pdata的具体分布,因为其源于采样,所以也许它们是有非常小的重叠分布范围。比如采样的点不够多,就算是这两个分布实际上很相似,也很难有任何的重叠的部分。
上图中表明了,JS散度的缺陷,当两个分布不重叠时,不管两个分布的中心距离有多近,其JS散度都是常数
log
2
\log 2
log2,这样就会存在不公平的问题。
JS 散度的值并不能很好地反映两个分布的差异,对于两个没有重叠的分布,JS散度的值都为
log
2
\log 2
log2,与具体的分布无关。因此更换了一种衡量两个分布相似程度的方式,即Wasserstein距离,这种GAN被称为Wasserstein GAN(WGAN)。
Wasserstein距离的想法如下,假设两个分布分别为P和Q,我们想要知道这两个分布的差异,我们可以想像有一个推土机,它可以把P这边的土堆挪到Q这边,那么推土机平均走的距离就是 Wasserstein距离。在这个例子里面,我们假设P集中在一个点,Q集中在一个点,如果P和Q的分布不是集中在一个点,而是分布在一个区域,那么我们就要考虑所有的可能性,也就是所有的推土机的走法,然后看平均走的距离是多少,这个平均走的距离就是 Wasserstein距离。Wasserstein距离可以想象为有一个推土机在推土,所以 Wasserstein距离也称为推土机距离(Earth Mover’s Distance,EMD)。
如果是更复杂的分布,如上图,我们可以把P的土搬到Q来,也可以反过来把Q的土搬到P。两种分布计算距离就有很多不同的方法,即不同的“移动”方式,从中计算算出来的距离,即推土机平均走的距离就不一样。对于左边这个例子,推土机平均走的距离比较少;右边这个例子因为舍近求远,所以推土机平均走的距离比较大。为了让Wasserstein距离只有一个值,我们将距离定义为穷举所有的“移动”方式,然后看哪一个推土的方法可以让平均的距离最小,那个最小的值才是Wasserstein距离。
比较Wasserstein距离和JS散度,假设两个分布 P G {P_G} PG和 P d a t a {P_{data}} Pdata它们的距离是 d 0 {d_0} d0,那么Wasserstein距离算出来就是 d 0 {d_0} d0;假设两个分布 P G {P_G} PG和 P d a t a {P_{data}} Pdata它们的距离是 d 1 {d_1} d1,那么Wasserstein距离算出来就是 d 1 {d_1} d1。而对于JS散度来说,只要两个分布没有重叠的地方,算出的差异就一直是 log 2 \log 2 log2。
1.3 GAN的性能评估方法
评估GAN生成图片质量的方法,一开始是训练一个图像的分类系统,然后把GAN产生出来的图片输入到这个图像的分类系统里面,看它产生什么样的结果。这个图像分类系统的输 是一张图片,输出是一个概率分布,这个概率分布代表说这张图片是猫的概率、狗的概率、斑马的概率等等。如果这个概率分布越集中,就代表现在产生的图片可能越好。如果生成出来的图片是一个四不像,图像识别系统就会非常的困惑,它产生出来的这个概率分布就会是非常平均的分布。
光用这个做法会被一个叫做模式崩塌(mode collapse)的问题骗过去。模式崩塌是指在训练 GAN 的过程中遇到的一个状况,假设上图蓝色的星星是真正的数据的分布,红色的星星是GAN的模型的分布。我们会发现生成式的模型它输出来的图片来来去去就是那几张。这个问题目前还没有很好的解决方法。
此外还有Inception分数,用Inception网络来做评估,用Inception网络度量质量和多样性。如果质量高并且多样性又大,那Inception分数就会比较大。
Fréchet Inception distance (FID)是目前通常使用的方法,先把生成器产生出来的人脸图片,丢到 InceptionNet 里面,让 Inception 网络输出它的类别。这里我们需要的不是最终的类别,而是进入Softmax之前的隐藏层的输出向量,这个向量的维度是上千维的,代表这个图片。我们就把它降维后画在二维的平面上,接下来我们假设真实的图片和生成的图片都服从高斯分布,然后去计算这两个分布之间的 Fréchet的距离。两个分布间的距离越小越好,距离越小越代表这两组图片越接近,也就是产生出来的品质越高。
1.4 条件型生成
前面介绍的GAN中的生成器,都没有输入任何的条件,只输入了一个随机的分布,然后产生出一张图片。为了进一步可以操控生成器的输出,我们给予其一个额外的输入条件 x x x,让生成器根据条件 x x x和输入的采样 z z z来产生输出 y y y。
如果按照之前的思路,判别器就是使用一张图片 y y y当作输入,并输出一个数值,这个数值代表输入的图像多像真实的图片。在训练集中,判别器将要看到真实的图片就标为1,看到生成的图片就标0,然后反复训练判别器和生成器。但是这样的方法没办法解决条件型GAN的问题以文字条件生成图片为例,如果只将图片 y y y当作输入的话,生成器会学到的东西是只要产生清晰的图片骗过判别器就可以了,而不再管输入的文字条件 x x x。因此,在训练判别器的时候,不仅要输入图片 y y y,还需要文字条件 x x x,同时,判别器需要计算图片 y y y与文字条件 x x x的匹配程度,对于匹配程度高的数据对判别器就输出一个较高的分数,越接近1。对于匹配程度低的数据对,就输出一个较低的分数,越接近0。
GAN根据不同条件的可控生成:Image-to-Image Translation with Conditional Adversarial Networks(在条件生成中,如果用supervised learning的方法进行img-to-img的结果会比较模糊,这是因为同样的输入可能对应不一样的输出(使用监督学习训练一个自动闯关游戏,在训练数据中遇到转角将要转弯时,同时含有向左转和向右转的数据,模型就会学到向左转和向右转都是对的,最后的结果就会比较平均既要往左又要往右,导致的图片模糊),模型学到的结果平均起来,就变得模糊。如果单独用GAN,GAN的创造力太强可能会生成条件里没有要求的部分。因此使用GAN+supervised learning的结果会比较好。)
Talking Head Generation: Few-Shot Adversarial Learning of Realistic Neural Talking Head Models
总结
本周解决了上周在学习GAN时的疑难数学问题,GAN的评估问题仍然值得深思。尽管现在的Stable Diffusion生成的图片更加精细,但也没有很好的评价指标。或许我可以从建立GAN的评估体系的过程中,学习经验并尝试为Diffusion模型建立合适的评估体系。