深度學習中對神經網路的理解
最近在研究Deep Learning在個性化推薦中的應用,由於DL跟神經網路有很大的關係,索性開篇就介紹下神經網路和自己所瞭解到的知識。接觸ML時間不是很長,難免有描述不當的地方,旨在於交流學習,有啥想法直接後面回覆。
在這篇博文中,你將會看到如下知識:
神經網路的基本模型,前向神經網路(Feed-forward neural network),General Feed-forward NN 的元件,優化目標函式,逆向誤差傳播演算法。
“ 根據一個簡化的統計,人腦由百億條神經組成 ― 每條神經平均連結到其它幾千條神經。通過這種連結方式,神經可以收發不同數量的能量。神經的一個非常重要的功能是它們對能量的接受並不是立即作出響應,而
人的大腦是非常複雜的,特別是大腦神經系統,可以說沒有它,大腦就是一些組織,細胞而已。在機器學習領域,對神經網路的研究應該是希望從大腦的工作機制和神經系統結構中獲得啟發,一方面可以設計高效的學習演算法,讓機器也能夠對問題進行大規模學習,另一方面可以從神經元的並行工作方式中得到啟發,設計高效的平行計算演算法,讓機器擁有更強的實時處理大規模資料的能力。
在這裡就不介紹生物上的神經網路了,一來是不懂,二來這裡的神經網路一概指
人工神經網路的基本模型
前向神經網路
上圖描述的是一個目前研究最為成熟Shallow 結構的神經網路(只含有單層隱藏層神經元的結構)。第一層為輸入層 (input layer ),第二層稱為隱藏層
啟用函式有好幾種形式,這裡列舉兩種,
GeneralFeed-forward NN 的元件
假設有包涵有N個樣本的資料集 = { (X1,T1) , (X2,T2) , (X3,T3)...... (Xn,Tn)} ,其中T的取值可以根據你的任務不同而不同,比如你要用神經網路進行迴歸分析,T ( target value)就是一個連續值,如果你面對的是一個迴歸問題的話,T 的取值就是離散的,比如二分類問題 T = { 0,1 },輸入樣本的每個觀測值(Observation) Xi 都具有相同的維度數量 m ,與之對應的輸入層的神經元個數也為(m + 1)個,包含有一個偏置神經元( bais unit )。
這裡採用了Andrew Ng的上的符號系統。nl表示神經網路具有的總層數,表示最後一層神經網路,下標就是表示第幾層,L1表示第一層,也就是輸入層。低層與高層的神經元之間都是通過帶權重的單向邊進行連線,(W,b)表示整個神經網路中的引數,W 表示連邊的權重,b表示偏置。在上圖中(W,b) = (W(1),b(1),W(2),b(2)),上角標表示第 i 層與(i + 1)層之間的權重係數矩陣(如無特殊說明,下文中的上角標都表示層號,當然對於係數矩陣和神經元來說,上角標的意思是不太一樣的),表示第L層的第 j 個神經元與第 L + 1 層的第 i 個神經元之間的權重係數。在上圖的例子中,。該部分採用向量化的表述方式,這個為後面的向量化程式設計會帶來非常大的好處,不用一個一個的去記哪個跟哪個權重係數對應,直接一個矩陣,非常簡潔。整個神經網路可以用一個函式 hW,b(x) 來表示。
接著來看下跟每個神經元都相關的符號,表示第L層的第i個神經元的啟用狀態(activations),該過程是非線性操作,這個概念非常重要,要牢記。當L = 1的時候,可以認為就是等於輸入神經元的值,表示該神經元具有的能量值。
到此為止,你已經可以掌握一個神經網路中的基本符號和表示方法,儘快熟悉這些符號,在你的腦子裡面神經網路已經不再是抽象的神經元之間的連線方式了,可以通過上述的符號來刻畫,這對後面公式的理解會有很大的幫助。
下面來看下神經網路的基本成分( neural network components)
對線性模型 (Linear Model )比較瞭解的人應該非常熟悉這個公式
線性模型可以表示成有限個基函式(basis function)的線性融合,基函式的形式可以自己定義,舉個簡單的例子,可以是關於輸入 m 次冪的多項式 x^m(順便吐槽一下,這裡敲公式實在麻煩)。實際上神經網路也可以看成是一些線性函式的疊加,不過中間有了一個啟用函式,情況就變得跟線性模型不一樣了。還是以FNN(Feed-forward Neural Network)為例對除輸入層之外的每個神經元進行的操作就可以得到神經元的能量值,每個神經元的啟用狀態就可以表示成 ( 非線性操作 ) ,下面對整個網路進行同樣的操作就可以得到
上述過程的向量化表示,這裡的f和h函式就都變成了向量函式,如 f([z1,z2,z3])= [f(z1),f(z2),f(z3)]
到該部分,你已經基本掌握了一個神經網路的結構,如何執行得到輸出,但是還差如何去訓練得到我們的引數 (W,b)。上面都是以單隱藏層的神經網路而且輸出只有一個神經元,如果你知道了如何去訓練這個簡易的神經網路,那下面這個看起來更復雜一些的例子你同樣知道該如何去訓練。
優化目標函式
這個是在用機器學習方式為問題建模的第二部,確定你的損失函式(Loss Function),也就是你的優化目標。該過程會涉及到一些基本的優化方法,統計學概念以及一些實際的應用經驗。當然如果你跟我一樣是剛接觸機器學習(Machine Learning)不久的話,瞭解了一些關於梯度優化方法的話,你就能掌控這裡的一切啦。
假設我們有m個樣本,這裡採用的是二次平方和最小化 (最小二乘)作為損失函式(關於損失函式的型別可以參考《統計學習方法》- 李航) ,用該公式表示損失函式,在實際優化目標函式需要表示成如下形式,比上面的公式多了一個 "+"好後面的內容,該項也稱作 weight decay,該部分是起正則作用,防止過擬合。
之所以採用二次損失函式,我想應該是為了構建一個具有 convex 性質的目標函式,便於使用梯度優化的方法尋找最優值。下圖就是在引數(w,b)下的誤差曲面(error surface)。
下面公式表示了權重係數更新的方式,也就是為了找到一個使得目標函式最小值的係數 (w,b) 。在整個優化的過程中,最重要的就是如何求解不同的梯度資訊,為了求解這個東西,又要來一個新的概念了,逆誤差傳播(error backpropagation)學習演算法。機器學習的問題總是會這樣,找到優化目標以後,就需要相應的學習演算法尋找最優值,此時的係數就是我們所要選擇的模型的引數了。
逆向誤差傳播演算法 (error backpropagation)
如其名,該方法就是讓輸出層的y 與輸入 x 的誤差往回傳播。因為我們在求每個引數的梯度的時候是通過對真值與預測值之間的誤差項求導得到的,對於輸出神經元還可以做到,但是我們無法獲取隱藏層的真值,這就造成了隱藏層的神經元梯度不可求的尷尬局面。還好領域大牛們想到了這種方式,讓輸出層的誤差往回傳播,計算出底層神經元的啟用狀態要為該誤差付出多大的責任,也可以理解成該神經元的誤差值,用表示,表示輸出層神經元的誤差。
逆誤差傳播演算法執行過程:
1,先執行一次前向傳播,計算出每一層的神經元的啟用值,直到輸出層為止
2,對於每一個輸出層神經元,採用如下方式計算誤差(實際上在Andrew的資料中省略了很多推到部分,該部分我後面會放上,你們先理解個大概過程)
3,對於較低層的神經元的誤差用如下公式進行表示,
4,關於不同引數的梯度
下面來看下項的具體推導過程。
PS:其實要想更好的理解該推導過程可以參考《Pattern Recognition and Machine Learning》中5.3節部分關於估計誤差函式梯度的內容,由於裡面採用的符號系統跟Andrew的是相反的,我就沒有放上來,借用了一個簡易的推導過程。
摘自《Deep Learning 教程中文版》--鄧侃老師主導,各路英雄好漢共同翻譯
下面來看一個利用神經網路擬合不同函式(Linear Regression)的例子,你可以在《Pattern Recognition and Machine Learning》的5.1節中找到。4副圖分別對應四個不同的函式,紅色的實線表示利用神經網路擬合的函式,圓點表示原函式生成的樣本點,虛線表示不同的神經元在對應於不同 x 取值的輸出值,幾條虛線經過線性新增後得到的就是擬合後的曲線。
總結:
1,簡易的神經網路結構並不複雜,但在實際訓練一個神經網路的時候是會遇見很多問題的,比如選擇線上梯度下降還是Batch梯度下降,隱藏層神經元個數的選擇,是選擇多層神經網路還是單層。這些都需要多多實踐才行。
2,從理論上來講,神經網路是可以擬合任何函式,但實際上並非如此。就我個人的實際經驗來看,對於某些資料神經網路是失敗的。
3,模型不是萬能,還需要做很多功課。
#梯度資訊在訓練 NN 中的使用
#Batch 梯度上升和線上梯度上升的比較
理解了該部分的神經網路知識對後面理解深度神經網路會很大幫助,包括其中的優化方法,能量模型(Energy-based Model),以及RBM(EBM的一個特例)
參考文獻:
《Pattern Recognition and Machine Learning》