fix imgs display bug

This commit is contained in:
xfguo 2019-04-07 13:42:22 +08:00
parent fb37ddda14
commit 85904cebe5
41 changed files with 26 additions and 24 deletions

BIN
.DS_Store vendored

Binary file not shown.

48
ch07_生成对抗网络(GAN)/ch7.md Normal file → Executable file
View File

@ -40,11 +40,11 @@
对于上述神经网络模型如果想要学习其参数首先需要一个目标函数。GAN的目标函数定义如下
$$
\mathop {\min }\limits_G \mathop {\max }\limits_D V(D,G) = {\rm E}_{x\sim{p_{data}}(x)}[\log D(x)] + {\rm E}_{z\sim{p_z}(z)}[\log (1 - D(G(z)))]
\mathop {\min }\limits_G \mathop {\max }\limits_D V(D,G) = {{\rm E}_{x\sim{p_{data}}(x)}}[\log D(x)] + {{\rm E}_{z\sim{p_z}(z)}}[\log (1 - D(G(z)))]
$$
这个目标函数可以分为两个部分来理解:
判别器的优化通过$\mathop {\max}\limits_D V(D,G)$实现,$V(D,G)$为判别器的目标函数,其第一项${\rm E}_{x\sim{p_{data}}(x)}[\log D(x)]$表示对于从真实数据分布 中采用的样本 ,其被判别器判定为真实样本概率的数学期望。对于真实数据分布 中采样的样本其预测为正样本的概率当然是越接近1越好。因此希望最大化这一项。第二项${\rm E}_{z\sim{p_z}(z)}[\log (1 - D(G(z)))]$表示对于从噪声P_z(z)分布当中采样得到的样本经过生成器生成之后得到的生成图片,然后送入判别器,其预测概率的负对数的期望,这个值自然是越大越好,这个值越大, 越接近0也就代表判别器越好。
判别器的优化通过$\mathop {\max}\limits_D V(D,G)$实现,$V(D,G)$为判别器的目标函数,其第一项${{\rm E}_{x\sim{p_{data}}(x)}}[\log D(x)]$表示对于从真实数据分布 中采用的样本 ,其被判别器判定为真实样本概率的数学期望。对于真实数据分布 中采样的样本其预测为正样本的概率当然是越接近1越好。因此希望最大化这一项。第二项${{\rm E}_{z\sim{p_z}(z)}}[\log (1 - D(G(z)))]$表示对于从噪声P_z(z)分布当中采样得到的样本经过生成器生成之后得到的生成图片,然后送入判别器,其预测概率的负对数的期望,这个值自然是越大越好,这个值越大, 越接近0也就代表判别器越好。
生成器的优化通过$\mathop {\min }\limits_G({\mathop {\max }\limits_D V(D,G)})$实现。注意,生成器的目标不是$\mathop {\min }\limits_GV(D,G)$,即生成器**不是最小化判别器的目标函数**,生成器最小化的是**判别器目标函数的最大值**判别器目标函数的最大值代表的是真实数据分布与生成数据分布的JS散度(详情可以参阅附录的推导)JS散度可以度量分布的相似性两个分布越接近JS散度越小。
@ -64,7 +64,7 @@ $$
对于很多GAN的初学者在实践过程中可能会纳闷为什么GAN的Loss一直降不下去。GAN到底什么时候才算收敛其实作为一个训练良好的GAN其Loss就是降不下去的。衡量GAN是否训练好了只能由人肉眼去看生成的图片质量是否好。不过对于没有一个很好的评价是否收敛指标的问也有许多学者做了一些研究后文提及的WGAN就提出了一种新的Loss设计方式较好的解决了难以判断收敛性的问题。下面我们分析一下GAN的Loss为什么降不下去
对于判别器而言GAN的Loss如下
$$\mathop {\min }\limits_G \mathop {\max }\limits_D V(D,G) = {\rm E}_{x\sim{p_{data}}(x)}[\log D(x)] + {\rm E}_{z\sim{p_z}(z)}[\log (1 - D(G(z)))]$$
$$\mathop {\min }\limits_G \mathop {\max }\limits_D V(D,G) = {{\rm E}_{x\sim{p_{data}}(x)}}[\log D(x)] + {{\rm E}_{z\sim{p_z}(z)}}[\log (1 - D(G(z)))]$$
从$\mathop {\min }\limits_G \mathop {\max }\limits_D V(D,G)$可以看出生成器和判别器的目的相反也就是说两个生成器网络和判别器网络互为对抗此消彼长。不可能Loss一直降到一个收敛的状态。
- 对于生成器其Loss下降快很有可能是判别器太弱导致生成器很轻易的就"愚弄"了判别器。
@ -93,7 +93,7 @@ X | 0 1/4 3/4
这个数据可以统计得到即统计人的特征X=0,1….的时候其类别为Y=0,1的概率。统计得到上述联合概率分布P(X, Y)后可以学习一个模型比如让二维高斯分布去拟合上述数据这样就学习到了XY的联合分布。在预测时如果我们希望给一个输入特征X预测其类别则需要通过贝叶斯公式得到条件概率分布才能进行推断
$$P(Y|X)={\frac{P(X,Y)}{P(X)}}={\frac{P(X,Y)}{P(X|Y)P(Y)}}$$
$$P(Y|X)={\frac{P(X,Y)}{P(X)}}={\frac{P(X,Y)}{P(X|Y)P(Y)}}$$
2如果用判别式模型可以训练一个模型输入人的特征X这些特征包括人的五官穿衣风格发型等。输出则是对于性别的判断概率这个概率服从一个分布分布的取值只有两个要么男要么女记这个分布为Y。这个过程学习了一个条件概率分布P(Y|X)即输入特征X的分布已知条件下Y的概率分布。
@ -117,15 +117,15 @@ X | 0 1/4 3/4
Multi agent diverse GAN(MAD-GAN)采用多个生成器,一个判别器以保障样本生成的多样性。具体结构如下:
![](/Users/xfguo/Desktop/blog/zhihu/imgs/MAD_GAN.png)
![](./img/ch7/MAD_GAN.png)
相比于普通GAN多了几个生成器且在loss设计的时候加入一个正则项。正则项使用余弦距离惩罚三个生成器生成样本的一致性。
MRGAN则添加了一个判别器来惩罚生成样本的mode collapse问题。具体结构如下
![](/Users/xfguo/Desktop/blog/zhihu/imgs/MRGAN.png)
![](./img/ch7/MRGAN.png)
输入样本$x$通过一个Encoder编码为隐变量$E(x)$然后隐变量被Generator重构训练时Loss有三个。$D_M$和$R$重构误差用于指导生成real-like的样本。而$D_D$则对$E(x)$和$z$生成的样本进行判别显然二者生成样本都是fake samples所以这个判别器主要用于判断生成的样本是否具有多样性即是否出现mode collapse。
输入样本$x$通过一个Encoder编码为隐变量$E(x)$然后隐变量被Generator重构训练时Loss有三个。$D_M$和$R$重构误差用于指导生成real-like的样本。而$D_D$则对$E(x)$和$z$生成的样本进行判别显然二者生成样本都是fake samples所以这个判别器主要用于判断生成的样本是否具有多样性即是否出现mode collapse。
**Mini-batch Discrimination**
@ -156,14 +156,14 @@ $$IS(P_g)=e^{E_{x\sim P_g}[KL(p_M(y|x)\Vert{p_M(y)})]}$$
#### Mode Score
Mode Score作为Inception Score的改进版本添加了关于生成样本和真实样本预测的概率分布相似性度量一项。具体公式如下
$$MS(P_g)=e^{E_{x\sim P_g}[KL(p_M(y|x)\Vert{p_M(y)})-KL(p_M(y)\Vert p_M(y^*))]}$$
$$MS(P_g)=e^{E_{x\sim P_g}[KL(p_M(y|x)\Vert{p_M(y)})-KL(p_M(y)\Vert p_M(y^*))]}$$
#### Kernel MMD (Maximum Mean Discrepancy)
计算公式如下:
$$MMD^2(P_r,P_g)=E_{x_r\sim{P_r},x_g\sim{P_g}}[\lVert\Sigma_{i=1}^{n1}k(x_r)-\Sigma_{i=1}^{n2}k(x_g)\rVert]$$
对于Kernel MMD值的计算首先需要选择一个核函数$k$,这个核函数把样本映射到再生希尔伯特空间(Reproducing Kernel Hilbert Space, RKHS) RKHS相比于欧几里得空间有许多优点对于函数内积的计算是完备的。将上述公式展开即可得到下面的计算公式
$$MMD^2(P_r,P_g)=E_{x_r,x_r{'}\sim{P_r},x_g,x_g{'}\sim{P_g}}[k(x_r,x_r{'})-2k(x_r,x_g)+k(x_g,x_g{'})]$$
$$MMD^2(P_r,P_g)=E_{x_r\sim{P_r},x_g\sim{P_g}}[\lVert\Sigma_{i=1}^{n1}k(x_r)-\Sigma_{i=1}^{n2}k(x_g)\rVert]$$
对于Kernel MMD值的计算首先需要选择一个核函数$k$,这个核函数把样本映射到再生希尔伯特空间(Reproducing Kernel Hilbert Space, RKHS) RKHS相比于欧几里得空间有许多优点对于函数内积的计算是完备的。将上述公式展开即可得到下面的计算公式
$$MMD^2(P_r,P_g)=E_{x_r,x_r{'}\sim{P_r},x_g,x_g{'}\sim{P_g}}[k(x_r,x_r{'})-2k(x_r,x_g)+k(x_g,x_g{'})]$$
MMD值越小两个分布越接近。
**特点:可以一定程度上衡量模型生成图像的优劣性,计算代价小。推荐使用。**
@ -171,8 +171,8 @@ MMD值越小两个分布越接近。
#### Wasserstein distance
Wasserstein distance在最优传输问题中通常也叫做推土机距离。这个距离的介绍在WGAN中有详细讨论。公式如下
$$WD(P_r,P_g)=min_{\omega\in\mathbb{R}^{m\times n}}\Sigma_{i=1}^n\Sigma_{i=1}^m\omega_{ij}d(x_i^r,x_j^g)$$
$$s.t. \Sigma_{i=1}^mw_{i,j}=p_r(x_i^r), \forall i;\Sigma_{j=1}^nw_{i,j}=p_g(x_j^g), \forall j$$
$$WD(P_r,P_g)=min_{\omega\in\mathbb{R}^{m\times n}}\Sigma_{i=1}^n\Sigma_{i=1}^m\omega_{ij}d(x_i^r,x_j^g)$$
$$s.t. \Sigma_{i=1}^mw_{i,j}=p_r(x_i^r), \forall i;\Sigma_{j=1}^nw_{i,j}=p_g(x_j^g), \forall j$$
Wasserstein distance可以衡量两个分布之间的相似性。距离越小分布越相似。
**特点:如果特征空间选择合适,会有一定的效果。但是计算复杂度为$O(n^3)$太高**
@ -207,9 +207,9 @@ p_{data}(x)=\prod_{i=1}^np(x_i|x_1,x_2,...,x_{i-1})
$$
上述公式很好理解,给定$x_1,x_2,...,x_{i-1}$条件下,所有$p(x_i)$的概率乘起来就是图像数据的分布。如果使用RNN对上述依然关系建模就是pixelRNN。如果使用CNN则是pixelCNN。具体如下[5]
![](/Users/xfguo/Desktop/blog/zhihu/imgs/pixRNN.png)
![](./img/ch7/pixRNN.png)
![](/Users/xfguo/Desktop/blog/zhihu/imgs/pixCNN.png)
![](./img/ch7/pixCNN.png)
显然不论是对于pixelCNN还是pixelRNN由于其像素值是一个个生成的速度会很慢。语音领域大火的WaveNet就是一个典型的自回归模型。
@ -217,7 +217,7 @@ $$
PixelCNN/RNN定义了一个易于处理的密度函数我们可以直接优化训练数据的似然对于变分自编码器我们将定义一个不易处理的密度函数通过附加的隐变量$z$对密度函数进行建模。 VAE原理图如下[6]
![](/Users/xfguo/Desktop/blog/zhihu/imgs/VAE.png)
![](./img/ch7/VAE.png)
在VAE中真实样本$X$通过神经网络计算出均值方差(假设隐变量服从正太分布),然后通过采样得到采样变量$Z$并进行重构。VAE和GAN均是学习了隐变量$z$到真实数据分布的映射。但是和GAN不同的是
@ -237,7 +237,7 @@ PixelCNN/RNN定义了一个易于处理的密度函数我们可以直接优
条件生成对抗网络CGAN, Conditional Generative Adversarial Networks作为一个GAN的改进其一定程度上解决了GAN生成结果的不确定性。如果在Mnist数据集上训练原始GANGAN生成的图像是完全不确定的具体生成的是数字1还是2还是几根本不可控。为了让生成的数字可控我们可以把数据集做一个切分把数字0~9的数据集分别拆分开训练9个模型不过这样太麻烦了也不现实。因为数据集拆分不仅仅是分类麻烦更主要在于每一个类别的样本少拿去训练GAN很有可能导致欠拟合。因此CGAN就应运而生了。我们先看一下CGAN的网络结构
![CGAN网络结构](./img/ch7/CGAN网络结构.png)
从网络结构图可以看到对于生成器Generator其输入不仅仅是随机噪声的采样z还有欲生成图像的标签信息。比如对于mnist数据生成就是一个one-hot向量某一维度为1则表示生成某个数字的图片。同样地判别器的输入也包括样本的标签。这样就使得判别器和生成器可以学习到样本和标签之间的联系。Loss如下
$$\mathop {\min }\limits_G \mathop {\max }\limits_D V(D,G) = {\rm E}_{x\sim{p_{data}}(x)}[\log D(x|y)] + {\rm E}_{z\sim{p_z}(z)}[\log (1 - D(G(z|y)))]$$
$$\mathop {\min }\limits_G \mathop {\max }\limits_D V(D,G) = {{\rm E}_{x\sim{p_{data}}(x)}}[\log D(x|y)] + {{\rm E}_{z\sim{p_z}(z)}}[\log (1 - D(G(z|y)))]$$
Loss设计和原始GAN基本一致只不过生成器判别器的输入数据是一个条件分布。在具体编程实现时只需要对随机噪声采样z和输入条件y做一个级联即可。
@ -272,11 +272,11 @@ GAN原始判别器的Loss在判别器达到最优的时候等价于最小化
#### WGAN如何解决训练崩溃问题
WGAN作者提出了使用Wasserstein距离以解决GAN网络训练过程难以判断收敛性的问题。Wasserstein距离定义如下:
$$L={\rm E}_{x\sim{p_{data}}(x)}[f_w(x)] - {\rm E}_{x\sim{p_g}(x)}[f_w(x)]$$
$$L={{\rm E}_{x\sim{p_{data}}(x)}}[f_w(x)] - {{\rm E}_{x\sim{p_g}(x)}}[f_w(x)]$$
通过最小化Wasserstein距离得到了WGAN的Loss
- WGAN生成器Loss$- {\rm E}_{x\sim{p_g}(x)}[f_w(x)]$
- WGAN判别器Loss$L=-{\rm E}_{x\sim{p_{data}}(x)}[f_w(x)] + {\rm E}_{x\sim{p_g}(x)}[f_w(x)]$
- WGAN生成器Loss$- {{\rm E}_{x\sim{p_g}(x)}}[f_w(x)]$
- WGAN判别器Loss$L=-{{\rm E}_{x\sim{p_{data}}(x)}}[f_w(x)] + {{\rm E}_{x\sim{p_g}(x)}}[f_w(x)]$
从公式上GAN似乎总是让人摸不着头脑在代码实现上来说其实就以下几点
@ -288,7 +288,7 @@ $$L={\rm E}_{x\sim{p_{data}}(x)}[f_w(x)] - {\rm E}_{x\sim{p_g}(x)}[f_w(x)]$$
实际实验过程发现WGAN没有那么好用主要原因在于WAGN进行梯度截断。梯度截断将导致判别网络趋向于一个二值网络造成模型容量的下降。
于是作者提出使用梯度惩罚来替代梯度裁剪。公式如下:
$$L=-{\rm E}_{x\sim{p_{data}}(x)}[f_w(x)] + {\rm E}_{x\sim{p_g}(x)}[f_w(x)]+\lambda{\rm E}_{x\sim{p_x}(x)}[\lVert\nabla_x(D(x))\rVert_p-1]^2$$
$$L=-{{\rm E}_{x\sim{p_{data}}(x)}}[f_w(x)] + {{\rm E}_{x\sim{p_g}(x)}}[f_w(x)]+\lambda{{\rm E}_{x\sim{p_x}(x)}}[\lVert\nabla_x(D(x))\rVert_p-1]^2$$
由于上式是对每一个梯度进行惩罚所以不适合使用BN因为它会引入同个batch中不同样本的相互依赖关系。如果需要的话可以选择Layer Normalization。实际训练过程中就可以通过Wasserstein距离来度量模型收敛程度了
![Wass距离随迭代次数变化](./img/ch7/Wass%E8%B7%9D%E7%A6%BB%E9%9A%8F%E8%BF%AD%E4%BB%A3%E6%AC%A1%E6%95%B0%E5%8F%98%E5%8C%96.png)
上图纵坐标是Wasserstein距离横坐标是迭代次数。可以看出随着迭代的进行Wasserstein距离趋于收敛生成图像也趋于稳定。
@ -296,8 +296,8 @@ $$L=-{\rm E}_{x\sim{p_{data}}(x)}[f_w(x)] + {\rm E}_{x\sim{p_g}(x)}[f_w(x)]+\lam
### 7.2.5 LSGAN
LSGANLeast Squares GAN这篇文章主要针对标准GAN的稳定性和图片生成质量不高做了一个改进。作者将原始GAN的交叉熵损失采用最小二乘损失替代。LSGAN的Loss
$$\mathop{\min }\limits_DJ(D)=\mathop{\min}\limits_D[{\frac{1}{2}}{\rm E}_{x\sim{p_{data}}(x)}[D(x)-a]^2 + {\frac{1}{2}}{\rm E}_{z\sim{p_z}(z)}[D(G(z))-b]^2]$$
$$\mathop{\min }\limits_GJ(G)=\mathop{\min}\limits_G{\frac{1}{2}}{\rm E}_{z\sim{p_z}(z)}[D(G(z))-c]^2$$
$$\mathop{\min }\limits_DJ(D)=\mathop{\min}\limits_D[{\frac{1}{2}}{{\rm E}_{x\sim{p_{data}}(x)}}[D(x)-a]^2 + {\frac{1}{2}}{{\rm E}_{z\sim{p_z}(z)}}[D(G(z))-b]^2]$$
$$\mathop{\min }\limits_GJ(G)=\mathop{\min}\limits_G{\frac{1}{2}}{{\rm E}_{z\sim{p_z}(z)}}[D(G(z))-c]^2$$
实际实现的时候非常简单最后一层去掉sigmoid并且计算Loss的时候用平方误差即可。之所以这么做作者在原文给出了一张图:
![LSGAN交叉熵与最小二乘损失对比图](./img/ch7/LSGAN%E4%BA%A4%E5%8F%89%E7%86%B5%E4%B8%8E%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%98%E6%8D%9F%E5%A4%B1%E5%AF%B9%E6%AF%94%E5%9B%BE.png)
上面是作者给出的基于交叉熵损失以及最小二乘损失的Loss函数。横坐标代表Loss函数的输入纵坐标代表输出的Loss值。可以看出随着输入的增大sigmoid交叉熵损失很快趋于0容易导致梯度饱和问题。如果使用右边的Loss设计则只在x=0点处饱和。因此使用LSGAN可以很好的解决交叉熵损失的问题。
@ -390,7 +390,7 @@ cycleGAN的生成器采用U-Net判别器采用LS-GAN。
#### Loss设计
总的Loss就是X域和Y域的GAN Loss以及Cycle consistency loss
$$L(G,F,D_X,D_Y)=L_{GAN}(G,D_Y,X,Y)+L_{GAN}(F,D_X,Y,X)+\lambda L_{cycle}(G,F)$$
$$L(G,F,D_X,D_Y)=L_{GAN}(G,D_Y,X,Y)+L_{GAN}(F,D_X,Y,X)+\lambda L_{cycle}(G,F)$$
整个过程End to end训练效果非常惊艳利用这一框架可以完成非常多有趣的任务
#### 多领域的无监督图像翻译StarGAN

Binary file not shown.

View File

Before

Width:  |  Height:  |  Size: 208 KiB

After

Width:  |  Height:  |  Size: 208 KiB

0
ch07_生成对抗网络(GAN)/img/ch7/Boundary_map.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 132 KiB

After

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

View File

Before

Width:  |  Height:  |  Size: 104 KiB

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 879 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

View File

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 32 KiB

View File

Before

Width:  |  Height:  |  Size: 265 KiB

After

Width:  |  Height:  |  Size: 265 KiB

0
ch07_生成对抗网络(GAN)/img/ch7/pix2pix_Loss.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 31 KiB

View File

Before

Width:  |  Height:  |  Size: 190 KiB

After

Width:  |  Height:  |  Size: 190 KiB

View File

Before

Width:  |  Height:  |  Size: 576 KiB

After

Width:  |  Height:  |  Size: 576 KiB

View File

Before

Width:  |  Height:  |  Size: 484 KiB

After

Width:  |  Height:  |  Size: 484 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 236 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 191 KiB

View File

@ -0,0 +1,2 @@
Add the corresponding chapter picture under img/ch*
在img/ch*下添加对应章节图片

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 KiB

0
ch07_生成对抗网络(GAN)/img/ch7/upsample.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

0
ch07_生成对抗网络(GAN)/img/ch7/语义编辑.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 197 KiB

After

Width:  |  Height:  |  Size: 197 KiB