论文:https://arxiv.org/abs/1606.03498
源码:https://github.com/openai/improved_gan
1 介绍
GAN是基于博弈论的生成模型方法。GAN训练一个生成网络来生成尽可能真实的图像,一个判别网络尽可能区分真是图像和生成图像。训练GAN要求找到在连续高维参数下非凸博弈的纳什均衡。但是通常GAN用梯度下降方法去寻找损失函数的最小值,而不是纳什均衡,这可能会导致无法收敛。论文中介绍了几个方法去尽量实现GAN博弈的收敛。这些方法的灵感来源于非凸问题的启发式理解。可以帮助提升半监督学习性能和提升采样生成。
2 相关tricks
首先需要对G做一个处理,使用Feature matching代替原来的关于G的loss函数。
2.1 Feature matching(特征匹配)
Feature matching 中提出,在D(判别器)模型中,添加中间层,称之为f(x)。也就是,不是像以前一样考虑最后的结果(概率),而是考虑在中间层中的数据之间的差异性(这里使用的是二范数的平方)。因为原始的GAN网络的目标函数需要最大化判别网络的输出。作者提出了新的目标函数,目的是让生成网络产生的图片经过判别网络后的中间层的feature 和真实图片经过判别网络的feature尽可能相同。因此生成网络的目标函数定义如下:
判别网络按照原来的方式训练。相比原先的方式,生成网络G产生的数据更符合数据的真实分布。尽管不能保证到达均衡点,不过收敛的稳定性应该是有所提高。
2.2 minibatch discrimination(小批量判别)
判别网络如果每次只看单张图片,如果判断为真的话,那么生成网络就会认为这里一个优化的目标,导致生成网络会快速收敛到当前点。作者使用了minibatch的方法,每次判别网络输入一批数据进行判断。
假设表示判别网络中间层的输出向量,作者将乘以矩阵,得到一个矩阵。计算矩阵每行的L-1距离,得到。定义输入的输出如下:
将作为输入,进入判别网络下一层的输入。
2.3 Historical averaging(历史平均)
在生成网络和判别网络的损失函数中添加一个项:
公式中 表示在i时刻的参数。这个项在网络训练过程中,也会更新。加入这个项后,梯度就不容易进入稳定的轨道,能够继续向均衡点更新。
2.4 One-side label smooth(类别标签平滑)
将正例label乘以,, 负例label乘以,最优的判别函数分类器变为:
文中将正例label乘以,, 负例label乘以0。
2.5 Virtual batch normalization(虚拟的batch normalization)
Normalization(归一化)使用能够提高网络的收敛,但是BN(批归一化)带来了一个问题,就是layer的输出和本次batch内的其他输入相关。为了避免这个问题,作者提出了一种新的bn方法,叫做virtual batch normalization。首先从训练集中拿出一个batch在训练开始前固定起来,算出这个特定batch的均值和方差,进行更新训练中的其他batch。VBN的缺点也显而易见,就是需要更新两份参数,比较耗时。
3 Semi-supervised learning(半监督学习)
标准的分类网络将数据xx输出为可能的K个classes,然后对K维的向量使用softmax:
标准的分类是有监督的学习,模型通过最小化交叉熵损失,获得最优的网络参数。对于GAN网络,可以把生成网络的输出作为第k+1类,相应的判别网络变为k+1类的分类问题。用来表示生成网络的图片为假,用来代替GAN的。对分类网络,只需要知道某一张图片属于哪一类,不用明确知道这个类是什么,通过可以训练。因此损失函数变为:
如果把,上述无监督的表达式就是GAN的形式(见2014的GAN论文https://blog.csdn.net/weixin_44855366/article/details/119734833):