【问题标题】:TensorFlow custom model optimizer returning NaN. Why?TensorFlow 自定义模型优化器返回 NaN。为什么?
【发布时间】:2016-07-12 10:42:47
【问题描述】:

我想为我创建的自定义模型学习最佳 weightsexponents

weights = tf.Variable(tf.zeros([t.num_features, 1], dtype=tf.float64))
exponents = tf.Variable(tf.ones([t.num_features, 1], dtype=tf.float64))

# works fine:
pred = tf.matmul(x, weights)

# doesn't work:
x_to_exponent = tf.mul(tf.sign(x), tf.pow(tf.abs(x), tf.transpose(exponents)))
pred = tf.matmul(x_to_exponent, weights)

cost_function = tf.reduce_mean(tf.abs(pred-y_))
optimizer = tf.train.GradientDescentOptimizer(t.LEARNING_RATE).minimize(cost_function)

问题在于,只要x 中有一个负值 零,优化器就会将权重返回为NaN。如果我在 x = 0 时简单地添加 0.0001,那么一切都会按预期工作。但我真的必须这样做吗? TensorFlow 优化器不应该有办法处理这个吗?

我注意到维基百科没有显示 activation functions 其中 x 被取为指数。为什么没有如下图所示的激活函数?

对于上面的图像,我希望我的程序知道正确的指数是 0.5。

【问题讨论】:

  • 您确定要将权重设为指数吗?这很容易达到无穷大。请也包含您的整个代码。
  • 是的——我想知道为了做出正确的预测,我必须将输入数据采用什么指数。指数通常在 0-1 之间,所以不应该无穷大。例如,如果上面的图像是我们试图预测的模型,我们需要学习的正确指数是 0.5。
  • @lejlot 我已经更新了代码以更清楚地显示哪些有效,哪些无效。我还纠正了一个错误。
  • 你的意思是当x为零时你得到nan?这是意料之中的,因为如图所示,梯度是无穷大的。
  • @GeoffreyIrving 是的,你是对的。问题在于 x = 0。如果我简单地将每个 x = 0 添加 0.0001,它似乎可以解决问题并且一切都按预期工作。 TensorFlow 优化器是否有办法处理这种情况而无需我手动添加 0.0001?

标签: machine-learning neural-network tensorflow


【解决方案1】:

这对 TensorFlow 来说是正确的行为,因为那里的梯度是无穷大的(许多在数学上应该是无穷大的计算由于不确定的限制而最终是 NaN)。

如果您想解决该问题,可以使用稍微通用的渐变剪裁版本。您可以通过Optimizer.compute_gradients 获取渐变,通过类似的方式手动剪辑它们

safe_grad = tf.clip_by_value(tf.select(tf.is_nan(grad), 0, grad), -lim, lim)

然后将剪裁的渐变传递给Optimizer.apply_gradients。剪裁对于奇点附近的值来说是必要的,因为这里的梯度可能是任意大的。

警告:不能保证这会奏效,尤其是对于更深的网络,其中 nan 可能会污染大片网络。

【讨论】:

  • 感谢您的提示!当我的理解有所提高并准备好实施这样的解决方案时,我会再参考这里。
猜你喜欢
  • 2020-03-05
  • 2020-05-31
  • 1970-01-01
  • 2017-05-10
  • 2020-09-12
  • 1970-01-01
  • 2016-02-28
  • 2021-04-12
  • 2010-11-28
相关资源
最近更新 更多