Tensorflow均方误差损失函数
machine-learning
python
tensorflow
5
0

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

这些之间有什么区别?

参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

我要说的是,第三个方程是不同的,而第一个和第二个在形式上是相同的,但是由于数值上的考虑,它们的行为有所不同。

我认为第三个方程(使用l2_loss )仅返回平方欧几里德范数的1/2,即输入的元素方平方之和,即x=prediction-Y 。您没有将其除以任何地方的样本数量。因此,如果您有大量的样本,则计算可能会溢出(返回Inf)。

其他两个在形式上相同,计算元素方平方x张量的平均值。但是,尽管文档中没有明确指定,但是reduce_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_difference(a - b, 2)相同, tf.squared_difference(a - b, 2)从理论上验证1st和2nd计算相同的事物。同样reduce_meanreduce_sum / number_of_element相同。问题是计算机无法准确计算所有内容。要查看数值不稳定性会对您的计算产生什么影响,请查看以下内容:

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.0, 0.26843545] ,答案应该是1,但是您会得到类似以下内容: [1.0, 0.26843545]

关于您的最后一个功能,文档说:

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

因此,如果您希望它计算与第一个相同的东西(理论上),则需要适当地缩放它:

loss3 = tf.nn.l2_loss(Y1 - Y2) * 2 / (reduce(lambda x, y: x*y, shape_obj))
收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号