Gan的loss函数

1. Classic Adversarial Loss

优化目标为:

D(x)为经过sigmoid的输出值

1)在GAN第一阶段——求Discriminator,最大化

 

 实验中统计梯度是对最小值进行寻优的,因此实际操作上是对目标函数做最小化处理:

 实现方式:

dis_real、dis_fake分别为真假样本输入判别器输出的logit,未经过sigmoid

(1)直接计算            
L1 = F.mean(-F.log(F.sigmoid(dis_real)))      
L2 = F.mean(-F.log(1-F.sigmoid(dis_fake)))      
loss_dis = L1 + L2

(2)BCEWithLogitsloss(p,y), p为判别器输出的logit,未经过sigmoid,y为判别器输入对应的标签
BCEWithLogitsloss(p,y) = -[ylog(sigmoid(p))+(1-y)log(1-sigmoid(p))]

BCELoss()和BCEWithLogitsLoss()的区别
https://blog.csdn.net/qq_16236875/article/details/87980867

L1 = BCEWithLogitsloss(dis_real,y_real)     
L2 = BCEWithLogitsloss(dis_fake,y_fake)       
loss_dis = L1 + L2

(3)softplus(p), p为判别器输出的logit,未经过sigmoid
softplus(-p) = log(1+exp(-p)) = -log(1/(1+exp(-p))) = -log(sigmoid(p))
softplus(p) = log(1+exp(p)) = -log(1/(1+exp(p))) = -log(1-1/(1+exp(-p))) = -log(1-sigmoid(p))

L1 = F.mean(softplus(-dis_real))      
L2 = F.mean(F.softplus(dis_fake))      
loss_dis = L1 + L2

2)在GAN第二阶段——求Generator,最小化

2. WGAN的loss object functions:

L为真实分布与生成分布之间的Wasserstein距离。

注意原始GAN的判别器做的是真假二分类任务,所以最后一层是sigmoid,但是现在WGAN中的判别器做的是近似拟合Wasserstein距离,属于回归任务,所以要把最后一层的sigmoid拿掉。

(1)在GAN第一阶段——求Discriminator,最大化L,等价于最小化下式

其数值越小,表示真实分布与生成分布的Wasserstein距离越大,dis训练得越好。

 实现方式:

dis_real、dis_fake分别为真假样本输入判别器输出的logit,未经过sigmoid

loss_dis = - F.mean(dis_real) + F.mean(dis_fake)

(2)在GAN第二阶段——求Generator,最小化L

 3.Hinge loss

最初是SVM中的概念,其基本思想是让正例和负例之间的距离尽量大,后来在Geometric GAN中,被迁移到GAN:

(1)在GAN第一阶段——求Discriminator,min LD,

希望D(x)越>1越好,此时的loss为0,D(G(z))越<-1越好,此时loss为0。便可将真样本与假样本分开与-1,1两端。

对于D来说,只有当D(x) < 1 的正向样本,以及D(G(z)) > -1的负样本才会对结果产生影响

也就是说,只有一些没有被合理区分的样本,才会对梯度产生影响这种方法可以使训练更加稳定。

dis_real、dis_fake分别为真假样本输入判别器输出的logit,未经过sigmoid

loss_dis = F.mean(F.relu(1. - dis_real)) + F.mean(F.relu(1. + dis_fake))

(2)在GAN第二阶段——求Generator,min LG,

优化D时,希望D(G(z))越<-1越好,此时则希望D(G(z))越大越好,则更倾向于真样本。故最小化-D(G(z))。

Geometric GAN的判别器力图把真实样本映射到大于1的区间,把伪造样本映射到小于-1的区间。

你可能感兴趣的:(《动手学深度学习》,记录,python)