从一个简单例子入门生成对抗网络GAN

本文深入浅出地介绍了生成对抗网络(GAN)的工作原理,包括生成器和判别器的交互机制,以及如何通过对抗训练达到生成高质量图片的目的。此外,还详细解释了信息熵、KL散度和交叉熵等关键概念,帮助读者理解GAN背后的数学原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 https://zhuanlan.zhihu.com/p/41993080

 

一、什么是生成对抗网络

通俗的讲:

  • 对抗网络有一个生成器(Generator),还有一个判别器 (Discriminator);
  • 生成器从随机噪声中生成图片,由于这些图片都是生成器臆想出来的,所以我们称之为 Fake Image;
  • 生成器生成的照片Fake Image和训练集里的Real Image都会传入判别器,判别器判断他们是 Real 还是 Fake。

那么我们如何训练网络呢?要达到什么样的目的?

  • 我们希望生成器生成的图片足够真实,可以骗过判别器;
  • 我们也希望判别器足够“精明”,可以很好的分别出真图还是生成图;
  • 最后在训练中,生成器和判别器达到一种“对抗”中的平衡,结束训练。

这时,我们分离出 生成器,它便可以帮助我们“生成”想要的图片。


二、基本概念

生成图片并不是一个新出现的需求,但是因为GAN的引入变得非常火爆。对于需要深入研究深度学习的人来说,还是需要认真学习其数学原理。

首先我们介绍几个概念(这几个概念是相互继承的,需要理解相互之间的关系):

  • 信息量
  • 信息熵
  • K-L散度
  • 交叉熵

1、信息量

假设有离散型随机变量 x,其取值集合为 X;且 x 的概率分布为 P(x)。那么定义事件 x=x_{0} (x_{0}\in X) 的信息量为:

意义:对于小概率事件,其对应的信息量将会非常小;但是对于大概率事件,其包含的信息量就会很大。

2、信息熵

根据香浓信息熵公式,对任意一个随机变量 x,定义其信息熵为 H(x),单位为 bit,由于 0 < P(x) < 1,所以 H(x)>0。

信息熵可以简称为熵,代表了随机变量 x 的混乱程度。其实就是其信息量 I(x)的数学期望。熵越大,随机性越强。

通过简单的求导过程,我们可以发现熵是存在最大值的:

当一个随机变量 x 各取值的概率相等时,x 的无序混乱度最大,我们也就最难判断哪种情况容易放生,即熵最大!

3、KL散度:

参考博客:https://blog.csdn.net/wangdongwei0/article/details/83628438

4、交叉熵

参考博客:https://blog.csdn.net/wangdongwei0/article/details/83628438

三、生成图片的原理

1、基本原理

  • 假设一组数据 x 服从概率分布 P_{data}(x),记为 x \sim P_{data}(x)
  • 对于以 x 为输入的分布 P_{G}(x;\Theta ),通过学习参数 \Theta 使得 P_{G}(x;\Theta ) 接近 P_{data}(x),那么就可以找到一个生成器。

那么如何学习参数呢?显然又到了使用最大似然估计的时候了。

2、最大似然估计

从 x \sim P_{data}(x) 随机采集一组样本  \{x^1,x^2,...,x^m\}

使得 L(\theta) 取得最大值时的 \theta^* 即为我们想要的值:

 

 

注意到样本 \{x^1,x^2,...,x^m\} 来源自 x \sim P_{data}(x) ,所以:

需要说明,公式中绿色横线项是一个 \theta 无关的常数项,所以减去后不会影响 \theta^* 的结果。

所以结论是:我们要找的 \theta^* 就是使得 KL(P_{data}(x)||P_G(x;\theta)) 取得最小值的 \theta 参数。

那如何来找这个 \theta^* 呢?

假设P_G(x;\theta)是一个神经网络。

首先随机一个向量 z ,通过网络 G(z)=x 生成图片 x ;那么我们如何比较两个分布是否相似呢?只要我们取一组sample z ,这组 z 符合一个分布,那么通过网络就可以生成另一个分布P_G,然后来比较与真实分布P_{data}

由于神经网络可以拟合任意的函数,那么也可以拟合任意分布(包括 P_G )。所以可以用正态分布,取样去训练一个神经网络,学习到一个很复杂的分布。

当给神经网络的输入时一个分布 P_{prrior}(z) ,它的输出也可以看做一个分布 P_G(x) 。那么这个过程可以看作:

P_G(x)=\int_{z}^{}P_{prrior}(z)I_{[G(z)=x]}dz\\

其中 I_{[G(z)=x]} 代表神经网络输入 z 时,输出恰好为 x 。

但此时如果使用最大似然估计会存在问题,就是神经网络的参数量太大,想要计算似然(likelihood)来对神经网络的参数进行估计是不现实的。

所以生成对抗网络GAN的最大贡献,就是用神经网络黑盒代替了上述过程:

用Gernerator代替 P_G(x;\theta) ,用Discriminator代替 P_{data}(x) 去约束Gernerator,不再需要似然估计,用玄学战胜了困难。

 

  • Generator(G)

所谓的生成器,就是将 n\times n=100 大小的随机噪声 z 通过全连接上采样到 28\times28 大小的图片(mnist图片大小)。设随机噪声 z 服从 P_{z}(z) 分布,即z\sim P_{z}(z) 。那么生成器的输出可以表示为 G(z) 。

  • Discriminator(D)

所谓判别器,其实就是一个全连接分类网络,输入为 28\times28=784 大小的图片,记为x 。输出由于经过sigmoid,所以 D(x) 是一个 (0,1) 之间的常数,代表输入 x 为数字图片的概率。

 

定义GAN的Cost value如下:

V(D,G)=E_{x\sim P_{data}(x)}\left[ \log D(x) \right]+E_{z\sim P_z(z)}\left[\log (1-D(G(z))) \right]\\

那么希望找到的Generator是:

G^*=\min_G\max_DV(D,G)\\

如何理解 G^* ?首先来感性的认识下 V(D,G)

判别器是一个二分类模型,判断输入的图片是Real image or Fake image。

假定判别器 D 输入 x_1 ,对应label为 y_1 ,则交叉熵为:

CE(y_1,D(x_1))=-y_1\log D(x_1) -(1-y_1)\log(1-D(x_1))\\

当有 N 个样本 \{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\} 时 CE 之和为:

sum(CE)=-\sum_{i=1}^{N}{y_i\log(D(x_i))-\sum_{i=1}^{N}{(1-y_i)\log(1-D(x_i))}}\\

考虑这里的样本 x_i 来源:

  • 假设以 y_i的概率 x_i 来自Real image,其中 x_i\sim P_{data}(x) ;
  • 即对应 1-y_i概率 x_i=G(z_i) 来自Fake image,其中 z\sim P_z(z)

那么:

sum(CE)=-\sum_{i=1}^{N}{y_i\log(D(x_i))-\sum_{i=1}^{N}{(1-y_i)\log(1-D(x_i))}}

=-\sum_{i=1}^{N}{y_i\log(D(x_i))-\sum_{i=1}^{N}{P_z(z_i)\log(1-D(G(z_i)))}}

当 (x_i,y_i) 采样足够多时,多到能够代表样本分布时:

sum(CE)=-E_{x\sim P_{data}(x)}\left[ \log D(x) \right]-E_{z\sim P_z(z)}\left[\log (1-D(G(z))) \right]\\

即:

V(D,G)=-sum(CE)\\

G^*=\min_G\max_DV(D,G)=\max_G\min_Dsum(CE)\\

  • 训练 D ,使得 V(D,G)变大,即交叉熵和KL散度变小
  • 训练 G ,使得 V(D,G)变小,即交叉熵和KL散度变大

最终在 \min\leftrightarrow\max 的博弈中整个GAN系统趋向于平衡。

 

关于 V(D,G) 原理的数学证明(数学公式预警)

首先考虑在给定 G 的情况下\max_DV(D,G) 的含义。

V(D,G)=E_{x\sim P_{data}(x)}\left[ \log D(x) \right]+E_{z\sim P_z(z)}\left[\log (1-D(G(z))) \right]

=\int_{x}^{}P_{data}(x)\log D(x)dx+\int_{z}^{}P_z(z)\log(1-D(G(z)))dz

=\int_{x}^{}P_{data}(x)\log D(x)dx+\int_{x}^{}P_G(x)\log(1-D(x))dx

=\int_{x}^{}\left[ P_{data}(x)\log D(x)+P_G(x)\log(1-D(x)) \right]dx

当每一个 P_{data}(x)\log D(x)+P_G(x)\log(1-D(x)) 取得最大值时, V(D,G) 也取得最大值。

观察函数 f(x) = a \log x + b\log(1 - x),在 x=\frac{a}{a+b} 取得最大值(不信你自己算)。所以:

D^*(x) = \frac{P_{data}(x)}{P_{data}(x) + P_G(x)}\\

在给定 G 时, D^* 使 V(D,G) 取得最大值。

然后将 D^* 带入 \max_DV(D,G) :

\max_DV(D,G)=E_{x\sim P_{data}(x)}\left[\log D^*(x)\right]+E_{z\sim P_z(z)} \left[ \log(1-D^*(G(z))) \right]

=E_{x\sim P_{data}(x)}\left[\log D^*(x)\right]+E_{x\sim P_G(x)} \left[ \log(1- D^*(x)) \right]

=E_{x\sim P_{data}(x)}\left[\log \frac{P_{data}(x)}{P_{data}(x) + P_G(x)}\right]+E_{x\sim P_G(x)} \left[ \log(\frac{P_{G}(x)}{P_{data}(x) + P_G(x)}) \right]

=\int_{x}^{}P_{data}(x)\log\frac{\frac{1}{2}P_{data}(x)}{\frac{P_{data}(x) + P_G(x)}{2}}dx + \int_{x}^{}P_G(x)\log\frac{\frac{1}{2}P_G(x)}{\frac{P_{data}(x) + P_G(x)}{2}}dx

=-2\log2+KL(P_{data}(x)||\frac{P_{data}(x)+P_G(x)}{2})+KL(P_G(x)||\frac{P_{data}(x)+P_G(x)}{2})

在 D 固定的情况下,当通过训练 G 使得 P_G(x)\approx P_{data}(x) ,即 G 生成的图片与真实图片非常接近的情况下获得 G^* 。

看到这,GAN的训练过程就是小菜一碟了。

整个训练过程简单说就是交替下面的过程:

  1. 固定 G 中所有参数,收集Real image + Fake image,用梯度下降法修正 D
  2. 然后固定 D 中所有参数,收集Fake image,用梯度下降法修正 G

条件生成对抗网络CGAN(Conditional Generative Adversarial Nets)

OK,了解了GAN的基本原理后,就可以生成数字了。但是有一个问题,GAN生成的数字是完全随机的,即具体生成 0\sim 9 中的哪一个数字依赖于随机输入 z\sim P_z(x) 。

那么如果只想固定生成某个具体数字怎么办?这时就要用到CGAN网络了。

定义CGAN:

Generator为 G(z|y) ,代表输入噪声z和标签 y 的情况下生成的特定 y 类别图片。

Discrimiator为D(x|y),代表输入输入图片 x 经过判别后是 y 类别的概率。

同时 V(D,G) 如下:

V(D,G)=E_{x\sim P_{data}(x)}\left[ \log D(x|y) \right]+E_{z\sim P_z(z)}\left[\log (1-D(G(z|y))) \right]\\

要寻找的 G^* 如下:

G^*=\min_G\max_DV(D,G)\\

相比于原始GAN,其实就是多了个类别标签 y ,并将原来的2分类变为多分类。

那么这个 y 是什么?也许是个矩阵,反正每个类别有自己特定的 y ,只需要将 x 与 y 拼接或相加在一起就能形成 x|y 了(当然必须保证 x|y 的生成方式,训练和评测时是一样的)。

还没有懂CGAN?建议你看看代码吧:GAN Code

 

参考文献:

[1] Agustinus Kristiadi's Blog (GitHub stars 3k+)

Generative Adversarial Nets in TensorFlow

Conditional Generative Adversarial Nets in TensorFlow

[2] 李宏毅深度学习课程

李宏毅深度学习(2017)

Machine Learning and having it deep and structured (2017,Spring)

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值