GAN(Generative Adversarial Network)由两个网络组成:Generator网络(生成网络,简称G)、Discriminator网络(判别网络,简称D),如图:
图1 GAN概念图
因而有两个Loss:Loss_D(判别网络损失函数)、Loss_G(生成网络损失函数)。
Loss_D只有两个分类,Real image判为1,Fake image(由G生成)判为0,因而可以用二进制交叉熵(BCELoss)来实现Loss_D。
熵(Entropy),是描述一个随机信号源的信息量的指标,为叙述方便,采用离散信号源。设信号源(S)可以发送N个符号
,符号
出现的概率为
,则该信号源所发送一个符号的平均信息量,即熵为:
于是,熵就可以看成是一个概率的信息度量,于是从信息论过渡大概率度量上。对于连续概率分布,使用概率密度 代替(1)式中的概率 ,有:
交叉熵(Cross Entropy)是描述两个随机分布(P、Q)差异的一个指标,其定义如下:
P、Q的顺序不能互换。当P与Q相同时,交叉熵取最小值,此时计算的是P(或Q)的熵。
所谓二进制交叉熵(Binary Cross Entropy)是指随机分布P、Q是一个二进制分布,即P和Q只有两个状态0-1。令p为P的状态1的概率,则1-p是P的状态0的概率,同理,令q为Q的状态1的概率,1-q为Q的状态0的概率,则P、Q的交叉熵为(只列离散方程,连续情况也一样):
在GAN中,判别器(Discriminator)的输出与ground-truth(它的取值只有0-1)被看作是概率。交叉熵就是用来衡量这两个概率之间差异的指标:p反映的是ground-truth认为来自real的概率,用L表示(ground truth label)此分布,它只取两个值100%和0%,即1和0;q反映的是Discriminator认为的来自real的概率,用D(Discriminator prediction)表示此分布,它的取值是 。
一个样本(1幅图片)x,假如来自real,p则为1,q为 ,其交叉熵输出是:
假如来自fake,p则为0,q为 ,其交叉熵为:
于是,对于一个样本集,一半来自真实(real),一半来生成器(fake),其交叉熵的平均是:
D的目标是求交叉熵越大越好(因为这样利于分辨),而ML中,后向梯度求的是最小值,因而所设计的损失函数为交叉熵的反,即:
为求最优判别器 ,(7)的等价形式如下,即求两类别各自的期望:
以下是一段来自 https://github.com/znxlwm/pytorch-MNIST-CelebA-GAN-DCGAN/blob/master/pytorch_MNIST_DCGAN.py的代码:
y_real_ = torch.ones(mini_batch) # ground-truth 全为1
y_fake_ = torch.zeros(mini_batch) # 全为0
x_, y_real_, y_fake_ = Variable(x_.cuda()), Variable(y_real_.cuda()), Variable(y_fake_.cuda())
D_result = D(x_).squeeze()
D_real_loss = BCE_loss(D_result, y_real_) # 应用BCELoss
z_ = torch.randn((mini_batch, 100)).view(-1, 100, 1, 1)
z_ = Variable(z_.cuda())
G_result = G(z_)
D_result = D(G_result).squeeze()
D_fake_loss = BCE_loss(D_result, y_fake_) # 应用BCELoss
D_fake_score = D_result.data.mean()
D_train_loss = D_real_loss + D_fake_loss # 实现上述公式7
以上是判别器Discriminator的Loss,生成器Generator的目标是尽可能以假乱真,即D对G生成的图像也判为1的概率越高越好,即
越高越好,而且它是概率,
,它的单调性与
相同,在ML中,要求最小值,因而取反,即
,因此,有:
是输入fake图像,判为1的概率 ,其目标是100%。(9)实际是 与1的二进制交叉熵。
实现代码如下:
G_train_loss = BCE_loss(D_result, y_real_) # y_real_全部为1
G_train_loss.backward()
G_optimizer.step()
GAN很强大,它生成的样本比VAE要更加清晰(边界清楚)和质量更好,但GAN很难训练,体现为两个方面:
1、模型坍塌,即产生的样本单一,没有了多样性。
2、训练过程收敛不易,一方面会出现梯度消失,另一方面会产生巨大的梯度不稳定。
Martin Arjovsky在他那两篇著名文章中,对Loss造成的影响进行了讨论:《Towards principled methods for training generative adversarial networks》、《Wasserstein GAN》。