机器学习课程学习周报十
文章目录
- 机器学习课程学习周报十
- 摘要
- Abstract
- 一、机器学习部分
- 1.1 生成对抗网络
- 1.2 生成器与辨别器的训练过程
- 1.3 信息论
- 1.3.1 信息量
- 1.3.2 熵
- 1.3.3 交叉熵
- 1.3.4 相对熵/KL散度
- 1.3.5 交叉熵损失函数
- 1.3.6 JS散度
- 1.4 GAN的理论介绍
- 总结
摘要
本周学习了生成对抗网络(GAN)的基本原理和训练过程。重点介绍了生成器和判别器的协同训练机制,以及信息论在GAN中的应用。通过GAN的实践,理解了如何通过最小化生成数据与真实数据分布之间的差异来提高生成器的效果。
Abstract
This week I focused on the foundational principles and training process of Generative Adversarial Networks(GAN). The study highlighted the collaborative training mechanism of the generator and discriminator, along with the application of information theory in GAN. Practical insights were gained into improving generator performance by minimizing the divergence between generated and real data distributions.
一、机器学习部分
1.1 生成对抗网络
生成模型(generative model)中的网络通常被作为一个生成器(generator)来使用。在模型输入时会将一个随机变量 z z z与原始输入 x x x一并输入到模型中,随机变量 z z z是从随机分布中采样得到的,这个随机分布应能知道其函数表达式,例如高斯分布(Gaussian distribution)、均匀分布(uniform distribution)。虽然我们每次输入同样的 x x x,但随着采样得到的 z z z不同,我们得到的输出 y y y也会不一样。同理,对于网络来说,其输出也不再固定,而变成了一个复杂的分布,我们也将这种可以输出一 个复杂分布的网络称为生成器,如下图所示。
提出生成模型的原因,是我们的任务需要创造性的输出。对于生成模型来说,其输出的结果能够输出一个分布,能够说出多种答案,以处理开放式的问题。生成模型又分为无限制生成(unconditional generation),也就是不需要原始输入 x x x,以及条件型生成(conditional generation),这种则需要原始输入 x x x。以无限制的图片生成为例,一张图片就是一个高维的向量,所以生成器实际上做的事情就是输出一个高维的向量。我们首先从正态分布中采样得到一个向量 z z z,并输入到生成器中,生成器输出一个高维向量,如 64 × 64 × 3 64 \times 64 \times 3 64×64×3大小的彩色图片。我们也可以选择其他的分布,但是根据经验,不同分布之间的差异并没有非常大。正态分布比较简单且常见,后面的学习都以正态分布为前提。
生成模型中,现在非常火的是扩散模型(Diffusion Model),这种模型将在下一章进行学习。本节将学习最为经典的生成式对抗网络(Generative Adversarial Network, GAN)。
在GAN中,除了生成器,还需要多训练一个判别器(discriminator),其通常是一个神经网络。判别器会输入一张图片,输出一个标量,其数值越大就代表现在输入的图片越像是真实的图像。举例来说,假设1是最大的值,生成得很好的图像输出就是1,不知道在画什么就输出0.5,再差一些就输出0.1 等等。判别器从本质来说与生成器一样也是神经网络,是由我们自己设计的。
举一个使用GAN生成动漫人物图像的例子:首先, 第一代生成器的参数几乎是完全随机的,所以它根本就不知道要怎么画动漫人物,所以其画出来的东西就是一些莫名其妙的噪音。那判别器学习的目标是要成功分辨生成器输出的动漫图片。 当然在上图里面可能非常容易,对判别器来说它只要看图片中是否有两个黑黑的眼睛即可。接下来生成器就要通过训练调整里面的参数来骗过判别器。假设判别器判断一张图片是不是真实图片的依据是看图片有没有眼睛,那新的生成器就需要输出有眼睛的图片。所以生成器产生眼睛出来,它是可以骗过第一代的判别器的。同时判别器也是会进化的,其会试图分辨新的生成器与真实图片之间的差异。例如,通过有没有嘴巴来识别真假。所以第三代的生成器就会想办法去骗过第二代的判别器,比如把嘴巴加上去。当然同时判别器也会逐渐的进步,会越来越严苛,来“逼迫”生成器产生出来的图片越来越像动漫的人物。所以生成器和判别器彼此之间是一直的互动、促进关系,和我们所说的“内卷”一样。最终,生成器会学会画出动漫人物的脸,而判别器也会学会分辨真假图片,这就是 GAN 的训练过程。
1.2 生成器与辨别器的训练过程
第一步,生成器和判别器是两个网络,在训练前我们要先分别进行参数初始化。然后固定生成器,只训练判别器。因为生成器的初始参数是随机初始化的,所以它什么都没有学习到,输入一系列采样得到的向量给它,它的输出肯定都是些随机、混乱的图片。这时,我们开始训练判别器,判别器的训练目标是要分辨真正的动漫人物与生成器产生出来的动漫人物间的差异。我们从图库中采样一些动漫人物头像图片,再将其与生成的结果作对比,将真正图片的标签标1,生成器产生的图片标签标0。此时,将训练判别器看作为分类或回归问题。如果是分类问题,判别器应能将真实图片当作类别1,将生成图片当作类别2;如果是回归问题,判别器得到真实图片的输入就要输出1,得到生成图片的输入就要输出0,并在0-1之间打分。
第二步,固定判别器,只训练生成器。训练生成器的目的就是让生成器想办法去骗过判别器,因为在第一步中判别器已经学会分辨真图和假图间的差异,如果生成器如果可以骗过判别器,那生成器产生出来的图片可能就可以以假乱真。现在,生成器先产生一个图片,然后将这个图片输入到判别器中,判别器会给这个图片一个打分。这里判别器是固定的,它只需要给更“真”的图片更高的分数即可,生成器训练的目标就是 让图片更加真实,也就是提高分数。生成器和判别器都是有很多层的神经网络络,我们通常将两者一起当作一 个比较大的网络来看待,但是不会调整判别器部分的模型参数,判别器在这一步是固定的。
GAN 算法的两个步骤:步骤一,固定生成器训练判别器;步骤二,固定判别器训练生成器。接下来就是重复以上的训练,训练完判别器固定判别器训练生成器。训练完生成器以后再用生成器去产生更多的新图片再给判别器做训练。训练完判别器后再训练生成器, 如此反覆地去执行。当其中一个进行训练的时候,另外一个就固定住,期待它们都可以在自己的目标处达到最优,这就是生成式对抗网络的思想。
1.3 信息论
在介绍GAN的理论之前,我认为有必要先在这里学习一下信息论相关的知识。
1.3.1 信息量
信息量(Amount of Information)表示事情包含的信息量大小(事件发生的难度有多大)。小概率事件,它发生的难度比较大,所以有较大的信息量。大概率事件,它发生的难度比较小,所以有较小的信息量。例如:小明考试及格的概率是20%,则不及格的概率就是80%。小明考试及格这件事,就是小概率事件,发生的难度大,信息量大;小明考试不及格这件事,就是大概率事件,发生的难度小,信息量小。
信息量的性质:对于独立事件A、B,有 p ( A B ) = p ( A ) p ( B ) p(AB) = p(A)p(B) p(AB)=p(A)p(B)。两个事件同时发生的信息量等于两个事件的信息量相加,有 I ( A B ) = I ( A ) + I ( B ) I(AB) = I(A) + I(B) I(AB)=I(A)+I(B)。
信息量公式: I ( x ) = log 2 ( 1 p ( x ) ) = − log 2 ( p ( x ) ) I(x) = {\log _2}(\frac{1}{{p(x)}}) = - \log {}_2(p(x)) I(x)=log2(p(x)1)=−log2(p(x))
这样设计信息量公式的原因是,要满足上面信息量的定义和性质:
-
概率 p ( x ) p(x) p(x)和信息量 I ( x ) I(x) I(x)是负相关的,所以设计为 1 p ( x ) \frac{1}{{p(x)}} p(x)1
-
两个事件同时发生的信息量等于两个事件的信息量相加,所以设计为log的形式
I ( A B ) = log 2 ( 1 p ( A B ) ) = log 2 ( 1 p ( A ) p ( B ) ) = log 2 ( 1 p ( A ) ) + log 2 ( 1 p ( B ) ) = I ( A ) + I ( B ) I(AB) = {\log _2}(\frac{1}{{p(AB)}}) = {\log _2}(\frac{1}{{p(A)p(B)}}) = {\log _2}(\frac{1}{{p(A)}}) + {\log _2}(\frac{1}{{p(B)}}) = I(A) + I(B) I(AB)=log2(p(AB)1)=log2(p(A)p(B)1)=log2(p(A)1)+log2(p(B)1)=I(A)+I(B)
log以2为底,是转换到二进制下表示复杂度。其实以e为底,以10为底都可以,只不过以2为底更优。
1.3.2 熵
熵(Entropy)表示概率分布的信息量期望: H ( p ) = E ( I ( x ) ) H(p) = E(I(x)) H(p)=E(I(x)),亦可以理解为系统整体的信息量。其中,系统整体由所有可能发生的事件构成。比如抛硬币,抛正面和抛反面就构成一个系统整体。
熵的公式: H ( p ) = ∑ p i I i p = − ∑ p i log 2 ( p i ) H(p) = \sum {{p_i}} I_i^p = - \sum {{p_i}} {\log _2}({p_i}) H(p)=∑piIip=−∑pilog2(pi)
熵的作用:用来评估概率模型的不确定性程度。不确定性越大,熵越大;不确定性越小,熵越小。
如上图,左边的图片类似于一个均匀分布,右边的图片类似于一个正态分布。均匀分布中概率都相等,完全不确定哪一个会发生,因此均匀分布的不确定性程度较高;正态分布中,概率的差异明显,因此正态分布的不确定性程度较低。
例子:
结论:
- 若概率密度均匀,产生的随机变量的不确定性就更高,则熵的值就更大
- 若概率密度聚拢,产生的随机变量的不确定性就更低,则熵的纸较小
1.3.3 交叉熵
假设真实概率分布为 p p p,预测概率分布(估计概率分布)为 q q q
交叉熵(Cross Entropy)表示预测概率分布 q q q对真实概率分布 p p p的平均信息量的估计。
交叉熵公式: H ( p , q ) = ∑ p i I i q = − ∑ p i log 2 ( q i ) H(p,q) = \sum {{p_i}} I_i^q = - \sum {{p_i}} {\log _2}({q_i}) H(p,q)=∑piIiq=−∑pilog2(qi)
例子:
结论:
-
预估概率分布与真实概率分布越接近,交叉熵越小。
-
交叉熵的值总是大于熵的值,根据吉布斯不等式。
1.3.4 相对熵/KL散度
相对熵(Relative Entropy)/ KL散度(KL Divergence),用于衡量2个概率分布之间的差异。
KL散度公式:(交叉熵减去熵)
D K L ( p ∥ q ) = ∑ p i [ I q − I p ] {D_{KL}}(p\parallel q) = \sum {{p_i}\left[ {{I_q} - {I_p}} \right]} DKL(p∥q)=∑pi[Iq−Ip]
= ∑ p i [ log 2 ( 1 q i ) − log 2 ( 1 p i ) ] = \sum {{p_i}} \left[ {{{\log }_2}(\frac{1}{{{q_i}}}) - {{\log }_2}(\frac{1}{{{p_i}}})} \right] =∑pi[log2(qi1)−log2(pi1)]
= ∑ p i log 2 ( 1 q i ) − ∑ p i log 2 ( 1 p i ) = \sum {{p_i}} {\log _2}(\frac{1}{{{q_i}}}) - \sum {{p_i}} {\log _2}(\frac{1}{{{p_i}}}) =∑pilog2(qi1)−∑pilog2(pi1)
= H ( p , q ) − H ( p ) = H(p,q) - H(p) =H(p,q)−H(p)
= ∑ p i log 2 ( p i q i ) = \sum {{p_i}} {\log _2}(\frac{{{p_i}}}{{{q_i}}}) =∑pilog2(qipi)
KL散度性质:
- D K L ( p ∥ q ) {D_{KL}}(p\parallel q) DKL(p∥q)与 D K L ( q ∥ p ) {D_{KL}}(q\parallel p) DKL(q∥p)是不一样的, D K L ( p ∥ q ) ≠ D K L ( q ∥ p ) {D_{KL}}(p\parallel q) \ne {D_{KL}}(q\parallel p) DKL(p∥q)=DKL(q∥p)。 D K L ( p ∥ q ) {D_{KL}}(p\parallel q) DKL(p∥q)表示以 p p p为基准(为真实概率分布),估计概率分布 q q q与真实概率分布 p p p之间的差异; D K L ( q ∥ p ) {D_{KL}}(q\parallel p) DKL(q∥p)表示以 q q q为基准(为真实概率分布),估计概率分布 p p p与真实概率分布 q q q之间的差异。
- 由上面介绍的吉布斯不等式可知: D K L ( p ∥ q ) ≥ 0 {D_{KL}}(p\parallel q) \ge 0 DKL(p∥q)≥0;当分布 p p p和分布 q q q完全一样时, D K L ( p ∥ q ) = 0 {D_{KL}}(p\parallel q) = 0 DKL(p∥q)=0。
1.3.5 交叉熵损失函数
由上可知,KL散度能够衡量2个概率分布之间的差距,所以我们直接将损失函数定义为KL散度: L o s s = D K L ( p ∥ q ) L{\rm{oss}} = {D_{KL}}(p\parallel q) Loss=DKL(p∥q),并且我们希望模型的预测分布 p p p与真是分布 q q q完全相同,即: L o s s = D K L ( p ∥ q ) = 0 L{\rm{oss}} = {D_{KL}}(p\parallel q) = 0 Loss=DKL(p∥q)=0
L o s s = D K L ( p ∥ q ) = H ( p , q ) − H ( p ) = ∑ p i log 2 ( 1 q i ) − ∑ p i log 2 ( 1 p i ) L{\rm{oss}} = {D_{KL}}(p\parallel q) = H(p,q) - H(p) = \sum {{p_i}} {\log _2}(\frac{1}{{{q_i}}}) - \sum {{p_i}} {\log _2}(\frac{1}{{{p_i}}}) Loss=DKL(p∥q)=H(p,q)−H(p)=∑pilog2(qi1)−∑pilog2(pi1)
对于分类问题,真实分布是一个单点分布,真实类别的概率为1,其他类别的概率为0,类似如下:
类别 | class1 | class2 | class3 | class4 |
---|---|---|---|---|
概率 | 0 | 0 | 1 | 0 |
1.3.6 JS散度
由于KL散度是非对称的, D K L ( p ∥ q ) ≠ D K L ( q ∥ p ) {D_{KL}}(p\parallel q) \ne {D_{KL}}(q\parallel p) DKL(p∥q)=DKL(q∥p)。JS散度在其基础上,稍作修改,有 D J S ( p ∥ q ) = D J S ( q ∥ p ) {D_{JS}}(p\parallel q) = {D_{JS}}(q\parallel p) DJS(p∥q)=DJS(q∥p),成为对称的。
1.4 GAN的理论介绍
生成器的输入是一系列的从分布中采样出的向量,生成器就会产生一个比较复杂的分布,我们称之为 P G {P_G} PG。另外我们还有一组原始数据,这些数据会形成另一个分布,我们称之为 P d a t a {P_{data}} Pdata。GAN的训练效果是希望 P G {P_G} PG和 P d a t a {P_{data}} Pdata尽可能得相似。
差异(Divergence),是衡量两个分布的相似度的一个指标,我在上面学习KL Divergence时,提到“当分布 p p p和分布 q q q完全一样时, D K L ( p ∥ q ) = 0 {D_{KL}}(p\parallel q) = 0 DKL(p∥q)=0。”。即我们现在要求 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分布最相似的最优的生成器称为 G ∗ {G^ * } G∗。
然而,训练生成器的过程训练例如卷积神经网络等简单网络非常地像,相比于之前的找一组参数最小化损失函数,我们现在其实也定义了生成器的损失函数,即 P G {P_G} PG和 P d a t a {P_{data}} Pdata之间的差异。 对于一般的神经网络,其损失函数是可以计算的,但是对于生成器的差异,其中连续的差异例如KL散度和JS散度是很复杂的,在实际离散的数据中,我们或许无法计算其对应的积分。
对于GAN,只要我们知道怎样从 P G {P_G} PG和 P d a t a {P_{data}} Pdata中采样,就可以计算得到差异,而不需要知道实际的公式,这其中要依靠判别器的力量。我们在训练判别器时,其训练目标是看到真实数据就给它比较高的分数,看到生成的数据就给它比较低的分数。这时,我们希望训练判别器时是最大化其目标函数,该目标函数就写为了下图所示的 V ( G , D ) V(G,D) V(G,D)。
我们希望目标函数 V ( G , D ) V(G,D) V(G,D)越大越好,其中 y y y如果是从 P d a t a {P_{data}} Pdata中采样得到的真实数据,分数就要越大越好,因为 D ( y ) D(y) D(y)大, log D ( y ) \log D(y) logD(y)就大;如果是从 P G {P_G} PG采样得到的生成数据,它就要越小越好,因为 D ( y ) D(y) D(y)越小, log ( 1 − D ( y ) ) \log (1 - D(y)) log(1−D(y))就越大。这个过程在 GAN 提出之初,人们将其写为这样其实还有一个缘由,就是为了让判别器和二分类产生联系,因为这个目标函数本身就是一个交叉熵乘上一个负号。训练一个分类器时的操作就是要最小化交叉熵, 所以当我们最大化目标函数的时候,其实等同于最小化交叉熵,也就是等同于是在训练一个分类器,训练后就等同于是解了这个优化问题。
上图红框中的 max V ( G , D ) \max V(G,D) maxV(G,D)与JS散度有关。如上图,当示蓝色的星星和红色的星星混在一起时,两种分布的差异不大,交叉熵的值大,交叉熵的负值小,也就是 V ( G , D ) V(G,D) V(G,D)小,在最大化 V ( G , D ) V(G,D) V(G,D)时,很难让目标函数 V ( G , D ) V(G,D) V(G,D)达到最大值。但是当两组数据差距很大时,也就是蓝色的星星和红色的星星并没有混在一起,那么分类器就可以轻易地把它们分开,交叉熵的值小,交叉熵的负值大,也就是 V ( G , D ) V(G,D) V(G,D)大,在最大化 V ( G , D ) V(G,D) V(G,D)时,目标函数 V ( G , D ) V(G,D) V(G,D)就可以很大。
将:
中的Divergence替换为:
总结
后面会继续重点学习GAN的数学原理,这一节的数学知识较多,需要好好消化一下。