生成式对抗网络(Generative Adversarial Networks,GANs)

1. 简介

首先简要介绍一下生成模型(Generative model)与判别模型(Discriminative mode)的概念:

  • 生成模型:对联合概率进行建模,从统计的角度表示数据的分布情况,刻画数据是如何生成的,收敛速度快,例如朴素贝叶斯,GDA,HMM等。
  • 判别模型:对条件概率 P(Y|X) 进行建模,不关心数据如何生成,主要是寻找不同类别之间的最优分类面,例如LR,SVM等。

判别模型在深度学习乃至机器学习领域取得了巨大成功,其本质是将样本的特征向量映射成对应的label;而生成模型由于需要大量的先验知识去对真实世界进行建模,且先验分布的选择直接影响模型的性能,因此此前人们更多关注于判别模型方法。生成式对抗网络(Generative Adversarial Networks,GANs)是蒙特利尔大学的Goodfellow Ian于2014年提出的一种生成模型, 在之后引起了业内人士的广泛关注与研究。

GANs中包含了两个模型,一个是生成模型 G ,另一个是判别模型D,下面通过一个生成图片的例子来解释两个模型的作用:

  • 生成模型 G :不断学习训练集中真实数据的概率分布,目标是将输入的随机噪声转化为可以以假乱真的图片(生成的图片与训练集中的图片越相似越好)
  • 判别模型D:判断一个图片是否是真实的图片,目标是将生成模型 G 产生的“假”图片与训练集中的“真”图片分辨开。

GANs的实现方法是让D G 进行博弈,训练过程中通过相互竞争让这两个模型同时得到增强。由于判别模型D的存在,使得 G 在没有大量先验知识以及先验分布的前提下也能很好的去学习逼近真实数据,并最终让模型生成的数据达到以假乱真的效果(即D无法区分 G 生成的图片与真实图片,从而G D 达到某种纳什均衡)。

2. 生成对抗网络

GANs中生成模型和判别模型的选择没有强制限制,在Ian的论文中,判别模型 D 和生成模型G均采用多层感知机。GANs定义了一个噪声 pz(x) 作为先验,用于学习生成模型 G 在训练数据x上的概率分布 pg G(z) 表示将输入的噪声 z 映射成数据(例如生成图片)。D(x)代表 x 来自于真实数据分布pdata而不是 pg 的概率。据此,优化的目标函数定义如下minmax的形式:

图片名称

原论文在参数的更新过程,是对 D 更新k次后,才对 G 更新1次。上式中的minmax可理解为当更新D时,需要最大化上式,而当更新 G 时,需要最小化上式,详细解释如下:

  • 在对判别模型D的参数进行更新时:对于来自真实分布 pdata 的样本 x 而言,我们希望D(x)的输出越接近于1越好,即 logD(x) 越大越好;对于通过噪声 z 生成的数据G(z)而言,我们希望 D(G(z)) 尽量接近于0(即 D 能够区分出真假数据),因此log(1D(G(z)))也是越大越好,所以需要 maxD

  • 在对生成模型 G 的参数进行更新时:我们希望G(z)尽可能和真实数据一样,即 pg=pdata 。因此我们希望 D(G(z)) 尽量接近于1,即 log(1D(G(z))) 越小越好,所以需要 minG 。需要说明的是, logD(x) 是与 G(z) 无关的项,在求导时直接为0。

原论文中对GANs理论上的有效性进行了分析,即当固定 G 更新D时,最优解为 D(x)=pdata(x)pdata(x)+pg(x) ;而在更新 G 时,目标函数取到全局最小值当且仅当pg=pdata。最后两个模型博弈的结果是 G 可以生成以假乱真的数据G(z)。而 D 难以判定G生成的数据是否真实,即 D(G(z))=0.5

下面这张图解释了这一博弈过程:

图片名称

第一阶段只有判别模型 D 参与。将训练集中的样本x作为 D 的输入,输出0-1之间的某个值,数值越大意味着样本x为真实数据的可能性越大。在这个过程中,我们希望 D 尽可能使输出的值逼近1。第二阶段中,判别模型D和生成模型 G 都参与,首先将噪声z输入 G G从真实数据集里学习概率分布并产生假的样本,然后将假的样本输入判别模型 D ,这一次D将尽可能输入数值0。所以在这个过程中,判别模型 D 相当于一个监督情况下的二分类器,数据要么归为1,要么归为0。

下图给出了一个更为直观的解释:

图片名称

其中,蓝色虚线为判别模型D的分布,黑色虚线为真实数据的分布 pdata ,绿色实线为生成模型 G 学习的分布pg。下方的水平线为均匀采样噪声 z 的区域,上方的水平线为数据x的区域。朝上的箭头表示将随机噪声转化成数据,即 x=G(z) 。从图(a)到图(b)给出了一个GANs的收敛过程。图(a)中 pg pdata 存在相似性,但还未完全收敛, D 是个部分准确的分类器。图(b)中,固定G更新 D ,收敛到 D(x)=pdata(x)pdata(x)+pg(x) 。图(c)中对 G 进行了1次更新,D的梯度引导 G(z) 移向更可能分类为真实数据的区域。图(d)中,训练若干步后,若 G D均有足够的capacity,它们接近某个稳定点,此时 pg=pdata 。判别模型将无法区分真实数据分布和生成数据分布,即 D(x)=0.5

论文中给出的算法流程如下:

图片名称

3. GANs的应用

对抗网络的一个主要缺点是训练过程不稳定,为了提高训练的稳定性,文献[2]提出了 Conditional Generative Adversarial Nets (CGAN),通过把无监督的 GAN 变成半监督或者有监督的模型,从而为 GAN 的训练加上一点目标,其优化的目标函数为:

图片名称

CGAN在生成模型 G 和判别模型D的建模中均引入了条件变量 y,这里y可以是label或者其他数据形态,将y和GAN原有的输入合并成一个向量作为CGAN的输入。这个简单直接的改进被证明很有效,并广泛用于后续的相关工作中。CGAN模型的示意图如下所示:

图片名称

文献[3]提出了一种Deep Convolutional Generative Adversarial Networks(DCGAN),将对抗网络与卷积神经网络相结合进行图片生成,DCGAN模型的结构如下:

图片名称

DCGANs的基本架构就是使用几层“反卷积”(Deconvolution)。传统的CNN是将图像的尺寸压缩,变得越来越小,而反卷积是将初始输入的小数据(噪声)变得越来越大(但反卷积并不是CNN的逆向操作),例如在上面这张图中,从输入层的100维noise,到最后输出层64x64x3的图片,从小维度产生出大的维度。反卷积的示意图如下所示,2x2的输入图片,经过3x3 的卷积核,可产生4x4的feature map:

图片名称

由于反卷积存在于卷积的反向传播中。其中反向传播的卷积核矩阵是前向传播的转置,所以其又可称为transport convolution。只不过我们把反向传播的操作拿到了前向传播来做,就产生了所谓的反卷积一说。但是transport convolution只能还原信号的大小,不能还原其值,因此不是真正的逆操作。

DCGAN的另一个改进是对生成模型中池化层的处理,传统CNN使用池化层(max-pooling或mean-pooling)来压缩数据的尺寸。在反卷积过程中,数据的尺寸会变得越来越大,而max-pooling的过程并不可逆,所以DCGAN的论文里并没有采用池化的逆向操作,而只是让反卷积的滑动步长设定为2或更大值,从而让尺寸按我们的需求增大。另外,DCGAN模型在 G D上均使用了batch normalization,这使得训练过程更加稳定和可控。

文献[3]将GANs应用于文本转图像(Text to Image),从而可根据特定输入文本所描述的内容来产生特定图像。因此,生成模型里除了输入随机噪声之外,还有一些特定的自然语言信息。所以判别模型不仅要区分样本是否是真实的,还要判定其是否与输入的语句信息相符。网络结构如下图所示:

图片名称

以下是实验的结果,同时可看到模型仍然存在Mode Collapse的问题:
图片名称

4. 文献

  1. Goodfellow I J, Pouget-Abadie J, Mirza M, et al. Generative adversarial nets[C]// International Conference on Neural Information Processing Systems. MIT Press, 2014:2672-2680.
  2. Mirza M, Osindero S. Conditional generative adversarial nets[J]. arXiv preprint arXiv:1411.1784, 2014.
  3. Radford A, Metz L, Chintala S. Unsupervised representation learning with deep convolutional generative adversarial networks[J]. arXiv preprint arXiv:1511.06434, 2015.
  4. Reed S, Akata Z, Yan X, et al. Generative adversarial text to image synthesis[J]. arXiv preprint arXiv:1605.05396, 2016.
生成对抗网络 (GANs) 的核心思想是通过两个神经网络的博弈来学习数据分布。一个网络被称为生成器 (Generator),它试图从随机噪声生成看起来像真实样本的新图片;另一个网络称为判别器 (Discriminator),负责判断图像是真实的还是由生成器产生的。以下是使用Python库如TensorFlow或PyTorch创建简单GAN的一个简略示例: ```python import tensorflow as tf from tensorflow.keras import layers # 创建生成器 def make_generator_model(): inputs = tf.keras.Input(shape=(latent_dim,)) x = layers.Dense(4*4*256)(inputs) x = layers.BatchNormalization()(x) x = layers.LeakyReLU()(x) x = layers.Reshape((4, 4, 256))(x) x = layers.Conv2DTranspose(128, (5, 5), strides=(2, 2), padding='same')(x) x = layers.BatchNormalization()(x) x = layers.LeakyReLU()(x) x = layers.Conv2DTranspose(64, (5, 5), strides=(2, 2), padding='same')(x) x = layers.BatchNormalization()(x) x = layers.LeakyReLU()(x) outputs = layers.Conv2D(channels, (5, 5), activation='tanh', padding='same')(x) return tf.keras.Model(inputs=inputs, outputs=outputs) # 创建判别器 def make_discriminator_model(): inputs = tf.keras.Input(shape=[image_size, image_size, channels]) x = layers.Conv2D(64, (5, 5), strides=(2, 2), padding='same')(inputs) x = layers.LeakyReLU()(x) x = layers.Dropout(0.3)(x) x = layers.Conv2D(128, (5, 5), strides=(2, 2), padding='same')(x) x = layers.LeakyReLU()(x) x = layers.Dropout(0.3)(x) x = layers.Flatten()(x) x = layers.Dense(1, activation='sigmoid')(x) return tf.keras.Model(inputs=inputs, outputs=x) # 实例化并训练GAN generator = make_generator_model() discriminator = make_discriminator_model() # ... 进行训练和优化步骤 ... ``` 这只是一个基本框架,实际训练过程中需要设置损失函数(如二元交叉熵)、优化器,并通过反向传播更新模型参数。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值