当我使用RELU激活时,为什么我的TensorFlow网络权重和成本NaN?

时间:2016-05-25 22:16:09

标签: machine-learning tensorflow nan

我无法让TensorFlow RELU激活(tf.nn.relutf.nn.relu6)在没有激活NaN值的情况下工作,并且权重会导致我的训练运行失败。

我相信我正在遵循所有正确的一般建议。例如,我用

初始化我的权重
weights = tf.Variable(tf.truncated_normal(w_dims, stddev=0.1))
biases = tf.Variable(tf.constant(0.1 if neuron_fn in [tf.nn.relu, tf.nn.relu6] else 0.0, shape=b_dims))

并使用较慢的训练率,例如,

tf.train.MomentumOptimizer(0.02, momentum=0.5).minimize(cross_entropy_loss)

但任何具有可观深度的网络都会导致NaN成本和至少一些权重(至少在它们的摘要直方图中)。事实上,从一开始(训练前),费用通常为NaN

即使我使用L2(约0.001)正则化和辍学(约50%),我似乎也有这些问题。

是否有一些参数或设置我应该调整以避免这些问题?我不知道哪里开始寻找,所以任何建议都会受到赞赏!

3 个答案:

答案 0 :(得分:7)

关注He et. al(如lejlot注释中所述),将 l -th图层的权重初始化为零均值高斯分布,标准偏差< / p>

其中 n l 是输入向量的展平长度或

stddev=np.sqrt(2 / np.prod(input_tensor.get_shape().as_list()[1:]))

导致权重通常不会发散。

答案 1 :(得分:4)

如果在网络顶部使用softmax分类器,请尝试使softmax正下方的初始权重非常小(例如std = 1e-4)。这使得网络输出的初始分布非常柔和(高温),并有助于确保优化的前几个步骤不会太大而且在数值上不稳定。

答案 2 :(得分:4)

您是否尝试过gradient clipping和/或较小的学习率?

基本上,您需要在应用之前处理渐变,如下所示(主要来自tf docs):

# Replace this with what follows
# opt = tf.train.MomentumOptimizer(0.02, momentum=0.5).minimize(cross_entropy_loss)

# Create an optimizer.
opt = tf.train.MomentumOptimizer(learning_rate=0.001, momentum=0.5)

# Compute the gradients for a list of variables.
grads_and_vars = opt.compute_gradients(cross_entropy_loss, tf.trainable_variables())

# grads_and_vars is a list of tuples (gradient, variable).  Do whatever you
# need to the 'gradient' part, for example cap them, etc.
capped_grads_and_vars = [(tf.clip_by_value(gv[0], -5., 5.), gv[1]) for gv in grads_and_vars]

# Ask the optimizer to apply the capped gradients.
opt = opt.apply_gradients(capped_grads_and_vars)

此外,the discussion in this question可能有所帮助。