狭义的生成器就是输入一个向量,通过生成器,输出一个高维向量(代表图片、文字等)
其中输入向量的每一个维度都代表一个特征。如下图示例:
狭义的判别器就是输入数据(生成器产物或者真实数据),通过判别器,输出一个标量数值,输出的数值越大,则代表这个数据越真实。如下图示例(假设输出数值在0-1之间):
结合图来理解生成器和判别器的关系:
当训练判别器的时候,就相当于把生成器固定住了,当训练生成器的时候,就相当于把判别器固定住了,于是就有对上述关于 v ‾ \overline v v的讲解:
对于判别器,目标是提升辨认图片来源的能力,对真实图片输出大的数值,所以 D ( x i ) D(x_i) D(xi)越大越好, D ( x ‾ i ) D(\overline x_i) D(xi)越小越好,也就是 v ‾ \overline v v越大越好。
对于生成器:目的是希望自己生成的图片越来越真实,也就是要让 D ( x ‾ i ) D(\overline x_i) D(xi)越大越好,也就是 v ‾ \overline v v越小越好(另一项当成常数即可)。
GAN提出了两个模型:
生成模型(Generator)
生成模型主要是用来生成数据分布,目的是尽量与原数据分布接近。
判别模型(Discriminator)
判别模型主要是用来判断样本是来自真实分布还是生成模型生成的分布。目的是能够更加好地区分哪些样本来自真实数据,哪些样本来自生成模型的数据,越真实的数据得到的结果越大。
用数学来表示训练过程中两模型的变化,如下图:
绿色线表示真实数据的分布,蓝色线表示生成模型输出的数据分布,红色线表示判别器(越高就表示给的分数越大)
真实数据的分布是 P d a t a ( x ) P_{data}(x) Pdata(x) ,我们定义一个分布 P G ( x i ; θ ) P_G(x_i;\theta) PG(xi;θ) ,我们想要找到一组参数 θ \theta θ,使得 P G ( x i ; θ ) P_G(x_i;\theta) PG(xi;θ)越接近 P d a t a ( x ) P_{data}(x) Pdata(x)越好。比如说, P G ( x i ; θ ) P_G(x_i;\theta) PG(xi;θ) 如果是一个高斯混合模型,那么 θ \theta θ就是均值和方差。
采用极大似然估计方法,我们从真实数据分布 P d a t a ( x ) P_{data}(x) Pdata(x)里面取样 m 个点, x 1 , x 2 , . . . , x m {x_1,x_2,...,x_m} x1,x2,...,xm,根据给定的参数 θ 我们可以算出某个x在该分布的概率 P G ( x i ; θ ) P_G(x_i;θ) PG(xi;θ),即:
也可以将极大似然估计等价于最小化KL散度,我们需要找一个最大的 θ \theta θ使得 P G ( x i ; θ ) P_G(x_i;\theta) PG(xi;θ)接近 P d a t a ( x ) P_{data}(x) Pdata(x),就有下列式子:
将其化简,得:
由于需要最大化概率的 θ \theta θ,也就是可以近似等价于原分布的期望,可得:
然后再展开成期望定义的形式,并且加减一项常数项(不含 θ \theta θ),不影响结果,有:
最终化成了最小化KL散度的形式。
其中KL散度用来衡量两种概率分布的相似程度,越小则表示两种概率分布越接近。形式为:
所以机器学习中的最大似然估计,其实就是最小化我们要寻找的目标分布 P G P_G PG与 P d a t a P_{data} Pdata的KL散度。
如何来定义 P G P_G PG呢?
以前是采用高斯分布来定义的,但是生成的图片会很模糊,采用更复杂的分布的话,最大似然会没法计算。所以就引进了Generator来定义 P G P_G PG,如下图:
优化目标是最小化 P G P_G PG与 P d a t a P_{data} Pdata之间的差异:
虽然我们不知道 P G P_G PG与 P d a t a P_{data} Pdata的公式,但是我们可以从这两个分布中采样出一些样本。
对 P G P_G PG,我们从给定的数据集中采样出一些样本。(该步骤对应训练判别器流程步骤1)
对 P d a t a P_{data} Pdata,我们随机采样出一些向量,经过Generator输出一些图片。(该步骤对应训练判别器流程步骤2,3)
之后经过Discriminator我们就可以计算 P G P_G PG与 P d a t a P_{data} Pdata的收敛。Discriminator的目标函数是:
该目标函数对应训练判别器的损失函数,意思是假设x是从 P d a t a P_{data} Pdata 里面采样出来的,那么希望D(x)越大越好。如果是从 P G P_G PG里面采样出来的,就希望它的值越小越好。x~ P d a t a P_{data} Pdata表示该均值的x都来自 P d a t a P_{data} Pdata分布。
我们的目标是让判别器无法区分 P G P_G PG与 P d a t a P_{data} Pdata,也就是让它没办法把V(G,D)调大。接下来从数学上去解释这个结论。
给定生成器,我们要找到能最大化目标函数V(D,G)的D*:
现在我们把积分里面的这一项拿出来看:
P d a t a l o g D ( x ) + P G ( x ) l o g ( 1 − D ( x ) ) P_{data}logD(x)+P_G(x)log(1-D(x)) PdatalogD(x)+PG(x)log(1−D(x))
我们想要找到一组参数D*,使这一项最大。把式子简写一下,将 P d a t a P_{data} Pdata用a表示, P G P_G PG用b表示,得:
f ( D ) = a l o g ( D ) + b l o g ( 1 − D ) f(D)=alog(D)+blog(1-D) f(D)=alog(D)+blog(1−D)
对D求导得:
d f ( D ) d D = a ∗ 1 D + b ∗ 1 1 − D ∗ ( − 1 ) \frac{df(D)}{dD}=a*\frac1D+b*\frac1{1-D}*(-1) dDdf(D)=a∗D1+b∗1−D1∗(−1)
另这个求导结果为0,得:
D ∗ = a a + b D^*=\frac a{a+b} D∗=a+ba
将a,b代回去,得:
D ∗ = P d a t a ( x ) P d a t a ( x ) + P G ( x ) D^*=\frac {P_{data}(x)}{P_{data}(x)+P_G(x)} D∗=Pdata(x)+PG(x)Pdata(x)
再将这个D带入V(G,D*)中,然后分子分母同时除以2,之后可以化简为JS散度形式(KL散度的变体,解决了KL散度非对称的问题),得:
当 P d a t a P_{data} Pdata= P G P_G PG时,JS散度为0,值为-2log2,达到最优(也就是让判别器没办法把V(G,D)调大)。这是从正向证明当 P d a t a P_{data} Pdata= P G P_G PG时达到最优,还需从反向证明才可以得出当且仅当 P d a t a P_{data} Pdata= P G P_G PG才可以达到的全局最优。
反向证明很容易:假设 P d a t a P_{data} Pdata= P G P_G PG,那么D*= 1 2 \frac 12 21,再直接代入V(G,D*)即可得到-2log2。
所以,当且仅当 P d a t a P_{data} Pdata= P G P_G PG才可以达到的全局最优。也就是,当且仅当生成分布等于真实数据分布时,我们取得最优生成器。
我们从头整理一下,我们的目标是找到一个G*,去最小化 P d a t a P_{data} Pdata, P G P_G PG的差异,也就是:
G ∗ = a r g m i n G D i v ( P G , P d a t a ) G^*=argmin_GDiv(P_G,P_{data}) G∗=argminGDiv(PG,Pdata)
但是这个差异没法之间去算,所以就用一个判别器来计算这两个分布的差异:
D ∗ = a r g m a x D V ( D , G ) D^*=argmax_DV(D,G) D∗=argmaxDV(D,G)
所以优化目标就变为:
G ∗ = a r g m i n G m a x D V ( G , D ) G^*=argmin_Gmax_DV(G,D) G∗=argminGmaxDV(G,D)
这个看起来很复杂,其实直观理解一下,如下图,我们假设已经把生成器固定住了,图片的曲线表示,红点表示固定住G后的 m a x D ( G , D ) max_D(G,D) maxD(G,D) , 也就是 P G P_G PG 和 P d a t a P_{data} Pdata 的差异。而我们的目标是最小化这个差异,所以下图的三个网络中, G 3 G_3 G3 是最优秀的。
参考的文章:
GAN论文阅读——原始GAN(基本概念及理论推导)
生成对抗网络(GAN) 背后的数学理论