1. 极大似然估计

GAN用到了极大似然估计(MLE),因此我们对MLE作简单介绍。

MLE的目标是从样本数据中估计出真实的数据分布情况,所用的方法是最大化样本数据在估计出的模型上的出现概率,也即选定使得样本数据出现的概率最大的模型,作为真实的数据分布。

将真实模型用参数θtheta表示,则在模型θtheta下,样本数据的出现概率(likelihood)是(1)i=1mpmodel(xi;θ)prod_{i=1}^mp_{model}(x_i; theta) tag{1}

其中xix_i表示样本中的第ii个数据。

最大化(1)式的概率,求得满足条件的θtheta
θ=argmaxθi=1mpmodel(xi;θ)=argmaxθi=1mlogpmodel(xi;θ)begin{aligned}theta^* & = argmax_thetaprod_{i=1}^mp_{model}(x_i; theta) \&= argmax_thetasum_{i=1}^mlog p_{model}(x_i; theta) \end{aligned}

还可以使用KL散度来代表MLE方法:
θ=argminθDKL(pdata(x)pmodel(x;θ)=argminθ{i=1mpdata(xi)logpdata(xi)i=1mpdata(xi)logpmodel(xi;θ)}=argminθi=1mpdata(xi)logpmodel(xi;θ)=argmaxθi=1mpdata(xi)logpmodel(xi;θ)begin{aligned}theta^*&=argmin_theta D_{KL}(p_{data}(x) || p_{model}(x;theta)\& = argmin_thetaleft{ sum_{i=1}^mp_{data}(x_i)log p_{data}(x_i) - sum_{i=1}^mp_{data}(x_i)log p_{model}(x_i;theta) right}\& = -argmin_thetasum_{i=1}^mp_{data}(x_i)log p_{model}(x_i;theta) \& = argmax_thetasum_{i=1}^mp_{data}(x_i)log p_{model}(x_i;theta)end{aligned}

在实际上,我们无法得到数据的真实分布pdatap_{data},但是可以从mm个数据的样本中近似得到一个估计p^datahat{p}_{data}

为了便于理解KL散度,我们在下面对其进行简要介绍。

2. 相对熵,KL散度

两个概率分布PPQQ的KL散度定义如下:
DKL(PQ)=iP(i)logP(i)Q(i)D_{KL}(P||Q)=sum_iP(i)log{frac{P(i)}{Q(i)}}

性质
DKL(PQ)0D_{KL}(P||Q)ge0

当且仅当P=QP=Q时,等号成立。(证明过程借用吉布斯不等式ipilogpiipilogqisum_ip_ilog p_igesum_ip_ilog q_i,证明吉布斯不等式会用到关系logxx1log x le x - 1

KL散度反映了两个分布PPQQ的相似情况,KL散度越小,两个分布越相似。

KL散度是不对称的:
DKL(PQ)DKL(QP)D_{KL}(P||Q) quadneq D_{KL}(Q||P)

3. KL散度与交叉熵的关系

神经网络中常常使用交叉熵作为损失函数:
L=iyiloghiL = -sum_i y_ilog h_i

其中yiy_i是实际的标签值,hih_i是网络的输出值。

我们将yyhh的KL散度展开,得到:
DKL(yh)=iyilogyihi=iyilogyiiyiloghi=iyilogyi+L=Constant+Lbegin{aligned}D_{KL}(y||h) & = sum_iy_ilog{frac{y_i}{h_i}}\& = sum_iy_ilog y_i - sum_iy_ilog h_i\& = sum_iy_ilog y_i + L\&= Constant + Lend{aligned}

因此,最小化KL散度,等价于最小化损失函数LL。也即交叉熵损失函数反应的是网络输出结果和样本实际标签结果的KL散度的大小,交叉熵越小,KL散度也越小,网络的输出结果越接近实际值

4. JS散度

对于两个分布PPQQ,JS散度是:
DJS(PQ)=12DKL(PP+Q2)+12DKL(QP+Q2)D_{JS}(P||Q) = frac{1}{2}D_{KL}(P||frac{P+Q}{2}) + frac{1}{2}D_{KL}(Q||frac{P+Q}{2})

JS散度是对称的,并且有界[0,log2][0, log2]

5. GAN 框架

生成器,生成与训练集数据相同分布的样本;判别器,检查生成器生成的样本是真的还是假的。
The generator is trained to fool the discriminator.
GAN生成对抗网络:数学原理

判别器的损失函数

判别器的损失函数为:
(2)J(D)(θ(D),θ(G))=12ExpdatalogD(x)12Ezpmodellog(1D(G(z)))J^{(D)}(theta^{(D)}, theta^{(G)})= -frac{1}{2}mathbb{E}_{xsim p_{data}}log D(x) - frac{1}{2}mathbb{E}_{zsim p_{model}}log (1-D(G(z)))tag{2}

上式其实就是一个交叉熵损失函数。GAN的判别器在训练的过程中,数据集包含两个部分,一部分是训练集的样本xx,对应的标签y=1y=1,一部分是生成器生成的数据G(z)G(z),对应的标签y=0y=0,因此判别器的训练集可以看做X={x,G(z)},Y={1,0}X={x, G(z)}, Y={1, 0}

训练集样本是XX,标签是YY,网络输出是HH,则交叉熵损失函数为:
(3)J=1mi=1m{YilogHi(1Yi)log(1Hi)}J = frac{1}{m} sum_{i=1}^m{-Y_ilog H_i - (1-Y_i)log(1-H_i)}tag{3}

与式(2)作比较,前一项的logHlog H等价于式(2)中的logD(x)log D(x),后一项的log(1Hi)log(1-H_i)等价于式(2)中的log(1D(G(z)))log(1-D(G(z)))。将xx看做包含了真实样本和生成器生成的数据G(z)G(z)的新的训练集,则判别器的损失函数可以重新写作:
(4)J(D)(θ(D),θ(G))=12ExpdatalogD(x)12Expmodellog(1D(x))=12ipdata(xi)logD(xi)12ipmodel(xi)log(1D(xi))begin{aligned}J^{(D)}(theta^{(D)}, theta^{(G)}) &= -frac{1}{2}mathbb{E}_{xsim p_{data}}log D(x) - frac{1}{2}mathbb{E}_{xsim p_{model}}log (1-D(x))\&= -frac{1}{2} sum_ip_{data}(x_i)log D(x_i) -frac{1}{2}sum_i p_{model}(x_i) log (1-D(x_i))end{aligned}tag{4}

对上式关于D(x)D(x)求导,并令导数为0,得到:
D(x)=pdata(x)pdata(x)+pmodel(x)D^*(x) = frac{p_{data}(x)}{p_{data}(x)+p_{model}(x)}

生成器的损失函数

J(G)=J(D)J^{(G)}=-J^{(D)},则
J(G)(θ(D),θ(G))=12ExpdatalogD(x)+12Ezpmodellog(1D(G(z)))=Constant+12Ezpmodellog(1D(G(z)))begin{aligned}J^{(G)}(theta^{(D)}, theta^{(G)}) &= frac{1}{2}mathbb{E}_{xsim p_{data}}log D(x) + frac{1}{2}mathbb{E}_{zsim p_{model}}log (1-D(G(z)))\& = Constant + frac{1}{2}mathbb{E}_{zsim p_{model}}log (1-D(G(z)))end{aligned}

生成器没有直接接受任何的训练集数据,训练集数据的信息是通过判别器学习后传递过来的。