GAN的发明者Ian Goodfellow2016年在Open AI任职期间发表了这篇论文,其中提到了GAN用于半监督学习(semi supervised)的方法。称为SSGAN。
作者给出了Theano+Lasagne实现。本文结合源码对这种方法的推导和实现进行讲解。1
考虑一个分类问题。
如果训练集中大部分样本没有标记类别,只有少部分样本有标记。则需要用半监督学习(semi-supervised)方法来训练一个分类器。
wiki上的这张图很好地说明了无标记样本在半监督学习中发挥作用:
如果只考虑有标记样本(黑白点),纯粹使用监督学习。则得到垂直的分类面。
考虑了无标记样本(灰色点)之后,我们对样本的整体分布有了进一步认识,能够得到新的、更准确的分类面。
在半监督学习中运用GAN的逻辑如下。
举个通俗的例子:就算没人教认字,多练练分辨“是不是字”也对认字有好处。有粗糙的反馈,也比没有反馈强。
GAN中的两个核心模块是生成器(Generator)和鉴别器(Discriminator)。这里用分类器(Classifier)代替了鉴别器。
训练集中包含有标签样本xlxl和无标签样本xuxu。
生成器从随机噪声生成伪样本IfIf。
分类器接受样本II,对于KK类分类问题,输出K+1K+1维估计ll,再经过softmax函数得到概率pp:其前KK维对应原有KK个类,最后一维对应“伪样本”类。
pp的最大值位置对应为估计标签yy。
softmax(xi)=exp(xi)∑jexp(xj)softmax(xi)=exp(xi)∑jexp(xj)
整个系统涉及三种误差。
对于训练集中的有标签样本,考察估计的标签是否正确。即,计算分类为相应的概率:
对于训练集中的无标签样本,考察是否估计为“真”。即,计算不估计为K+1K+1类的概率:
对于生成器产生的伪样本,考察是否估计为“伪”。即,计算估计为K+1K+1类的概率:
考虑softmax函数的一个特性:
期望号略去不写,利用explK+1=1,explK+1=1,后两种代价变为:
上述推导可以让我们省去lK+1lK+1,让分类器仍然输出K维的估计ll。
对于第一个代价,由于分类器输入必定来自前K类,所以可以直接使用ll的前K维:
引入两个函数,使得书写更为简洁:
LSE(x)=ln[∑j=1expxj]LSE(x)=ln[∑j=1expxj]softplus(x)=ln(1+expx)softplus(x)=ln(1+expx)
三个误差:
对于分类器来说,希望上述误差尽量小。引入权重ww,得到分类器优化目标:
对于生成器来说,希望其输出的伪样本能够骗过分类器。生成器优化目标与分类器的第三项相反: