【问题标题】:Link between range of input values and loss convergence输入值范围与损失收敛之间的联系
【发布时间】:2020-04-18 17:05:15
【问题描述】:

我正在使用 Keras 高端 API 使用 tensorflow 2.0 训练变分自动编码器。目的是重构图像,这些图像由具有均匀强度int_shape 在零背景上不等于零的形状 组成,请参见下面带有int_shape = -0.25 的图像:

变分自动编码器具有以下架构,其中潜在空间为 50 维,与图像中所述的 16 维相反:

lambda 层使用一个函数从如下所示的正态分布中进行采样:

def sampling(args):
    z_mean, z_log_var = args
    epsilon = K.random_normal(shape =(1,1,latent_dim))
    return z_mean + K.exp(0.5 * z_log_var) * epsilon

损失是 KL 散度和 MSE 损失的组合:

    def vae_loss(y_pred, y_gt):
        mse_loss = mse(y_pred, y_gt)
        original_dim = GLOBAL.input_res**2
        mse_loss *= original_dim
        z_mean = model.get_layer('z_mean_layer').output
        z_log_var = model.get_layer('z_log_var_layer').output
        kl_loss = 1 + z_log_var - K.square(z_mean) - K.exp(z_log_var)
        kl_loss = K.sum(kl_loss, axis=-1)
        kl_loss *= -0.5
        return K.mean(mse_loss + GLOBAL.beta*kl_loss)

目前,int_shape 取值范围(-0.5、0.5),但大小不同(1e-1、1e-2 和很少 1e-3)。 VAE 的目的是将图像作为输入并重建相同的图像。 对于范围 (-0.5, 0.5),损失的收敛不是确定性的:有时它始终保持不变,有时它在 5 / 50/180 个时期保持不变,然后下降并收敛。结果,重建并不总是好的,有些是混乱的,有时只会出现噪音。在我看来,收敛很大程度上取决于优化的初始起点。

但是,如果我将数据缩放为 10,即范围 (-5, 5) 或什至 100,即 (-50, 50),则损失收敛并且我不断获得良好的重建。在 (-5,5) 范围内,较高的绝对值往往具有更好的重建效果,而在 (-50,50) 范围内,几乎每个输入都可以正确重建。

我的问题是:在 VAE 的情况下,输入数据的范围和损失的收敛之间是否存在联系?

根据我的实验,int_shape 较高的形状往往具有更好的重建效果。我将其归因于更高的梯度,因此超参数空间中的步长更大,因为梯度的值取决于输入的值。更大的步骤会导致损失找到最小值并收敛。从这个意义上说,较小的值会产生较小的梯度,因此会采取更小的优化步骤。

我的另一个理论是,对于 (-0.5, 0.5) 的小范围内,表示输入的潜在空间中的点彼此更接近,并且在随机采样期间它们会混淆并且选择“错误”点为解码器。我已经通过绘制潜在空间分量的直方图进行了验证。输入值的范围越大,潜在空间中分布的方差越大。

更新: 我尝试了各种学习率,从 1e-4 到 5e-2,有和没有学习率衰减(每 10 个 epoch 减少 10%)。我还训练了足够数量的 epoch(300),batch size 64,训练集 3800 图像,val on 100。损失没有改善,重建也不好。使用 32 位和 64 位浮点精度均未成功。对于大于 2e-2 的学习率,损失偶尔会转向 Nan。提供稳定训练的最高学习率为 1e-2。此外,潜在空间为 50(不过,IMO 应该对问题没有任何影响)。

【问题讨论】:

    标签: tensorflow keras deep-learning neural-network autoencoder


    【解决方案1】:

    查看您发布的第一个输入图像,您似乎没有使用任何输入规范化。也许您的缩放解决了有关错误输入的不同问题。您可以尝试将图像标准化为零平均单位标准偏差或类似最小最大标准化(尽管我会推荐第一个)。

    【讨论】:

    • 谢谢,归一化输入(零均值,单位标准差)解决了问题,损失下降收敛,重建正确!
    【解决方案2】:

    这听起来与学习率有关。

    缩放输入可能不会对网络产生太大影响。是的,规范化输入,例如z 分数是标准的,有助于收敛。但我认为这不是推动您取得成果的原因。

    对于 VAE 案例,我认为您的 10 倍或 100 倍因子也将缩放 输出。这将导致更大的损失,这将通过网络的其余部分发回更强的信号。如果您的原始学习率太低,您将获得更快的收敛速度。从事物的声音来看,确实如此。很长一段时间没有发生任何事情,然后最终收敛,这通常意味着你可以训练得更快。

    因此,不要将您的输入放大 10 倍或 100 倍,而是尝试将您的学习率提高 10 倍或 100 倍。 Leslie N. Smith 的Super-Convergence paper 对高学习率和快速收敛的良好 LR 时间表有一些深刻的见解。如果你想更深入地研究超参数调优,他在a disciplined approach to neural network hyper-parameters 上也有一篇出色的论文。

    【讨论】:

    • 谢谢。问题仍然存在,我更新了我的帖子以获取更多信息。超级收敛是特定于架构的,afaik,我没有在 VAE 上尝试过,因为我目前不知道问题的原因。太低的学习率似乎不是它。我将看看循环学习率和你提出的关于超参数调整的论文。
    猜你喜欢
    • 2017-02-08
    • 1970-01-01
    • 2019-02-20
    • 2020-01-08
    • 1970-01-01
    • 2020-12-22
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    相关资源
    最近更新 更多