GAN2-训练GAN 时所遇到的问题及可能的解决⽅法
问题1,模式坍塌(Mode collapse )
对模式崩溃产⽣原因的猜想:
GAN 的学习⽬标是映射关系G :x ➡y ,这种单⼀域之间的对应关系是⾼度约束不⾜的,⽆法为分类器和判别其的训练提供⾜够的信息输⼊。
在这种情况下所优化得到的G 可以将域X 转换为与Y 分布相同的域Y',但是并不能确保单独的输⼊和输出样本x 和y 是以⼀种有意义的⽅式配对的——⽆限多种映射
G (由训练过程的随机性产⽣)针对单独的输⼊x 可能产⽣⽆限多种y (对G 的约束依旧不⾜,只是保证了分布域上的⼀致,⽽且每⼀个分布域都是由多⼦域(⽐如多个类别)所组成的,如果只是将x 转换为Y 中的其中⼀个⼦域(此时⽣成的y 全部都是同⼀个类别),这样依旧可以使得损失函数降到最低,从⽽使得G 和D 达到局部最优并使训练停⽌,这也是模式崩溃产⽣的原因)。
模式崩溃问题导致很难孤⽴地优化对抗性⽬标,经常发⽣所有输⼊都映射到相同输出并且优化⽆法取得进展的现象。(或许将每⼀个类别都单独挑出来分别⽣成独有的G 是⼀种根治的⽅案,不过这样的G 也不要想着有什么泛化能⼒了)。spectral collapse (谱崩溃)& spectral regularization (频谱正则化)
⽂献:Spectral regularization for combating mode collapse in GANs 代码:概念及定义:
谱崩溃:当模式崩溃发⽣时,权重矩阵的奇异值急剧下降的现象称为谱崩溃,作者发现模式崩溃和频谱崩溃并存的现象普遍存在,⽽本⽂通过解决谱崩溃来解决模式崩溃问题。
谱归⼀化权重矩阵(spectral nornalized weight matrix )¯W SN (W );当模型没有模式崩溃发⽣时,¯W SN (W )中⼤部分值接近1;⽽当模式崩溃发⽣时,¯
W SN (W )中的值会急剧下降。(作者在⽂中做了⼀些实验,说明了这⼀现象,但没有从理论层⾯证明为什么会发⽣这⼀现象)
¯W
SN (W ):=
W
σ(W )其中σ(W )是D 中权重矩阵的[谱范数]( Norm. The natural norm induced by the,root of the maximum eigenvalue of %%2C)(),相当于权重矩阵的最⼤奇异值。
权重矩阵W 的奇异值分解(singular value decomposition )(原⽂中的公式)
W =U ⋅
∑⋅V T
U T U =I V T V =I
∑=[D 00
]
其中D =diag {σ1,σ2,⋯,σr }
解决⽅案:频谱正则化通过补偿频谱分布避免频谱崩溃,从⽽对D 的权重矩阵施加约束(核⼼思想:防⽌D 的权重矩阵W 集中到⼀个⽅向上)。有两种频谱正则化⽅案,
频谱正则化(spectral regularization )
静态补偿(static compensation ):需要⼿动确定超参数i ,不易于应⽤。
ΔD =
σ1−σ1
0⋯⋯⋯00σ1−σ2⋯⋯⋯0⋮⋯⋱⋯⋯0⋮⋯⋯σ1−σi ⋯0⋮⋯⋯⋯⋱00
动态补偿(dynamic compensation ):没有需要⼿动确定的超参数,相⽐于静态补偿使⽤起来更⽅便。
ΔD T =
00⋯00γT 2
σT 1−σT 2
⋯0⋮⋯⋱0
0⋯
γT r
⋅σT 1−σT
r
ΔD T 是第T 次迭代的补偿矩阵,γT j 是第j 个补偿系数:
γT j
=max (σ1j
σ11,⋯,σt j
σt 1,⋯,σT j
σT 1
),t =0,1,⋯,T σt j 是第t 次迭代的第j 个奇异值。频谱正则化的实现
ΔW =U ⋅[
ΔD 00
0]⋅V T
¯W
SR (W )
=
W +ΔW
σ(W )
=¯W
SN (W )+
ΔW
σ(W )
implicit variational learning (隐式变分学习)
⽂献:VEEGAN: Reducing Mode Collapse in GANs using Implicit Variational Learning 代码:
[
]
[
]
概念及定义:
隐式变分原理(implicit variational principle):
VEEGAN引⼊了⼀个额外的重构⽹络(reconstructor network),将真实数据映射到⾼斯随机噪声,通过联合训练训练⽣成器和重建器⽹络⿎励重建器⽹络不仅将数据分布映射到⾼斯分布,⽽且还近似地反转⽣成器的动作。
如何理解使⽤隐式变分原理可以防⽌模式崩溃?
观察上图:中部p(x)是由两个⾼斯分布叠加⽽成的真实分布;底部p0(z)∼N(0,1)是⽣成器Gγ的输⼊;顶部是将重构⽹Fθ⽤于⽣成数据和真实数据的结果;由底部到中部的箭头是⽣成器Gγ的动作;由中部到顶部的绿⾊箭头是重构⽣成数据的动作,紫⾊箭头是重构真实数据的动作。在图中,⽣成器都只是捕获了p(x)中其中⼀个⾼斯分布,图a与图b的区别在于重构⽹络不同。
图a中Fθ是Gγ的逆,由于⽣成数据只包含真实数据的部分分布,Fθ对真实数据中分布被丢失的那部分数
博客为什么没人用了据的处理结果不定,这也意味着其重构结果⼤概率与p0(z)不匹配,这种不匹配可以作为模式崩溃的指标。
图b中Fθ成功将真实数据重构回p0(z),此时如果Gγ发⽣模式崩溃,Fθ并不会将⽣成数据重构回p0(z)(毕竟真实数据分布与⽣成数据分布存在差异),由此产⽣的惩罚信息提供了强⼤的Gγ,Fθ学习信息。
⽂中提到了⼀个模式崩溃发⽣原因的猜想:⽬标函数提供的关于⽣成器⽹络参数γ的唯⼀信息是由鉴别器⽹络Dω介导的。(An intuition behind why mode collapse occurs is that the only information that the objective function provides about γ is mediated by the discriminator network Dω)
重构⽹络本质上是依据重构数据的差异反应⽣成数据和真实数据的差异,那为什么不直接度量⽣成数据和真实数据的分布差异呢?为什么必须要借助重构⽹络呢?
解决⽅案:
重构损失
min
前半部分保证F_\theta是G_\gamma的逆;后半部分保证对于真实数据,F_\theta的重构结果依旧是与p_0(z)相同的分布,使⽤交叉熵进⾏计算。
为了便于计算,将重构损失进⾏如下转换:
重构⽹络F_\theta(x)对应于分布p_{\theta}(z|x),样本集合X\sim{p(x)}的平均重构数据为
p_{\theta}(z)=\int{p_{\theta}(z|x)p(x)dx}~~~~~~\tag{2}
根据交叉熵公式以及2式,H(Z,F_{\theta}(X))可写作
H(Z,F_{\theta}(X))=-\int{p_{0}(z)logp_{\theta}(z)dz}=-\int{p_0(z)}log\int{p(x)p_{\theta}(z|x)}dxdz~~~~~~\tag{3}
当p_\theta(z)=p_0(z)时交叉熵最⼩,为了使上式可计算(毕竟p(x)未知),引⼊变分分布q_\gamma(x|z)和Jensen不等式,有(推导看原⽂):
-logp_\theta(z)=-log\int{p_\theta(z|x)p(x)\frac{q_\gamma(x|z)}{q_\gamma(x|z)}}dx\leq{\int{q_\gamma(x|z)log\frac{p_\theta(z|x)}{q_\gamma(x|z)}}}dx~~~~~~\tag{4} -\int{p_0(z)}logp_\theta(z)\leq{KL[q_\gamma(x|z)p_0(z)||p_\theta(z|x)p(x)]}-E[logp_0(z)]~~~~~~\tag{5}
这⾥的q_\gamma(x|z)对应⽣成器,p_{\theta}(z|x)对应重构器,由1和5式可将优化⽬标转化为(此为优化⽬标的上界):
O_{entropy}(\gamma,\theta)=E[||z-F_{\theta}(G_\gamma(z))||_2^2]+KL[q_\gamma(x|z)p_0(z)||p_\theta(z|x)p(x)]-E[logp_0(z)]~~~~~~\tag{6}
6式还是⽆法计算,因为q_\gamma(x|z)对应⽣成器,p_{\theta}(z|x)对应重构器,都是隐式表⽰,分布未知;样本数据分布p(x)也是未知,这⾥假设训练所得判别器D_\omega(x,z)满⾜
D_\omega(Z,X)=log\frac{q_\gamma(x|z)p_0(z)}{p_\theta(z|x)p(x)}\tag{7}
并有
\hat{O}(\omega,\gamma,\theta)=\frac{1}{N}\sum_{i=1}^{N}D_{\omega}(z^i,x^i_g)+\frac{1}{N}\sum_{i=1}^{N}d(z^i,x_g^i) \tag{8}
其中(z^i,x_g^i)\sim{p_0(x)q_\gamma(x|z)},优化⽬标最终化为:
O_{LR}(\omega,\gamma,\theta)=-E_\gamma[log(\sigma(D_{\omega}(z,x)))]-E_{\theta}[log(1-\sigma({D_{\omega}(z,x)}))] \tag{9}
训练伪代码:⽣成器\gamma,重构器\theta,判别器\omega
Loading [MathJax]/jax/element/mml/optable/BasicLatin.js