深度學習之損失函數


機器學習中的所有算法都依靠最小化或最大化函數,我們將其稱為“目標函數”。被最小化的函數就被稱為“損失函數”。損失函數也能衡量預測模型在預測期望結果方面的性能,如果預測值與實際結果偏離較遠,損失函數會得到一個非常大的值。而在一些優化策略的輔助下,我們可以讓模型“學會”逐步減少損失函數預測值的誤差,從而找到其最小值點。這些優化策略中,最常用的是“梯度下降”。如果把損失函數比作連綿起伏的山巒,那么梯度下降就好比愚公一樣盡力削低山脈,讓山達到最低點。

損失函數,並非只有一種。根據不同的因素,包括是否存在異常值,所選機器學習算法,梯度下降的的時效,找到預測的置信度和導數的難易度,我們可以選擇不同的損失函數。在深度學習之神經網絡模型的基本工作原理這篇文章中,損失函數這部分的介紹主要從思路與公式設計的角度展開,對常用的損失函數公式類型進行了粗淺的介紹,本文是關於損失函數的專篇,將換個角度,從其在機器學習和深度學習領域的應用場景來進行分析與歸納。總而言之,沒有一個適合所有機器學習算法的損失函數。針對特定問題選擇損失函數涉及到許多因素,比如所選機器學習算法的類型、是否易於計算導數以及數據集中異常值所占比例。

損失函數的划分

從學習任務的類型出發,可以從廣義上將損失函數分為兩大類——回歸損失分類損失。在回歸問題處理的則是連續值的預測問題,例如給定房屋面積、房間數量以及房間大小,預測房屋價格。而在分類任務中,我們要從類別值有限的數據集中預測輸出,比如給定一個手寫數字圖像的大數據集,將其分為$0 \sim 9$中的一個。

符號約定

$y$:真實值    $\hat{y}$:預測值    $n$:樣本量

回歸損失

L2損失

$$MSE = \frac{\sum_{i=1}^{n}(y_i - \hat{y_i})^2}{n}$$

最常見的損失函數,名字也有很多:均方誤差(Mean Square Error,MSE)/ 平方損失(Quadratic Loss)。顧名思義,L2損失度量的是預測值和實際觀測值間差的平方的均值。它只考慮誤差的平均大小,不考慮其方向。但由於經過平方,與真實值偏離較多的預測值會比偏離較少的預測值受到更為嚴重的懲罰。再加上MSE的數學特性很好,這使得計算梯度變得更容易

下圖是均方誤差函數圖,其中目標真值為100,預測值范圍在-10000到10000之間。均方誤差損失(Y軸)在預測值(X軸)= 100處達到最小值。范圍為[0, \infty)$。

L1損失

$$MAE = \frac{\sum_{i=1}^{n}|y_i - \hat{y_i}|}{n}$$

L1損失又名平均絕對誤差,英文全稱Mean Absolute Error。L1損失度量的是預測值和實際觀測值之間絕對差之和的平均值。和L2損失一樣,這種度量方法也是在不考慮方向的情況下衡量一組預測值的平均誤差大小,范圍在$[0, \infty)$。但L2的不同之處的是,L1損失需要像線性規划這樣更復雜的工具來計算梯度。此外,MAE對異常值更加穩健,因為它不使用平方。

L1 vs. L2

通常來說,使用平方誤差更容易解決問題,但使用絕對誤差對於異常值更魯棒

不管我們什么時候訓練機器學習模型,我們的目標都是想找到一個點將損失函數最小化。當然,當預測值正好等於真值時,這兩個函數都會達到最小值。

我們來看看兩種情況下MAE和均方根誤差(RMSE,和MAE相同尺度下MSE的平方根)。在第一種情況下,預測值和真值非常接近,誤差在眾多觀測值中變化很小。在第二種情況下,出現了一個異常觀測值,誤差就很高。


因為MSE是誤差的平方值,那么誤差$e$的值在$e > 1$時會增加很多。如果我們的數據中有異常值,$e$的值會非常高,$e^2$會遠大於$|e|$。這會讓存在MSE誤差的模型比存在MAE誤差的模型向異常值賦予更多的權重。在上面第2種情況中,存在RMSE誤差的模型為了能將該單個異常值最小化會犧牲其它常見情況,這降低模型的整體性能。如果訓練數據被異常值破壞的話(也就是我們在訓練環境中錯誤地接收到巨大的不切實際的正/負值,但在測試環境中卻沒有),MAE會很有用。

試想:如果我們必須為所有的觀測值賦予一個預測值,以最小化MSE,那么該預測值應當為所有目標值的平均值。但是如果我們想將MAE最小化,那么預測值應當為所有觀測值的中間值。我們知道中間值比起平均值,對異常值有更好的魯棒性,這樣就會讓MAE比MSE對異常值更加魯棒。

但使用MAE損失(特別是對於神經網絡來說)的一個大問題就是,其梯度始終一樣,這意味着梯度即便是對於很小的損失值來說,也還會非常大。這對於機器學習可不是件好事。為了修正這一點,我們可以使用動態學習率,它會隨着我們越來越接近最小值而逐漸變小。在這種情況下,MSE會表現得很好,即便學習率固定,也會收斂。MSE損失的梯度對於更大的損失值來說非常高,當損失值趨向於0時會逐漸降低,從而讓它在模型訓練收尾時更加准確(見下圖)。

總結

  1. 如果異常值表示的反常現象對於業務非常重要,且應當被檢測到,那么我們就應當使用MSE。另一方面,如果我們認為異常值僅表示損壞數據而已,那么我們應當選擇MAE作為損失函數。
  2. L1損失對異常值更魯棒,但它的導數是不連續的,從而讓它無法有效的求解。L2損失對異常值很敏感,但會求出更穩定和更接近的解(通過將導數設為0)。
  3. 這兩者存在的問題:可能會出現兩種損失函數都無法給出理想預測值的情況。例如,如果我們的數據中90%的觀測值的目標真值為150, 剩余10%的目標值在0-30之間。那么存在MAE損失的模型可能會預測全部觀測值的目標值為150,而忽略了那10%的異常情況,因為它會試圖趨向於中間值。在同一種情況下,使用MSE損失的模型會給出大量值范圍在0到30之間的預測值,因為它會偏向於異常值。在很多業務情況中,這兩種結果都不夠理想。

平均偏差誤差(Mean Bias Error)

$$MBE = \frac{\sum_{i=1}^{n}(y_i - \hat{y_i})}{n}$$

與其它損失函數相比,這個函數在機器學習領域沒有那么常見。它與MAE相似,唯一的區別是這個函數沒有用絕對值。用這個函數需要注意的一點是,正負誤差可以互相抵消。盡管在實際應用中沒那么准確,但它可以確定模型存在正偏差還是負偏差。

Huber Loss

$$L_\delta(y, \hat{y}) = \begin{cases} \frac{1}{2}(y - \hat{y})^2 \quad &for|y - \hat{y}| \leq \delta \\ \delta|y - \hat{y}| - \frac{1}{2}\delta^2 &otherwise \end{cases}$$

又稱Smooth Mean Absolute Error,中文名平滑平均絕對誤差。相比平方誤差損失,Huber損失對於數據中異常值的敏感性要差一些。在值為0時,它也是可微分的。它基本上是絕對值,在誤差很小時會變為平方值。誤差使其平方值的大小如何取決於一個超參數$\delta$,該參數可以調整。當$\delta \sim 0$時,Huber損失會趨向於MAE;當$\delta \sim \infty$(很大的數字),Huber損失會趨向於MSE。

$\delta$的選擇非常關鍵,因為它決定了你如何看待異常值。殘差大於$\delta$,就用L1(它對很大的異常值敏感性較差)最小化,而殘差小於$\delta$,就用L2“適當地”最小化。

為何使用Huber損失函數?

使用MAE用於訓練神經網絡的一個大問題就是,它的梯度始終很大,這會導致使用梯度下降訓練模型時,在結束時遺漏最小值。對於MSE,梯度會隨着損失值接近其最小值而逐漸減少,從而使其更准確。在這些情況下,Huber損失函數真的會非常有幫助,因為它圍繞的最小值會減小梯度。而且相比MSE,它對異常值更具魯棒性。因此,它同時具備MSE和MAE這兩種損失函數的優點。不過,Huber損失函數也存在一個問題,我們可能需要訓練超參數$\delta$,而且這個過程需要不斷迭代。而Huber損失函數的良好表現得益於精心訓練的超參數$\delta$。

Log cosh Loss

$$L(y, \hat{y}) = \sum_{i=1}^{n}\log(cosh(\hat{y_i} - y_i))$$

Log-Cosh是應用於回歸任務中的另一種損失函數,它比L2損失更平滑。Log-cosh是預測誤差的雙曲余弦的對數。

優點

對於較小的$x$值,$\log(cosh(x))$約等於$\frac{x^2}{2}$;對於較大的$x$值,則約等於$abs(x) - log(2)$。這意味着Log-cosh很大程度上工作原理和均方誤差很像,但偶爾出現錯得離譜的預測時對它影響又不是很大。它具備了Huber損失函數的所有優點,但不像Huber損失,它在所有地方都二次可微。

我們為何需要二階導數?

很多機器學習模型,比如XGBoost,使用牛頓法來尋找最好結果,因此需要二階導數(Hessian矩陣)。對於像XGBoost這樣的機器學習框架,二次可微函數更為有利。

但Log-cosh也不是完美無缺。如果始終出現非常大的偏離目標的預測值時,它就會遭受梯度問題,因此會導致XGboost的節點不能充分分裂。

Quantile Loss

$$L_\gamma(y, \hat{y}) = \sum_{i=y_i<\hat{y_i}}  ({\gamma-1})|y_i - \hat{y_i}| + \sum_{i=y_i \geq \hat{y_i}}  ({\gamma})|y_i - \hat{y_i}|$$

在大多數現實預測問題中,我們常常很想知道我們的預測值的不確定性。對於很多業務問題而言,相對於知道某個預測點,了解預測值范圍能夠大幅優化決策過程。如果我們是想預測某個區間而非某個點,那么分位數損失(Quantile Loss)就會非常有用

通常,最小二乘回歸的預測區間基於假設:殘差值$y - \hat{y}$在所有獨立變量值上的變化保持一致,而違背此假設的回歸模型是不可信的。當然我們也不能認為這種情況下用非線性函數或基於樹的模型能更好地建模,把擬合線性模型作為基准的理念扔在一邊就完了。這時,我們就可以用到Quantile損失和Quantile回歸,因為基於Quantile損失的回歸能夠提供更明智的預測區間,即便是有非常量方差和非正常分布的誤差,效果同樣不錯。

基於Quantile損失的回歸能對異方差問題效果良好

Quantile回歸 VS 普通最小二乘回歸

上左為$b/w$ $X1$和$Y$的線性關系,殘差的方差為常量方差;上右為$b/w$ $X2$和$Y$的線性關系,$Y$的方差增加2倍。下邊兩幅圖中的橙色直線表示兩種情況的OLS預估。我們無法得到取值的區間范圍,這時候就需要分位數損失函數來提供。

理解 Quantile 損失函數

基於Quantile的回歸模型目的是根據預測變量的特定值,預測反應變量的條件分位數。Quantile損失實際上就是MAE的延伸(當分位數為第50個百分位數時,它就是MAE)。其理念就是根據我們是否想增加正誤差或負誤差的分量選擇合適的分位數值損失函數會根據所選分位數($\gamma$)的值為估計過高或估計不足做出不同的處罰。例如,$\gamma = 0.25$的Quantile損失函數會向估計過高做出更多的懲罰,將預測值保持在略微低於平均值的狀態。$\gamma$就是所需的分位數,值范圍在$0$和$1$之間。

我們也能用該損失函數計算神經網絡或基於樹的模型的預測區間。下面是用Sklearn實現梯度漸進回歸樹模型的示例

上圖展示了用Sklearn和Quantile損失函數計算出的梯度漸進回歸樹中90%的預測區間。以$\gamma = 0.95$構建上界,以$\gamma =0.05$構建下界。

比較研究

在文章《Gradient Boosting Machines, a Tutorial》中,很好的比較了這幾種損失函數。為了展示以上所有損失函數的屬性,文章作者模擬了一個取樣於sinc(x)函數的數據集,以及兩個人工模擬噪聲數據集:高斯噪聲分量$\epsilon \sim N(0, \sigma^2)$,以及脈沖噪聲分量$\xi \sim Bern(p)$。作者添加了脈沖噪聲項來說明魯棒影響。下圖是用不同損失函數擬合GBM回歸模型的結果。

圖中依次為(A)MSE損失函數(B)MAE損失函數(C)Huber損失函數(D)Quantile損失函數(E)原始sinc(x) 函數(F)擬合了MSE和MAE損失的平滑GBM(G)擬合了huber損失為$\delta = \{4, 2, 1\}$的平滑GBM(H)擬合了Quantile損失為$\alpha = \{0.5, 0.1, 0.9\}$的平滑GBM。

從以上模擬中我們可以觀察到:

  • MAE損失的模型預測值受脈沖噪聲的影響較小,而有MSE損失的模型預測值由於噪聲數據導致的偏差,則出現輕微偏差。
  • Huber損失的模型預測值對於所選超參數的值敏感度較小。
  • Quantile損失在對應置信度水平上做出了很好的預測。

最后把以上所有損失函數繪制在一張圖中:

分類損失

邏輯回歸是最常見的分類模型,具有如下形式:$$p(x;w,b) = \sigma(w^Tx + b) = \frac{1}{1 + \mathrm{e}^{-w^Tx+b}}$$

 

其中 $p(x;w,b)$表示預測類別為1的概率,記 $\theta = (b, w)$。

對於二分類問題,$y \in \{1,+1\},損失函數常表示為關於$yf(x)$的單調遞減形式。如下圖

其中$yf(x)$被稱為margin,其作用類似於回歸問題中的殘差$y - \hat{y}$。此處,$f(x)$即$\hat{y}$。

二分類問題中的分類規則通常為$$sign(f(x)) = \begin{cases} +1 \quad if\  yf(x) \geq 0 \\ -1 \quad if\ yf(x) < 0 \end{cases}$$ 

可以看到如果$yf(x) \geq 0$,則樣本分類正確,$yf(x) < 0$則分類錯誤,而相應的分類決策邊界即為$f(x) = 0$。所以最小化損失函數也可以看作是最大化margin的過程,任何合格的分類損失函數都應該對$margin < 0$的樣本施以較大的懲罰

0-1損失 (Zero-one loss)

$$L(y, f(x)) =  \begin{cases} 0\quad if\quad yf(x) \geq 0 \\ 1\quad if\quad yf(x) < 0 \end{cases}$$

0-1損失對每個錯分類點都施以相同的懲罰,這樣那些“錯的離譜“ (即$margin \to -\infty$)的點並不會收到大的關注,這在直覺上不是很合適。另外0-1損失不連續、非凸,優化困難,因而常使用其他的代理損失函數進行優化。

Logistic Loss

$$L(y,f(x)) = \log(1 + \mathrm{e}^{-yf(x)})$$

logistic Loss為Logistic Regression中使用的損失函數,下面做一下簡單證明:

Logistic Regression中使用了Sigmoid函數表示預測概率:$$g(f(x)) = P(y=1|x) = \frac{1}{1 + \mathrm{e}^{-f(x)}}$$

而$$P(y = -1|x) = 1 - P(y = 1|x) = 1 - \frac{1}{1 + \mathrm{e}^{-f(x)}} = \frac{1}{1 + \mathrm{e}^{f(x)}} = g(-f(x))$$

因此利用$y \in \{-1, +1\}$,可寫為$P(y|x) = \frac{1}{1 + \mathrm{e}^{-yf'(x)}}$。此為一個概率模型,利用極大似然的思想:

$$\max(\prod_{i=1}^{m}P(y_i|x_i)) = \max(\prod_{i=1}^{m}\frac{1}{1 + \mathrm{e}^{-y_if(x_i)}})$$

兩邊取對數,又因為是求損失函數,則將極大轉為極小:$$\max(\sum_{i=1}^{m}\log P(y_i|x_i)) = -\min(\sum_{i=1}^{m}\log(\frac{1}{1 + \mathrm{e}^{-y_if(x_i)}})) = \min(\sum_{i=1}^{m}\log(1 + \mathrm{e}^{-y_if(x_i)}))$$

這樣就得到了logistic loss。

如果定義$t = \frac{y + 1}{2} \in \{0, 1\}$,則極大似然法可寫為:

$$\prod_{i=1}^{m}(P(t_i = 1|x_i))^{t_i}((1 - P(t_i = 1|x))^{1 - t_i}$$

取對數,並轉為極小得:$$\sum_{i=1}^{m}\{-t_i\log P(t_i = 1|x_i) - (1 - t_i)\log(1 - P(t_i = 1|x_i))\}$$

上式被稱為交叉熵損失(Cross entropy loss),可以看到在二分類問題中logistic loss和交叉熵損失是等價的,二者區別只是標簽$y$的定義不同。

【以上證明是在概率函數確定為Sigmoid的基礎上所做的推導,對於更普遍的直接用概率$p$表示而進行的推導,詳見下一節交叉熵損失。】

交叉熵損失(Cross Entropy Loss)

$$Cross\ Entropy\ Loss = -(y_i\log(\hat{y_i}) + (1 - y_i)\log(1 - \hat{y_i}))$$

先介紹一個概念——KL距離,是Kullback-Leibler散度(Kullback-Leibler Divergence)的簡稱,也叫做相對熵(Relative Entropy)。它衡量的是相同事件空間里的兩個概率分布的差異情況。其物理意義是:在相同事件空間里,概率分布$P(x)$對應的每個事件,若用概率分布$Q(x)$編碼時,平均每個基本事件(符號)編碼長度增加了多少比特。我們用$D(P||Q)$表示KL距離,計算公式如下:$$D(P||Q) = \sum_{x \in X}P(x)\log \frac{P(x)}{Q(x)} = -\sum_{x \in X}P(x)\log Q(x) - H(P)$$

其中$P$稱為真實分布,$Q$稱為擬合分布,$H(P)$是$P$的熵,為常數。因此$-\sum_{x \in X}P(x)\log Q(x)$度量了$P$和$Q$兩個分布之間的距離,叫作交叉熵損失

【有關熵的相關知識在信息,信息量與信息熵這篇有專門的介紹,這里就不展開詳談了。】

在二分類問題中,數據的真實分布為$(y, 1 - y)$,預測分布為$(P(x;\theta), 1 - P(x;\theta))$,因此交叉熵損失為$$-(y_i\log P(x;\theta) + (1 - y_i)\log(1 - P(x;\theta)))$$。

注意,當實際標簽為 1(y(i)=1) 時,函數的后半部分消失,而當實際標簽是為 0(y(i=0)) 時,函數的前半部分消失。簡言之,我們只是把對真實值類別的實際預測概率的對數相乘。還有重要的一點是,交叉熵損失會重重懲罰那些置信度高但是錯誤的預測值

負對數似然損失(Negative Log Likelihood)

上一節推導證明了交叉熵損失在某些條件下等價於負對數似然損失

從極大似然的角度出發,我們希望極大化如下似然函數:$$l(\theta) = \log \prod_{i=1}^{n}P_{y_i}(x_i;\theta) = \sum_{i=1}{n}\log P_{y_i}(x_i;\theta)$$

其中$P_k(x;\theta) = P(y=k|x;\theta)$。當$y=1$時,$P_k(x;\theta) = P(x;\theta)$;當$y=0$時,$P_k(x;\theta) = 1 -P(x;\theta)$。於是,$$\log P_Y(x;\theta) = y\log P(x;\theta) + (1 - y)\log(1 - P(x;\theta))$$

最大化上式等價於極小化下式$$\sum_{i=1}^{m}\{-t_i\log P(t_i = 1|x_i) - (1 - t_i)\log(1 - P(t_i = 1|x_i))\}$$

該式被稱為負對數似然損失,與上一節的推導結果一模一樣。

交叉熵與Softmax

Softmax分類器使用的即為交叉熵損失函數,Binary Cross Entropy Loss為二分類交叉熵損失,Categorical Crossentropy為多分類交叉熵損失,當使用多分類交叉熵損失函數時,標簽應該為多分類模式,即使用one-hot編碼的向量。

實際上,Softmax是由Logistic Regression模型(用於二分類)推廣得到的多項Logistic Regression模型(用於多分類)。具體可以參考李航大神的《統計學方法》第六章,這里給一個大致的過程:

邏輯回歸的$P(Y=y|x)$表達式如下$$P(Y=y|x) = \begin{cases} h_{\theta}(x) = g(f(x)) = \frac{1}{1+exp\{-f(x)\}} \quad &y=1 \\ 1 - h_{\theta}(x) = 1 - g(f(x)) = \frac{1}{1+exp\{f(x)\}} &y=0\end{cases}$$

將它代入上式,通過推導可以得到logistic的損失函數表達式,如下$$L(y, P(Y=y|x)) = \begin{cases} \log(1+exp\{-f(x)\}) \quad y=1 \\ \log(1+exp\{f(x)\}) \quad y=0 \end{cases}$$

邏輯回歸最后得到的式子如下$$J(\theta) = -\frac{1}{m}[\sum_{i=1}^{m}y^(i)\log h_{\theta}(x^{(i)}) + (1-y^{(i)})\log (1 - h_{\theta}(x^{(i)}))]$$

篇幅有限,有關交叉熵損失函數與softmax更多的理論與實踐內容推薦飛魚Talk的這篇:損失函數 - 交叉熵損失函數

Hinge Loss

$$L(y) = \max(1-y\hat{y})$$

Hinge loss,中文名鉸鏈損失,也被翻譯為“合頁損失“”。在機器學習中常用於"最大間隔(maximum-margin)"的分類任務中,如支持向量機SVM。盡管不可微,但它是一個凸函數,因此可以輕而易舉地使用機器學習領域中常用的凸優化器。

數學表達式中的$\hat{y}$是預測輸出,通常都是軟結果(即輸出不是0,1這種,可能是0.87),$y$表示正確的類別。

  • 如果$\hat{y}y < 1$,則損失為:$1 - \hat{y}y$
  • 如果$\hat{y}y \geq 1$,則損失為:$0$

Hinge loss使得$hat{y}y > 1$的樣本損失皆為0,由此帶來了稀疏解,使得SVM僅通過少量的支持向量就能確定最終超平面。

其函數圖像如下,與0-1損失對比:

優化

以支持向量機為例,其模型為:$\hat{y} = w \cdot x$,如果用Hinge損失,其求導結果如下:

$$\frac{\partial L}{\partial w_i} = \begin{cases} -y\cdot x_i &if\quad \hat{y}y < 1 \\ 0 \quad&otherwise \end{cases}$$

變種

實際應用中,一方面很多時候我們的y的值域並不是$[-1,1]$,比如我們可能更希望$y$更接近於一個概率,即其值域最好是$[0,1]$。另一方面,很多時候我們希望訓練的是兩個樣本之間的相似關系,而非樣本的整體分類,所以很多時候我們會用下面的公式:

$$l(y, y') = \max(0, m - y + y')$$

其中,$y$是正樣本的得分,$y’$是負樣本的得分,$m$是margin(自己選一個數)。

即我們希望正樣本分數越高越好,負樣本分數越低越好,但二者得分之差最多到$m$就足夠了,差距增大並不會有任何獎勵。

比如,我們想訓練詞向量,我們希望經常同時出現的詞,他們的向量內積越大越好;不經常同時出現的詞,他們的向量內積越小越好。則我們的Hinge loss function可以是:$$l(w,w+,w-) = \max(0, 1 - w^T\cdot w +\ +w^T\cdot w-)$$

其中,$w$是當前正在處理的詞, $w+$是$w$在文中前3個詞和后3個詞中的某一個詞, $w-$是隨機選的一個詞。

Exponential Loss

$$L(y,f(x)) = \mathrm{e}^{-yf(x)}$$

學過Adaboost算法的人都知道,它是前向分步加法算法的特例,是一個加和模型,其損失函數就是指數損失(Exponential Loss)。在Adaboost中,經過$m$次迭代之后,可以得到$f_m(x)$:$f_m(x) = f_{m-1}(x)+\alpha_{m}G_m(x)$

Adaboost每次迭代時的目的是為了找到最小化下列式子時的參數$\alpha$和$G$:$$arg\min_{\alpha,G} = \sum_{i=1}^{N}exp[-y_i(f_{m-1}(x_i) + \alpha G(x_i))]$$

對比指數損失函數可以看出,Adaboost的目標式子就是指數損失,在給定$n$個樣本的情況下,Adaboost的損失函數為:$$L(y,f(x)) =\frac{1}{n}\sum_{i=1}^{n}exp[-y_if(x_i)]$$

然而其和squared loss一樣,對異常點敏感,不夠robust。

忽略模型的具體形式,在指數損失下,我們的優化目標為$$\min_{f(x)}E_xE_{Y|x}(\mathrm{e}^{-Yf(x)})$$

最優解為(公式5)$$f^{*}(x) = arg\min_{f(x)}E_xE_{Y|x}(\mathrm{e}^{-Yf(x)}) = \frac{1}{2}\log \frac{Pr(Y=1|x)}{Pr(Y=-1|x)}$$

$f^{*}(x)$估計的是對數幾率的一半。當$Pr(Y=1|x) > Pr(Y=-1)$時, $f^{*}(x)$的符號為正,反之為負。於是$sign(f^{*}(x))$作為預測值可達貝葉斯最優。這說明了指數函數作為損失函數的合理性。當$f(x)$為線性函數時,這就是Logistic Regression。

可以看到,損失函數決定了模型的最優值是什么,模型的形式決定了在哪個函數空間去逼近這個最優值

從上式得到,$$P(x) = Pr(Y=1|x) = \frac{1}{1+\mathrm{e}^{-2f(x)}}$$

令$Y' = (Y + 1)/2 \in \{0, 1\}$,那么負對數似然損失為$$\begin{align}l(Y, P(x)) &= -Y'\log P(x) - (1 - Y')\log(1 - P(x)) \\ &=\log(1+\mathrm{e}^{-2Yf(x)}) \end{align}$$

其最優解(公式7)為$$f(x) = \frac{1}{2}\log\frac{P(y=1|x)}{P(y=-1|x)}$$

因此,在期望意義下,指數損失和負對數似然損失對應了相同的解公式5和7。

但對於樣本損失來說,負對數似然損失有更好的魯棒性。舉個例子就好理解了,估計正態分布的均值,平均數( L2損失的最優值)和中位數( L1損失的最優值)都是無偏估計,但中位數對於異常值的波動性更小。因為L2對偏離較遠的點懲罰較重(平方),L1對偏離較遠的點懲罰較輕(線性)。同樣的,指數損失對於向左偏離較遠的$Yf(x)$懲罰也太重了(指數),負對數似然是線性懲罰。

Focal Loss

$$L_{FL}(y) = \begin{cases} -\alpha(1-y')^{\gamma}\log y' \quad &y=1 \\ -(1-alpha)y'^{\gamma}\log(1-y') &y=0\end{cases}$$

Focal Loss來自ICCV2017 RBG和Kaiming大神的新作《Focal Loss for Dense Object Detection》。論文詳解推薦這篇Focal loss論文詳解,介於篇幅,這里只做簡單介紹。

Focal loss主要是為了解決one-stage目標檢測中正負樣本比例嚴重失衡的問題。該損失函數降低了大量簡單負樣本在訓練中所占的權重,也可理解為一種困難樣本挖掘。它是在交叉熵損失函數基礎上進行的修改,首先回顧二分類交叉熵損失:$$L_{CE} = -y\log y' - (1-y)\log(1-y') = \begin{cases} -\log y' &y=1 \\ -\log(1-y') &y=0 \end{cases}$$

$y'$是經過激活函數的輸出,所以在0-1之間。可見普通的交叉熵對於正樣本而言,輸出概率越大損失越小。對於負樣本而言,輸出概率越小則損失越小。此時的損失函數在大量簡單樣本的迭代過程中比較緩慢且可能無法優化至最優。那么Focal loss是怎么改進的呢?$$L_{FL} = \begin{cases} -(1-y')^{\gamma}\log y' &y=1 \\ -y'^{\gamma}\log(1-y') &y=0\end{cases}$$

首先在原有的基礎上加了一個因子,其中$\gamma > 0$使得減少易分類樣本的損失。使得更關注於困難的、錯分的樣本。

例如$\gamma$為$2$,對於正類樣本而言,預測結果為$0.95$肯定是簡單樣本,所以$(1-0.95)$的$\gamma$次方就會很小,這時損失函數值就變得更小。而預測概率為$0.3$的樣本其損失相對很大。對於負類樣本而言同樣,預測$0.1$的結果應當遠比預測$0.7$的樣本損失值要小得多。對於預測概率為$0.5$時,損失只減少了$0.25$倍,所以更加關注於這種難以區分的樣本。這樣減少了簡單樣本的影響,大量預測概率很小的樣本疊加起來后的效應才可能比較有效。

此外,加入平衡因子$\alpha$,用來平衡正負樣本本身的比例不均:文中$\alpha$取$0.25$,即正樣本要比負樣本占比小,這是因為負例易分。

$$L_{FL} = \begin{cases} -\alpha(1-y')^{\gamma}\log y' &y=1 \\ -(1-\alpha)y'^{\gamma}\log(1-y') &y=0 \end{cases}$$

只添加$\alpha$雖然可以平衡正負樣本的重要性,但是無法解決簡單與困難樣本的問題。

$\gamma$調節簡單樣本權重降低的速率,當$\gamma$為$0$時即為交叉熵損失函數,當$\gamma$增加時,調整因子的影響也在增加。實驗發現$\gamma$為$2$是最優。

總結

作者認為one-stage和two-stage的表現差異主要原因是大量前景背景類別不平衡導致。作者設計了一個簡單密集型網絡RetinaNet來訓練在保證速度的同時達到了精度最優。在雙階段算法中,在候選框階段,通過得分和nms篩選過濾掉了大量的負樣本,然后在分類回歸階段又固定了正負樣本比例,或者通過OHEM在線困難挖掘使得前景和背景相對平衡。而one-stage階段需要產生約100k的候選位置,雖然有類似的采樣,但是訓練仍然被大量負樣本所主導。

補充解答

為什么平方損失函數不適用分類問題?

直觀上,對特定的分類問題,平方差的損失有上限(所有標簽都錯,損失值是一個有效值),但交叉熵則可以用整個非負域來反映優化程度的程度。

從本質上看,平方差的意義和交叉熵的意義不一樣。概率理解上,平方損失函數意味着模型的輸出是以預測值為均值的高斯分布,損失函數是在這個預測分布下真實值的似然度,Softmax損失意味着真實標簽的似然度。

分類問題中的標簽,是沒有連續的概念的。one-hot作為標簽的一種表達方式,每個標簽之間的距離也是沒有實際意義的,所以預測值和標簽兩個向量之間的平方差這個值不能反應分類這個問題的優化程度。

還有個原因應該是Softmax帶來的梯度消失吧。預測值離標簽越遠,有可能的梯度越小。李龍說的non-convex問題,應該是一種體現形式。

能不能設計一個分類模型,當使用平方損失時,損失函數關於參數是凸函數?

一個簡單而不成熟的想法是,把這個問題當成回歸問題,$f(x) = w^T + b$。當$f(x) > 0$時,預測值為$1$。當$f(x) < 0$時,預測值為$-1$。損失函數是凸函數,如下圖:

但這個平方損失+線性模型可以說是非常糟糕了,魯棒性特別差!如果一個點碰巧標記錯了又離最優的boundary特別遠,很可能導致友軍全軍覆沒。

增強魯棒性的一個直接的想法是,對模型進行截斷或者對損失函數進行截斷。

對模型截斷:$$f(x;w,b) = \begin{cases} 1 &if\quad w_Tx + b > 1 \\ -1 &if\quad w^Tx + b < -1 \\ w^Tx + b &else \end{cases}$$

對損失函數截斷:$$loss(y;f(x)) = \begin{cases} 1&if\quad  loss(y;f(x)) > 1 \\ -1&if\quad loss(y;f(x)) < -1 \\ loss(y;f(x)) &else \end{cases}$$

線性模型+截斷平方損失

截斷線性模型+平方損失

隨着深度學習推動了一系列非凸優化算法的研究和應用,在工程中大家並不太關心損失函數,或者說損失函數的選擇比較少,而是將重心放在如何去設計模型的結構。神經網絡中有一個例子展現了優雅的損失函數是如何發揮作用的,那就是孿生網絡中的Contrastive Loss

(整理自網絡)

參考資料:

https://nbviewer.jupyter.org/github/groverpr/Machine-Learning/blob/master/notebooks/05_Loss_Functions.ipynb

https://www.jiqizhixin.com/articles/091202

https://zhuanlan.zhihu.com/p/39239829

https://zhuanlan.zhihu.com/p/35708936

https://zhuanlan.zhihu.com/p/74073096

https://www.zhihu.com/question/319865092

https://blog.csdn.net/zhangjunp3/article/details/80467350

https://www.cnblogs.com/massquantity/p/8964029.html

https://www.pianshen.com/article/3162136463/

https://www.cnblogs.com/king-lps/p/9497836.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM