我在Tensorflow中关于回归模型的各种帖子中看到了一些不同的均方误差损失函数:
loss = tf.reduce_sum(tf.pow(prediction - Y,2))/(n_instances)loss = tf.reduce_mean(tf.squared_difference(prediction, Y))loss = tf.nn.l2_loss(prediction - Y)
这些之间的区别是什么?
回答:
我认为第三个方程是不同的,而第一和第二个在形式上是相同的,但由于数值问题表现不同。
我认为第三个方程(使用l2_loss
)只是返回欧几里得范数平方的1/2,即输入的逐元素平方和,也就是x=prediction-Y
。你没有在任何地方除以样本数。因此,如果你有非常多的样本,计算可能会溢出(返回Inf)。
另外两个在形式上是相同的,计算x
张量的逐元素平方的平均值。然而,尽管文档没有明确说明,很可能reduce_mean
使用了一种适应于避免在非常大量的样本下溢出的算法。换句话说,它很可能不会先尝试将所有东西相加然后再除以N,而是使用某种可以适应任意数量样本的滚动平均值,而不一定会引起溢出。