因为 D(Y,Θ) 的均值,也就是 L,是度量两个分布的差异程度,这就意味着,L 要能够将两个分布区分开来,即 L 越大越好;但是我们最终的目的,是希望通过均匀分布而生成我们指定的分布,所以 G(X,θ) 则希望两个分布越来越接近,即 L 越小越好。这时候,一个天才的想法出现了:互怼!不要怂,gan! 首先我们随机初始化 G(X,θ),固定它,然后生成一批 Y,这时候我们要训练 D(Y,Θ),既然 L 代表的是“与指定样本 Z 的差异”,那么,如果将指定样本 Z 代入 L,结果应该是越小越好,而将 Y 代入 L,结果应该是越大越好,所以: 然而有两个目标并不容易平衡,所以干脆都取同样的样本数 B(一个 batch),然后一起训练就好: 很自然,G(X,θ) 希望它生成的样本越接近真实样本越好,因此这时候把 Θ 固定,只训练 θ 让 L 越来越小: 这就是天才的对抗网络! 需要指出的是: 1. 这里的 Loss 写法跟传统的 GAN 相反,习惯性的做法是让真实样本的LL越大越好,但这只不过跟本文差了个负号而已,不是本质的问题; 2. 从 GAN 开始,D 这个神经网络就被赋予了“判别器”的意义,但在这里 D 本身是没有意义的(正如我们不能说某个数是不是正态分布的),只有 D 的平均值 L 才代表着与真实分布的差距(我们只能根据一批数据来估计它是否服从正态分布),所以从这里也可以看到,GAN 不能单个样本地训练,至少成批训练,因为有一批样本才能看出统计特征; 3. 咋看上去 D 只是个二分类问题,而 G 则要把噪声映射为正样本,貌似 D 应该比 G 要简单得多?事实并非如此,它们两者的复杂度至少是相当的。我们可以直观考虑一下它们的工作原理:因为 D 的均值 L 直接就给出了输入的数据与指定分布的差异,而要真的做到这一点,那么 D 要把所有的“正样本”(在某种程度上)都“记住”了才行;而 G 要生成良好的正样本,基本上也是“记住”了所有的正样本,开奖,并通过随机数来插值输出。因此两个网络的复杂度应该是相当的(当然这里的“记住”是形象理解,不是真的强行记住了,不然就是过拟合了); 4. 既然 L1 是真伪样本的分布差,那么 L1 越大,意味着“伪造”的样本质量越好,所以 L1 同时也指示着 GAN 训练的进程,L1 越大,训练得越好。(D 希望 L1 越小越好,G 希望 L1 越大越好,当然是 G 希望的结果,才是我们希望的。其实也可以这样理解,G 的损失 L2,其实就相当于 −L1,但是因为 D 的权重已经固定了,所以有关真实样本那一项是个常数,因此只剩下伪造样本那一项,即 L2,但 L2 是个绝对值,我们关心的是相对值,所以 −L1 是我们关心的,它越小越好,相当于 L1 越大越好。) 7 别走,还没完 稍微思考一下,我们就发现,问题还没完。我们目前还没有对 D 做约束,不难发现,无约束的话 Loss 基本上会直接跑到负无穷去了。 因此,有必要给 D 加点条件,一个比较容易想到的方案是约束 D 的范围,比如能不能给 D 最后的输出加个 Sigmoid 激活函数,让它取值在 0 到 1 之间?事实上这个方案在理论上是没有问题的,然而这会造成训练的困难。因为 Sigmoid 函数具有饱和区,一旦 D 进入了饱和区,就很难传回梯度来更新 G 了。 (责任编辑:本港台直播) |