Generator
生成器的本质就是一个神经网络,通过从一个简单的分布zzz中采样来生成一个复杂的分布,同时要求这个生成的复杂分布尽可能地相似输入样本xxx(真实数据)的分布。其实现了从低维数据到高维数据的转变。

那么生成器为什么输出的非要是分布呢?这是因为在实际训练中同一个输入,生成器可能会产生不同的输出,但是每一种输出单独出现的时候都是正确且合理的。比如下图是一个预判小精灵在下一秒走向的问题:如果我们的神经网络的训练数据集只有向右转的情况,那么输出就是向右转;如果我们的神经网络的训练数据集只有向左转的情况,那么输出就是向左转;如果我们的神经网络同时包含向右转和向左转的训练数据集,且向右转和向左转的误差都比较小,那么就会输出同时向左向右转的情况。而如果让机器的输出不再是一个单一的输出,而是一个机率的分布就可以解决这个问题。如果我们给神经网络增加了一个二分类分布(0,1各占50%),让0表示向右转,1表示向左转。
其实,这样做可以实现同样的输入有多种不同可能的输出。

Generative Adversarial Network
基本原理
GAN包含了两个模型:
- 生成器(Generator):其输入是一个随机编码向量,输出是一个复杂样本。该模型主要是从训练数据中产生相同分布的样本。对于输入样本xxx、类别标签yyy,在生成器模型中估计其联合概率分布,即生成与输入样本xxx更为相似的样本。
- 判别器(Discriminator):估计样本属于某类的条件概率分布,即区分真假样本。它的输入是一个复杂样本,输出是一个概率。这个概率用来判定输入样本是真实样本还是生成器输出的模拟样本。
算法流程:
-
初始化生成器和判别器G、DG、DG、D。
-
在每一个训练迭代中
-
固定生成器GGG,然后更新判别器DDD**。**详细来说,就是首先我们从数据集中抽样出一部分样本,同时还会使用生成器GGG生成相同数量的样本,分别将其标记为1、0。然后就是让判别器DDD去学习这两类样本,使其能区分出真假样本。(这里只有判别器的梯度会更新)

-
固定判别器DDD,然后更新生成器GGG**。**详细来说,就是这里我们其实会想把生成器和判别器组成一个大的神经网络模型。然后从简单分布中采样出一个随机编码向量让它进入到生成其中去生成一个样本,然后将这个生成的样本喂入到判别器中,让其打分。最后根据这个分数来更新生成器的梯度。

-
-
总体流程如下图所示

理论介绍
如下图所示,生成器要做的事情就是输入一个低维的简单分布,输出一个高位的复杂分布PGP_GPG,同时要做到生成的复杂分布要尽量与数据datadatadata的分布PdataP_{data}Pdata越接近越好(即理想情况下,就是让PGP_GPG和PdataP_{data}Pdata一模一样)。
比如,我们现在输入是一个标准正态分布(其样本主要分布在中间),通过生成器GGG之后,输出PGP_GPG(样本分布在两端,且主要分布在左侧),其分布和目标分布PdataP_{data}Pdata还是有一定差距的,那我们怎么让PGP_GPG和PdataP_{data}Pdata更接近呢?因为生成器本身就是一个神经网络,所以我们要做的就是设置一个合适的损失函数,根据我们的目标,我们可得:
G∗=argminGDiv(PG,Pdata) (1)G^*=arg\min\limits_{G}Div(P_G,P_{data})\ \ \ (1)G∗=argGminDiv(PG,Pdata) (1)
其中,DivDivDiv表示的是分布PGP_GPG和PdataP_{data}Pdata之间的距离。而谈到距离,我们能想到的可能有KL divergence、JS divergence等,但是我们现在还有一个问题是其实我们并不知道PGP_GPG和PdataP_{data}Pdata真实的样子是怎样的?而解决这个问题的方法就是下文要提到的判别器DDD。

如下图所示,我们首先假设蓝色星星是从真实样本分布中采样出来的样本,黄色星星是从模拟样本分布中采样出来的样本;目前两个样本是融合在一起的,而判别器要做的工作就是给真实的样本打一个较高的分数,给生成器模拟出来的样本打一个较低的分数,即最大化真实样本的分数,最小化模拟样本的分数。那么该判别器的损失函数为:
D∗=argmaxDV(D,G)V(D,G)=Ey∼Pdata[logD(y)]+Ey∼PG[log(1−D(y))] (2)\begin{aligned} D^*&=arg\max\limits_{D}V(D,G)\\ V(D,G)&=E_{y\sim P_{data}}[logD(y)]+E_{y\sim P_G}[log(1-D(y))] \end{aligned}\ \ \ (2)D∗V(D,G)=argDmaxV(D,G)=Ey∼Pdata[logD(y)]+Ey∼PG[log(1−D(y))] (2)

从这里我们还是看不出判别器损失函数D∗D^*D∗和生成器损失函数G∗G^*G∗之间的关系的,并且到这里似乎还看不出任何与距离相关的概念,其实只会再推导就能看出来了。
首先我们已知V(G,D)=∫y(Pdata(y)log(D(y))+PG(y)log(1−D(y)))dyV(G, D) = \int_y \bigg( P_{data}(y) \log(D(y)) + P_G (y) \log(1 - D(y)) \bigg) dyV(G,D)=∫y(Pdata(y)log(D(y))+PG(y)log(1−D(y)))dy,现在我们做一些简单的替换,假设y~=D(y),A=Pdata(y),B=PG(y)\tilde{y} = D(y), A=P_{data}(y), B=P_G(y)y~=D(y),A=Pdata(y),B=PG(y),则V(G,D)=∫y(Alogy~+Blog(1−y~))dyV(G, D) = \int_y \bigg( A\log\tilde{y} + B \log(1 - \tilde{y}) \bigg) dyV(G,D)=∫y(Alogy~+Blog(1−y~))dy,同时因为yyy是从全体可能的样本中采样出来的,其实这是积分是可以省略的,那么就有了
f(y~)=Alogy~+Blog(1−y~)df(y)~dy~=A1y~+B⋅11−y~⋅(−1)=A−(A+B)y~y~(1−y~)\begin{aligned} f(\tilde{y})&=Alog\tilde{y}+Blog(1-\tilde{y})\\ \frac{df(\tilde{y)}}{d\tilde{y}}&=A\frac{1}{\tilde{y}}+B\cdot\frac{1}{1-\tilde{y}}\cdot(-1)\\ &=\frac{A-(A+B)\tilde{y}}{\tilde{y}(1-\tilde{y})} \end{aligned}f(y~)dy~df(y)~=Alogy~+Blog(1−y~)=Ay~1+B⋅1−y~1⋅(−1)=y~(1−

本文深入浅出地介绍了生成对抗网络(GAN)的工作原理,包括生成器和判别器的基本概念及其训练流程。进一步地,文章探讨了Wasserstein GAN(WGAN)如何改进传统GAN的局限性,通过采用EM距离克服了JS距离的缺陷,并通过代码实例展示了WGAN的具体实现。
最低0.47元/天 解锁文章
1197

被折叠的 条评论
为什么被折叠?



