提交 96f89ec5 编写于 作者: W wizardforcel

2021-01-07 20:47:37

上级 be5f23bb
......@@ -43,7 +43,7 @@ WGAN 认为 GAN 固有的不稳定性是由于它的损失函数引起的,该
| | ![](img/B14853_05_004.png) |
| *詹森·香农(JS)“公式 5.1.2” | ![](img/B14853_05_005.png) |
| 陆地移动距离(EMD)或 Wasserstein 1 “公式 5.1.3” | ![](img/B14853_05_006.png) |
| | 其中![](img/B14853_05_007.png)是所有联合分布![](img/B14853_05_008.png)的集合,其边际为`p_data``p_g`。 |
| | 其中`Π(p_data, p_g)`是所有联合分布`γ(x, y)`的集合,其边际为`p_data``p_g`。 |
表 5.1.1:两个概率分布函数`p_data``p_g`之间的散度函数
......@@ -71,13 +71,13 @@ EMD 背后的想法是,它是`d = ||x - y||`传输多少质量`γ(x, y)`,为
![](img/B14853_05_016.png) (Equation 5.1.5)
找出最小的![](img/B14853_05_017.png)
找出最小的`L^(D)`
![](img/B14853_05_018.png) (Equation 5.1.6)
![](img/B14853_05_019.png) (Equation 5.1.7)
积分内部的术语为![](img/B14853_05_020.png)的形式,对于不包括![](img/B14853_05_024.png)的任何![](img/B14853_05_023.png),在![](img/B14853_05_022.png)的![](img/B14853_05_021.png)处都有一个已知的最大值。 由于该积分不会更改此表达式的最大值(或![](img/B14853_05_025.png)的最小值)的位置,因此最佳判别器为:
积分内部的术语为`y -> a log(y) + b log(1 - y)`的形式,对于不包括`{0, 0}`的任何`a, b ∈ R^2`,在`y ∈ [0. 1]``a / (a + b)`处都有一个已知的最大值。 由于该积分不会更改此表达式的最大值(或`L^(D)`的最小值)的位置,因此最佳判别器为:
![](img/B14853_05_026.png) (Equation 5.1.8)
......@@ -91,19 +91,19 @@ EMD 背后的想法是,它是`d = ||x - y||`传输多少质量`γ(x, y)`,为
![](img/B14853_05_030.png) (Equation 5.1.12)
我们可以从“公式 5.1.12”观察到,最佳判别器的损失函数为常数减去真实分布![](img/B14853_05_031.png)和任何发生器分布`p_g`之间的 JS 散度的两倍。 最小化![](img/B14853_05_032.png)意味着最大化![](img/B14853_05_033.png),否则鉴别者必须正确地将真实数据中的伪造物分类。
我们可以从“公式 5.1.12”观察到,最佳判别器的损失函数为常数减去真实分布`p_data`和任何发生器分布`p_g`之间的 JS 散度的两倍。 最小化`L^(D*)`意味着最大化`D[JS](p_data || p_g)`,否则鉴别者必须正确地将真实数据中的伪造物分类。
同时,我们可以放心地说,最佳生成器是当生成器分布等于真实数据分布时:
![](img/B14853_05_034.png) (Equation 5.1.13)
这是有道理的,因为生成器的目的是通过学习真实的数据分布来欺骗判别器。 有效地,我们可以通过最小化`D[JS]`或通过制作![](img/B14853_05_035.png)来获得最佳生成器。 给定最佳生成器,最佳判别器为![](img/B14853_05_036.png)和![](img/B14853_05_037.png)
这是有道理的,因为生成器的目的是通过学习真实的数据分布来欺骗判别器。 有效地,我们可以通过最小化`D[JS]`或通过制作`p_g -> p_data`来获得最佳生成器。 给定最佳生成器,最佳判别器为`D*(x) = 1 / 2``L^(D*) = 2log2 = 0.60`
问题在于,当两个分布没有重叠时,就没有平滑函数可以帮助缩小它们之间的差距。 训练 GAN 不会因梯度下降而收敛。 例如,假设:
![](img/B14853_05_038.png)=![](img/B14853_05_039.png) where ![](img/B14853_05_040.png) (Equation 5.1.14)
`p_data = (x, y) where x = 0, y ~ U(0, 1)` (Equation 5.1.14)
![](img/B14853_05_041.png)=![](img/B14853_05_042.png) where ![](img/B14853_05_043.png) (Equation 5.1.15)
`p_g = (x, y) where x = θ, y ~ U(0, 1)` (Equation 5.1.15)
这两个分布显示在“图 5.1.2”中:
......@@ -118,7 +118,7 @@ EMD 背后的想法是,它是`d = ||x - y||`传输多少质量`γ(x, y)`,为
* ![](img/B14853_05_047.png)
* ![](img/B14853_05_048.png)
由于`D[JS]`是一个常数,因此 GAN 将没有足够的梯度来驱动![](img/B14853_05_049.png)。 我们还会发现`D[KL]`或反向`D[KL]`也不起作用。 但是,通过`W(p_data, p_g)`,我们可以拥有平滑函数,以便通过梯度下降获得![](img/B14853_05_050.png)。 为了优化 GAN,EMD 或 Wasserstein 1 似乎是一个更具逻辑性的损失函数,因为在两个分布具有极小或没有重叠的情况下,`D[JS]`会失败。
由于`D[JS]`是一个常数,因此 GAN 将没有足够的梯度来驱动`p_g -> p_data`。 我们还会发现`D[KL]`或反向`D[KL]`也不起作用。 但是,通过`W(p_data, p_g)`,我们可以拥有平滑函数,以便通过梯度下降获得`p_g -> p_data`。 为了优化 GAN,EMD 或 Wasserstein 1 似乎是一个更具逻辑性的损失函数,因为在两个分布具有极小或没有重叠的情况下,`D[JS]`会失败。
为了帮助进一步理解,可以在以下位置找到[有关距离函数的精彩讨论](https://lilianweng.github.io/lil-log/2017/08/20/from-GAN-to-WGAN.html)
......@@ -126,17 +126,17 @@ EMD 背后的想法是,它是`d = ||x - y||`传输多少质量`γ(x, y)`,为
## 使用 Wasserstein 损失
在使用 EMD 或 Wasserstein 1 之前,还有一个要解决的问题。 耗尽![](img/B14853_05_051.png)的空间来找到![](img/B14853_05_052.png)是很棘手的。 提出的解决方案是使用其 Kantorovich-Rubinstein 对偶:
在使用 EMD 或 Wasserstein 1 之前,还有一个要解决的问题。 耗尽`Π(p_data, p_g)`的空间来找到`γ ~ Π(p_data, p_g)`是很棘手的。 提出的解决方案是使用其 Kantorovich-Rubinstein 对偶:
![](img/B14853_05_053.png) (Equation 5.1.16)
等效地,EMD ![](img/B14853_05_054.png)是所有 K-Lipschitz 函数上的最高值(大约是最大值):![](img/B14853_05_055.png)。 K-Lipschitz 函数满足以下约束:
等效地,EMD `sup ||f||_L <= 1`是所有 K-Lipschitz 函数上的最高值(大约是最大值):`f: x -> R`。 K-Lipschitz 函数满足以下约束:
![](img/B14853_05_056.png) (Equation 5.1.17)
对于所有![](img/B14853_05_057.png)。 K-Lipschitz 函数具有有界导数,并且几乎总是连续可微的(例如,![](img/B14853_05_058.png)具有有界导数并且是连续的,但在`x = 0`时不可微分)。
对于所有`x[1], x[2] ∈ R`。 K-Lipschitz 函数具有有界导数,并且几乎总是连续可微的(例如,`f(x) = |x|`具有有界导数并且是连续的,但在`x = 0`时不可微分)。
“公式 5.1.16”可以通过找到 K-Lipschitz 函数![](img/B14853_05_059.png)的族来求解:
“公式 5.1.16”可以通过找到 K-Lipschitz 函数`{f[w]}, w ∈ W`的族来求解:
![](img/B14853_05_060.png) (Equation 5.1.18)
......@@ -144,7 +144,7 @@ EMD 背后的想法是,它是`d = ||x - y||`传输多少质量`γ(x, y)`,为
![](img/B14853_05_061.png) (Equation 5.1.19)
我们使用粗体字母突出显示多维样本的一般性。 最后一个问题是如何找到功能族![](img/B14853_05_062.png)。 所提出的解决方案是在每次梯度更新时进行的。 判别器`w`的权重被限制在上下限之间(例如,-0.01 和 0.01):
我们使用粗体字母突出显示多维样本的一般性。 最后一个问题是如何找到功能族`w ∈ W`。 所提出的解决方案是在每次梯度更新时进行的。 判别器`w`的权重被限制在上下限之间(例如,-0.01 和 0.01):
![](img/B14853_05_063.png) (Equation 5.1.20)
......@@ -158,7 +158,7 @@ EMD 背后的想法是,它是`d = ||x - y||`传输多少质量`γ(x, y)`,为
在发电机损失函数中,第一项消失了,因为它没有针对实际数据进行直接优化。
“表 5.1.2”显示了 GAN 和 WGAN 的损失函数之间的差异。 为简洁起见,我们简化了![](img/B14853_05_066.png)和![](img/B14853_05_067.png)的表示法:
“表 5.1.2”显示了 GAN 和 WGAN 的损失函数之间的差异。 为简洁起见,我们简化了`L^(D)``L^(G)`的表示法:
| **网络** | **损失函数** | **公式** |
| --- | --- | --- |
......@@ -172,23 +172,33 @@ EMD 背后的想法是,它是`d = ||x - y||`传输多少质量`γ(x, y)`,为
这些损失功能用于训练 WGAN,如“算法 5.1.1”中所示。
**算法 5.1.1 WGAN**。 参数的值为![](img/B14853_05_073.png),![](img/B14853_05_074.png),![](img/B14853_05_075.png)和![](img/B14853_05_076.png)
**算法 5.1.1 WGAN**。 参数的值为`α = 0.00005``c = 0.01``m = 64``n_critic = 5`
要求:![](img/B14853_05_077.png),学习率。`c`是削波参数。`m`,批量大小。 ![](img/B14853_05_078.png),即每个生成器迭代的评论(鉴别)迭代次数。
要求:`α`,学习率。`c`是削波参数。`m`,批量大小。 `n_critic`,即每个生成器迭代的评论(鉴别)迭代次数。
要求:![](img/B14853_05_079.png),初始注释器(discriminator)参数。 ![](img/B14853_05_080.png),初始发电机参数:
要求:`w[D]`,初始注释器(discriminator)参数。 `θ[D]`,初始发电机参数:
1. `while` ![](img/B14853_05_081.png)尚未收敛`do`
2. `for` ![](img/B14853_05_082.png) `do`
3. 从真实数据中抽样一批![](img/B14853_05_083.png)
4. 从均匀的噪声分布中采样一批![](img/B14853_05_084.png)
5. ![](img/B14853_05_085.png),计算判别器梯度
6. ![](img/B14853_05_086.png),更新判别器参数
7. ![](img/B14853_05_087.png),剪辑判别器权重
1.`θ[D]`尚未收敛,执行:
2. 对于`t = 1, ..., n_critic`,执行:
3. 从真实数据中抽样一批`{x^(i)} ~ p_data, i = 1, ..., m`
4. 从均匀的噪声分布中采样一批`{z^(i)} ~ p_x, i = 1, ..., m`
5. ![](img/B14853_05_085.png)
计算判别器梯度
6. ![](img/B14853_05_086.png)
更新判别器参数
7. ![](img/B14853_05_087.png)
剪辑判别器权重
8. `end for`
9. 从均匀的噪声分布中采样一批![](img/B14853_05_088.png)
10. ![](img/B14853_05_089.png),计算生成器梯度
11. ![](img/B14853_05_090.png),更新生成器参数
9. 从均匀的噪声分布中采样一批`{z^(i)} ~ p_x, i = 1, ..., m`
10. ![](img/B14853_05_089.png)
计算生成器梯度
11. ![](img/B14853_05_090.png)
更新生成器参数
12. `end while`
“图 5.1.3”展示了 WGAN 模型实际上与 DCGAN 相同,除了伪造的/真实的数据标签和损失函数:
......@@ -209,9 +219,9 @@ EMD 背后的想法是,它是`d = ||x - y||`传输多少质量`γ(x, y)`,为
![](img/B14853_05_091.png) (Equation 5.1.23)
对于真实数据,其中`y_label = 1.0`,对于假数据,`y_label= -1.0`。 为了简化符号,我们删除了上标`(i)`。 对于判别器,当使用实际数据进行训练时,WGAN 增加![](img/B14853_05_092.png)以最小化损失函数。
对于真实数据,其中`y_label = 1.0`,对于假数据,`y_label= -1.0`。 为了简化符号,我们删除了上标`(i)`。 对于判别器,当使用实际数据进行训练时,WGAN 增加`y_pred = D[w](x)`以最小化损失函数。
使用伪造数据进行训练时,WGAN 会降低![](img/B14853_05_093.png)以最大程度地减少损失函数。 对于生成器,当在训练过程中将伪数据标记为真实数据时,WGAN 增加![](img/B14853_05_094.png)以最小化损失功能。 请注意,`y_label`除了其符号外,对损失功能没有直接贡献。 在`tf.keras`中,“公式 5.1.23”实现为:
使用伪造数据进行训练时,WGAN 会降低`y_pred = D[w](g(z))`以最大程度地减少损失函数。 对于生成器,当在训练过程中将伪数据标记为真实数据时,WGAN 增加`y_pred = D[w](g(z))`以最小化损失功能。 请注意,`y_label`除了其符号外,对损失功能没有直接贡献。 在`tf.keras`中,“公式 5.1.23”实现为:
```py
def wasserstein_loss(y_label, y_pred):
......@@ -639,7 +649,7 @@ ACGAN 在原理上类似于我们在上一章中讨论的**条件 GAN**(**CGAN
表 5.3.1:CGAN 和 ACGAN 损失函数之间的比较
ACGAN 损失函数与 CGAN 相同,除了附加的分类器损失函数。 除了从假图片中识别真实图像的原始任务之外,判别器的“公式 5.3.1”还具有对真假图像正确分类的附加任务。 生成器的“公式 5.3.2”意味着,除了尝试用伪造的图像来欺骗判别器(![](img/B14853_05_108.png))之外,它还要求判别器正确地对那些伪造的图像进行分类(![](img/B14853_05_109.png))。
ACGAN 损失函数与 CGAN 相同,除了附加的分类器损失函数。 除了从假图片中识别真实图像的原始任务之外,判别器的“公式 5.3.1”还具有对真假图像正确分类的附加任务。 生成器的“公式 5.3.2”意味着,除了尝试用伪造的图像来欺骗判别器(`-E[z] log D(g(z | y))`)之外,它还要求判别器正确地对那些伪造的图像进行分类(`-E[z] log P(c | g(z | y))`)。
从 CGAN 代码开始,仅修改判别器和训练功能以实现 ACGAN。 `gan.py`还提供了判别器和生成器构建器功能。 要查看判别器上所做的更改,清单 5.3.1 显示了构建器功能,其中突出显示了执行图像分类的辅助解码器网络和双输出。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册