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