大泽之国

以技术的名字灌水

深度卷积对抗网络DCGAN

重点

  • DCGAN的论文通过大量实验,给出一组结构和参数,提高GAN训练成功率, 其后面的训练算法就是2014年论文中提出的
  • GAN损失函数和二类交叉熵损失函数的关系

深度学习给机器学习带来了一次革命,学术研究和实际应用一片欣欣向荣,那么未来继续引领机器学习发展的技术将什么? 无监督学习和强化学习,这个答案得到绝大多数的认同,尤其是体会到深度学习算法对样本量的巨大需求的人们. 无监督学习中最具有发展前景的两类方法是VAE和GAN.
VAE(Variational Autoencode)来自于标准的Autoencode方法. Autoencode方法逻辑上包含两部分:编码器和解码器. 编码器和解码器共享一个隐含层, 编码器输入和解码器输出的维度一致,隐含层的维度要低很多. 一个输入信号通过编码器,降低维度到达隐含层,再经过维度升高到达解码器输入,训练时定义L2损失,即要求编码器的输入和解码器的输入相似,最终人们期望最终训练出来的解码器可以学习到训练集的分布,达到生成的目的.但是大量实验证明,最终训练的解码器并不能达到期望:把编码器的输入送入解码器后,的确可以得到一个符合训练集分布的结果,但是如果时人工调制一个信号送入解码器,输出的就一团糟了.人们发现解决问题的关键时损失函数,L2并不是一个好的分布描述函数,对损失函数的改进就得到了VAE.
GAN的目的和VAE一致,但走了不同的路径.GAN需要两个网络:D网络负责对信号分类,判断信号的真假,G网络负责生成假信号,来迷惑D网络.GAN训练目的是D网络无法区分信号的真假,即G网络输出的假信号和真信号分布一致.训练成功后,D网络可以用来做特征提取,G网络用来生成新样本.

DCGAN

主要贡献

  • 提出并验证一些GAN网络结构上的限制,满足这些限制的网络有利于提高GAN训练的稳定性
  • 训练出来的D网络进行图像分类,达到较高的指标
  • 分析了GAN学习到的filter,分析了filter和特定目标之间的关联
  • 分析了G网络的输入-输出对应关系,通过控制输入的一些分量可以决定输出信号一些特性
    后两点说明G网络不是简单的”记住”训练集,而是表现出一定的”语意”特性.比如抑制输入信号的某些信号,就可以让输出图中不出现窗户,这十分符合人们对G网络的期望.

具体的建议

  • 去掉pooling层,用卷积层的stride做采样
  • 去掉CNN之后的全连接层,全连接层有助于提高稳定性,但降低训练效率.
    G网络的输入是1维随机向量,经过全连接网络(线性激励函数,相当于矩阵乘法)后reshape成一个4维信号作为后续卷积层的输入.D网络的最后一层用flatten层压缩维度后经过sigmoid函数后输出
  • 增加BN层,对G网络的训练很重要,避免G网络把输入映射到同一个输出上.但是G网络的输出层和D网络的输入层不能用BN层,否则网络训练不稳定.
  • 使用ReLU激励函数. G网络除了最后一层是Tanh激励,其他都是用ReLU激励.D网络使用LeakyReLU激励

一些细节

  • 权重用均值0,标准差0.02的高斯信号初始化
  • LeakyReLU的slope设置成0.2
  • 采用Adam优化策略
  • 训练速率设置成0.0002
  • 动量权重β1设置成0.5

至此DCGAN论文原理部分已经结束,论文下半部分是大量实验分析,证明DCGAN的优势,那么我们应该如何复现DCGAN?

GAN

DCGAN通过大量实验,提供了很多建议,保证GAN训练的成功率. 其背后的训练方法在2014年的一篇论文中.
这里写图片描述
任何训练方法中最重要的损失函数,GAN的损失函数

L(D,G)=logD(xi)log(1D(G(zi)))

采用类似EM的方法令损失函数最小化

  • 先固定G网络,训练D网络,令L(D,G)最小化
    zi是随机向量,G(zi)是生成的信号, x_i是真实信号. 此时相当于令xi对应标签1, 令G(zi)对应标签0,损失函数采用二类的交叉熵,采用梯度下降方法训练D网络

  • 固定D网络,训练G网络,令L(D,G)最小化
    因为D网络固定,L(D,G)=log(1D(G(zi))),把G(zi)对应标签1,损失函数依然采用二类交叉熵,采用梯度下降方法训练G网络.注意这一步中D网络的输出被用来计算loss,作为更新
    G网络的输入误差.

上述两个步骤交替进行,直至人工审核到合适的训练效果.

GAN的训练需要很多的人工干预,这也是目前GAN研究的热点

  • 训练稳定性
    GAN的训练未必一定会成功, 并不想其他监督学习算法有唯一的指标评估训练进度, GAN没有明确的训练指标,D网络和G网络在相互争斗,同步成长,一个动态的过程. 训练D网络优化了loss,固定D网络,训练G网络再次优化loss,但是对于新的G网络,D网络未必可以找到继续降低loss的路径,如此虽然单步都降低了loss,但合在一起并没有达到优化loss的目的,导致训练失败.对于这个问题可以令上面算法的超参数k>1, 训练k次D网络后,训练1次G网络. 另外需要降低G网络的学习速率,令G网络缓慢改变,给D网络机会跟踪G网络的变化.

  • 偷懒的G网络
    GAN训练中,G网络其实有一个最优的选择:把所有输入映射到同一个真实信号,如此loss最小,但这不是我们训练的目的. 对于这种偷懒行为, 有个策略是计算batch的均值信号,把当前信号和均值信号的差值作为一个新的通道送入D网络,帮助D网络发现G网络的偷懒行为

  • G网络输出的多样性
    比如用MNIST训练GAN,有时训练出来的G网络对0~9十个数字不能均衡对待,可能倾向输出其中某几个类别,这也不是我们期望的.可以在D网络中增加对类别的预测,既判断输入信号的真假,还要判断信号的类别,有助于G网络对各个类别均衡.

参考文献

2016年DCGANUnsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks
2014年GANGenerative Adversarial Nets

阅读更多
个人分类: 文献阅读
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭