论文地址
https://arxiv.org/pdf/1606.01583.pdf
摘要
\quad 无论是在GAN还是DCGAN中,我们鉴别器Discriminator输出的都是一个概率变量(float),代表输入到鉴别器的图片是真的还是假的,SGAN通过使判别器网络输出类别标签将GAN扩展为半监督的。在一个N个类别的数据集上训练生成模型G和判别模型D。训练时,D预测输入数据属于N个类别中的哪一类,加入一个额外的类对应G的输出。我们证明了,相对于普通的GAN,这种方法可以用来生成一个更有效的分类器并可以生成更高质量的样本。生成网络G和判别网络D作为对抗网络同时训练,G接受一个噪声向量作为输入,输出生成的图像(样本),D接受图像并输出该图像是否来自于G。训练G以最大化D犯错的概率,训练D以最小化自己犯错的概率。基于这种对抗,使用CNN可以生成高质量的图片。
\quad 论文的贡献:
- 我们对GAN做了一个新的扩展,允许他们同时学习一个生成器模型和一个分类器(鉴别器)。我们把这个扩展为半监督GAN或者SGAN
- 我们表明SGAN在有限的数据集上比吗诶呦生成部分基准分类器提升了分类性能
- 我们证明,SGAN可以显著的提升生成样本的质量并降低生成器的训练时间
SGAN模型
一个标准的GAN中鉴别器网络D输出一个关于输入图像来自数据生成分布中的概率。传统方法中,这由一个单个sigmoid单元结束的前馈式网络实现,但是,也可以由一个softmax输出层实现,每个类一个单元[real,fake]。一旦这样进行修改后,很容易看出D有N+1个输出单元,对应[类1,类2,…,类N, fake]。这种情况下D也可以作为一个C,我们将此网络叫做D/C。训练SGAN和训练GAN类似。SGAN的网络结构如下:
损失函数设计
网络结构确定之后就是设计损失函数,借助GAN我们就可以从无标签数据中学习,只要知道输入数据是真实数据,那就可以通过最大化 l o g p m o d e l ( y ∈ 1 , . . . , K ∣ x ) logp_{model}(y\in {1,...,K}|x) logpmodel(y∈1,...,K∣x),这个等式表示不管输入的是哪一类的真实图片(不是生成器G生成的假图片)。只要最大化输出它是真图像的概率就可以了,不需要具体分出是哪一类。由于GAN生成器的参与,训练数据中有一半都是生成的假数据。下面给出判别器D的损失函数设计,D损失函数包括监督学习损失,一个是半监督学习损失,公式为:
L = L s u p e r v i s e d + L u n s u p e r v i s e d L=L_{supervised}+L_{unsupervised} L=Lsupervised+Lunsupervised,其中:
对于无监督学习来讲,只需要输出真假就可以了,不需要确定是哪一类,因此我们令: D ( x ) = 1 − p m o d e l ( y = K + 1 ∣ x ) D(x)=1-p_{model}(y=K+1|x) D(x)=1−pmodel(y=K+1∣x),其中 P m o d e l P_{model} Pmodel表示判别是假图像的概率,那么D(x)就代表了输出是真图像的概率,那么无监督学习的损失函数就可以表示为:
在半监督学习中,判别器的分类要多分一类,多出的这一类表示的是生成器生成的假图像这一类,另外判别器的损失函数不仅包括了监督损失而且还有无监督的损失函数,在训练过程中同时最小化这两者。
\quad 假设分类数有k个,最后的(分类器/鉴别器)输出有k+1个 l 1 , l 2 , . . . , l k , l k + 1 {l_1, l_2, ..., l_k, l_{k+1}} l1,l2,...,lk,lk+1,那么 p m o d e l ( y = k + 1 ∣ x ) = e x p ( l k + 1 ) ∑ j = 1 k + 1 e x p ( l j ) p_{model}(y=k+1|x)=\frac{exp(l_{k+1})}{\sum_{j=1}^{k+1}exp(l_j)} pmodel(y=k+1∣x)=∑j=1k+1exp(lj)exp(lk+1)代表了x为假的概率, p m o d e l ( y = i ∣ x , i < k + 1 ) = e x p ( l i ) ∑ j = 1 k + 1 e x p ( l j ) p_{model}(y=i|x, i<k+1)=\frac{exp(l_i)}{\sum_{j=1}^{k+1}exp(l_j)} p