損失函數詳解


損失函數(loss function)是用來估量你模型的預測值f(x)與真實值Y的不一致程度,它是一個非負實值函數,通常使用L(Y, f(x))來表示,損失函數越小,模型的魯棒性就越好。損失函數是經驗風險函數的核心部分,也是結構風險函數重要組成部分。模型的結構風險函數包括了經驗風險項和正則項,通常可以表示成如下式子:

$$\theta^* = \arg \min_\theta \frac{1}{N}{}\sum_{i=1}^{N} L(y_i, f(x_i; \theta)) + \lambda\ \Phi(\theta)$$

其中,前面的均值函數表示的是經驗風險函數,L代表的是損失函數,后面的$\Phi$是正則化項(regularizer)或者叫懲罰項(penalty term),它可以是L1,也可以是L2,或者其他的正則函數。整個式子表示的意思是找到使目標函數最小時的$\theta$值。下面主要列出幾種常見的損失函數。

一、log對數損失函數(邏輯回歸)

有些人可能覺得邏輯回歸的損失函數就是平方損失,其實並不是。平方損失函數可以通過線性回歸在假設樣本是高斯分布的條件下推導得到,而邏輯回歸得到的並不是平方損失。在邏輯回歸的推導中,它假設樣本服從伯努利分布(0-1分布),然后求得滿足該分布的似然函數,接着取對數求極值等等。而邏輯回歸並沒有求似然函數的極值,而是把極大化當做是一種思想,進而推導出它的經驗風險函數為:最小化負的似然函數(即max F(y, f(x)) —-> min -F(y, f(x)))。從損失函數的視角來看,它就成了log損失函數了。

log損失函數的標准形式
$$L(Y,P(Y|X)) = -\log P(Y|X)$$
剛剛說到,取對數是為了方便計算極大似然估計,因為在MLE中,直接求導比較困難,所以通常都是先取對數再求導找極值點。損失函數L(Y, P(Y|X))表達的是樣本X在分類Y的情況下,使概率P(Y|X)達到最大值(換言之,就是利用已知的樣本分布,找到最有可能(即最大概率)導致這種分布的參數值;或者說什么樣的參數才能使我們觀測到目前這組數據的概率最大)。因為log函數是單調遞增的,所以logP(Y|X)也會達到最大值,因此在前面加上負號之后,最大化P(Y|X)就等價於最小化L了。

邏輯回歸的P(Y=y|x)表達式如下(為了將類別標簽y統一為1和0,下面將表達式分開表示):

將它帶入到上式,通過推導可以得到logistic的損失函數表達式,如下:

邏輯回歸最后得到的目標式子如下:

$$J(\theta) = - \frac{1}{m} \sum_{i=1}^m \left [ y^{(i)} \log h_{\theta}(x^{(i)}) + (1-y^{(i)}) \log(1-h_{\theta}(x^{(i)})) \right ]$$

上面是針對二分類而言的。這里需要解釋一下:之所以有人認為邏輯回歸是平方損失,是因為在使用梯度下降來求最優解的時候,它的迭代式子與平方損失求導后的式子非常相似,從而給人一種直觀上的錯覺

這里有個PDF可以參考一下:Lecture 6: logistic regression.pdf.

二、平方損失函數(最小二乘法, Ordinary Least Squares )

最小二乘法是線性回歸的一種,OLS將問題轉化成了一個凸優化問題。在線性回歸中,它假設樣本和噪聲都服從高斯分布(為什么假設成高斯分布呢?其實這里隱藏了一個小知識點,就是中心極限定理,可以參考【central limit theorem】),最后通過極大似然估計(MLE)可以推導出最小二乘式子。最小二乘的基本原則是:最優擬合直線應該是使各點到回歸直線的距離和最小的直線,即平方和最小。換言之,OLS是基於距離的,而這個距離就是我們用的最多的歐幾里得距離。為什么它會選擇使用歐式距離作為誤差度量呢(即Mean squared error, MSE),主要有以下幾個原因:

  • 簡單,計算方便;
  • 歐氏距離是一種很好的相似性度量標准;
  • 在不同的表示域變換后特征性質不變。

平方損失(Square loss)的標准形式如下:
$$ L(Y, f(X)) = (Y - f(X))^2 $$
當樣本個數為n時,此時的損失函數變為:
$$L(Y, f(X)) = \sum _{i=1}^{n}(Y - f(X))^2$$
Y-f(X)表示的是殘差,整個式子表示的是殘差的平方和,而我們的目的就是最小化這個目標函數值(注:該式子未加入正則項),也就是最小化殘差的平方和(residual sum of squares,RSS)。

而在實際應用中,通常會使用均方差(MSE)作為一項衡量指標,公式如下:
$$MSE = \frac{1}{n} \sum_{i=1} ^{n} (\tilde{Y_i} - Y_i )^2$$
上面提到了線性回歸,這里額外補充一句,我們通常說的線性有兩種情況,一種是因變量y是自變量x的線性函數,一種是因變量y是參數$\alpha$的線性函數。在機器學習中,通常指的都是后一種情況。

三、指數損失函數(Adaboost)

學過Adaboost算法的人都知道,它是前向分步加法算法的特例,是一個加和模型,損失函數就是指數函數。在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}))]$$

而指數損失函數(exp-loss)的標准形式如下

$$L(y, f(x)) = \exp[-yf(x)]$$

可以看出,Adaboost的目標式子就是指數損失,在給定n個樣本的情況下,Adaboost的損失函數為:

L(y, f(x)) = \frac{1}{n}\sum_{i=1}^{n}\exp[-y_if(x_i)]

關於Adaboost的推導,可以參考Wikipedia:AdaBoost或者《統計學習方法》P145.

四、Hinge損失函數(SVM)

在機器學習算法中,hinge損失函數和SVM是息息相關的。在線性支持向量機中,最優化問題可以等價於下列式子:
$$\min_{w,b}  \ \sum_{i}^{N} [1 - y_i(w\cdot x_i + b)]_{+} + \lambda||w||^2 $$
下面來對式子做個變形,令:
$$[1 - y_i(w\cdot x_i + b)]_{+} = \xi_{i}$$
於是,原式就變成了:
$$\min_{w,b}  \ \sum_{i}^{N} \xi_i + \lambda||w||^2 $$
如若取$\lambda=\frac{1}{2C}$,式子就可以表示成:
$$\min_{w,b}  \frac{1}{C}\left ( \frac{1}{2}\ ||w||^2 $$ + C \sum_{i}^{N} \xi_i\right )$$
可以看出,該式子與下式非常相似:
$$\frac{1}{m} \sum_{i=1}^{m} l(w \cdot  x_i + b, y_i) + ||w||^2$$

前半部分中的$l$就是hinge損失函數,而后面相當於L2正則項。

Hinge 損失函數的標准形式
$$L(y) = \max(0, 1-y\tilde{y}), y=\pm 1$$
可以看出,當|y|>=1時,L(y)=0。

更多內容,參考Hinge-loss

補充一下:在libsvm中一共有4中核函數可以選擇,對應的是-t參數分別是:

  • 0-線性核;
  • 1-多項式核;
  • 2-RBF核;
  • 3-sigmoid核。

五、其它損失函數

除了以上這幾種損失函數,常用的還有:

0-1損失函數
L(Y, f(X)) = \left\{\begin{matrix}1 ,& Y \neq f(X)\\ 0 ,& y = f(X)    \end{matrix}\right.
絕對值損失函數
$$L(Y, f(X)) = |Y-f(X)|$$
下面來看看幾種損失函數的可視化圖像,對着圖看看橫坐標,看看縱坐標,再看看每條線都表示什么損失函數,多看幾次好好消化消化。

OK,暫時先寫到這里,休息下。最后,需要記住的是:參數越多,模型越復雜,而越復雜的模型越容易過擬合。過擬合就是說模型在訓練數據上的效果遠遠好於在測試集上的性能。此時可以考慮正則化,通過設置正則項前面的hyper parameter,來權衡損失函數和正則項,減小參數規模,達到模型簡化的目的,從而使模型具有更好的泛化能力。

六、示例分析

0/1損失函數是最理想的損失函數,如果分類錯誤(只要有一個錯誤)就是1,全部正確就是0。不過這個函數有凸函數,不連續等性質,在實際應用中很難實現,所以才有了幾種替代的損失函數,他們都是連續,凸函數。其他的三個損失函數的0/1損失函數的上界,如果可以讓其他的三個損失函數比較小,也就可以近似的讓0/1損失函數比較小。hinge損失函數只要分類正確就不在要求,而其他的另個函數即使分類正確,也要追求更加正確,也就是說,如果你考60分幾個,hinge損失函數知道你得到60分就滿意。但是另外兩個就不會滿足於此,還會繼續讓你考80分,就是繼續讓你超更加好的方面更新,所以hinge損失函數是及格就好。要是不斷追求完美,這就會容易導致過擬合。這幾個函數的更新速度就是在分類效果差的時候,指數下降最快,慢慢變得分類效果好的時候,就是hinge下降最快。不過平方誤差函數分類很正確和分類錯誤很嚴重都會導致很大的誤差,模型會出問題,所以在分類的時候不用這個函數,只有在擬合的時候用這個損失函數。

我們來看下下面這個示例:

 1 import numpy as np;
 2 import matplotlib.pyplot as plt;
 3 
 4 x = np.linspace(-2, 2, 300)
 5 
 6 hinge_loss_function = []
 7 for i in (1-x):
 8     if i > 0:
 9         hinge_loss_function.append(i)
10     else:
11         hinge_loss_function.append(0)
12 exponential_loss_function = np.exp(-x)
13 logistic_loss_function = np.log(1+np.exp(-x))/np.log(2)
14 
15 l0_1_loss_function = []
16 for j in x:
17     if j < 0:
18         l0_1_loss_function.append(1)
19     else:
20         l0_1_loss_function.append(0)
21 
22 pingfang_loss_function = (x-1) ** 2
23 
24 plt.plot(x, hinge_loss_function, 'r-')
25 plt.plot(x, exponential_loss_function, 'b-')
26 plt.plot(x, logistic_loss_function, 'g-')
27 plt.plot(x, l0_1_loss_function, 'k-')
28 plt.plot(x, pingfang_loss_function, 'c-')
29 plt.legend(['hinge_loss_function', 'exponential_loss_function', 'logistic_loss_function', 'l0_1_loss_function', 'pingfang_loss_function'])
30 plt.show()

結果如下:

參考文獻


免責聲明!

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



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