我们在上一篇文章里学习了StyleGAN2是怎样消除液滴伪影的,这是StyleGAN2论文讨论的最重要的一个问题,内容请参考:
StyleGAN2探骊得珠(二):论文解读与注释,一代中的ARTIFACT是怎样产生的,二代网络中又是怎样消除它们的?
上面这篇文章的内容对应于下面【表1】中的“B +Weight demodulation”。
论文中,第二个重要问题是如何对生成图像的质量进行定量分析,并且找到提升图像质量的新的方法,本篇文章就围绕这个问题来继续学习和解读StyleGAN2的论文,其内容对应于下面【表1】中的“C +Lazy regularization”和“D +Path length regularization”。
论文引言(Introduction)部分的第4自然段,作者开宗明义:对于用生成(对抗网络)方法产生的图像,图像质量的定量分析依然是一个具有挑战性的主题。Fréchet Inception Distance(FID)测量的是(被分析图像在)两个分布密度上的差异,而这两个分布是在Inception V3分类器的高维特征空间上进行计算得到的。精确度和召回率(P&R)通过显式地量化提供了额外的可视性,其中精确度是指与训练数据相似的生成图像的百分比,召回率是指(生成的“真”图像占)可以被生成的训练数据的百分比。我们使用这些度量值来量化(StyleGAN2模型的)改进程度。
FID 和 P&R 都是基于分类器网络,最近的研究发现分类器网络聚焦于纹理,而不是聚焦于形状。因而,这两个度量值不能准确地捕捉到图像质量的所有方面。我们注意到感知路径长度(PPL)度量值与形状的一致性和稳定型相关,(最初)引入PPL是把它当做评估潜码空间插值质量的一种方法。基于这个发现,我们对合成网络进行正则化运算以利于实现平滑映射(见:第3节),由此在图像质量上取得了清晰可见的改进。为了抵消计算开销,我们也建议以更低的频次来执行所有正则化运算(即:后文所说的“延迟正则化”,lazy regularization),我们注意到这么做并不影响(正则化运算的)效果。
【表1】. 主要(测试)结果。对于每一轮训练,我们选用FID数值最低的训练快照。我们用不同的随机种子计算每个度量值10次,然后取它们的平均值写入报告。“路径长度”(Path length)这一列(数据)对应于PPL度量值,它基于W空间的路径终点进行计算。对于LSUN数据集,我们报告的路径长度没有采用(对图像进行)中心裁剪的方法,该方法最初提出时是为了让FFHQ(数据集)应用它。 FFHQ数据集包含了7万张图像,在训练过程中我们向判别器展示(或者说:投喂)了2500万张图像。对于LSUN CAR数据集,对应的数字是89.3万张与5700万张。
【图4】. 使用StyleGAN基线模型(【表1】中的配置 A)时,感知路径长度与图像质量之间的联系。(a)PPL数值较低(≤ 第10个百分位数)的随机实例。(b)PPL数值较高(≥ 第90个百分位数)的实例。在图像的语义一致性和PPL分数之间有着显而易见的相关性。
来到论文的第3节,论文中说,我们在被观察图像的质量与感知路径长度(PPL)之间发现了一种有趣的相关性。最初引入PPL是把它作为一个度量值,用于定量分析从潜码空间到输出图像的映射平滑度——度量的方法是在潜码空间施加很小的扰动时,测量多个生成图像之间的平均LPIPS距离。我们再次看一下【图13】和【图14】,较小的PPL(更平滑的生成器映射)看起来与更高的整体图像质量相关,此时其他的度量值(FID 和 P&R)却看不到这个变化。【图4】更仔细地检查了这种相关性,其方法是:在基于LSUN CAT数据集训练的StyleGAN的 W 空间里,围绕单独数据点进行潜码空间采样,然后计算每个图像的PPL分数,PPL分数较低的确表明是高质量图像,反之亦然(译者注:PPL分数较高表明是低质量图像)。【图5a】展示了每个图像PPL分数所对应的直方图,并揭示了其概率分布的长尾特征。模型的整体PPL(分布)就是每个图像PPL分数的期望值(分布)。
【图5】. 用StyleGAN基线模型(【表1】中的配置 A,FID = 8.53,PPL = 924)生成的单独图像的PPL分数的概率分布。对应于【图4】中的百分点数范围用橙色高亮标出。(b)我们的方法(配置 F)显著地改善了PPL的概率分布(展示的是一个具有相同FID = 8.53的快照,PPL = 387)。
关于为什么较低的PPL分数会与图像的高质量相关,论文并没有给出充分的理由,作者只做了一个较为牵强的直观解释。
论文中说,我们假设在训练过程中,当判别器对破损的图像进行惩罚时,生成器最直接的改进方法就是对生成好图像的潜码空间区域进行有效地伸展。这会导致低质量图像被挤压到一个狭小的快速变化的潜码空间区域内。虽然这在短期内改进了平均的输出(图像)质量,但累积的变形损害了训练(进一步优化的)动力,并因此也损害了最终的图像质量。
也就是说,生成器为了避免总是被判别器惩罚,在整个潜码空间区域的布局上,对应于好图像的潜码会逐渐形成一个开阔平稳的平原,而对应于破损图像的潜码会形成犬牙交错、高低起伏的褶皱山区。在褶皱山区内部,生成器的映射平滑度是非常差的,即:在潜码空间上一个小的扰动就可能带来非常大的输出图像的改变,这在整体上导致PPL分数偏高(表明生成图像的质量较差)。当此时,若基于某些度量指标(如:FID 或 P&R),StyleGAN神经网络已经达到训练的完成标准而停止了训练,而事实上基于PPL指标还有很大的改进余地,这就使得整个训练工作只得到了一个并不完美的半成品,因此说“损害了训练(进一步优化的)动力”。
论文把PPL的正则化项引入到损失函数中,并说明何时可以使得PPL的正则化项取得最小值(即:生成器的映射平滑度最好)。
延迟正则化(Lazy regularization)适用于所有正则化技术,而不仅仅适用于PPL的正则化。
论文中说,通常,主损失函数(如:logistic损失函数)与正则化项(如:正则化项R₁)被写为同一个表达式(译者注,如:Loss = Loss_logistic + R₁),因此会同时被优化。我们发现较之主损失函数,正则化项通常可以用低得多的频率进行计算,这样就可以极大地减少计算成本和整体的内存使用率。【表1】的 C 行显示,每16个小批量(minibatch)才执行一次R₁正则化,并没有造成(最终结果的)任何损害,因此在新的正则化器中我们也采用了这个策略。附录 B 给出了实现的细节。
下面回到改善图像质量的主题,即如何实现感知路径长度(PPL)的正则化。
论文中说,在生成器中,过度的路径变形显然表现为不良的局部状态:W空间中的任何一个小区域在被合成网络 g 映射时可以被任意挤压和伸展。与更早的研究工作相一致,如果在潜码空间的每一个点上,不论扰动的方向如何,小的位移在图像空间上都生成相同量级的变化,我们就认为从潜码空间映射到图像空间的生成器是状态良好的。
论文继续说,在一个单个的w向量 ∈ W空间处,对于实现映射 g(w) : W --> Y 生成器的属性,其尺度调整的本地度量值可以由雅克比矩阵 Jw = ∂ g(w)/∂ w 捕获。不论其方向如何,我们都希望保留向量的期望长度,出于这样的动机,将我们的正则化器用公式表示为:
这里,y是随机图像,其像素(数值)强度服从正态分布;w ~ f( z)(译者注:w是z的函数),z 是正态分布的。在附录 C 中我们证明,在高维度上,当 Jw 在任何 w 向量处都正交(作为一个全局尺度)时,该先验(期望)是最小化的。正交矩阵保留了(向量)长度,并且沿任何维度都没有引入挤压(变形)。
我们直观地进行理解,由于y = g( w ),则 Δ y = ∂ g(w)/∂ w ·Δw,即:Δ y = Jw·Δw
同时,由于Jw是正交矩阵,JwT·Jw = E (E 为单位矩阵),因此:JwT·Δ y = Δw。
当 y 是随机图像,其像素(数值)强度服从正态分布时,w 也表现为服从正态分布。也就是说,w 向量的微小扰动,表现为图像 y 的微小变化,二者的变化模式趋同。
若基于训练数据得出的Jw在任何 w 向量处都正交时,则公式(4)所表达的先验(期望)是最小的,这意味着此时 w 向量的微小扰动,所带来的图像 y 的变化是最小的,即:生成器的映射平滑度为最优。
论文继续说,为了避免雅克比矩阵的显式计算,我们使用恒等式:
其中,哈密顿算子(译者注,也叫:矢量微分算子)使用标准的反向传播算法即可高效计算。在优化过程中,常数 a 被动态地设置为长度的长期指数移动平均值,使得优化过程可以仅凭自己就能找到合适的全局尺度。
也就是说,公式(4)中的常数 a 引用的是当前优化周期得到的欧式距离长度的平均值,减去 a 之后,则公式(4)所表达的先验(期望)则接近于一个均值为 0 的正态分布,该正态分布越是呈现出一种窄而高的尖峰时,则生成器映射的期望方差越小,生成的图像质量越稳定。
论文继续说,我们的正则化器与 Odena 等人提出的雅克比夹紧(clamping)正则化器密切相关。实际的不同包括:我们用解析方法计算JwT·y的乘积;而他们使用有限差分的方法来估算Jw·δ,其中δ ~ N(0, 1),δ∈Z 空间。需要特别指出的是,生成器的频谱归一化操作只是约束了最大的异常值,而对其他异常值没有做任何约束,因此不一定会导致更佳的(映射平滑度)状态。
这里,作者津津乐道于他们使用反向传播算法来计算JwT·y的乘积,并暗示公式(4)所表达的先验(期望)最小化操作是目前最好的保证生成器映射平滑度的方法,因为频谱归一化只是压低了W空间中最大的w向量异常值,对较低的异常值附近不平滑的褶皱并没有改善的效果。这让我们联想到StyleGAN2使用“解调”操作代替一代StyleGAN的自适应实例归一化操作(AdaIN),来解决一代StyleGAN产生液滴伪影的问题,其中的液滴伪影,我认为就是论文此处所暗示的“最大的异常值”。
在本节论文的最后,作者引用图表进行总结:【图5b】显示路径长度正则化明显改进了每个图像PPL分数的概率分布。【表1】D行说明正则化如同预期一样降低了PPL,但是在LSUN CAR数据集以及其他较之FFHQ结构化更差的数据集上,在FID和PPL之间有需要权衡的地方(译者注:PPL下降了,但FID却上升了)。此外,我们发现,更平滑的生成器更易于实现反转(见:第5节)。
尾声:
StyleGAN2主损失函数和路径长度正则化运算,具体的代码实现在.\training\loss.py里,其中的重点内容可参考如下:
def G_logistic_ns_pathreg(G, D, opt, training_set, minibatch_size, pl_minibatch_shrink=2, pl_decay=0.01, pl_weight=2.0):
_ = opt
latents = tf.random_normal([minibatch_size] + G.input_shapes[0][1:])
labels = training_set.get_random_labels_tf(minibatch_size)
fake_images_out, fake_dlatents_out = G.get_output_for(latents, labels, is_training=True, return_dlatents=True)
fake_scores_out = D.get_output_for(fake_images_out, labels, is_training=True)
loss = tf.nn.softplus(-fake_scores_out) # -log(sigmoid(fake_scores_out))
# Path length regularization.
# 路径长度正则化运算
with tf.name_scope('PathReg'):
# Evaluate the regularization term using a smaller minibatch to conserve memory.
# 评估正则化项,使用较小的小批量以节省内存
if pl_minibatch_shrink > 1:
pl_minibatch = minibatch_size // pl_minibatch_shrink
pl_latents = tf.random_normal([pl_minibatch] + G.input_shapes[0][1:])
pl_labels = training_set.get_random_labels_tf(pl_minibatch)
fake_images_out, fake_dlatents_out = G.get_output_for(pl_latents, pl_labels, is_training=True, return_dlatents=True)
# Compute |J*y|.
# 计算|J*y|
pl_noise = tf.random_normal(tf.shape(fake_images_out)) / np.sqrt(np.prod(G.output_shape[2:]))
pl_grads = tf.gradients(tf.reduce_sum(fake_images_out * pl_noise), [fake_dlatents_out])[0]
pl_lengths = tf.sqrt(tf.reduce_mean(tf.reduce_sum(tf.square(pl_grads), axis=2), axis=1))
pl_lengths = autosummary('Loss/pl_lengths', pl_lengths)
# Track exponential moving average of |J*y|.
# 跟踪|J*y|的指数移动平均值
with tf.control_dependencies(None):
pl_mean_var = tf.Variable(name='pl_mean', trainable=False, initial_value=0.0, dtype=tf.float32)
pl_mean = pl_mean_var + pl_decay * (tf.reduce_mean(pl_lengths) - pl_mean_var)
pl_update = tf.assign(pl_mean_var, pl_mean)
# Calculate (|J*y|-a)^2.
# 计算(|J*y|-a)^2
with tf.control_dependencies([pl_update]):
pl_penalty = tf.square(pl_lengths - pl_mean)
pl_penalty = autosummary('Loss/pl_penalty', pl_penalty)
# Apply weight.
# 应用权重(计算正则化项)
#
# Note: The division in pl_noise decreases the weight by num_pixels, and the reduce_mean
# in pl_lengths decreases it by num_affine_layers. The effective weight then becomes:
#
# gamma_pl = pl_weight / num_pixels / num_affine_layers
# = 2 / (r^2) / (log2(r) * 2 - 2)
# = 1 / (r^2 * (log2(r) - 1))
# = ln(2) / (r^2 * (ln(r) - ln(2))
#
reg = pl_penalty * pl_weight
return loss, reg
StyleGAN2论文的下载地址是:http://arxiv.org/abs/1912.04958
也可以到百度网盘下载:https://pan.baidu.com/s/15jv2hVVrcC-dsPjqZ_p9Xw 提取码: rvir
(完)