[機器學習] Coursera ML筆記 - 神經網絡(Learning) - Micheal Wang的機器學習樂園 - 博客頻道 -...
來自: http://blog.csdn.net/walilk/article/details/50504393
引言
機器學習欄目記錄我在學習Machine Learning過程的一些心得筆記,涵蓋線性回歸、邏輯回歸、Softmax回歸、神經網絡和SVM等等,主要學習資料來自Standford Andrew Ng老師在Coursera的教程以及UFLDL Tutorial,同時也參考了大量網上的相關資料(在后面列出)。
本文主要記錄我在學習神經網絡過程中的心得筆記,共分為三個部分:
Neural network - Representation:神經網絡的模型描述 ;
Neural network - Learning:神經網絡的模型訓練 ;
Neural network - Code:神經網絡的代碼實現。
前言
在本文中,我們將神經網絡看作是一個分類算法,其輸出是樣本屬于某類別的概率值 P(y==k|x;Θ),暫時不去考慮深度學習中用于特征學習的復雜卷積神經網絡。因此,本文將按照一個分類模型的維度去安排文章結構,包括模型結構及數學描述、模型訓練等,記錄我在學習神經網絡過程中的心得和思考。
本文是我在學習神經網絡模型訓練(Learning)時的筆記,主要以Andrew Ng老師在Coursera課程中以及UFLDL Tutorial中的關于神經網絡模型訓練的資料為主,文章小節安排如下:
1)神經網絡的背景
2)代價函數(cost function)
3)優化(Optimization)/模型訓練/參數學習
4)梯度檢查(Gradient Checking)
5)隨機初始化(Random Initialization)
6)Putting It Together
7)參考資料
8)結語
在閱讀這部分筆記之前,請先閱讀 《Neural network - Representation:神經網絡的模型描述》 這一篇筆記,以了解神經網絡的模型描述,激活函數,前向傳播等基礎知識。
《Neural network - Representation:神經網絡的模型描述》神經網絡的背景
這里重復一遍神經網絡的靈感來源,
實驗證明大腦利用同一個學習算法實現了聽覺、視覺等等所有的功能,這也是神經網絡算法美好的愿景。我認為一個好的算法,是具備自我學習、成長和進步能力的,可以不斷的適應問題和環境變化。同樣,一個好的人,一個好的公司,一個好的國家,也應該是具備這樣的自我成長性,所謂好的事物是長出來的。
記得聽過一個講座,主講人是國外大學的一位教授,他說:Deeplearning就是入侵其他領域的強有力武器,我們課題組是做圖像的,半年前還一點都不懂 Natural language processing,但半年后我們就在該領域的頂級會議發了paper,因為我們只需要關心Raw data和深度網絡模型,至于分詞等技術我們并沒有什么工作。
這位教授說的話也許有一定夸張成分,但也說明了神經網絡是極具潛力的機器學習模型,可以用一套技術解決多個領域的問題,是不是非常類似于前述的人腦工作機制?并且現在大家也可以看到,深度神經網絡目前基本上一統江湖,正在逐項碾壓其他機器學習技術。
這是好事,也是壞事。
代價函數(cost function)
神經網絡模型的代價函數取決于輸出層是什么,也就是說不同的應用場景對應不同的代價函數,那么進一步的求導計算也就會有差異。 例如,在Autoencoder網絡中,輸出層等于輸入層,此時采用均方誤差(MSE)函數作為代價函數;在分類問題中,如果輸出層采用Softmax回歸進行分類,則可以直接采用Softmax回歸的代價函數作為整個神經網絡的代價函數。如果輸出層采用Logistic regression進行分類,那么輸出層其實就是K個Logistic regression,整個網絡的代價函數就是這K個Logistic regression模型代價函數的加和。
其實只要理解Cost function反映的就是預測值與實際值的誤差,那么完全可以根據問題自定義一個Cost function表達式。在Coursera Machine Learning課程中將神經網絡看作是輸出層采用邏輯回歸的分類器,因此其代價函數如下:

對比Logistic regression:

分析可以看出,
此時,神經網絡里使用的代價函數是邏輯回歸里中代價函數的一般化形式(generalization),也就是神經網絡中不再是僅有一個邏輯回歸輸出單元,而是K個(就好像K個邏輯回歸模型并行計算,也就是邏輯回歸中的多分類問題)。
2)輸出層采用Softmax Regression
其中,
θ 指的是Softmax Regression的參數矩陣。
自編碼神經網絡是一種無監督學習算法,學習一個 Hw,b (x) ≈ x 的函數。換句話說,它嘗試逼近一個恒等函數,從而使得輸出接近于輸入。此時,自編碼神經網絡采用均方誤差(MSE)作為代價函數,其代價函數形式如下:

實際上,
Autoencoder并不是用于分類,而是用于學習輸入數據的壓縮表示,可以發現輸入數據中隱含著的一些特定結構。具體可以參考: Autoencoders and Sparsity
討論: 1)代價函數的均值化問題這里均值化指的是代價函數是否除以樣本數,以及代價函數中哪一項應該除以樣本數的問題。
首先對比Coursera ML課程中神經網絡的代價函數公式:

細心的同學可以看到,
這里正則化項是除以樣本數 m 的,而我給出的代價函數是沒有除以樣本數的,如下:

對于正則項是否除以樣本數這個問題,我作為初學者還沒有看到確切深入的討論,并且看到的大多數資料中是沒有均值化的。根據實驗,在不同的問題中,正則項是否均值化對優化過程的影響也不一樣的,有時候可能沒有影響,有時候就會致使梯度無法收斂,這一點大家可以在代碼中實驗一下。
通過引入正則項是否均值化問題,我想討論的其實是: 代價函數是否除以樣本數(均值化)?哪一項應該除以樣本數?這里我根據學習和實驗中粗淺的經驗總結如下:
其實代價函數是否除以樣本數(均值化),是整體均值化?還是部分均值化?這在很多算法模型中都存在這個問題,比如在Sparse Autoencoder中,代價函數由誤差項,權重衰減項(正則化項),稀疏懲罰項構成,如下:
Cost function = Error term + Sparsity penalty term + Weight decay term那么,在具體實現時,到底應該如何均值化呢?
基本原則是這樣,
如果某個term與整個訓練樣本集有關,那么就應該均值化(除以樣本數),否則就不均值化。例如Sparse Autoencoder的代價函數,誤差項是所有訓練樣本誤差的總和,稀疏懲罰項是對所有樣本的稀疏性懲罰,因此這兩項應該均值化,而權重衰減項是針對參數的,所以不應該均值化。 2)什么時候采用邏輯回歸作為分類?什么時候采用Softmax回歸呢?這里引用UFLDL的講解:
Softmax Regression vs. k Binary Classifiers如果你在開發一個音樂分類的應用,需要對k種類型的音樂進行識別,那么是選擇使用 softmax 分類器呢,還是使用 logistic 回歸算法建立 k 個獨立的二元分類器呢?
這一選擇取決于你的類別之間是否互斥,例如,如果你有四個類別的音樂,分別為:古典音樂、鄉村音樂、搖滾樂和爵士樂,那么你可以假設每個訓練樣本只會被打上一個標簽(即:一首歌只能屬于這四種音樂類型的其中一種),此時你應該使用類別數 k = 4 的softmax回歸。(如果在你的數據集中,有的歌曲不屬于以上四類的其中任何一類,那么你可以添加一個“其他類”,并將類別數 k 設為5。)
現在我們來看一個計算視覺領域的例子,你的任務是將圖像分到三個不同類別中。(i) 假設這三個類別分別是:室內場景、戶外城區場景、戶外荒野場景。你會使用sofmax回歸還是 3個logistic 回歸分類器呢? (ii) 現在假設這三個類別分別是室內場景、黑白圖片、包含人物的圖片,你又會選擇 softmax 回歸還是多個 logistic 回歸分類器呢?
在第一個例子中,三個類別是互斥的,因此更適于選擇softmax回歸分類器 。而在第二個例子中,建立三個獨立的logistic回歸分類器更加合適。
當設置偏置單元=1,并在參數矩陣 Θ 中設置第 0 列對應為偏置單元的參數時,就存在一個問題:是否懲罰偏置單元對應的參數?
引用Andrew Ng老師對該問題的說明:
不應該把這些項加入到正規化項里去,因為我們并不想正規化這些項,但這只是一個合理的規定,即使我們真的把他們加進去了,也就是 i 從0 加到s(l),這個式子(代價函數)依然成立,并且不會有大的差異。這個“不把偏差項正規化”的規定可能只是更常見一些。一般來說是不懲罰偏置項的,因為沒什么意義。
補充: 1)均方誤差均方誤差(MeanSquaredError,MSE)是衡量“平均誤差”的一種較方便的方法,可以評價數據的變化程度。對于等精度測量來說,還有一種更好的表示誤差的方法,就是標準誤差。標準誤差定義為各測量值誤差的平方和的平均值的平方根。數理統計中均方誤差是指參數估計值與參數真值之差平方的期望值,記為MSE。MSE是衡量“平均誤差”的一種較方便的方法,MSE可以評價數據的變化程度,MSE的值越小,說明預測模型描述實驗數據具有更好的精確度。與此相對應的,還有均方根誤差RMSE、平均絕對百分誤差等等。
參考: Bing網典 - 均方誤差
1,標準誤差一般用來判定該組測量數據的可靠性,在數學上它的值等于測量值誤差的平方和的平均值的平方根。
2,標準誤差在正態分布中表現出正態分布曲線的陡峭程度,標準誤差越小,曲線越陡峭,反之,曲線越平坦。
3,標準誤差在實際的計算中使用的是標準誤差估算值。
4,標準誤差不是實際誤差。
參考: Bing網典 - 標準誤差
優化(Optimization)/模型訓練/參數學習
神經網絡的優化依然可以采用梯度下降法(Gradient descent),而梯度下降法需要兩方面的計算:
1)代價函數
2)梯度
即,

代價函數的計算公式前面已經給出,

J(Θ) 的梯度如何計算就需要請出大名鼎鼎的 反向傳播算法(Backpropagation Algorithm) !
定義如下網絡,輸出層采用邏輯回歸:

首先,我們引入 符號 δ ,解釋如下:

代表了第 l 層的第 j 個節點的誤差。
那么,各層各節點的error計算如下:

其中,

可以看出,與激勵值(activation)計算類似,誤差的計算也是層層傳遞的,δ 3 的計算依賴于δ 4 ,δ 2 的計算依賴于δ 3 。這樣一種誤差計算方式,就稱之為 反向傳播(backpropagation) 。
以上面的網絡模型為例,反向傳播算法從后往前(或者說從右往左)計算,即從輸出層開始計算,并反向逐層向前計算每一層的 δ 。 反向傳播法這個名字源于我們從輸出層開始計算 δ 項,然后我們返回到上一層計算第 3 個隱藏層的 δ 項,接著我們再往前一步來計算 δ 2 。所以說我們是類似于把輸出層的誤差反向傳播給了第3層,然后是再傳到第2層,這就是反向傳播的意思。
通過反向傳播計算的這些 δ 項,可以非常快速的計算出所有參數的偏導數項(J(Θ) 關于 所有θ的偏導數項)。
讓我們將反向傳播與前向傳播對比一下:

因此可以說,
反向傳播算法就是在逐層計算每個神經節點的激勵值誤差。備注,
上面只是一種直觀的解釋,那么 δ 項到底是什么?其實 δ 本質上是代價函數 J 對加權和 z 的求導結果。
這里引用Coursera ML課程中的描述:

這里重點討論兩個問題:
1)為何上面所講的網絡最后一層的 δ 與其他層計算不一致?

其實是一致的,如前面所述,δ 本質上是代價函數 J 對加權和 z 的求導結果。這里 δ(4) 是 J 對 z(4) 的導數,δ(3) 是 J 對 z(3) 的導數,具體推導見后文。
比如,

再比如,

那么是什么原因導致了上面不同的公式形式呢?其實原因就在于所采用的代價函數和輸出層激勵函數的形式。
不同形式的代價函數和輸出層激勵函數,會推導出不同的輸出層誤差計算公式!下面我們可以利用兩種形式的代價函數進行偏導數計算,驗證上述結論,如下:
1) Cost function采用:
輸出層激勵函數(也可以稱為預測函數)采用:

則 δ(L) 推導如下:

2) Cost function采用:
輸出層激勵函數(也可以稱為預測函數)采用:

則 δ(L) 推導如下:

如果, 輸出層激勵函數(也可以稱為預測函數)采用:
則 δ(L) 推導如下:

綜上可以看出,
δ(L) 的形式與代價函數 J 和輸出層激勵函數 g 的形式直接相關。備注,Andrew Ng老師在課程中為了降低理解難度,并沒有講明上述的推演關系,而是給出一種直觀的解釋,即:δ(L) = 實際值 - 預測值。作為入門的話,這樣理解也未嘗不可。
至此,完成 δ(L) 計算的推導和討論,也解答了神經網絡最后一層誤差計算出現不同公式形式的原因,希望可以為大家提供一定參考。
如果對于上述推導感興趣,請參考: https://share.coursera.org/wiki/index.php/ML:Neural_Networks:_Learning http://deeplearning.stanford.edu/wiki/index.php/Backpropagation_Algorithm
重點:梯度計算(Gradient Computation)在神經網絡模型中,代價函數 J(Θ) 關于 參數 θ 的偏導數(partial derivative terms)/梯度計算如下:

向量化描述如下:

關于該計算公式的推導可以參考wiki ML中關于Neural Network: Learning一節( https://share.coursera.org/wiki/index.php/ML:Neural_Networks:_Learning )。
Andrew Ng老師給出的用于計算梯度的Backpropagation Algorithm如下:

寫到這里想起來前陣子聽講座,主講人的兩句吐槽:
1)入門神經網絡只要學會計算梯度就行了,其他什么概念都不需要了解,比SVM簡單多了,并且想現在很多Toolbox連梯度都幫你計算了,你還需要做什么?你只需要配置下網絡結構就可以了,代碼都不用寫,越來越沒有門檻了。
2)算個梯度還搞出個什么反向傳播(Backpropagation),說到底不就是鏈式法則(chain rule)么!現在人真會玩,換個名詞就炒冷飯!
關于利用反向傳播算法計算梯度,可以重點參考:
Backpropagation Algorithm備注,
也許有人會有疑問, 反向傳播到底是用來計算梯度的?還是僅僅用來逐層計算誤差的??,為何這里所寫的反向傳播只計算了誤差,而沒有計算梯度??確實,在Coursera ML課程中,Andrew Ng老師的講解一開始告訴你說,Backpropagation是用來反向逐層計算誤差的。而后續的講解,包括很多資料里所描述的BP算法又是是用來計算梯度的。這到底是咋回事呢?
如前所述,反向傳播僅僅是計算過程的一個直觀上的稱呼罷了,更重要的是其背后的神經網絡求導思想,所以,
無論說:反向傳播是用來逐層計算(或稱傳遞)誤差的;又或者說:反向傳播是用來計算梯度的。 其實所說所指的都是如何對神經網絡的參數進行快速求導這個事情。
如果非要較真兒,也許可以這樣理解前向傳播、反向傳播、梯度計算之間的關系:
前向傳播和反向傳播是一種計算過程的直觀描述,而梯度是基于前向傳播得到的Activation和反向傳播得到的Error進行計算的。為了更清晰更方便的記憶激勵值、誤差、前向傳播、反向傳播等概念,可以這樣:
前向傳播計算 a,反向傳播計算 δ,基于 a 和 δ 計算梯度。得到代價函數和梯度,就可以利用梯度下降算法來求解最優參數,描述如下:

補充:
方向導數:函數上某一點在某一方向上的導數值,偏導數就是沿著坐標軸的方向導數;
偏導數:一個多變量的函數的偏導數,就是它關于其中一個變量的導數而保持其他變量恒定(相對于全導數,在其中所有變量都允許變化),偏導數反映的是函數沿坐標軸正方向的變化率;
梯度:梯度即是某一點最大的方向導數,沿梯度方向函數有最大的變化率(正向增加,逆向減少);
參考:
方向導數和梯度
http://blog.csdn.net/wolenski/article/details/8030654百度百科-梯度
http://baike.baidu.com/subview/454441/12503183.htm梯度檢查(Gradient Checking)
反向傳播算法作為一個有很多細節的算法在實現的時候比較復雜,可能會遇到很多細小的錯誤。所以如果把BP算法和梯度下降法或者其他優化算法一起運行時,可能看起來運行正常,并且代價函數可能在每次梯度下降法迭代時都會減小,但是可能最后得到的計算結果誤差較高,更要命的是很難判斷這個錯誤結果是哪些小錯誤導致的。
解決該問題的方法是: 梯度檢查 (Gradient Checking)梯度檢查 (Gradient Checking)的思想就是通過數值近似(numerically approximately)的方式計算導數近似值,從而檢查導數計算是否正確。雖然數值計算方法速度很慢,但實現起來很容易,并且易于理解,所以它可以用來驗證例如BP算法等快速求導算法的正確性。
如前所述,機器學習中大部分算法的核心就是代價值計算和梯度計算,因此,在實現神經網絡或者其他比較復雜的模型時候,利用Gradient Checking可以檢查算法是否正確實現。
梯度檢查 (Gradient Checking)的核心是導數的數值計算 ,公式如下:

多參數情況的公式如下:


其中,
DVec:利用反向傳播算法得到的導數,BP是一個比較有效率的計算導數的方法;
gradApprox:利用數值近似得到的導數,數值計算法速度很慢;
如果兩者相等或者近似,最多幾位小數的差距,那么就可以確信所實現的BP算法是正確的。
隨機初始化(Random Initialization)
當運行一個優化算法(例如梯度下降算法或者其他高級優化算法)時,需要給變量 θ 設置初始值。例如,在梯度下降法中,需要對 θ 進行初始化(通常為全0),然后使用梯度下降的方法不斷最小化函數 J,最終代價函數 J 下降到最小。
但要注意的是,
將 θ 初始化為全 0 向量在邏輯回歸時是可行的的,但在訓練神經網絡時是不可行的,這會使得神經網絡無法學習出有價值的信息。以第一層參數矩陣(權重矩陣)為例,假定有K個隱藏單元,那么神經網絡的參數矩陣 Θ1 實質上對應著特征的K個映射函數(映射關系),如果參數全為 0,那就意味著所有映射關系都是相同的,即所有的隱藏單元都在計算相同的激勵值,那么這樣一個具有很多隱藏單元的網絡結構就是完全多余的表達,最終該網絡只能學到一種特征。
這種現象稱為: 對稱權重(Symmetric ways)解決辦法其實很簡單,即:隨機初始化(Random Initialization)
描述如下:

所有權重相同的問題稱為對稱權重(Symmetric ways),隨機初始化解決的就是如何打破這種對稱性,需要做的就是對 θ 的每個值進行初始化,使其范圍在 -? 到 +? 之間。
? 的取值:

Θ 的初始化:

Putting It Together
上面已經講解了神經網絡訓練的各個部分,綜合起來就可以得到一個最基礎神經網絡學習算法的實現過程。
這里引用課程中的一張PPT來作說明:

下面總結網絡結構設計的幾點基本原則:
網絡結構的選擇規則: 神經網絡搭建時,可能會從上面PPT中所示的幾種結構中選擇,一個默認的規則是只使用單個隱藏層,即PPT中最左邊的結構,或者如果使用不止一個隱藏層的話,同樣也有一個默認規則就是每一個隱藏層通常都應有相同的隱藏單元數。 通常來說,PPT中左邊這個結構是較為合理的默認結構。
對于一個用于分類的神經網絡,輸入層即特征,輸出層即類別。
Number of input units = dimension of features x(i)
Number of output units = number of classes
隱藏單元的選擇規則: 通常情況下隱藏單元越多越好,不過需要注意的是如果有大量隱藏單元,那么計算量一般會比較大。一般來說,每個隱藏層所包含的單元數量還應該和輸入 x 的維度相匹配,也要和特征的數目匹配。 可能隱藏單元的數目和輸入特征的數量相同,或者是它的二倍或者三倍、四倍。一般來說,隱藏單元的數目取為稍大于輸入特征數目都是可以接受的。
完成上述理解,便可以得到神經網絡的訓練過程,如下。
神經網絡的訓練過程:
下面附一張Andrew Ng老師在Coursera ML課程中的PPT,來給出神經網絡訓練過程的直觀描述:
(由于繪圖所限,這里假定代價函數 J(Θ) 只有兩個參數值)

———————————————————————
實際上,梯度下降算法和其他一些高級優化方法理論上都只能使神經網絡的代價函數收斂于局部最小值,不過一般來講這個問題并不是什么要緊的事,因為盡管不能保證這些優化算法一定會得到全局最優值,但通常來講這些算法在最小化代價函數 J(θ) 的過程中還是表現得很不錯的,通常能夠得到一個很小的局部最小值,雖然這不一定是全局最優值。
參考資料
UFLDL Tutorial
http://ufldl.stanford.edu/tutorial/Coursera - Machine learning( Andrew Ng)
https://www.coursera.org/learn/machine-learningCoursera -ML:Neural Networks: Representation
https://share.coursera.org/wiki/index.php/ML:Neural_Networks:_RepresentationCoursera -ML:Neural Networks: Learning
https://share.coursera.org/wiki/index.php/ML:Neural_Networks:_Learning結語
以上就是神經網絡模型Learning的相關知識點和實現過程,其中重點討論了神經網絡的代價函數模型和參數學習中的Backpropagation算法,這也是我在學習NN時反復理解了好久的問題,希望可以為大家提供一些幫助,也歡迎交流討論,謝謝!
本文的文字、公式和圖形都是筆者根據所學所看的資料經過思考后認真整理和撰寫編制的,如有朋友轉載,希望可以注明出處:
[機器學習] Coursera ML筆記 - 神經網絡(Learning) http://blog.csdn.net/walilk/article/details/50504393
·
</div>