生成对抗网络(GAN)简介

生成对抗网络(GAN)简介

有些机器学习和深度学习背景的,可以认为这个是GAN入门介绍:)。

生成对抗网络(Generative Adversarial Network,GAN)的原理是什么?以生成图片为例,比较容易说明。假设有两个网络,生成网络G(Generator)和鉴别网络D(Discriminator)。那么:

  • 1) G是一个图片的生成网络,输入一个随机的噪声z,通过它生成图片,记做G(z);
  • 2) D是一个图片的鉴别网络,确认一张图片是不是“真实”。它的输入参数是x,代表一张图片,输出D(x)代表x为真实图片的概率,如果为1, 100%是真实的图片,反之输出为0,完全不是真实的图片。

在训练过程中,生成网络G尽量生成真实的图片去欺骗鉴别网络D,而鉴别网络D尽量把G生成的图片和真实的图片分别开来。这样,G和D构成了一个动态的“博弈(gaming)过程”。最后博弈的结果, G可以生成足以“以假乱真”的图片G(z),而对D来说,它难以判定G生成的图片究竟是不是真实的,故D(G(z)) = 0.5。如图是GAN的直观表示。

GAN

好了,反过来看看数学上的描述。GAN需要优化的目标函数如下

其中pdata(x)和pz(z)分别表示在数据空间X中定义的真实数据概率分布和潜在空间Z上定义的潜在变量z概率分布,而V(G,D)是二元交叉熵函数,通常用于二元分类问题。

由于D想要对真实或虚假样本进行分类,因此V(G,D)是分类问题目标函数的自然选择。 从D的角度来看,如果样本来自真实数据,D将最大化其输出;而如果样本来自G,D将最小化其输出。同时,G想要欺骗D,因此当虚假样本呈现给D时,它试图最大化D的输出。通过对V(G,D)求导,可计算出最优的鉴别器

把这个最优鉴别器带入前面的目标函数,则等式变为pdata(x)和pg(x)之间的Jensen Shannon Divergence(JSD)。 因此,最小化JSD(pdata || pg)的最优生成器是数据分布pdata(x),并且将最优生成器代入最优鉴别器,D变为0.5,意思是二者难以区分。

f-散度Df(pdata || pg)是一种通过特定凸函数f测量两个分布之间差异的手段。在f是凸函数并且满足f(1)= 0的条件下,Df(pdata || pg)可以充当两个分布之间的散度。 由于条件f(1)= 0,如果两个分布是等价的,它们的比率变为1并且它们的散度变为0。虽然f一般被称为生成函数,称它为f-散度函数 避免与生成器G混淆。Kullback-Leibler Divergence(KLD)、逆KLD、JSD以及其他散度函数可以用特定生成函数f的f-GAN框架导出。

Wasserstein GAN(WGAN)提出了关于pdata(x)和pg(x)之间距离的重要研究。 GAN学习将潜在变量z变换为pg(x)的生成函数gθ,而不是直接学习概率分布pdata(x)本身。 因此,需要pg(x)和pdata(x)之间的测度来训练gθ。 WGAN建议将推土机距离(Earth Mover distance,EMD)称为Wasserstein距离,作为两种分布之间差异的度量。Wasserstein距离定义如下:

其中

表示所有联合分布的集合,γ(x,y)的边缘发布分别是pdata(x)和pg(x)。

深度卷积生成对抗器(Deep Convolutional GAN,DCGAN)为GAN提供了重要贡献,因为其建议的卷积神经网络(CNN)架构极大地稳定了GAN训练。DCGAN提出几点很有用的架构建议:

  • 1) 鉴别器D用步幅(strided)卷积取代池化,生成器G则用分数步幅(fractional-strided)卷积取代池化;
  • 2) 在D和G同时用批处理归一化(Batch Normalization);
  • 3) 去除全连接的隐含层;
  • 4) 在G中,除了输出层以外,均采用ReLU,采用Tanh函数;
  • 5) 在D中,全部层采用LeakyReLU发生器。

由于DCGAN解决了训练GAN的不稳定性,成为各种GAN建模的基准。如图是DCGAN的生成器架构图。

DCGAN的一个生成器架构

如果生成器和鉴别器都以某些额外信息y为条件,例如类标签或来自其他模态的数据,则GAN扩展到条件模型,即y作为附加输入层进入鉴别器和发生器来进行调节。这个网络称为条件生成对抗网络(Conditional Generative Adversarial Nets, C-GAN ),如图给出其直观的表示。

GAN现在已经在很多领域得到应用,比如图像翻译、超分辨率、目标检测、目标改变形象、图像生成和视频生成,还有那些串行数据的生成,如音乐、语言和语音等。

GAN训练的挑战性要大于CNN,一些要注意的技巧:

  • 1. 归一化输入;
  • 2. 修改的损失函数;
  • 3. 使用球形噪声分布(不是均匀分布,而是高斯分布);
  • 4. 批量归一化;
  • 5. 避免稀疏梯度:
    • a) ReLU和Max Pooling;
  • 6. 使用软且噪声标签;
  • 7. 推荐DCGAN或者混合模型;
    • a) KL 散度 + GAN,或VAE(Variational Autoencoder)+ GAN;
  • 8. 使用增强学习的稳定性方法;
  • 9. 将Adam 优化器用于生成器G,而随机梯度下降(SGD)用于鉴别器D;
  • 10. 尽早跟踪故障;
    • a) 检查梯度的模;
  • 11. 不要通过统计平衡损失(除非你有充分的理由);
  • 12. 如果你有标签,最好用它们;
    • a) 辅助(Auxillary )GAN;
  • 13. 向输入添加噪声,并随时间逐渐衰减;
  • 14. (不确定)训练鉴别器更多些,(有时候)特别是有噪音的时候;
  • 15. (不确定)批量鉴定(Batch Discrimination);
  • 16. 采用C-GAN中的离散变量;
  • 17. 在训练/测试阶段,在G中使用放弃(Dropout)。

附录:卷积神经网络CNN结构

CNN是前馈神经网络,被称作网络(network)的原因是因为它们通常用许多不同函数组合在一起。这种模型与一个有向无环图相关联,而图描述了函数是如何复合在一起的,俗称为链式结构,也是神经网络中最常用的结构。链的全长称为模型的深度(depth),正是因此才出现了“深度学 习”这个名词,对应于以前的“浅度学习”。

前馈网络的第一层叫做输入层(input layer),最后一层被称为输出层(output layer)。但是训练数据(training data)并没有直接确定其他层要干什么。学习算法(learning algorithm)决定如何使用这些层来产生期望的输出,并决定如何使用这些层来最好地实现任务。为此,在输入和输出之间的这些层叫做隐含层(hidden layer)

1 激活/损失函数

先介绍几个常见的单元激活函数或者输出损失函数:

a). 最大似然函数(条件分布),一般是输出层的损失测度;

取决于分布函数形式,比如取以下例子



那么


b). 整流线性单元(rectified linear unit,ReLU)函数(如图所示),常常在隐含层;

g(z) = max(0, z)

ReLU函数

c). 泄漏整流线性单元(Leaky rectified linear unit,ReLU)函数,也常常是隐含层的激活函数

𝑓(𝑥)=max(𝑥, 𝛼𝑥),𝛼∈(0, 1)

d). sigmoid函数,输出层

其中σ(x)的形式是

e). 双曲正切函数(tanh),输出层


f). softmax函数,主要在输出层

2卷积层

卷积神经网络(CNN),从其名字就可以看出该网络使用了卷积(convolution)运算,至少在网络的一层中使用卷积运算来替代了一般的矩阵乘法运算。卷积运算通常用星号表示为

s(t) = (x ∗ w)(t)

其实际计算是

上面参数x通常叫做输入,参数w叫做核函数,输出s有时被称作特征图(feature map)。

假设x和w都定义在离散时刻t,那么卷积成为

将上面的形式推广到2-D信号,则得到

注:卷积是可交换的 (commutative) ,离散卷积可以矩阵相乘实现。

卷积计算在NN模型中具有几个优点:稀疏交互(sparse interactions)也叫做稀疏连接(sparse connectivity)或者稀疏权重 (sparse weights)、参数共享(parameter sharing)和等变表示(equivariant representations) 。如图所示,比较稀疏连接层和全连接(上下)层的结构不同。

稀疏连接层

CNN模型中一个重要的层叫池化(pooling)层,其调用池化函数(pooling function)修正该层的输出。

池化函数使用某一位置的相邻输出的总体统计特征来代替网络在该位置的输出。最大池化(max pooling)函数给出相邻矩形区域内的最大值,其他池化函数包括平均值、L2范数以及加权平均函数等。池化最大的优点是平移不变性,同时带有降采样(downsampling)的功能。

降采样也可以采用增大卷积运算的步幅(stride)实现,即跳过核中的一些位置来降低计算的开销,算是对全卷积函数输出的降采样,比如下面的步幅s:

3 后向传播

多层前向网络的训练方法基于后向传播(BP,back propagation),CNN训练也是如此。假设训练的误差成本函数如下

E (f(x0,w),y0) = -log (f(x0,w)- y0)

那么,每步迭代的梯度下降法表示为

其中λ为学习率(learning rate)。然后,误差从输出层开始反向逐层传播到输入层以生成所有输出单元和隐藏单元的增量,即链规则(chain rule),比如下面第l层到第l-1层的梯度计算

那么将这个梯度公式带入上面的梯度下降法中就构成了模型参数的训练算法。

4 随机梯度下降(SGD)

在CNN模型采用的梯度下降法最普遍的是随机梯度下降法(SGD),下面着重介绍一下这个最常用的训练算法。

机器学习中一个敏感问题是泛化能力,这需要比较大的训练集,但大训练集的计算代价也更大。训练中的代价函数通常可以分解成每个样本的代价函数的总和,对于这些相加的代价函数,梯度下降需要计算。以最大似然的负条件对数形式为例,

其中每个样本的损失为


其梯度下降为



那么SGD的观点是,作为梯度的期望可使用小规模的样本近似估计。那样,在每步迭代中,从训练集中均匀抽出最小批量(minibatch)样本B={x(1),...,x(n)}。最小批量的数目n是事先确定的,从一到几百。主要是,当训练集大小m增长时,n是不变的。这样在抽取几亿样本时,每次更新只用到最小批量的样本。SGD的梯度计算为

随机梯度下降在深度学习之外也有很多重要的应用。它是在大规模数据上训练大型线性模型的主要方法。

在CNN的模型训练中,另外还需注意的一些问题:

  • 1. 学习率(learning rate):自适应调整,先大后小;
  • 2. 动量(Momentum):加速梯度下降方法,比如Nesterov’s Accelerated Gradient (NAG);
  • 3. AdaGrad/AdaDelta:基于梯度历史信息来调整学习率;
  • 4. 退出(Dropout):一种对付过拟合的方法,以一定概率选取节点关闭响应;
  • 5. 权值衰减(Weight Decay):也是为了对付过拟合,一种L1/L2正则化手段;
  • 6. 批量归一化(Batch normalization): 解决方差漂移,可以加快学习率,对付过拟合的手段;
  • 7. 数据增强(data augmentation):增加数据变异,克服过拟合;
  • 8. 预处理:归一化,PCA白化(whitening);
  • 9. 初始化: 比如Xavier方法。
编辑于 2019-06-03

文章被以下专栏收录