赞
踩
GAN是一种基于深度学习的生成建模方法。生成建模是一项无监督的机器学习任务,需要自动检测和学习传入数据中的模式,以便模型可用于生成与原始数据无法区分的新假副本。
GAN由卷积神经网络(CNN)组成。它是AI的一个分支,是一种用于图像识别和处理的人工神经网络,专门设计用于处理像素数据。
GAN算法由2个相互竞争的神经网络组成:生成器和鉴别器,通过GAN我们可以生成足以以假乱真的图像,GAN被广泛应用在图像生成,语音生成等场景中。
GAN is a generative modeling method based on deep learning. Generative modeling is an unsupervised machine learning task that requires automatic detection and learning of patterns in incoming data, so that the model can be used to generate new false copies that cannot be distinguished from the original data.
GAN consists of Convolutional Neural Networks (CNN). It is a branch of AI, an artificial neural network designed specifically for processing pixel data for image recognition and processing.
The GAN algorithm consists of two competing neural networks: a generator and a discriminator. Through GAN, we can generate images that are sufficiently fake to be true. GAN is widely used in image generation, speech generation, and other scenarios.
2014年Ian Goodfellow在研究使用生成模型自动生成图片的过程中,发现传统神经网络方法效果并不理想,随后缘于一个偶然的灵感,发明了生成对抗网络(GAN),在其实验数据的图片生成上取得了非常理想的效果。从此,这种全新的技术作为训练生成模型的新框架,迅速风靡人工智能各个领域并取得不少突破。
在概率统计理论里,生成模型泛指在给定一些隐含参数的条件下随机生成观测数据的模型,主要分为两类模型,第一类旨在建立数据确切的分布函数;而第二类则是在无需完全明确数据分布函数的情况下直接生成新样本,GAN网络就是其一个典型。
生成对抗网络的基本思想是训练过程中生成网络(生成器,generator)与判别网络(判别器,discriminator)不断对抗的过程。所以,无论GAN模型多么复杂,基本思想仍是这两种网络的对抗,基本结构一定要有生成器与判别器。
如下图所示,GANs通过对抗的方式,训练生成器(Generator)和判别器(Discriminator)两部分,其中,生成器用于生成尽量逼真的“假”样本,判别器用于尽可能准确地区分输入是真实样本还是生成的“假”样本。
具体训练过程中,生成器与判别器交替训练:首先,固定生成器,使用生成器基于隐随机向量z模拟出G(z)作为负样本,并从真实数据中采样得到正样本x,然后将正负样本输入给判别器,进行二分类预测,最后利用其二分类交叉熵损失更新判别器参数;之后固定判别器优化生成器,对于生成器,为了尽可能欺骗判别器,即尽量让判别器将生成的“假”样本判为正样本,一般考虑以最大化生成样本的判别概率为目标来优化。
目标函数
对于判别器,输入样本一半来自真实数据,一半来自生成器,则其二分类交叉熵损失可表示为:
分别对应真实数据和生成数据的交叉熵损失之和,以此得到优化目标函数为:
然后在训练优化阶段,一方面让判别器最大化目标函数,使得其尽量对真实数据采样样本x的预测概率D(x)趋近于1,对生成样本G(z)的预测概率D(G(z))趋近于0;另一方面,要让生成器最小化目标函数,而且logD(x)一项与生成器无关,因此此时主要是最小化后一项,使得生成器生成样本让判别器预测概率D(G(z))趋近于1即可。
具体的推导过程如下所示:
import torch import numpy as np from torch.utils.data import DataLoader from torch import nn import argparse class Generator(nn.Module): '''生成器''' def __init__(self): super(Generator, self).__init__() pass def forward(self,input): pass class Discriminator(nn.Module): '''判别器''' def __init__(self): super(Discriminator, self).__init__() pass def forward(self,input): pass class GAN(nn.Module): '''GAN模型''' def __init__(self): super(GAN, self).__init__() self.gene=Generator() self.gene.requires_grad_(True) self.disc=Discriminator() self.disc.requires_grad_(False) def forward(self,input): out=self.gene(input) out=self.disc(out) return out class dataset: '''真实图片数据集''' def __init__(self): pass def __len__(self): pass def __getitem__(self, item): pass if __name__=='__main__': parser=argparse.ArgumentParser() parser.add_argument('--epoch',type=int,default=10,help='the train epoch') parser.add_argument('--n',type=int,default=200,help='the length of noise') parser.add_argument('--noise_batch',type=int,default=10,help='the batch size of noise') parser.add_argument('--true_batch',type=int,default=10,help='the batch size of true picture') opt=parser.parse_args() gene=Generator() disc=Discriminator() gan=GAN() disc_optim=torch.optim.Adam(disc.parameters()) gan_optim=torch.optim.Adam(gan.parameters()) criterion=nn.MSELoss() for i in range(opt.epoch): true_pict = DataLoader(dataset(), batch_size=opt.true_batch, shuffle=True) for batch in true_pict: noise=torch.tensor(np.random.normal((opt.noise_batch,opt.n)),dtype=torch.float32) false_pict=gene(noise) label_true=torch.tensor(np.ones(shape=opt.true_batch),dtype=torch.float32) label_fake=torch.tensor(np.ones(shape=opt.noise_batch),dtype=torch.float32) loss_true=criterion(batch,label_true) loss_fake=criterion(false_pict,label_fake) disc_optim.zero_grad() loss_fake.backward() loss_true.backward() loss_fake.step() loss_true.step() noise1=torch.tensor(np.random.normal((opt.noise_batch,opt.n)),dtype=torch.float32) pict=gene(noise1) label=torch.tensor(np.ones(shape=(opt.noise_batch,opt.n)),dtype=torch.float32) loss_gan=criterion(pict,label) loss_gan.zero_grad() loss_gan.backward() loss_gan.step()
基于上述目标函数,可以得出,训练判别器实质是训练其度量生成样本与真实数据的样本分布的JS散度/距离,而训练生成器实质是为减小此JS散度/距离。因此,理论上,应该优先尽可能地把判别器训练好,但实际上会发现,当判别器训练得越好,生成器反而越难优化,常出现模型坍塌问题,即生成器生成样本单一,不具备多样性。
这样以后,确实可有效避免梯度消失问题,但实际会发现这样会导致网络更新不稳定,因为随着迭代次数的增加,梯度上升会非常快,同时不同批次求得的梯度方差也会增加,导致最终生成器生成样本质量不高。因此,针对该问题,又一种思路是训练判别器时加入一些随机噪声,这样以后,可以使得生成数据与真实数据重合的几率增加,保证JS距离会下降,从而有效优化网络参数,但是,当生成数据与真实数据在空间分布上本身相距较远的时候,加入随机噪声也很难使得两者的低维度流形有重合,此时该方法就失效了。
本周再次对GAN进行学习,对GAN背后的一些数学原理进行学习和推导,进一步加深了对GAN的理解。GAN的发展时间并不长,但是目前却已经有非常多的GAN模型,并由GAN衍生出提出许多新的方法。GAN不仅打开了深度学习在创作领域的大门,更重要的是它所带来的一种新法方法与思想,对诸多领域的发展有着深远影响。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。