首先一下文章的背景,他要解决的是传统的 GAN 会存在的两个问题。第一个是我们之前说过的模式崩溃,就是生成器会反复的生成一些相似或者相同的样本,这是因为生成器本质上是在减小生成样本和真是样本的 JS 距离,但是真实的数据是高维空间中的一个低维流形,所以这里的 PR 几乎处处为 0。然后第二点,GAN 的训练看似是公平的博弈,但其实对判别器并不是很友好。因为生成器是一直在更新的,所以判别器在不同阶段需要提取输入图片的不同特征,可能一开始生成器生成的图像质量比较差,他会从全局的轮廓上进行约束,随着生成器的更新,判别器可能需要去注意图像的纹理细节,这样他提取特征的策略就变了。所以通过 GAN 训练出来的判别器没有直接在数据集上训练一个分类器的性能好。
作者是用对比学习和互信息解决了这两个问题。首先是互信息,左边这个就是熵的公式,假设我们抛一枚硬币,如果是均匀的话正反面 1/2 可以算出熵,抛了 1W 次后,有 9 千次是正的,1 千次是反的,这时候我们会觉得他不是均匀的,根据这个正反面的概率在计算一次熵会得到一个更小的值,这个相差的信息量或者说不确定的降低就是互信息。应用到神经网络的话,就是输出从输入图像中提取出关键信息,降低不确定性的能力。在实际操作中的话,会取两个中间层,或者中间层和输出层做互信息,这样做有两个好处,一个是选择不同的中间层可以不同的特征,这样可以从多个角度去算互信息,另一个就是中间层的维度会比输入的图像要更低,可以降低计算量。然后第二个对比学习的话,他其实就是一种表征学习,而表征学习实际上在做的就是最大化输入和输出之间的互信息。
我们看互信息的公式,他需要 x 和 y 的联合分布,这个就比较难获取到了,所以直接优化他是不现实的。在今年的另外一篇文章中,提到了可以用对比学习的方法来找到一个互信息的替代损失函数,这里的这个 xj 是指对比学习的负样本。其实这个公式和下面这个框框里的公式是一样的,分子就是正样本之间的距离,分母就是加上和负样本之间的距离,只不过这里的正负样本取法不一样。这里取全连接层前的卷积层,这个是一个局部特征,然后取全连接层作为全局特征,这是一个正样本对,再把其他图片输入进来后得到的局部特征和当前图像的全局特征作为负样本对。另外这篇论文有给出完整的证明,就是最小化这里的对比损失 infoNCE 实际上是在最大化互信息的下届,所以我们最大化互信息的目标就可以用这个损失去替代。
为什么这个对比学习的方法可以解决之前说过的两个问题呢?这个文章里并没有说,我讲一下自己的理解吧。首先是判别器健忘的问题,表征学习的方法迫使判别器判别器学习出一种原图像更好的表示,也就是提取出通用性更强,更稳定的特征。这样就不需要在每个阶段改变特征提取的策略。然后模式崩溃的话,加入了对比损失之后,我们就可以在生成分布和真实分布没有重叠的时候仍然可以让生成器感知到真实分布,从而去做进一步的优化。
这是他的网络结构,前面这就是生成器,后面这里整个都是判别器,然后分别用倒数第一二层作为全局特征和局部特征。之后再去做对比学习,但是这里正负样本的选取有点不一样。因为直接套用户信息的话,可能判别器他会去选择一些简单的特征,比如白色的背景这样的,这个很容易就可以提取出来,对互信息也会有很大的提升,但是这并不是我们想要的。所以他这里把特征图的每个位置给他拆出来做对比学习,假设这个特征图大小是 HxWxC 的话,那就是这个位置的,维度为 C 的向量和全连接层的向量是正样本对,当前图像的其他所有位置以及另外一张图像都是负样本对。其实可以把这个看作是一个正则化项,它限制了判别器不要用这种偷懒的方式取最大化互信息。但其实这个方法会有一部分的正样本也被当作了负样本,作者说这个对最后的结果是没有影响的。
最后是对一开始两个问题的实验。左边这个是判别器的健忘性,他是取了一个极端,每 1000 次迭代只给判别器输入一个类别的图像,蓝色的线是他的方法,就很稳定,红色的话,每一次输入一个新的类别,判别器的损失都会突然变大,这就是他只关注于当前图像的特征提取,而忘记了之前的信息。右边这个图,红色的是没有模式崩溃的情况,蓝色的是生成器只生成一个类别,下面这个紫色的是生成器只生成一张图片。