代碼
損失函數的一般表示為\(L(y,f(x))\),用以衡量真實值\(y\)和預測值\(f(x)\)之間不一致的程度,一般越小越好。為了便於不同損失函數的比較,常將其表示為單變量的函數,在回歸問題中這個變量為\(y-f(x)\),在分類問題中則為\(yf(x)\)。下面分別進行討論。
回歸問題的損失函數
回歸問題中\(y\)和\(f(x)\)皆為實數\(\in R\),因此用殘差 \(y-f(x)\)來度量二者的不一致程度。殘差 (的絕對值) 越大,則損失函數越大,學習出來的模型效果就越差(這里不考慮正則化問題)。
常見的回歸損失函數有:
- 平方損失 (squared loss) : \((y-f(x))^2\)
- 絕對值 (absolute loss) : \(|y-f(x)|\)
- Huber損失 (huber loss) : \(\left\{\begin{matrix}\frac12[y-f(x)]^2 & \qquad |y-f(x)| \leq \delta \\ \delta|y-f(x)| - \frac12\delta^2 & \qquad |y-f(x)| > \delta\end{matrix}\right.\)
其中最常用的是平方損失,然而其缺點是對於異常點會施以較大的懲罰,因而不夠robust。如果有較多異常點,則絕對值損失表現較好,但絕對值損失的缺點是在$y-f(x)=0$處不連續可導,因而不容易優化。
Huber損失是對二者的綜合,當$|y-f(x)|$小於一個事先指定的值$\delta$時,變為平方損失,大於$\delta$時,則變成類似於絕對值損失,因此也是比較robust的損失函數。三者的圖形比較如下:
分類問題的損失函數
對於二分類問題,\(y\in \left\{-1,+1 \right\}\),損失函數常表示為關於\(yf(x)\)的單調遞減形式。如下圖:
\(yf(x)\)被稱為margin,其作用類似於回歸問題中的殘差 \(y-f(x)\)。
二分類問題中的分類規則通常為 \(\text{sign}(f(x)) = \left\{\begin{matrix} +1 \qquad\text{if}\;\;yf(x) \geq 0 \\ -1 \qquad \text{if} \;\; yf(x) < 0\end{matrix}\right.\)
可以看到如果 \(yf(x) > 0\),則樣本分類正確,\(yf(x) < 0\) 則分類錯誤,而相應的分類決策邊界即為 \(f(x) = 0\)。所以最小化損失函數也可以看作是最大化 margin 的過程,任何合格的分類損失函數都應該對 margin<0 的樣本施以較大的懲罰。
1、 0-1損失 (zero-one loss)
0-1損失對每個錯分類點都施以相同的懲罰,這樣那些“錯的離譜“ (即 \(margin \rightarrow -\infty\))的點並不會收到大的關注,這在直覺上不是很合適。另外0-1損失不連續、非凸,優化困難,因而常使用其他的代理損失函數進行優化。
2、Logistic loss
logistic Loss為Logistic Regression中使用的損失函數,下面做一下簡單證明:
Logistic Regression中使用了Sigmoid函數表示預測概率:$$g(f(x)) = P(y=1|x) = \frac{1}{1+e^{-f(x)}}$$
而$$P(y=-1|x) = 1-P(y=1|x) = 1-\frac{1}{1+e^{-f(x)}} = \frac{1}{1+e^{f(x)}} = g(-f(x))$$
因此利用\(y\in\left\{-1,+1\right\}\),可寫為\(P(y|x) = \frac{1}{1+e^{-yf(x)}}\),此為一個概率模型,利用極大似然的思想:
$$max \left(\prod\limits_{i=1}^m P(y_i|x_i)\right) = max \left(\prod\limits_{i=1}^m \frac{1}{1+e^{-y_if(x_i)}}\right)$$
兩邊取對數,又因為是求損失函數,則將極大轉為極小:
這樣就得到了logistic loss。
如果定義\(t = \frac{y+1}2 \in \left\{0,1\right\}\),則極大似然法可寫為:
取對數並轉為極小得:
上式被稱為交叉熵損失 (cross entropy loss),可以看到在二分類問題中logistic loss和交叉熵損失是等價的,二者區別只是標簽y的定義不同。
3、Hinge loss
hinge loss為svm中使用的損失函數,hinge loss使得\(yf(x)>1\)的樣本損失皆為0,由此帶來了稀疏解,使得svm僅通過少量的支持向量就能確定最終超平面。
hinge loss被翻譯為“合頁損失”,那么合頁究竟長啥樣?如圖,確實有點像hinge loss的形狀:
來看下 hinge loss 是如何推導出來的,帶軟間隔的svm最后的優化問題可表示為:
\((2)\) 式重新整理為 $ \xi_i \geqslant 1 - y_i(\boldsymbol{w}^T\boldsymbol{x}_i + b)$ 。若 \(1 - y_i(\boldsymbol{w}^T\boldsymbol{x}_i + b) < 0\) ,由於約束\((3)\) 的存在,則 \(\xi_i \geqslant 0\) ;若\(1 - y_i(\boldsymbol{w}^T\boldsymbol{x}_i + b) \geqslant 0\) ,則依然為 $ \xi_i \geqslant 1 - y_i(\boldsymbol{w}^T\boldsymbol{x}_i + b)$ 。所以\((2),(3)\) 式結合起來:
又由於 \((1)\) 式是最小化問題,所以取 \(\xi_i\) 的極小值,即令 \(\xi_i = max(0,1-yf(x))\) 代入 \((1)\) 式,並令\(\lambda = \frac{1}{2C}\) :
另外可以看到 svm 這個形式的損失函數是自帶參數 \(\boldsymbol{w}\) 的\(L2\) 正則的,而相比之下Logistic Regression的損失函數則沒有顯式的正則化項,需要另外添加。
4、指數損失(Exponential loss)
exponential loss為AdaBoost中使用的損失函數,使用exponential loss能比較方便地利用加法模型推導出AdaBoost算法 (具體推導過程)。然而其和squared loss一樣,對異常點敏感,不夠robust。
5、modified Huber loss
modified huber loss結合了hinge loss和logistic loss的優點,既能在\(yf(x) > 1\)時產生稀疏解提高訓練效率,又能進行概率估計。另外其對於\((yf(x) < -1)\) 樣本的懲罰以線性增加,這意味着受異常點的干擾較少,比較robust。scikit-learn中的SGDClassifier同樣實現了modified huber loss。
最后來張全家福:
從上圖可以看出上面介紹的這些損失函數都可以看作是0-1損失的單調連續近似函數,而因為這些損失函數通常是凸的連續函數,因此常用來代替0-1損失進行優化。它們的相同點是都隨着\(margin \rightarrow -\infty\)而加大懲罰;不同點在於,logistic loss和hinge loss都是線性增長,而exponential loss是以指數增長。
值得注意的是上圖中modified huber loss的走向和exponential loss差不多,並不能看出其robust的屬性。其實這和算法時間復雜度一樣,成倍放大了之后才能體現出巨大差異:
/