[英]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.