Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
大唐爆破僧
apachecn-dl-zh
提交
96f89ec5
A
apachecn-dl-zh
项目概览
大唐爆破僧
/
apachecn-dl-zh
与 Fork 源项目一致
Fork自
OpenDocCN / apachecn-dl-zh
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
A
apachecn-dl-zh
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
96f89ec5
编写于
1月 07, 2021
作者:
W
wizardforcel
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
2021-01-07 20:47:37
上级
be5f23bb
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
40 addition
and
30 deletion
+40
-30
new/adv-dl-tf2-keras/05.md
new/adv-dl-tf2-keras/05.md
+40
-30
未找到文件。
new/adv-dl-tf2-keras/05.md
浏览文件 @
96f89ec5
...
...
@@ -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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录