【问题标题】:How to use TensorBoard to analyze the results and reduce the mean square error如何使用 TensorBoard 分析结果并降低均方误差
【发布时间】:2018-08-03 02:09:01
【问题描述】:

在 Tensorflow 中,我正在尝试构建一个模型来执行图像超分辨率(即回归任务)并使用 TensorBoard 分析结果。在训练过程中,我发现均方误差 (MSE) 大多数时候(甚至从一开始)都在 100 到 200 之间反弹,并且从未收敛。我希望将以下变量添加到tf.summary 并分析导致此问题的原因。

graph_loss = get_graph_mean_square_error()
tf.summary.scalar('graph_loss', graph_loss)

regularization_loss = tf.add_n([tf.nn.l2_loss(weight) for weight in weights]) * regularization_param
tf.summary.scalar('reg_loss', regularization_loss)

tf.summary.scalar('overall_loss', regularization_loss + graph_loss)

for index in range(len(weights)):
    tf.summary.histogram("weight[%02d]" % index, weights[index])

optimizer = tf.train.AdamOptimizer()
capped_grad_and_vars = [(tf.clip_by_value(grad, -clip_value, clip_value), var) for grad, var in grad_and_vars if grad is not None]
train_optimizer = optimizer.apply_gradients(capped_grad_and_vars, global_step)

for grad, var in grad_and_vars:
    tf.summary.histogram(var.name + '/gradient', grad)

for grad, var in capped_grad_and_vars:
    tf.summary.histogram(var.name + '/capped_gradient', grad)

该模型是一个带有跳过连接的 ResNET,其中包含多个 [卷积 -> 批量标准化 -> ReLU] 重复层。在 Distributions 选项卡中,我可以看到添加了几个具有以下模式的图表:

  • BatchNorm_[number]/beta0/capped_gradient
  • BatchNorm_[number]/beta0/gradient
  • BatchNorm_[number]/gamma0/capped_gradient
  • BatchNorm_[number]/gamma0/gradient
  • bias[number]_0/capped_gradient
  • bias[number]_0/gradient
  • 体重_[数量]_
  • weight_[number]_0/capped_gradient
  • 权重_[数量]_0/梯度

我正在研究的东西很少,希望有人能对它们有所了解:

使用 L2 损失进行正则化

regularization_param 的值设置为 0.0001,reg_loss 图表显示它从 1.5 增加(如对数)并在 3.5 附近收敛。就我而言,graph_loss 在 100 到 200 之间,而reg_loss 在 1.5 到 3.5 之间。

  1. reg_loss的趋势图是我们要找的吗(比如对数递增函数)?
  2. reg_loss 会不会太小而无法惩罚模型(100-200 与 1.5-3.5)?
  3. 我如何知道我是否正确选择了regularization_param

解决梯度消失问题

我认为 MSE 从头到尾的弹跳问题可能是由于梯度消失问题造成的。我希望使用 ResNET 等几种技术与跳过的连接、批量标准化和渐变裁剪(clip_by_value 为 0.05)来解决渐变消失问题。我不太确定如何阅读图表,但在我看来,前 22 层的权重似乎没有像这样的前 20K 步骤中发生变化(我不熟悉 TensorBoard,如果我阅读/解释请纠正我它不正确):

我已将训练拆分为多次运行,并从上一次运行中恢复检查点。这是最后几层经过 66K 步后的图表:

您可以看到,在最初的 20K 步中,权重在某些层上仍然发生变化,例如橙色的 weight_36_ 和 weight_37_。然而,在 50K 步之后,所有的权重看起来都是扁平的,比如绿色的 weight_36_(非常薄)和 weight_39_(厚度很小)。

然后我查看批量标准化图(注意 capped_gradient 在 0.05 时为 clip_by_value),看起来有如下一些变化:

  1. 请,有人能解释一下上面的图表是否正确吗? (我不明白为什么每次批量标准化后都有一些好的值,但权重似乎没有改变)
  2. 从头到尾应该从哪个方向来解决 MSE 弹跳问题?

欢迎任何其他建议:)

【问题讨论】:

  • 实际上使用如此低的剪辑值会进一步增加您的消失问题。它用于对抗成本函数陡峭山脊中的梯度爆炸。

标签: tensorflow machine-learning tensorboard


【解决方案1】:

要尝试的事情:

  1. 移除渐变剪裁:您将渐变值剪裁为 0.05。我认为 update = (0.05 * learning rate) 会产生非常低的权重更新,这就是为什么大多数层都没有学习任何东西的原因。如果将最后一层的梯度(首先从输出)剪裁为 0.05,那么非常低的梯度值会传播回其前一层,并且与局部梯度相乘会产生更低的梯度值。因此,您可能会看到最后几层学到了一些东西。

  2. 移除l2正则化:尝试移除正则化,移除正则化解决了弹跳MSE问题,那么你应该非常仔细地调整正则化参数。

【讨论】:

    【解决方案2】:
    1. 我们要找的是reg_loss的趋势图吗(比如对数>递增函数)?

    是的,看起来不错。

    1. reg_loss 会不会太小而无法惩罚模型(100-200 与 1.5-3.5)?
    2. 我如何知道我是否正确选择了regularization_param

    首先,我建议您将学习率从 0.001 更改为 0.1(这是研究梯度裁剪问题的第一件事),并观察平均 MSE 是否降低以选择没有reg_loss 的最佳学习率。然后你可以通过微调reg_loss来添加正则化。

    1. 请,有人能解释一下上面的图表是否正确吗? (我不明白为什么每次批量标准化后都有一些好的值但权重似乎没有改变)
    2. 从头到尾应该从哪个方向解决 MSE 弹跳问题?

    请仔细检查您是否采用每个时期的平均 MSE。有时在每个子纪元中观察到弹跳问题可能是正常的。但是如果你取每个 epoch 的平均 MSE,你可能会观察到它会逐渐下降。

    【讨论】:

      猜你喜欢
      • 2018-11-14
      • 2011-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-29
      • 1970-01-01
      • 2016-03-26
      相关资源
      最近更新 更多