【機器學習】代價函數(cost function)

:代價函數(有的地方也叫損失函數,Loss Function)在機器學習中的每一種算法中都很重要,由於訓練模型的過程就是優化代價函數的過程,代價函數對每一個參數的偏導數就是梯度降低中提到的梯度,防止過擬合時添加的正則化項也是加在代價函數後面的。在學習相關算法的過程當中,對代價函數的理解也在不斷的加深,在此作一個小結。html

 

1. 什麼是代價函數?


假設有訓練樣本(x, y),模型爲h,參數爲θ。h(θ) = θTx(θT表示θ的轉置)。git

(1)概況來說,任何可以衡量模型預測出來的值h(θ)與真實值y之間的差別的函數均可以叫作代價函數C(θ),若是有多個樣本,則能夠將全部代價函數的取值求均值,記作J(θ)。所以很容易就能夠得出如下關於代價函數的性質:算法

  • 對於每種算法來講,代價函數不是惟一的;
  • 代價函數是參數θ的函數;
  • 總的代價函數J(θ)能夠用來評價模型的好壞,代價函數越小說明模型和參數越符合訓練樣本(x, y);
  • J(θ)是一個標量;

(2)當咱們肯定了模型h,後面作的全部事情就是訓練模型的參數θ。那麼何時模型的訓練才能結束呢?這時候也涉及到代價函數,因爲代價函數是用來衡量模型好壞的,咱們的目標固然是獲得最好的模型(也就是最符合訓練樣本(x, y)的模型)。所以訓練參數的過程就是不斷改變θ,從而獲得更小的J(θ)的過程。理想狀況下,當咱們取到代價函數J的最小值時,就獲得了最優的參數θ,記爲:網絡

$$\displaystyle \min_{ \theta } J(\theta)$$app

例如,J(θ) = 0,表示咱們的模型完美的擬合了觀察的數據,沒有任何偏差。機器學習

(3)在優化參數θ的過程當中,最經常使用的方法是梯度降低,這裏的梯度就是代價函數J(θ)對θ1, θ2, ..., θn的偏導數。因爲須要求偏導,咱們能夠獲得另外一個關於代價函數的性質:ide

  • 選擇代價函數時,最好挑選對參數θ可微的函數(全微分存在,偏導數必定存在)

 

2. 代價函數的常見形式


通過上面的描述,一個好的代價函數須要知足兩個最基本的要求:可以評價模型的準確性,對參數θ可微。 函數

 

2.1 均方偏差學習

在線性迴歸中,最經常使用的是均方偏差(Mean squared error),具體形式爲:優化

$$J(\theta_0, \theta_1) = \frac{ 1 }{ 2m } \displaystyle \sum_{ i = 1 }^{ m } (\hat{ y }^{(i)} - y^{(i)})^2 = \frac{ 1 }{ 2m } \displaystyle \sum_{ i = 1 }^{ m } (h_\theta(x^{(i)}) - y^{(i)})^2 $$

m:訓練樣本的個數;

hθ(x):用參數θ和x預測出來的y值;

y:原訓練樣本中的y值,也就是標準答案

上角標(i):第i個樣本

 

2.2 交叉熵

在邏輯迴歸中,最經常使用的是代價函數是交叉熵(Cross Entropy),交叉熵是一個常見的代價函數,在神經網絡中也會用到。下面是《神經網絡與深度學習》一書對交叉熵的解釋:

交叉熵是對「出乎意料」(譯者注:原文使用suprise)的度量。神經元的目標是去計算函數y, 且y=y(x)。可是咱們讓它取而代之計算函數a, 且a=a(x)。假設咱們把a看成y等於1的機率,1−a是y等於0的機率。那麼,交叉熵衡量的是咱們在知道y的真實值時的平均「出乎意料」程度。當輸出是咱們指望的值,咱們的「出乎意料」程度比較低;當輸出不是咱們指望的,咱們的「出乎意料」程度就比較高。

 

在1948年,克勞德·艾爾伍德·香農將熱力學的熵,引入到信息論,所以它又被稱爲香農熵(Shannon Entropy),它是香農信息量(Shannon Information Content, SIC)的指望。香農信息量用來度量不肯定性的大小:一個事件的香農信息量等於0,表示該事件的發生不會給咱們提供任何新的信息,例如肯定性的事件,發生的機率是1,發生了也不會引發任何驚訝;當不可能事件發生時,香農信息量爲無窮大,這表示給咱們提供了無窮多的新信息,而且使咱們無限的驚訝。更多解釋能夠看這裏

$$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)})})]$$

符號說明同上 

 

2.3 神經網絡中的代價函數

學習過神經網絡後,發現邏輯迴歸實際上是神經網絡的一種特例(沒有隱藏層的神經網絡)。所以神經網絡中的代價函數與邏輯迴歸中的代價函數很是類似:

$$J(\theta) = -\frac{ 1 }{ m }[\sum_{ i=1 }^{ m } \sum_{ k=1 }^{ K } ({y_k^{(i)} \log h_\theta(x^{(i)}) + (1 - y_k^{(i)}) \log (1 - (h_\theta(x^{(i)}))_k})]$$

這裏之因此多了一層求和項,是由於神經網絡的輸出通常都不是單一的值,K表示在多分類中的類型數。

例如在數字識別中,K=10,表示分了10類。此時對於某一個樣原本說,輸出的結果以下:

  1.1266e-004
  1.7413e-003
  2.5270e-003
  1.8403e-005
  9.3626e-003
  3.9927e-003
  5.5152e-003
  4.0147e-004
  6.4807e-003
  9.9573e-001

一個10維的列向量,預測的結果表示輸入的數字是0~9中的某一個的機率,機率最大的就被當作是預測結果。例如上面的預測結果是9。理想狀況下的預測結果應該以下(9的機率是1,其餘都是0):

   0
   0
   0
   0
   0
   0
   0
   0
   0
   1

比較預測結果和理想狀況下的結果,能夠看到這兩個向量的對應元素之間都存在差別,共有10組,這裏的10就表示代價函數裏的K,至關於把每一種類型的差別都累加起來了。

 

3. 代價函數與參數


代價函數衡量的是模型預測值h(θ) 與標準答案y之間的差別,因此總的代價函數J是h(θ)和y的函數,即J=f(h(θ), y)。又由於y都是訓練樣本中給定的,h(θ)由θ決定,因此,最終仍是模型參數θ的改變致使了J的改變。對於不一樣的θ,對應不一樣的預測值h(θ),也就對應着不一樣的代價函數J的取值。變化過程爲:

$$\theta --> h(\theta) --> J(\theta)$$

θ引發了h(θ)的改變,進而改變了J(θ)的取值。爲了更直觀的看到參數對代價函數的影響,舉個簡單的例子:

有訓練樣本{(0, 0), (1, 1), (2, 2), (4, 4)},即4對訓練樣本,每一個樣本對中第1個數表示x的值,第2個數表示y的值。這幾個點很明顯都是y=x這條直線上的點。以下圖:

abc

                                                                                                             圖1:不一樣參數能夠擬合出不一樣的直線

"""
Spyder Editor

Python 3.6, Belter, 20170401
"""

import matplotlib.pyplot as plt
import numpy as np
X = np.array([[0, 1, 2, 4]]).T  # 都轉換成列向量
y = np.array([[0, 1, 2, 4]]).T
theta1 = np.array([[0, 0]]).T  # 三個不一樣的theta_1值
theta2 = np.array([[0, 0.5]]).T
theta3 = np.array([[0, 1]]).T
X_size = X.shape
X_0 = np.ones((X_size[0],1))  # 添加x_0
X_with_x0 = np.concatenate((X_0, X), axis=1)
h1 = np.dot(X_with_x0, theta1)
h2 = np.dot(X_with_x0, theta2)
h3 = np.dot(X_with_x0, theta3)
plt.plot(X, y, 'rx', label='y')
plt.plot(X, h1, 'b', label='h1, theta_1=0')
plt.plot(X, h2, 'm', label='h2, theta_1=0.5')
plt.plot(X, h3, 'g', label='h3, theta_1=1')
plt.xlabel('X')
plt.ylabel('y/h')
plt.axis([-0.1, 4.5, -0.1, 4.5])
plt.legend(loc='upper left')
plt.savefig('liner_gression_error.png', dpi=200)
View Code

常數項爲0,因此能夠取θ0=0,而後取不一樣的θ1,能夠獲得不一樣的擬合直線。當θ1=0時,擬合的直線是y=0,即藍色線段,此時距離樣本點最遠,代價函數的值(偏差)也最大;當θ1=1時,擬合的直線是y=x,即綠色線段,此時擬合的直線通過每個樣本點,代價函數的值爲0。

經過下圖能夠查看隨着θ1的變化,J(θ)的變化狀況:

                                                                                                        圖2:代價函數J(θ)隨參數的變化而變化

"""
Spyder Editor

Python 3.6, Belter, 20170401
"""

# 計算代價函數的值
def calcu_cost(theta, X, y):
    m = X.shape[0]  # sample size
    X_0 = np.ones((m,1))
    X_with_x0 = np.concatenate((X_0, X), axis=1)
    h = np.dot(X_with_x0, theta)
    return(np.dot((h-y).T, (h-y))/(2*m))
    
X = np.array([[0, 1, 2, 4]]).T
y = np.array([[0, 1, 2, 4]]).T
theta_0 = np.zeros((101, 1))
theta_1 = np.array([np.linspace(-2, 4, 101)]).T
theta = np.concatenate((theta_0, theta_1), axis=1)  # 101組不一樣的參數
J_list = []
for i in range(101):
    current_theta = theta[i:i+1].T
    cost = calcu_cost(current_theta, X, y)
    J_list.append(cost[0,0])
plt.plot(theta_1, J_list)
plt.xlabel('theta_1')
plt.ylabel('J(theta)')
plt.savefig('cost_theta.png', dpi=200)
View Code

從圖中能夠很直觀的看到θ對代價函數的影響,當θ1=1時,代價函數J(θ)取到最小值。由於線性迴歸模型的代價函數(均方偏差)的性質很是好,所以也能夠直接使用代數的方法,求J(θ)的一階導數爲0的點,就能夠直接求出最優的θ值(正規方程法)。

 

4. 代價函數與梯度


 梯度降低中的梯度指的是代價函數對各個參數的偏導數,偏導數的方向決定了在學習過程當中參數降低的方向,學習率(一般用α表示)決定了每步變化的步長,有了導數和學習率就可使用梯度降低算法(Gradient Descent Algorithm)更新參數了。下圖中展現了只有兩個參數的模型運用梯度降低算法的過程。

 

 

 

下圖能夠看作是代價函數J(θ)與參數θ作出的圖,曲面上的一個點(θ 0, θ 1, J(θ)),有無數條切線,在這些切線中與x-y平面(底面,至關於θ 0, θ 1)夾角最大的那條切線就是該點梯度的方向,沿該方向移動,會產生最大的高度變化(相對於z軸,這裏的z軸至關於代價函數J(θ))。

 

4.1 線性迴歸模型的代價函數對參數的偏導數

 

 仍是以兩個參數爲例,每一個參數都有一個偏導數,且綜合了全部樣本的信息。

 

4.2 邏輯迴歸模型的代價函數對參數的偏導數

根據邏輯迴歸模型的代價函數以及sigmoid函數

$$h_{\theta}(x)=g(\theta^{T}x)$$

$$g(z)=\frac{1}{1+e^{-z}}$$

獲得對每一個參數的偏導數爲

$$\frac{\partial}{\partial\theta_{j}}J(\theta) =\sum_{i=1}^{m}(h_\theta(x^{i})-y^i)x_j^i$$

 詳細推導過程能夠看這裏-邏輯迴歸代價函數的導數

 

4.3 神經網絡中的代價函數對參數的偏導數

 這裏的計算過程與前面都不同,後面再補充。

 

 

 

重大修訂:

2017.8.14 修改排版,補充對交叉熵的解釋

 

References


 

https://www.quora.com/How-are-the-cost-functions-for-Neural-Networks-derived/answer/Daniel-Watson-22?srid=uIoGQ

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

https://zh.wikipedia.org/wiki/%E7%86%B5_(%E4%BF%A1%E6%81%AF%E8%AE%BA)

https://hit-scir.gitbooks.io/neural-networks-and-deep-learning-zh_cn/content/chap3/c3s3.html

Coursera, Andrew Ng 公開課第一週,第三週,第五週

http://math.stackexchange.com/questions/477207/derivative-of-cost-function-for-logistic-regression

http://math.stackexchange.com/questions/947604/gradient-tangents-planes-and-steepest-direction

相關文章
相關標籤/搜索