【发布时间】: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 之间。
-
reg_loss的趋势图是我们要找的吗(比如对数递增函数)? -
reg_loss会不会太小而无法惩罚模型(100-200 与 1.5-3.5)? - 我如何知道我是否正确选择了
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),看起来有如下一些变化:
- 请,有人能解释一下上面的图表是否正确吗? (我不明白为什么每次批量标准化后都有一些好的值,但权重似乎没有改变)
- 从头到尾应该从哪个方向来解决 MSE 弹跳问题?
欢迎任何其他建议:)
【问题讨论】:
-
实际上使用如此低的剪辑值会进一步增加您的消失问题。它用于对抗成本函数陡峭山脊中的梯度爆炸。
标签: tensorflow machine-learning tensorboard