Python Tensorflow均方误差损失函数

Python Tensorflow均方误差损失函数,python,machine-learning,tensorflow,Python,Machine Learning,Tensorflow,我在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) 它们之间有什么区别?我想说,第三个方程是不同的,而第1个和第2个方程在形式上是相同的,但由于数值方

我在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)

它们之间有什么区别?

我想说,第三个方程是不同的,而第1个和第2个方程在形式上是相同的,但由于数值方面的考虑,它们的行为不同

我认为第三个方程(使用
l2_损失
)只返回了平方欧氏范数的1/2,即输入的元素平方和,即
x=prediction-Y
。任何地方都不能除以样本数。因此,如果有大量样本,计算可能会溢出(返回Inf)


另外两个在形式上是相同的,计算元素方向的平方
x
张量的平均值。然而,尽管文档没有明确规定,但很可能
reduce\u mean
使用了一种算法,该算法适用于避免大量样本溢出。换句话说,它可能不会尝试先求和然后除以N,而是使用某种滚动平均值,可以适应任意数量的样本,而不一定会导致溢出。

第一个和第二个损失函数计算相同的东西,但方式略有不同。第三个函数计算完全不同的东西。您可以通过执行以下代码看到这一点:

import tensorflow as tf

shape_obj = (5, 5)
shape_obj = (100, 6, 12)
Y1 = tf.random_normal(shape=shape_obj)
Y2 = tf.random_normal(shape=shape_obj)

loss1 = tf.reduce_sum(tf.pow(Y1 - Y2, 2)) / (reduce(lambda x, y: x*y, shape_obj))
loss2 = tf.reduce_mean(tf.squared_difference(Y1, Y2))
loss3 = tf.nn.l2_loss(Y1 - Y2)

with tf.Session() as sess:
    print sess.run([loss1, loss2, loss3])
# when I run it I got: [2.0291963, 2.0291963, 7305.1069]
现在,您可以通过注意到
tf.pow(a-b,2)
tf.squared_差(a-b,2)
相同来验证1-st和2-nd计算相同的东西(理论上)。另外,
reduce\u mean
reduce\u sum/number\u元素
相同。问题是计算机不能精确地计算每件事。要了解数值不稳定性对计算的影响,请查看以下内容:

import tensorflow as tf

shape_obj = (5000, 5000, 10)
Y1 = tf.zeros(shape=shape_obj)
Y2 = tf.ones(shape=shape_obj)

loss1 = tf.reduce_sum(tf.pow(Y1 - Y2, 2)) / (reduce(lambda x, y: x*y, shape_obj))
loss2 = tf.reduce_mean(tf.squared_difference(Y1, Y2))

with tf.Session() as sess:
    print sess.run([loss1, loss2])
很容易看出答案应该是1,但您会得到如下结果:
[1.0,0.26843545]

关于您的上一个功能,文档中说:

计算不带sqrt的张量的L2范数的一半:输出=和(t **2)/2

因此,如果你想让它计算出与第一个相同的东西(理论上),你需要适当地缩放它:

loss3 = tf.nn.l2_loss(Y1 - Y2) * 2 / (reduce(lambda x, y: x*y, shape_obj))

还有一种计算MSE的方法(相当于第一种和第二种方法):这是否意味着内置的tensorflow函数比显式计算平方并取平均值更差?这对我来说没有意义,内置实现是否应该在数值上更稳定?否则,为什么还要麻烦地创建一个函数呢?那么
tf.nn.l2_loss
的用例是什么呢?“reduce_-mean很可能使用了一种适合于避免大量样本溢出的算法”我不认为这是真的,很明显,你声称正在发生的事情并没有发生。虽然tf代码有点像兔子洞,但我不是这方面的专家。然而,在没有引证或证据的情况下,我发现其中一些说法是可疑的。