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

本文详细介绍了生成式对抗网络(GANs)的结构、训练过程、训练模型及其存在的问题。GANs由生成器和判别器组成,通过对抗学习提升生成样本的质量。文章还探讨了GANs的训练模型,包括Wasserstein距离的WGAN、卷积神经网络应用的DCGAN,以及ALI、IRGAN和SeqGAN等变种。

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

1 原始的 GANs

1.1 GANs 的结构

GANs 的结果图如下所示:

在这里插入图片描述

生成式对抗网络 GANs 最重要的两个部分为:

  • 生成器(Generator) :用于生成“假”样本。生成器从先验分布中采得随机信号,经过神经网络的变换,得到模拟样本。
  • 判别器(Discriminator) :用于判断输入的样本是真实的还是合成的。判别器既接收来自实际数据集的真实样本,也接收来自生成器的模拟样本,判别器需要判断输入的样本是真实数据还是生成器的模拟(假)数据。

从上面可以看出,生成器和判别器是对抗的关系,生成器要尽可能生成出让判别器失败的样本,而判别器要尽可能识别出生成器的假样本。GANs 就是通过这种对抗的关系,让生成器和判别器不断提升。理想状态下,生成器和判别器最终能达到一种平衡,两者都趋于完美,都没有更进一步的空间。

1.2 GANs 的训练过程

GANs 采用生成器和判别器交替优化的方式:

(1)固定生成器 G G G,训练判别器 D D D

固定生成器 G G G,然后利用生成器随机模拟产生样本 G ( z ) G(z) G(z) 作为负样本( z z z 是一个随机向量),并从真实数据集中采样获得正样本 X X X,将这些正负样本输入到判别器 D D D 中,根据判别器的输出(即 D ( X ) D(X) D(X) D ( G ( z ) ) D(G(z)) D(G(z)) )和样本标签来计算误差,最后利误差反向传播算法来更新判别器的参数,如下图所示

在这里插入图片描述

(2)固定判别器 D D D,训练生成器 G G G

固定判别器 D D D,然后利用当前生成器 G G G 随机模拟产生样本 G ( z ) G(z) G(z),并输入到判别器 D D D 中;根据判别器的输出 D ( G ( z ) ) D(G(z)) D(G(z)) 和样本标签来计算误差,最后利用误差反向传播算法来更新生成器 G G G 的参数,如下图所示:

在这里插入图片描述

1.3 GANs 的训练模型

先给出 GANs 的公式:

min ⁡ G max ⁡ D V ( D , G ) = E x ∼ p d a t a ( x ) [ log ⁡ D ( x ) ] + E z ∼ p z ( z ) [ log ⁡ D ( G ( z ) ) ] (1) \min_G \max_D V(D,G)=E_{x\sim p_{data}(x)}[\log D(x)] + E_{z\sim p_{z}(z)}[\log D(G(z))] \tag{1} GminDmaxV(D,G)=Expdata(x)[logD(x)]+Ezpz(z)[logD(G(z))](1)

训练模型中需要用到的符号有:

  • G G G:生成器模型,通常为一个多层感知机结构的可微函数
  • D D D:判别器模型
  • x x x:判别器的输入,包括真实数据样本和生成器的输出
  • z z z:生成器输入的噪声变量,则生成器的输出为 x = G ( z ) x=G(z) x=G(z)
  • p d a t a ( x ) ≐ p ( x ∣ d a t a ) p_{data}(x) \doteq p(x|data) pdata(x)p(xdata):表示从实际数据集得到样本 x x x 的概率
  • p z ( z ) p_{z}(z) pz(z):生成器输入的噪声变量 z z z 的先验分布
  • p g ( x ) ≐ p ( x ∣ g ) p_{g}(x) \doteq p(x|g) pg(x)p(xg):生成器输出的样本 x x x 的概率
  • p s r c ( d a t a ) p_{src}(data) psrc(data) p s r c ( g ) p_{src}(g) psrc(g):判别器模型输入样本中来自真实数据和来自生成器的概率,一般采用一半真实数据、一半假数据的方式,即: p s r c ( d a t a ) = p s r c ( g ) = 1 2 p_{src}(data)=p_{src}(g)=\frac{1}{2} psrc(data)=psrc(g)=21
  • G ( z ; θ g ) G(z;\theta_g) G(z;θg) θ g \theta_g θg 为生成器的多层感知机的参数, G ( z ; θ g ) G(z;\theta_g) G(z;θg) 代表生成器模型的输出空间
  • D ( x ; θ d ) D(x;\theta_d) D(x;θd) θ d \theta_d θd 为判别器的多层感知机的参数, D ( x ; θ d ) D(x;\theta_d) D(x;θd) 为判别器的输出,是一个标量值
  • D ( x ) D(x) D(x):判别器预测输入样本 x x x 来自于真实数据集的概率
  • ( G ∗ , D ∗ ) (G^*,D^*) (G,D):求得的解,即达到最终纳什均衡点时的生成器和判别器

1.3.1 生成器 G G G 固定,寻求当下最优的判别器 D G ∗ D_G^* DG

判别器 D D D 实质上解决的是一个二分类问题,其损失函数可以用 负对数似然(Negative Log-Likelihood,NLL),也称 绝对交叉熵损失(Categorical Cross-Entropy Loss) 来表示:

L ( D ) = − ∫ p ( x ) [ p ( d a t a ∣ x ) log ⁡ D ( x ) + p ( g ∣ x ) log ⁡ ( 1 − D ( x ) ) ] d x (2) L(D)=-\int p(x)[p(data|x) \log D(x) + p(g|x) \log (1-D(x))]dx \tag{2} L(D)=p(x)[p(datax)logD(x)+p(gx)log(1D(x))]dx(2)

其中:

  • p ( d a t a ∣ x ) p(data|x) p(datax):样本 x x x 属于真实数据集的概率
  • p ( g ∣ x ) p(g|x) p(gx):样本 x x x 属于生成器的概率

我们可以推出:

p ( x ) p ( d a t a ∣ x ) = p s r c ( d a t a ) p ( x ∣ d a t a ) = p s r c ( d a t a ) p d a t a ( x ) = 1 2 p d a t a ( x ) p(x)p(data|x)=p_{src}(data)p(x|data)=p_{src}(data)p_{data}(x)=\frac{1}{2}p_{data}(x) p(x)p(datax)=psrc(data)p(xdata)=psrc(data)pdata(x)=21pdata(x)

p ( x ) p ( g ∣ x ) = p s r c ( g ) p ( x ∣ g ) = p s r c ( g ) p g ( x ) = 1 2 p g ( x ) p(x)p(g|x)=p_{src}(g)p(x|g)=p_{src}(g)p_{g}(x)=\frac{1}{2}p_{g}(x) p(x)p(gx)=psrc(g)p(xg)=psrc(g)pg(x)=21pg(x)

代入公式 (2)则有:

L ( D ) = − ∫ p ( x ) [ p ( d a t a ∣ x ) log ⁡ D ( x ) + p ( g ∣ x ) log ⁡ ( 1 − D ( x ) ) ] d x

生成对抗网络 (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() # ... 进行训练和优化步骤 ... ``` 这只是一个基本框架,实际训练过程中需要设置损失函数(如二元交叉熵)、优化器,并通过反向传播更新模型参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值