Wednesday, November 25, 2020

常見的 ML Loss Function: MSE, Hinge 及 Cross Entropy

簡介
在 ML 的領域中,Loss Function 是一種量化「機器預測值 (predicted value)」和「實際期望值 (desired value)」之間差距的一種工具。簡單來講,如果機器預測的結果與實際期望一致,這個模型就「沒有任何資料損失」,也就是說,Loss Function 的輸出會等於 0。相反,如果兩者不一致,損失就應該越大,故此數值輸出應該越高。

以上概念雖然簡單, 但實際上, 不同的 Projects 中均會採用不同的 Loss Function,以便有效反映資料損失的程度。所以,在實際應用中,往往令人覺得很困惑:到底什麼情景,才能用這個 Loss Function 呢?本文會介紹三種十分常見的 Loss Function,並輔以「正常人能理解的文字」,幫助大家更容易明白,以及作出正確選擇。

---

Mean-Squared Error (MSE) 均方差
MSE 是最通用,最易理解的 Loss Function,它的目標是找出兩點的距離。
這種算法不限定期望值的範圍,基本上任何輸出(例如 [-1, 1], [0, 1], [0, inf) 等)都可以用。

首先,我們需用最簡單的方法,計算出兩點距離,也就是 x2 - x1
不過,它會產生以下問題:

假設 x1 = -4,x2 = 3:

  • 使用 x2 - x1 的公式,我們得出距離為 3-(-4) = 7

但當 x1 = 4,x2 = -3 的情況:

  • 使用 x2 - x1 的公式,我們將得出距離為 -3-4 = -7

因為 Loss Function 的定義是「數值越細,損失越少」,這個情況下,明明兩個例子的實際距離均是 7,我們卻得到不一樣的結果。為了防止這種情況,最簡單的方法,就是把結果平方,變成以下公式:

  • 使用 (x2 - x1) ^2,兩個例子均能得到 (7)^2 = (-7)^2 = 49

這樣就能解決正負問題,而且也能做到「距離越大,損失越多」的感覺。
(例如 2^2 = 4,但 7^2 = 49,原本只差 7-2=5,卻做到了 49/4=12 倍的差別)

附上公式代碼:

def MSE(yHat, y):
    return np.sum((yHat - y)**2) / y.size 

---

Hinge Loss 鉸鏈損失
這種 Loss Function 只適用於期望值是 -1 或 +1 的情況。例如,在 SVM 二元分類器 (binary classifier) 的情況中,只要分類正確,損失值就應該是 0。相反,若果分類錯誤,Loss Function 就應該要懂得表達有多少差距。

這種特性,可以用 Loss = max(0, 1 - desired value * predicted value) 表示。

例如當 predicted value = +1,desired value = +1 (分到同類)時:

  • Loss = max(0, 1 - 1*1) = max(0, 0) = 0

當 predicted value = +0.8,desired value = +1 (分到同類,但不夠肯定)時:

  • Loss = max(0, 1-0.8) = max(0, 0.2) = 0.2

當 predicted value = -0.8,desired value = +1 (分錯類)時:

  •  Loss  = max(0, 1-(-0.8)) = max(0, 1.8) = 1.8

這樣,Loss Function 就能有效表示分錯類,或者分得不夠開的情況。

附上公式代碼:

def Hinge(yHat, y):
    return np.max(0, 1 - yHat * y)

---

Cross Entropy Loss 交叉熵損失
這種 Loss Function 特別適合期望值在 [0, 1] 連續數據範圍的情況,例如概率等等。它與 MSE 有一個相似之處:當預測值與期望值的差距越大,得到的懲罰就會指數性上升。例如當期望值 = 1, 我們可以用下列圖表及公式表示 Cross Entropy:

公式:Loss = - p(x) * log (q(x))
若 desired value = 1,則 p(x) = 1,q(x) = predicted value;
若 desired value = 0,則 p(x) = 1,q(x) = 1-predicted value。

當 desired value = 1 及 predicted value = 1 時:

  • Loss = -1*log(1) = 0

當 desired value = 0 及 predicted value = 0.99 時:

  • Loss = -1*log(1-0.99) = -1*log(0.01) = -2

由此可見,當預測值與期望值越背道而馳,損失就越高。

附上公式代碼:

def CrossEntropy(yHat, y):
    if y == 1:
      return -log(yHat)
    else:
      return -log(1 - yHat)

---

參考:

[1] - https://ml-cheatsheet.readthedocs.io/en/latest/loss_functions.html

[2] - https://blog.csdn.net/hustqb/article/details/78347713