機器學習中的優化算法、加速訓練機制、損失函數、KL散度和交叉熵

1.優化算法

爲了說明梯度下降法、隨機梯度下降法、批量梯度下降法三者區別,我們通過一組數據來擬合

y=θ1x1+θ2x2

梯度下降(gradient descent):在梯度下降中,對於θ 的更新,所有的樣本都有貢獻,也就是所有樣本參與調整θ .其計算得到的是一個標準梯度。因而理論上來說一次更新的幅度是比較大的。如果樣本不多的情況下,當然是這樣收斂的速度會比較快。在一次迭代過程中,所有樣本都參與權值調整。

隨機梯度下降(stochastic gradient descent):可以看到多了隨機兩個字,隨機也就是說我用樣本集合中的一個樣本來近似我所有的樣本,來調整θ ,因而隨機梯度下降是會帶來一定的問題,因爲計算得到的並不是準確的一個梯度,容易陷入到局部最優解中。一次迭代,只隨機選一個樣本來進行權值更新。使用隨機梯度下降法雖然簡單有效,但是它需要非常細心地調節模型hyper-parameters,特別是學習率(learning rate),以及模型參數的初始化值。

小批量梯度下降(mini-batch gradient descent):其實批量的梯度下降就是一種折中的方法,他用了一些小樣本來近似全部的,用minibatch size個樣本,這樣比隨機的要準不少了吧,而且批量的話還可以反映樣本的一個分佈情況的。此外,還有批量梯度下降,它是計算全部訓練集樣本梯度的平均,然後更新梯度。對於大規模數據集來說,比如ILSVRC,可以包含幾百萬個樣本,若採用批量梯度下降的話,需要計算幾百萬次梯度計算,然後計算平均,才能更新一次參數,無論從時間效率還是內存佔用來說都是不可取的,一種常用的做法將訓練數據分批(batch)進行訓練,稱爲小批量梯度下降。比如對於卷積神經網絡來說,每次在訓練集中選擇包含256個樣本的一批數據,然後使用這批數據計算梯度,完成參數更新。

損失函數在minibatch上的梯度是其在整個訓練集上的估計,質量隨着minibatch size的增加而提高。此外,在batch上計算更有效,數據並行計算。

在神經網絡訓練過程中,很少使用隨機梯度下降,因爲小批量梯度下降可以利用矩陣和向量計算進行加速。通常我們講隨機梯度下降(SGD)時,也可以指代小批量梯度下降。

#Python3  
import random  
# matrix_A  訓練集  
matrix_A = [[1,4], [2,5], [5,1], [4,2]]  
Matrix_y = [19,26,19,20]  
theta = [2,5]  
#學習速率  
leraing_rate = 0.005  
minibatch=3;
loss = 50  
iters = 1  
Eps = 0.0001  
#隨機梯度下降  
while loss>Eps and iters <1000 :  
    loss = 0  
    i = random.randint(0, 3)  
    h = theta[0]*matrix_A[i][0] + theta[1]*matrix_A[i][1]   
    theta[0] = theta[0] + leraing_rate*(Matrix_y[i]-h)*matrix_A[i][0]  
    theta[1] = theta[1] + leraing_rate*(Matrix_y[i]-h)*matrix_A[i][1]  
    Error = 0  
    Error = theta[0]*matrix_A[i][0] + theta[1]*matrix_A[i][1] - Matrix_y[i]  
    Error = Error*Error  
    loss = loss +Error  
    iters = iters +1  
print ('theta=',theta)  
print ('iters=',iters)  



#梯度下降 
while loss>Eps and iters <1000 : 
    loss = 0 
    for i in range(4): 
        h = theta[0]*matrix_A[i][0] + theta[1]*matrix_A[i][1]  
        theta[0] = theta[0] + leraing_rate*(Matrix_y[i]-h)*matrix_A[i][0] 
        theta[1] = theta[1] + leraing_rate*(Matrix_y[i]-h)*matrix_A[i][1] 
    for i in range(4): 
        Error = 0 
        Error = theta[0]*matrix_A[i][0] + theta[1]*matrix_A[i][1] - Matrix_y[i] 
        Error = Error*Error 
        loss = loss +Error 
    iters = iters +1 
print ('theta=',theta) 
print ('iters=',iters) 




#小批量梯度下降 
while loss>Eps and iters <1000 : 
    loss = 0 
    sampleindex =  random.sample([0,1,2,3],minibatch) 
    for i in sampleindex : 
        h = theta[0]*matrix_A[i][0] + theta[1]*matrix_A[i][1]  
        theta[0] = theta[0] + leraing_rate*(Matrix_y[i]-h)*matrix_A[i][0] 
        theta[1] = theta[1] + leraing_rate*(Matrix_y[i]-h)*matrix_A[i][1] 
    for i in sampleindex : 
        Error = 0 
        Error = theta[0]*matrix_A[i][0] + theta[1]*matrix_A[i][1] - Matrix_y[i] 
        Error = Error*Error 
        loss = loss +Error 
    iters = iters +1 
print ('theta=',theta) 
print ('iters=',iters) 

2.加速訓練

2.1 Batch Normalization

網絡訓練過程中參數不斷改變導致後續每一層輸入的分佈也發生變化,而學習的過程又要使每一層適應輸入的分佈,因此我們不得不降低學習率、小心地初始化,這種現象稱之爲 internal covariate shift.爲了解決這個問題,Sergey Ioffe和Christian Szegedy在2015年提出了一個方法——Batch Normalization.

首先我們來說說Batch Normalization的好處:
(1)可以利用更高的學習速率(learning rate),
(2)不用小心翼翼初始化權重參數
(3)可以在網絡中去掉Dropout,減少L2 正則化,因爲BN具有提高網絡泛化能力的特性
(4)不需要使用使用Local Response Normalization(局部響應歸一化是2012的Alexnet網絡中使用)
(5)把訓練數據(shuffle)打亂得更徹底(防止每批訓練的時候,某一個樣本都經常被挑選到,還可以提高1%的精度)
(6)最顯著的好處就是加速了算法收斂速度,作者用實驗證明了這一點,如下圖:
這裏寫圖片描述

算法本質:在網絡的每一層輸入的時候,又插入了一個歸一化層,也就是先做一個歸一化處理,然後再進入網絡的下一層。該歸一化層,是一個可學習、有參數的網絡層,不同我們一前學到的數據歸一化方法。

2.2Batch Normalization算法原理

這裏寫圖片描述
對於每層的輸入:d-維向量x=(x(1),...,x(d)) ,我們標準化每維:

x^=x(k)E[x(k)]Var[x(k)]

這裏的期望和方差都是在每個minibatch數據集合上計算的,這樣的標準化可以加速算法收斂,但特徵沒有去相關。
yk=γ(k)x^(k)+β(k)

這裏的參數γβ 與原始模型中的參數一起學習。
這裏寫圖片描述
m = K.mean(X, axis=-1, keepdims=True)#計算均值  
std = K.std(X, axis=-1, keepdims=True)#計算標準差  
X_normed = (X - m) / (std + self.epsilon)#歸一化  
out = self.gamma * X_normed + self.beta#重構變換 

關於在實戰中使用Batch Normalization可以詳細閱讀文獻《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》

3.損失函數

在監督學習問題中,用損失函數(loss function)或代價函數(cost funtion)來度量預測錯誤的程度,即模型f 輸出的預測值f(X) 與真實值Y 之間不一致的程度。它是f(X)Y 的非負值函數,記作L(Y,f(X))
機器學習中常見的損失函數如下:

(1)0-1損失函數(0-1 loss function)

L(Y,f(X))={1,Yf(X)0,Y=f(X)

(2)平方損失函數(quadratic loss fuction)

L(Y,f(X))=(Yf(X))2

(3)絕對損失函數(absolute loss function)

L(Y,f(X))=|Yf(X)|

(4)對數損失函數(logarithmic loss function),或稱對數似然損失函數

L(Y,f(Y|X))=logP(Y|X)

Note:損失函數是度量模型一次預測的好壞,而風險函數度量平均意義下模型預測的好壞。
損失函數值越小,模型就越好,由於模型輸入,輸出(X,Y) 爲隨機變量,遵循聯合分佈P(X,Y) ,所以損失函數的期望是

Rexp(f)=EP[L(Y,f(X))]=X×YL(Y,f(X))P(X,Y)dxdy

上式是理論上模型f(X) 關於聯合分佈P(X,Y) 的平均意義下的損失,稱爲風險函數(risk function).理論上,我們機器學習的目標就是懸着期望風險最小的模型。但通常聯合分佈P(X,Y) 是未知的,所以我們在對給定數據集的學習問題,我們通常做模型f(X) 關於訓練數據集的平均損失,稱之爲經驗風險(empirical risk)或者經驗損失(empirical losss),記作Remp

Remp(f)=1Ni=1NL(yi,f(xi))

由大數定律我們可以知道,當樣本容量趨於無窮大時,經驗風險Remp 趨於期望風險Rexp .但是我們在實際處理機器學習問題是,現實情況,我們獲得的訓練樣本總是有限的,所以我們用經驗分析去估計期望風險常常不是非常理想,要對經驗風險進行一定修整。即在經驗風險上加上模型複雜度的正則化項Rsrm(f) ,
Rsrm(f)=Remp(f)+λJ(f)=1Ni=1NL(yi,f(xi))+λJ(f)

Note:模型f 越複雜,其複雜度J(f) 越大。複雜度表示了對複雜模型的懲罰,λ 是係數,權衡經驗風險和模型複雜度,結構風險小需要 經驗風險和模型複雜度都小,通常,結構風險小的模型對訓練數據和未知的測試數據都有較好的預測。在解決有監督實際機器學習問題是,我們也往往是把結構風險函數作爲模型優化的目標函數,當然經驗風險函數也可以做爲模型優化的目標函數。

3.1 logistic迴歸

logistic迴歸模型,對於給定的訓練數據集{(xi,yi),i=1,2,,N}xiRn+1,yi0,1 ,它是一個二分類問題。用極大似然估計法估計模型參數,從而得到logistic迴歸模型。
P(Y=1|x)=π(x),P(Y=0|x)=1π(x)
π(x)=11+exp(WTx) , W 爲模型參數

則極大似然函數爲:

i=1N[π(xi)]yi[1π(xi)]1yi

其對數似然函數爲:
L(W)=i=1N[yilogπ(xi)+(1yi)log(1π(xi))]

L(W) 求最大值,得到了W 的估計值。上面的對數似然函數正是在sec3中提到的對數似然損失函數在訓練集的經驗風險函數的1N1N 爲常數,對與最優解無影響。由此我們也可以這樣理解,logistic迴歸採用的損失函數是對數損失函數,模型優化的目標函數是經驗風險函數。

3.2 Softmax迴歸模型

Softmax迴歸模型是logistic迴歸模型在多分類問題上的推廣,在多分類問題中,類標籤y 可以取兩個以上的值。 Softmax迴歸模型對於諸如MNIST手寫數字分類等問題是很有用的,該問題的目的是辨識10個不同的單個數字。Softmax迴歸是有監督的,不過後面也會介紹它與深度學習/無監督學習方法的結合。
在 softmax迴歸中,我們解決的是多分類問題(相對於 logistic 迴歸解決的二分類問題),類標 y 可以取 k 個不同的值(而不是 2 個)。因此,對於訓練集 {(x(1),y(1)),,(x(m),y(m))} ,我們有 y(i){1,2,,k} 。(注意此處的類別下標從 1 開始,而不是 0)。例如,在 MNIST 數字識別任務中,我們有 k=10 個不同的類別。

對於給定的測試輸入 x ,我們想用假設函數針對每一個類別j估算出概率值p(y=j|x) 。也就是說,我們想估計x 的每一種分類結果出現的概率。因此,我們的假設函數將要輸出一個k 維的向量(向量元素的和爲1)來表示這k 個估計的概率值。 具體地說,我們的假設函數 hθ(x) 形式如下:

hθ(x(i))=p(y(i)=1|x(i);θ)p(y(i)=2|x(i);θ)p(y(i)=k|x(i);θ)=1kj=1eθTjx(i)eθT1x(i)eθT2x(i)eθTkx(i)

其中θ1,θ2,,θkRn+1 是模型的參數。請注意 1kj=1eθTjx(i) 這一項對概率分佈進行歸一化,使得所有概率之和爲 1 。

爲了方便起見,我們同樣使用符號θ 來表示全部的模型參數。在實現Softmax迴歸時,將 θ 用一個k×(n+1) 的矩陣來表示會很方便,該矩陣是將θ1,θ2,,θk 按行羅列起來得到的,如下所示:

θ=---θT1------θT2------θTk---

損失函數J(θ) 如下:
1{}=0 。舉例來說,表達式1{2+2=4} 的值爲1 ,1{1+1=5} 的值爲 0,它也稱爲指示函數。softmax迴歸的損失函數函數爲:
J(θ)=1mi=1mj=1k1{y(i)=j}logeθTjx(i)kl=1eθTlx(i)

值得注意的是,上述公式是logistic迴歸代價函數的推廣。logistic迴歸代價函數可以改爲:
J(θ)=1m[i=1m(1y(i))log(1hθ(x(i)))+y(i)loghθ(x(i))]=1mi=1mj=011{y(i)=j}logp(y(i)=j|x(i);θ)

可以看到,Softmax代價函數與logistic 代價函數在形式上非常類似,只是在Softmax損失函數中對類標記的 k 個可能值進行了累加。注意在Softmax迴歸中將x 分類爲類別 j 的概率爲:
p(y(i)=j|x(i);θ)=eθTjx(i)kl=1eθTlx(i)

到目前爲止,我們可以看到該目標函數是softmax迴歸的風險函數,爲防止模型過擬合,可以在該目標函數上再加一個正則化項(或權重衰減),得到結構風險函數,並將其作爲目標函數進行優化。

3.3Softmax迴歸與Logistic 迴歸的關係

當類別數k=2 時,softmax 迴歸退化爲 logistic 迴歸。這表明 softmax 迴歸是 logistic 迴歸的一般形式。具體地說,當 k=2 時,softmax 迴歸的假設函數爲:

hθ(x)=1eθT1x+eθT2x(i)[eθT1xeθT2x]

利用softmax迴歸參數冗餘的特點,我們令ψ=θ1 ,並且從兩個參數向量中都減去向量θ1 ,得到:
h(x)=1e0⃗ Tx+e(θ2θ1)Tx(i)e0⃗ Txe(θ2θ1)Tx=11+e(θ2θ1)Tx(i)e(θ2θ1)Tx1+e(θ2θ1)Tx(i)=11+e(θ2θ1)Tx(i)111+e(θ2θ1)Tx(i)

因此,用θ 來表示θ2θ1 ,我們就會發現 softmax 迴歸器預測其中一個類別的概率爲11+e(θ)Tx(i) ,另一個類別概率的爲 111+e(θ)Tx(i) ,這與 logistic迴歸是一致的。

4.信息論中的香農熵、KL散度、交叉熵

4.1 信息量與香農熵

信息論的基本思想是一個不太可能的事件居然發生了,要比一個非常可能的事件發生,能提供更多的信息。我們想要通過這種基本思想來量化信息。特別地:

• 非常可能發生的事件信息量要比較少,並且極端情況下,確保能夠發生的事件應該沒有信息量。
• 較不可能發生的事件具有更高的信息量。
• 獨立事件應具有增量的信息。例如,投擲的硬幣兩次正面朝上傳遞的信息量,應該是投擲一次硬幣正面朝上的信息量的兩倍。

爲了滿足上述三個性質,我們定義一個事件 X=x 的 自信息(self-information)爲:

I(x)=logP(x)

自信息只處理單個的輸出。我們可以用 香農熵(Shannonentropy)來對整個概率分佈中的不確定性總量進行量化:

H(x)=ExP[I(x)]=ExP[logP(x)]

香弄熵也稱信息熵,香農用信息熵的概念來描述信源的不確定度。在機器學習中用來描述隨機變量的不確定性,熵越大,變量的取值越不確定,反之就越確定。

這裏寫圖片描述

4.2 KL散度

如果我們對於同一個隨機變量 x 有兩個單獨的概率分佈P(x)Q(x) ,我們可以使用 KL 散度(Kullback-Leibler (KL) divergence)來衡量這兩個分佈的差異:

DKL(P||Q)=ExP[logP(x)Q(x)]=ExP[logP(x)logQ(x)]

KL 散度有很多有用的性質,最重要的是它是非負的。 KL 散度爲0 當且僅當PQ 在離散型變量的情況下是相同的分佈,或者在連續型變量的情況下是 “幾乎處處” 相同的。因爲 KL 散度是非負的並且衡量的是兩個分佈之間的差異,它經常被用作分佈之間的某種距離。然而,它並不是真的距離因爲它不是對稱的:對於某些PQDKL(P||Q)DKL(Q||P) .這種非對稱性意味着選擇 DKL(P||Q) 還是DKL(Q||P) 影響很大。更多細節可以看下圖:

這裏寫圖片描述

DKL(P||Q) 表示在真實分佈爲P 的前提下,使用Q 分佈進行編碼相對於使用真實分佈p進行編碼(即最優編碼)所多出來的bit數。在某種程度上可以理解爲擬合分佈Q 對真實分佈 P 的近似程度,DKL(P||Q) 值越小,表示近似的效果越好。

4.3交叉熵(cross-entropy)

一個和 KL 散度密切聯繫的量是 交叉熵(cross-entropy) H(P,Q)

H(P,Q)=H(P)+DKL(P||Q)=ExP[logP(x)]+ExP[logP(x)logQ(x)]=ExP[logQ(x)]

特別的,在logistic regression,二分類問題中,p 爲真實分佈,q 爲估計分佈。

yi{0,1}CEH(p,q)=i=0Np(yi|xi)logq(yi|xi)

yi=1 :
p(yi=1|xi)=1,p(yi=0|xi)=0

yi=0 :
p(yi=1|xi)=0,p(yi=0|xi)=1

而預測的概率:
q(yi=1|xi)=yi,q(yi=0|xi)=1yi

因此交叉熵如下:

CEH(p,q)=1Ni=0N(yilogyi(1yi)log(1yi))

這個結果與通過最大似然估計方法求出來的結果一致,見sec3。
從上面可以看出對於分類問題的交叉熵函數,其給定一個樣本(xi,yi) , yi 表示類別,比如yi{0,1,2,,K}K+1 分類問題中,假設其真實類別是L ,則P(yi=k|xi)=1 ,當且僅當k=L 是成立,而其它類的概率都爲0(因爲給定訓練集中的樣本,其類別當然是確定的呀).所以該樣本的交叉熵=logP(yi=L|xi)
這裏P(yi=L|xi)K+1 分類器預測當前輸入xi 是第L 類的概率。

發佈了61 篇原創文章 · 獲贊 49 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章