原始论文:Generative Adversarial Networks, https://arxiv.org/abs/1406.2661

GAN怎么开干(gan)

生成对抗网络Generative Adversarial NetworksGAN)主要由两个神经网络构成,分别是生成器GG (Generator)和判别器DD (Discriminator)。

生成器的目标是生成服从于真实数据分布的样本,而判别器的目标则是区分输入的数据是真实数据还是生成数据。

可见,二者的训练目标的存在对抗性的,而二者也正是通过这样不断的对抗训练——极小极大博弈(Minimax Game),使得模型能在所有可能的 GG 和 DD 中,求出唯一的均衡解:最终 GG 足以生成与训练样本相同分布的数据,相对地,DD 的判别结果则稳定在了1/21/2

根据GAN的基本原理,可简单绘制出其基本的模型结构。

对于服从于任意的某种分布Pz(z)P_z(\boldsymbol z) 的噪声z\boldsymbol z,经过生成器GG 后得到数据G(z)G(\boldsymbol z)。我们假设G(z)G(\boldsymbol z)服从的分布为PG(G(z))P_G(G(\boldsymbol z)) ,而真实数据(即数据集给出的数据)服从于Pdata(x)P_{data}(\boldsymbol x),所以我们需要训练使得两种分布尽可能地一致。

【插入图片】

数学表示与证明

信息熵

信息熵(Information Entropy)是度量样本集合纯度最常用的一种指标。

对于离散随机变量XX 的一个事件X=xiX=x_i,定义其信息量\textbf{信息量}* 为:

I(xi)=log(p(xi)),i,  xiχ,  i=1,2,...,n\begin{aligned} I(x_i)=-\log(p(x_i)),\quad \forall i,\; x_i\in\chi,\;i=1,2,...,n \end{aligned}

其中χ={x1,x2,,xn}\chi=\{x_1,x_2,\cdots,x_n\} 为随机变量XX 可能的取值范围。p(xi)=P{X=xi}p(x_i)=P\{X=x_i\} 表示事件X=xiX=x_i 发生的概率。

离散随机变量XX信息熵\textbf{信息熵} 被定义为其事件信息量的期望:

  H(X)=E(logp(x))=i=1np(xi)log(p(xi))\begin{equation*}     H(X)=-\mathbb{E}(\log p(x))=-\sum_{i=1}^np(x_i)\log(p(x_i)) \end{equation*}

规定:当p(xi)=0p(x_i)=0 时,p(xi)log(p(xi))=0p(x_i)\log(p(x_i))=0

若信息熵H(X)H(X) 越小,则说明XX 的纯度越高,事件发生的情况更稳定。

相对熵/KL散度

相对熵\textbf{相对熵}(Relative Entropy),又被称为Kullback-Leibler散度(Kullback-Leibler divergence)或信息散度(Information Divergence),是两个概率分布间差异的非对称性度量。在信息理论中,相对熵等价于两个概率分布的信息熵的差值。
相对熵是一些优化算法,例如最大期望算法(Expectation-Maximization algorithm, EM)的损失函数 。此时参与计算的一个概率分布为真实分布,另一个为理论(拟合)分布,相对熵表示使用理论分布拟合真实分布时产生的信息损耗。

对于概率分布p(x),q(x)p(x),q(x),它们的 KL 散度为:

KL(pq)=i=1np(xi)log(p(xi)q(xi))\begin{equation*} KL(p||q)=\sum_{i=1}^np(x_i)\log\left(\frac{p(x_i)}{q(x_i)}\right) \end{equation*}

https://hsinjhao.github.io/2019/05/22/KL-DivergenceIntroduction/
非负矩阵分解(1):准则函数及KL散度 - LeeLIn。 - 博客园 (cnblogs.com)

JS散度

为了解决KL散度非对称性的问题,在KL散度的基础上又提出了JS散度\textbf{JS散度}(Jensen-Shannon Divergence),作为另一种度量两个概率分布相似度的方法:

JS(PQ)=12KL(PM)+12KL(QM)\begin{equation*} JS(P||Q)=\frac12KL(P||M)+\frac12KL(Q||M) \end{equation*}

其中,M=P+Q2\begin{aligned}M=\frac{P+Q}2\end{aligned}

https://www.cnblogs.com/MorStar/p/14882813.html

价值函数与证明

为了指导实现GGDD 的参数调整,我们需要定义适当的价值函数V(G,D)V(G,D) 用来训练,Wang等人则是通过引入信息熵的概念来实现其定义。

不难得出,判别器对真实数据的信息熵ExPdata(x)[logD(x)]\mathbb{E}_{x\sim P_{data}(x)}[\log D(x)] 越大则表示判别器DD 识别真实数据的能力越强,而判别器对生成数据的信息熵EzPz(z)[logD(G(z))]\mathbb{E}_{z\sim P_z(z)}[\log D(G(z))] 越小则表示判别器DD 将假数据误判成真数据的可能性越低;相反,若它的值越大则说明DD 容易误判,也即G(z)G(z) 更接近真实数据。于是,可得到优化目标函数如下:

minGmaxDV(G,D)=ExPdata(x)[logD(x)]+EzPz(z)[log(1D(G(z)))]\begin{aligned} \min_G\max_D V(G,D)=\mathbb{E}_{x\sim P_{data}(x)}[\log D(x)]+\mathbb{E}_{z\sim P_z(z)}[\log(1-D(G(z)))] \end{aligned}

其中,将EzPz(z)[log(1D(G(z)))]\mathbb{E}_{z\sim P_z(z)}[\log(1-D(G(z)))] 代替EzPz(z)[logD(G(z))]\mathbb{E}_{z\sim P_z(z)}[\log D(G(z))] 可以更好统一函数。

上述目标函数的求解过程主要分为两步:

  • 固定GG 优化判别器DD ,使得最终得到的判别器D=argmaxDV(G,D)D^*=\arg\max\limits_{D}V(G,D)
  • 固定DD 优化生成器GG,使得最终得到的生成器器G=argminGV(G,D)G^*=\arg\min\limits_{G}V(G,D)
    首先对目标函数V(G,D)V(G,D) 化简如下,

V(G,D)=ExPdata(x)[logD(x)]+EzPz(z)[log(1D(G(z)))]=xPdata(x)logD(x)dx+zPz(z)log(1D(G(z)))dz=xPdata(x)logD(x)dx+xPG(x)log(1D(x))dx=x[Pdata(x)logD(x)+PG(x)log(1D(x))]dx\begin{aligned} V(G,D)&=\mathbb{E}_{x\sim P_{data}(x)}[\log D(x)]+\mathbb{E}_{z\sim P_z(z)}[\log(1-D(G(z)))]\\ &=\int_xP_{data}(x)\log D(x)\mathrm dx+\int_zP_z(z)\log(1-D(G(z)))\mathrm dz\\ &=\int_xP_{data}(x)\log D(x)\mathrm dx+\int_xP_G(x)\log(1-D(x))\mathrm dx\\ &=\int_x\left[P_{data}(x)\log D(x)+P_G(x)\log(1-D(x))\right]\mathrm dx \end{aligned}

从而求解maxDV(G,D)\max\limits_{D}V(G,D) 等价于对其被积函数,记为Φ(D)\Phi(D) 做优化。有

dΦ(D)dD=Pdata(x)D(x)PG(x)1D(x)=0  D(x)=Pdata(x)Pdata(x)+PG(x)\begin{aligned} &\frac{\mathrm d\Phi(D)}{\mathrm dD}=\frac{P_{data}(x)}{D(x)}-\frac{P_G(x)}{1-D(x)}=0\\ \\\quad\Rightarrow \;&D^*(x)=\frac{P_{data}(x)}{P_{data}(x)+P_G(x)} \end{aligned}

DD^* 带入V(G,D)V(G,D),求解minGV(G,D)\min\limits_{G}V(G,D^*)。此时

V(G,D)=x[Pdata(x)logPdata(x)Pdata(x)+PG(x)+PG(x)logPG(x)Pdata(x)+PG(x)]dx=2log2+KL(PdataPdata+PG2)+KL(PGPdata+PG2)=2log2+2JS(PdataPG)\begin{aligned} V(G,D^*)&=\int_x\left[P_{data}(x)\log \frac{P_{data}(x)}{P_{data}(x)+P_G(x)}+P_G(x)\log \frac{P_{G}(x)}{P_{data}(x)+P_G(x)}\right]\mathrm dx\\ &=-2\log2+KL\left(P_{data}\bigg|\bigg|\frac{P_{data}+P_G}2\right)+KL\left(P_{G}\bigg|\bigg|\frac{P_{data}+P_G}2\right)\\ &=-2\log2+2JS(P_{data}||P_G) \end{aligned}

从而,当且仅当Pdata(x)=PG(x)P_{data}(x)=P_G(x) 时,V(G,D)V(G,D^*) 取得最小。

算法实现

Fake图像生成

数据不够,生成来凑

有哪些GAN

图像质量指标

PSNR

SSIM

VainF/pytorch-msssim: Fast and differentiable MS-SSIM and SSIM for pytorch. (github.com)

【python】ssim原理简介及代码实现_python ssim-CSDN博客

本文相关引用

  1. GAN 生成对抗网络合集|bilibili
  2. GAN完整理论推导与实现,Perfect!|机器之心