为什么在训练过程中多次缩小参数将有助于渐进式 GAN 中所有权重的学习速度相同?

问题描述 投票:0回答:2

均衡学习率是NVIDIA团队的论文Progressive Gan中的特别之处之一。通过使用这种方法,他们介绍了

我们的方法确保所有权重的动态范围以及学习速度都是相同的。

详细来说,他们通过正态分布初始化了所有可学习的参数formula。在训练期间,每次前向时间,他们都会使用 He 初始化器中的每层归一化常数来缩放结果

我从 pytorch GAN Zoo Github 的仓库中复制了代码

def forward(self, x, equalized):
    # generate He constant depend on the size of tensor W
    size = self.module.weight.size()
    fan_in = prod(size[1:])
    weight = math.sqrt(2.0 / fan_in)
    '''
    A module example:

    import torch.nn as nn
    module = nn.Conv2d(nChannelsPrevious, nChannels, kernelSize, padding=padding, bias=bias) 
    '''
    x = self.module(x)

    if equalized:
        x *= self.weight
    return x

起初,我认为He常数将是He的论文

formula

通常情况下,所以可以按比例放大,这会导致反向传播的梯度增加,因为ProGan论文中的公式可以防止梯度消失。

但是,代码显示

综上所述,我不明白为什么在训练过程中多次缩小参数会有助于学习速度更稳定。

我在一些社区提出了这个问题,例如:人工智能、数学,但仍然没有答案。

请帮我解释一下,谢谢!

python optimization deep-learning gradient generative-adversarial-network
2个回答
1
投票

论文中已经解释了为什么要在每一次pass中缩小参数:

动态执行此操作而不是在初始化期间执行此操作的好处是 微妙,与常用的自适应随机梯度下降中的尺度不变性有关 RMSProp (Tieleman & Hinton, 2012) 和 Adam (Kingma & Ba, 2015) 等方法。这些 方法通过估计的标准差对梯度更新进行归一化,从而使更新 与参数的大小无关。因此,如果某些参数具有较大的动态 与其他人相比,他们需要更长的时间来调整。这是现代初始化程序引起的场景,并且 因此,学习率可能同时太大和太小。

我相信在每次传递中乘以He常数可以确保参数的范围在反向传播的任何点都不会太宽,因此它们不会花费很长时间来调整。因此,如果判别器在学习过程中的某个时刻比生成器调整得更快,则生成器不需要自我调整,因此它们的学习过程将均衡。


0
投票

在深度学习中,一层输入是前一层。通常,它们的统计分布会在几次迭代后发生变化。

例如,考虑一个权重形状为

[2,1]
的全连接层,其中每个值都使用正态分布
N(0,1)
进行初始化。该层将产生方差为 2(参考)的输出。由于分布波动,做出的推论越多,该节点的输出就会变得越动态。这种增加的动态性使模型难以适应这样的动态范围,这种现象称为“内部协方差偏移”。

均衡学习率

是通过对每一层的偏移进行归一化来稳定这个过程。

© www.soinside.com 2019 - 2024. All rights reserved.