【发布时间】:2016-08-23 16:48:58
【问题描述】:
准确地说,我要找的损失函数是绝对误差小于0.5时的平方误差,绝对误差大于0.5时是绝对误差本身。这样,误差函数的梯度不会超过 1,因为一旦平方误差函数的梯度达到 1,绝对误差函数就会启动,梯度保持恒定在 1。我在下面包含了我当前的实现.出于某种原因,它给我的性能比平方误差更差。
fn_choice_maker1 = (tf.to_int32(tf.sign(y - y_ + 0.5)) + 1)/2
fn_choice_maker2 = (tf.to_int32(tf.sign(y_ - y + 0.5)) + 1)/2
choice_maker_sqr = tf.to_float(tf.mul(fn_choice_maker1, fn_choice_maker2))
sqr_contrib = tf.mul(choice_maker_sqr, tf.square(y - y_))
abs_contrib = tf.abs(y - y_)-0.25 - tf.mul(choice_maker_sqr, tf.abs(y - y_)-0.25)
loss = tf.reduce_mean(sqr_contrib + abs_contrib)
train_step = tf.train.AdamOptimizer(1e-4).minimize(loss)
choice_maker_sqr 是一个列张量,只要误差在 0.5 和 -0.5 之间,它就是一个。这些名称非常不言自明。
【问题讨论】:
-
当你说“这让我的表现更差”时,你是在谈论跑一步的速度,还是你的模型的学习表现?前者是预期的,因为当您计算 Huber 损失与仅平方损失时,有更多的操作。如果是后者,那么您真的是在询问使用 Huber 损失解决您的问题的效果吗?在这种情况下,如果您包含更多模型的详细信息,可能会有所帮助。
-
是后者。这是针对强化学习模型的,与this stack overflow question 相关。实际上,我更想知道我对 Huber 损失的实现是否有任何错误(在 tensorflow 中)。
-
tf.cond(tf.abs(y-y_) < 0.5, lambda: tf.square(y-y_), lambda: tf.abs(y-y_))将是描述的更直接的实现。 -
您描述的函数在
|error| = 0.5处存在不连续性。正确的 Huber 损失应该是tf.cond(tf.abs(error) < 0.5, lambda: tf.square(error), lambda: tf.abs(error) - 0.25)。 -
要为向量实现这个,你可以使用
tf.where:tf.where(tf.abs(error) < 0.5, tf.square(error), tf.abs(error) - 0.25)
标签: neural-network tensorflow loss