Link 在输入值范围和损失收敛之间
Link between range of input values and loss convergence
我正在使用 Keras 高端 API 训练带有 tensorflow 2.0 的变分自动编码器。目的是重建图像,它由 形状 组成,在零背景上具有均匀强度 int_shape
不等于零,请参见下图 int_shape = -0.25
:
变分自动编码器具有以下架构,w潜在 space 有 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的情况下,输入数据的范围和损失的收敛之间是否存在link?
根据我的实验,具有更高 int_shape
的形状往往具有更好的重建。我将此归因于更高的梯度,因此超参数 space 中的步骤更大,因为梯度的值取决于输入的值。更大的步骤导致损失找到最小值并收敛的点。从这个意义上说,较小的值会产生较小的梯度,因此将采取较小的优化步骤。
我的另一个理论是,对于 (-0.5, 0.5) 的小范围,表示输入的潜在 space 中的点彼此更接近,并且在随机采样期间它们会混淆并且"wrong" 点被选中用于解码器。我已经通过绘制潜在 space 分量的直方图进行了验证。输入值的范围越大,潜在 space.
中分布的方差越大
更新:
我尝试了各种学习率,从 1e-4 到 5e-2,有和没有学习率衰减(每 10 个 epoch 减少 10%)。我还训练了足够数量的纪元 (300),批量大小 64,训练集 3800 张图像,val on 100。损失没有改善,重建也不好。使用 32 位和 64 位浮点精度都没有成功。对于大于 2e-2 的学习率,损失偶尔转向 Nan。提供稳定训练的最高学习率是 1e-2。另外,latent space 是 50(不过应该对问题没有任何影响,IMO)。
这听起来与学习率有关。
缩放输入可能不会对网络产生太大影响。是的,标准化输入,例如具有 z 分数是标准的,将有助于收敛。但我认为这不是推动您取得成果的原因。
对于 VAE 案例,我认为您的 10 倍或 100 倍因子也会缩放 输出 。这将导致更大的损失,这将通过网络的其余部分发送回更强的信号。如果您的原始学习率太低,您将获得更快的收敛。听起来确实如此。很长一段时间什么都没发生,然后最终收敛,通常意味着你可以训练得更快。
因此,与其将输入缩放 10 倍或 100 倍,不如尝试将学习率提高 10 倍或 100 倍。 Super-Convergence paper by Leslie N. Smith has some great insights on high learning rates and a good LR schedule for fast convergence. If you want to go even deeper into hyperparameter tuning, he also has an excellent paper on a disciplined approach to neural network hyper-parameters.
查看您发布的第一张输入图像,您似乎没有使用任何输入规范化。也许您的缩放比例解决了有关错误输入的不同问题。您可以尝试将图像标准化为零平均单位标准偏差或类似最小最大标准化的东西(尽管我会推荐第一个)。
我正在使用 Keras 高端 API 训练带有 tensorflow 2.0 的变分自动编码器。目的是重建图像,它由 形状 组成,在零背景上具有均匀强度 int_shape
不等于零,请参见下图 int_shape = -0.25
:
变分自动编码器具有以下架构,w潜在 space 有 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的情况下,输入数据的范围和损失的收敛之间是否存在link?
根据我的实验,具有更高 int_shape
的形状往往具有更好的重建。我将此归因于更高的梯度,因此超参数 space 中的步骤更大,因为梯度的值取决于输入的值。更大的步骤导致损失找到最小值并收敛的点。从这个意义上说,较小的值会产生较小的梯度,因此将采取较小的优化步骤。
我的另一个理论是,对于 (-0.5, 0.5) 的小范围,表示输入的潜在 space 中的点彼此更接近,并且在随机采样期间它们会混淆并且"wrong" 点被选中用于解码器。我已经通过绘制潜在 space 分量的直方图进行了验证。输入值的范围越大,潜在 space.
中分布的方差越大更新: 我尝试了各种学习率,从 1e-4 到 5e-2,有和没有学习率衰减(每 10 个 epoch 减少 10%)。我还训练了足够数量的纪元 (300),批量大小 64,训练集 3800 张图像,val on 100。损失没有改善,重建也不好。使用 32 位和 64 位浮点精度都没有成功。对于大于 2e-2 的学习率,损失偶尔转向 Nan。提供稳定训练的最高学习率是 1e-2。另外,latent space 是 50(不过应该对问题没有任何影响,IMO)。
这听起来与学习率有关。
缩放输入可能不会对网络产生太大影响。是的,标准化输入,例如具有 z 分数是标准的,将有助于收敛。但我认为这不是推动您取得成果的原因。
对于 VAE 案例,我认为您的 10 倍或 100 倍因子也会缩放 输出 。这将导致更大的损失,这将通过网络的其余部分发送回更强的信号。如果您的原始学习率太低,您将获得更快的收敛。听起来确实如此。很长一段时间什么都没发生,然后最终收敛,通常意味着你可以训练得更快。
因此,与其将输入缩放 10 倍或 100 倍,不如尝试将学习率提高 10 倍或 100 倍。 Super-Convergence paper by Leslie N. Smith has some great insights on high learning rates and a good LR schedule for fast convergence. If you want to go even deeper into hyperparameter tuning, he also has an excellent paper on a disciplined approach to neural network hyper-parameters.
查看您发布的第一张输入图像,您似乎没有使用任何输入规范化。也许您的缩放比例解决了有关错误输入的不同问题。您可以尝试将图像标准化为零平均单位标准偏差或类似最小最大标准化的东西(尽管我会推荐第一个)。