标题图来自下文的 ProInfoGAN,在 CelebA-HQ 上无监督发现高质量 disentangled 编码。
我在几天前介绍了一个很简单的“TVGAN”,很奇怪的是,为什么这么简单的事情,之前没人明确去用。
今天细看 BigGAN 才发现,原来 Google 的这篇 SotA 也是在用非常接近的 LOSS。让我们看看为什么。
1. TVGAN 的训练
首先,回顾 TVGAN 公式:
但是,如果实际去用,会发现一个问题:
如果用 tanh 硬性把 D 的输出映射到 [-1, 1],那么 G 的梯度就很容易消失(显然,就像 MSE 配合 CE 会梯度消失)。
估计这就是为什么之前大家都不用这个方法。
那么,简单的想法是,去掉 [-1,1] 限制,然后加个正则项希望 D 的输出接近 0,例如这样:
但感觉这样丑。
于是,我想了想,想到一个怪招,见下图:
这是当时试的一些方法,没有注释掉的那个,就是当时想到的怪招:
- 对于 D(x) > 1 的真样本,直接就把梯度归零(因为已经足够了)。
- 同理,对于 D(x) < -1 的假样本,也把梯度归零(因为已经足够了)。
- 不用添加任何参数,大致实现了我们的要求,真好。
- 这还有一个有趣的地方,就是现在如果 D 太完美,它会自动停下来等 G。
如果写到式子里面,就是:
另外,代码中第一个 ggg 是另一种梯度方案,好像也还可以。第三个 ggg 就是普通的 GAN(显然)。
其实,许多不同的 GAN 只不过是梯度变来变去。我们完全可以去掉 D 最后的那个非线性,直接改梯度。
值得注意的是,G 不能用类似的思路,如图:
由于神秘的原因,G 还是要用原来的 loss,即,固定的梯度。否则似乎 G 会相对 D 而言太弱,导致没图像。
其实原始 GAN 中的 G loss 也是和 D loss 有区别。
2. BigGAN 的 LOSS:巧合
今天想再看看最新进展,于是细读了 BigGAN 的论文:
[1809.11096] Large Scale GAN Training for High Fidelity Natural Image Synthesisarxiv.org发现 BigGAN 用这个所谓 Hinge loss(来自 SA-GAN):
易见,这里 D 和 G 的 loss 和“TVGAN”的方法一模一样,真是巧合,哈哈。
当然,我之前也说过,GAN 的这个 loss 没那么重要,所以也没什么可夸的,不过这可以说明这个方法是有道理的。
BigGAN 还有谱归一化,我个人是把谱归一化看成是通用技巧,和 BN 一个性质。
BigGAN 还做了很多有趣的选择。Google 完全不在意模型是否“简洁优美”(所以放心地给 D 和 G 用不同学习速率,D-D-G 训练周期,等等等等),只有效果好才是硬道理。
BigGAN 效果好,关键还是因为 Attention 太重要了,和 BERT 的情况一样。有了 Attention 之后,几乎是暴力解决一切。
Google 还明确地说,可能是 BigGAN 太大了,到后面都会塌掉,他们也没搞清楚深层的原因。所以现在 report 的是塌掉之前的结果。
我没有 TPU 集群,只能猜。我猜,BigGAN 缺少的环节,可以由 InfoGAN 模块补全。让我们继续看下文。
3. ProInfoGAN 与感想
这是搜索到的一篇少为人知的最新结果,效果非常好。我本来想做类似的事情,现在看来已经没有什么可做的了。
jonasz/progressive_infogangithub.com无监督发现高质量 disentangled 编码!这是无监督学习的圣杯之一。
请大家欣赏视频(Youtube,需要翻墙),效果非常好:
https://youtu.be/U2okTa0JGZgyoutu.be其实,就是 NVidia 那个逐步 GAN(ProGAN),和 InfoGAN 的结合:
- 它发现,在有 InfoGAN 模组后,相当于加入了正则化,会令 GAN 稳定得多。用普通的 GAN loss 就够了,不会塌。
- 它要求不同编码对应不同的尺度(例如,改眼睛颜色,就肯定在小图像中看不出来),还有其它一些技巧,实现了非常高质量的编码分离。
- 具体技巧,看它的论文草稿吧。
效果,左右转:
嘴张合: