@@ -57,39 +57,39 @@ StackedGAN 使用预训练的编码器或分类器,以帮助解开潜在代码
57
57
58
58
![ ] ( img/B14853_06_002.png ) (Equation 6.1.2)
59
59
60
- 生成器函数![ ] ( img/B14853_06_003.png ) 带有不可压缩的噪声代码和潜在代码。 从生成器的角度来看,优化` z = (z, c) ` 与优化` z ` 相同。
60
+ 生成器函数` x = g(z, c) = g(z) ` 带有不可压缩的噪声代码和潜在代码。 从生成器的角度来看,优化` z = (z, c) ` 与优化` z ` 相同。
61
61
62
62
当提出解决方案时,生成器网络将仅忽略解纠结代码所施加的约束。
63
63
64
- 生成器学习分布![ ] ( img/B14853_06_004.png ) 。 这实际上将打乱分散表示的目的。
64
+ 生成器学习分布` p_g(x | c) = p_g(x) ` 。 这实际上将打乱分散表示的目的。
65
65
66
- InfoGAN 的关键思想是强制 GAN 不要忽略潜在代码` c ` 。 这是通过最大化` c ` 和![ ] ( img/B14853_06_005.png ) 之间的相互信息来完成的。 在下一节中,我们将公式化 InfoGAN 的损失函数。
66
+ InfoGAN 的关键思想是强制 GAN 不要忽略潜在代码` c ` 。 这是通过最大化` c ` 和` g(z, c) ` 之间的相互信息来完成的。 在下一节中,我们将公式化 InfoGAN 的损失函数。
67
67
68
68
# InfoGAN
69
69
70
- 为了加强对代码的纠缠,InfoGAN 提出了一种针对原始损失函数的正则化函数,该函数可最大化潜在代码` c ` 和![ ] ( img/B14853_06_006.png ) 之间的互信息:
70
+ 为了加强对代码的纠缠,InfoGAN 提出了一种针对原始损失函数的正则化函数,该函数可最大化潜在代码` c ` 和` g(z, c) ` 之间的互信息:
71
71
72
72
![ ] ( img/B14853_06_007.png ) (Equation 6.1.3)
73
73
74
- 正则化器在生成用于合成伪图像的函数时,会强制生成器考虑潜在代码。 在信息论领域,潜码` c ` 和![ ] ( img/B14853_06_008.png ) 之间的互信息定义为:
74
+ 正则化器在生成用于合成伪图像的函数时,会强制生成器考虑潜在代码。 在信息论领域,潜码` c ` 和` g(z, c) ` 之间的互信息定义为:
75
75
76
76
![ ] ( img/B14853_06_009.png ) (Equation 6.1.4)
77
77
78
- 其中` H(c) ` 是潜码的熵, ` c ` , ![ ] ( img/B14853_06_010.png ) 是观察发生器的输出后` c ` 的条件熵, ![ ] ( img/B14853_06_011.png ) 。 熵是对随机变量或事件的不确定性的度量。 例如,** 在东方升起** 之类的信息具有较低的熵,而** 在彩票中赢得大奖** 具有较高的熵。 可以在“第 13 章”,“使用互信息的无监督学习”中找到有关互信息的更详细讨论。
78
+ 其中` H(c) ` 是潜码 ` c ` 的熵, ` H(c | g(z | c)) ` 是观察发生器的输出后` c ` 的条件熵, ` g(z, c) ` 。 熵是对随机变量或事件的不确定性的度量。 例如,** 在东方升起** 之类的信息具有较低的熵,而** 在彩票中赢得大奖** 具有较高的熵。 可以在“第 13 章”,“使用互信息的无监督学习”中找到有关互信息的更详细讨论。
79
79
80
- 在“公式 6.1.4”中,最大化互信息意味着在观察生成的输出时,将![ ] ( img/B14853_06_012.png ) 最小化或减小潜码中的不确定性。 这是有道理的,因为例如在 MNIST 数据集中,如果 GAN 看到生成器 8 看到了数字 8,则生成器对合成数字 8 变得更有信心。
80
+ 在“公式 6.1.4”中,最大化互信息意味着在观察生成的输出时,将` H(c | g(z | c)) ` 最小化或减小潜码中的不确定性。 这是有道理的,因为例如在 MNIST 数据集中,如果 GAN 看到生成器 8 看到了数字 8,则生成器对合成数字 8 变得更有信心。
81
81
82
- 但是,![ ] ( img/B14853_06_013.png ) 很难估计,因为它需要后验![ ] ( img/B14853_06_014.png ) 的知识,这是我们无法获得的。 为简单起见,我们将使用常规字母` x ` 表示数据分布。
82
+ 但是,` H(c | g(z | c)) ` 很难估计,因为它需要后验` P(c | g(z | c)) = P(c | x) ` 的知识,这是我们无法获得的。 为简单起见,我们将使用常规字母` x ` 表示数据分布。
83
83
84
- 解决方法是通过使用辅助分布![ ] ( img/B14853_06_015.png ) 估计后验来估计互信息的下界。 InfoGAN 估计相互信息的下限为:
84
+ 解决方法是通过使用辅助分布` Q(c | x) ` 估计后验来估计互信息的下界。 InfoGAN 估计相互信息的下限为:
85
85
86
86
![ ] ( img/B14853_06_016.png ) (Equation 6.1.5)
87
87
88
- 在 InfoGAN 中,` H(c) ` 被假定为常数。 因此,使相互信息最大化是使期望最大化的问题。 生成器必须确信已生成具有特定属性的输出。 我们应注意,此期望的最大值为零。 因此,相互信息的下限的最大值为` H(c) ` 。 在 InfoGAN 中,离散隐码的![ ] ( img/B14853_06_017.png ) 可以由` softmax ` 非线性表示。 期望是` tf.keras ` 中的负` categorical_crossentropy ` 损失。
88
+ 在 InfoGAN 中,` H(c) ` 被假定为常数。 因此,使相互信息最大化是使期望最大化的问题。 生成器必须确信已生成具有特定属性的输出。 我们应注意,此期望的最大值为零。 因此,相互信息的下限的最大值为` H(c) ` 。 在 InfoGAN 中,离散隐码的` Q(c | x) ` 可以由` softmax ` 非线性表示。 期望是` tf.keras ` 中的负` categorical_crossentropy ` 损失。
89
89
90
- 对于一维连续代码,期望是` c ` 和` x ` 的双整数。 这是由于期望从纠缠的代码分布和生成器分布中采样。 估计期望值的一种方法是通过假设样本是连续数据的良好度量。 因此,损失估计为![ ] ( img/B14853_06_018.png ) 。 在“第 13 章”,“使用互信息的无监督学习”中,我们将提供对互信息的更精确估计。
90
+ 对于一维连续代码,期望是` c ` 和` x ` 的双整数。 这是由于期望从纠缠的代码分布和生成器分布中采样。 估计期望值的一种方法是通过假设样本是连续数据的良好度量。 因此,损失估计为` c log Q(c | x) ` 。 在“第 13 章”,“使用互信息的无监督学习”中,我们将提供对互信息的更精确估计。
91
91
92
- 为了完成 InfoGAN 的网络,我们应该有![ ] ( img/B14853_06_0151.png ) 的实现。 为了简单起见,网络 Q 是一个附加到判别器第二到最后一层的辅助网络。 因此,这对原始 GAN 的训练影响很小。
92
+ 为了完成 InfoGAN 的网络,我们应该有` Q(c | x) ` 的实现。 为了简单起见,网络 Q 是一个附加到判别器第二到最后一层的辅助网络。 因此,这对原始 GAN 的训练影响很小。
93
93
94
94
“图 6.1.2”显示了 InfoGAN 网络图:
95
95
@@ -105,11 +105,11 @@ InfoGAN 的关键思想是强制 GAN 不要忽略潜在代码`c`。 这是通过
105
105
| | ![ ] ( img/B14853_06_020.png ) | 4.1.5 |
106
106
| InfoGAN | ![ ] ( img/B14853_06_021.png ) | 6.1.1 |
107
107
| | ![ ] ( img/B14853_06_022.png ) | 6.1.2 |
108
- | | 对于连续代码,InfoGAN 建议使用![ ] ( img/B14853_06_023.png ) 的值。 在我们的示例中,我们设置![ ] ( img/B14853_06_024.png ) 。 对于离散代码,InfoGAN 建议使用![ ] ( img/B14853_06_025.png ) 。 | |
108
+ | | 对于连续代码,InfoGAN 建议使用` λ < 1 ` 的值。 在我们的示例中,我们设置` λ = 0.5 ` 。 对于离散代码,InfoGAN 建议使用` λ = 1 ` 。 | |
109
109
110
110
表 6.1.1:GAN 和 InfoGAN 的损失函数之间的比较
111
111
112
- InfoGAN 的损失函数与 GAN 的区别是附加术语![ ] ( img/B14853_06_026.png ) ,其中![ ] ( img/B14853_06_027.png ) 是一个小的正常数。 最小化 InfoGAN 的损失功能可以将原始 GAN 的损失最小化,并将互信息最大化![ ] ( img/B14853_06_028.png ) 。
112
+ InfoGAN 的损失函数与 GAN 的区别是附加术语` -λI(c; g(z, c)) ` ,其中` λ ` 是一个小的正常数。 最小化 InfoGAN 的损失功能可以将原始 GAN 的损失最小化,并将互信息最大化` I(c; g(z, c)) ` 。
113
113
114
114
如果将其应用于 MNIST 数据集,InfoGAN 可以学习解开的离散码和连续码,以修改生成器输出属性。 例如,像 CGAN 和 ACGAN 一样,将使用` 10-dim ` 一键标签形式的离散代码来指定要生成的数字。 但是,我们可以添加两个连续的代码,一个用于控制书写样式的角度,另一个用于调整笔划宽度。“图 6.1.3”显示了 InfoGAN 中 MNIST 数字的代码。 我们保留较小尺寸的纠缠代码以表示所有其他属性:
115
115
@@ -323,7 +323,7 @@ def discriminator(inputs,
323
323
324
324
图 6.1.4:InfoGAN Keras 模型
325
325
326
- 建立判别器和对抗模型还需要进行许多更改。 更改取决于所使用的损失函数。 原始的判别器损失函数` binary_crossentropy ` ,用于离散码的` categorical_crossentropy ` 和每个连续码的` mi_loss ` 函数构成了整体损失函数。 除` mi_loss ` 函数的权重为 0.5(对应于连续代码的![ ] ( img/B14853_06_029.png ) )外,每个损失函数的权重均为 1.0。
326
+ 建立判别器和对抗模型还需要进行许多更改。 更改取决于所使用的损失函数。 原始的判别器损失函数` binary_crossentropy ` ,用于离散码的` categorical_crossentropy ` 和每个连续码的` mi_loss ` 函数构成了整体损失函数。 除` mi_loss ` 函数的权重为 0.5(对应于连续代码的` λ = 0.5 ` )外,每个损失函数的权重均为 1.0。
327
327
328
328
“列表 6.1.3”突出显示了所做的更改。 但是,我们应该注意,通过使用构造器函数,判别器被实例化为:
329
329
@@ -782,31 +782,31 @@ def build_encoder(inputs, num_labels=10, feature1_dim=256):
782
782
| | ![ ] ( img/B14853_06_034.png ) | 6.2.3 |
783
783
| | ![ ] ( img/B14853_06_035.png ) | 6.2.4 |
784
784
| | ![ ] ( img/B14853_06_036.png ) | 6.2.5 |
785
- | | 其中![ ] ( img/B14853_06_037.png ) 是权重,` i ` 是编码器和 GAN ID | |
785
+ | | 其中` λ1, λ2, λ3 ` 是权重,` i ` 是编码器和 GAN ID | |
786
786
787
787
表 6.2.1:GAN 和 StackedGAN 的损失函数之间的比较。 ` ~p_data ` 表示从相应的编码器数据(输入,特征或输出)采样
788
788
789
- 条件“公式 6.2.3”中的损失函数![ ] ( img/B14853_06_038.png ) 确保发生器不会忽略输入` f[i + 1] ` , 当从输入噪声代码` z[i] ` 合成输出` f[i] ` 时。 编码器` Encoder[i] ` 必须能够通过反转发生器的过程` Generator[i] ` 来恢复发生器输入。 通过` L2 ` 或欧几里德距离(** 均方误差** (** MSE** ))来测量发电机输入和使用编码器恢复的输入之间的差异。
789
+ 条件“公式 6.2.3”中的损失函数` L_i^(G_cond) ` 确保发生器不会忽略输入` f[i + 1] ` , 当从输入噪声代码` z[i] ` 合成输出` f[i] ` 时。 编码器` Encoder[i] ` 必须能够通过反转发生器的过程` Generator[i] ` 来恢复发生器输入。 通过` L2 ` 或欧几里德距离(** 均方误差** (** MSE** ))来测量发电机输入和使用编码器恢复的输入之间的差异。
790
790
791
- “图 6.2.4”显示了![ ] ( img/B14853_06_039.png ) 计算所涉及的网络元素:
791
+ “图 6.2.4”显示了` L_0^(G_cond) ` 计算所涉及的网络元素:
792
792
793
793
![ ] ( img/B14853_06_11.png )
794
794
795
- 图 6.2.4:图 6.2.3 的简化版本,仅显示![ ] ( img/B14853_06_040.png ) 计算中涉及的网络元素
795
+ 图 6.2.4:图 6.2.3 的简化版本,仅显示` L_0^(G_cond) ` 计算中涉及的网络元素
796
796
797
- 但是,条件损失函数引入了一个新问题。 发生器忽略输入噪声代码` z[i] ` ,仅依赖` f[i + 1] ` 。 熵损失函数“公式 6.2.4”中的![ ] ( img/B14853_06_041.png ) 确保发生器不会忽略噪声代码` z[i] ` 。 * Q 网络* 从发生器的输出中恢复噪声代码。 恢复的噪声和输入噪声之间的差异也通过` L2 ` 或欧几里德距离(MSE)进行测量。
797
+ 但是,条件损失函数引入了一个新问题。 发生器忽略输入噪声代码` z[i] ` ,仅依赖` f[i + 1] ` 。 熵损失函数“公式 6.2.4”中的` L_0^(G_ent) ` 确保发生器不会忽略噪声代码` z[i] ` 。 * Q 网络* 从发生器的输出中恢复噪声代码。 恢复的噪声和输入噪声之间的差异也通过` L2 ` 或欧几里德距离(MSE)进行测量。
798
798
799
- “图 6.2.5”显示了![ ] ( img/B14853_06_042.png ) 计算中涉及的网络元素:
799
+ “图 6.2.5”显示了` L_0^(G_ent) ` 计算中涉及的网络元素:
800
800
801
801
![ ] ( img/B14853_06_12.png )
802
802
803
- 图 6.2.5:图 6.2.3 的简单版本仅向我们显示了![ ] ( img/B14853_06_043.png ) 计算中涉及的网络元素
803
+ 图 6.2.5:图 6.2.3 的简单版本仅向我们显示了` L_0^(G_ent) ` 计算中涉及的网络元素
804
804
805
- 最后的损失功能类似于通常的 GAN 损失。 它包括判别器损失![ ] ( img/B14853_06_044.png ) 和生成器(通过对抗性)损失![ ] ( img/B14853_06_045.png ) 。“图 6.2.6”显示了 GAN 丢失所涉及的元素。
805
+ 最后的损失功能类似于通常的 GAN 损失。 它包括判别器损失` L_i^(D) ` 和生成器(通过对抗性)损失` L_i^(G_adv) ` 。“图 6.2.6”显示了 GAN 丢失所涉及的元素。
806
806
807
807
![ ] ( img/B14853_06_13.png )
808
808
809
- 图 6.2.6:图 6.2.3 的简化版本,仅显示了![ ] ( img/B14853_06_046.png ) 和 ![ ] ( img/B14853_06_047.png ) 计算中涉及的网络元素
809
+ 图 6.2.6:图 6.2.3 的简化版本,仅显示了` L_i^(D) ` 和 ` L_0^(G_adv) ` 计算中涉及的网络元素
810
810
811
811
在“公式 6.2.5”中,三个发电机损耗函数的加权和为最终发电机损耗函数。 在我们将要介绍的 Keras 代码中,除的熵损失设置为 10.0 之外,所有权重都设置为 1.0。 在“公式 6.2.1”至“公式 6.2.5”中,` i ` 是指编码器和 GAN 组 ID 或级别。 在原始论文中,首先对网络进行独立训练,然后进行联合训练。 在独立训练期间,编码器将首先进行训练。 在联合训练期间,将使用真实数据和虚假数据。
812
812
0 commit comments