准确地说,我要找的损失函数是绝对误差小于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 之间,它就是一个。这些名称非常不言自明。