簡體   English   中英

Tensorflow均方誤差損失函數

[英]Tensorflow mean squared error loss function

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

這些有什么區別?

我會說第三個方程是不同的,而第一個和第二個方程式正式相同但由於數值問題而表現不同。

我認為第3個等式(使用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)相同來驗證1-st和2-nd計算相同的東西(理論上tf.squared_difference(a - b, 2) reduce_mean也與reduce_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,但你會得到這樣的東西: [1.0, 0.26843545]

關於你的上一個功能,文檔說:

在沒有sqrt:output = sum(t ** 2)/ 2的情況下計算張量的L2范數的一半

因此,如果您希望它(在理論上)計算與第一個相同的東西,您需要適當地縮放它:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM