神經網絡(Neural Networks)

1.簡介

一般的迴歸和分類方式是基於線性模型,也就是固定的非線性的基函數(basis function)的線性組合,形式如下:


其中,如果f(.)是非線性的激活函數(activation function),這就是一個分類模型;如果f(.)是恆等函數(identity),則是迴歸模型。

根據自己的認識,我認爲神經網絡就是多層這樣的模型的疊加,並引入非線性的activation function,提高模型的整體能力(因爲每一個隱藏層可以對上一層的輸出進行非線性變換,因此深度神經網絡擁有比“淺層”網絡擁有更加優異的表達能力)。神經網絡的計算量相比於其他的迴歸和分類模型比較大,在早期並沒有受到研究者的重視,隨機近幾年計算機設備的性能提升從而受到廣泛的關注,也誕生了新的領域Deep learning。


上圖是簡單的三層神經網絡,其中,相鄰層之間是全聯通的(即下一層的輸入是上一層所有結點的線性組合),當然也有不是全聯通的網絡,典型代表是卷積神經網絡(CNN),CNN在計算機視覺領域取得比較的成果,由於圖像的維度比較高,如果採用全聯通結構會導致模型會有非常多的參數,使得模型變得非常複雜。另外,一般情況下hidden layer 的結點數目會比input layer和output layer的結點多(稀疏自動編碼,是一種hidden layer的結點數比其他的小,而input layer 和 output layer的結點數相同)。

此外,神經網絡也可以分爲監督神經網絡和非監督神經網絡,我們比較熟悉的是監督神經網絡,該模型可以處理分類,迴歸問題;非監督神經網絡最典型的的就是稀疏自編碼器(Sparse Autoencoder)。


神經網絡主要有三部分構成:正反饋(Feedforward),代價函數(cost function),反向傳播(Backpropagation),下面從這三部分介紹神經網絡。


2.正反饋(Feedforward)

正反饋比較簡單,計算過程可見上圖。簡單介紹下激勵函數(activation function),最常用是sigmoid數和tanh函數。

sigmoid函數:

tanh函數:


這個兩個函數的特性就是它的導數比較特別,方面後面的計算。Sigmoid函數的導數是,tanh函數的導數是


3.代價函數(cost function)

在線性迴歸中,我們使用sum-of-square cost function,在這裏我們同樣可以使用,代價函數爲:

接下來,我們需要找到某個w使得代價函數最小。在迴歸問題中,我們可以得到參數w的解析解,但在該問題中由於activation function是非線性的,E(w)是一個非凸函數,我們無法得到解析解,但可通過迭代優化方法求解。

我們最熟悉的梯度下降(gradient descent),用梯度信息來更新參數w,每一次迭代按如下公式更新:

這是batch gradient descent,該方法的缺點是比較time-consuming,每更新一次參數需要計算整個數據集的數據。對於這種batch optimization,更高效的方法是共軛梯度(conjugate gradients)和擬牛頓(quasi-newton),這兩種方法每次迭代cost function都會減小,除非w已經是局部或者全局最小值,這個和梯度下降不同。


另外一種是on-line 的方法,假設所有的觀測值都是獨立的,cost function 有每一個數據的cost組成:

我們採用on-line gradient descent,也被稱爲sequential或者stochasticgradient descent,這個方法每一次迭代都只基於一個數據數據,梯度下降中每一次迭代按如下公式更新:


Tip:爲了得到足夠好的最小值,我們往往需要運行多次優化算法,每一次都隨機的取不同的初始參數,在validation set 上比較性能。

到目前爲止,我們已經知道如何求解模型的參數了,但是cost function的梯度未知,如何求解梯度呢,神經網絡通過後向傳播來求解梯度,大大提高了計算效率。


4.反向傳播(Backpropagation)

在這裏,我以on-line的方法爲例子,主要參照PRML,其中的一些符號與UFLDL 的tutorial有所不同,需要注意的是,其中z和a的意義正好相反。


現在考慮最簡單的一層神經網絡,也就是輸出是輸入的線性組合,即

對於某一個輸入n,cost function爲

然後我們求cost function關於wji的梯度,得到

現在考慮一般的神經網絡結構,使用chain rule求解偏導數,得到,我們記,該值經常被稱爲error。由於,推到可以得到。現在,我們只需要知道delta_j和z_j,就可以求解cost function關於wji的偏導數了。


輸出層(output layer)

對於輸出層(output layer),我們可以得到(這個自己也還沒搞定,不知道和上面簡單的一層神經網絡有沒有關係)。


隱藏層(hidden layer)

對於隱藏層(hidden layer),我們同樣使用chainrule,得到


其中,a_k是與a_j相連接的所有下一層結點,所以a_k可以表示成上一層的線性組合,再通過一個activation函數,得到


然後把該公式帶入上式,得到


根據該公式,我們可以發現,計算hidden層的delta需要先計算後一層的delta,delta的計算是從後面往前傳遞,所以稱爲backpropagation。


在計算得到所有的delat之後,我可以通過下式計算偏導數:,如果結點是bias結點,z_i = 1,然後通過梯度下降求解參數w。


5.總結:

 

總的來說,訓練神經網絡的其實就是迭代地尋找到使得E(w)最小化的參數w,一般採用的是Gradient decent的方法,該方法有一個核心就是計算E(w)的梯度,而在神經網絡中使用BP求解梯度,下面列出計算的流程:

1.  給定一個輸入向量x,通過forward propagation計算所以hidden結點和output結點的activation。

2.  計算output結點的delta。

3.  根據output結點的delta,通過back propagation計算所有hidden結點的delat。

4.  然後通過計算想要的偏導數。

 

需要注意的是,我們上面是以on-line爲列介紹神經網絡的BP,如果是batch方法也是類似的,只是在整個數據集上重複上面的過程,然後把偏導數求個和得到


整個神經網絡的流程就是訓練w,流程如下:

(1)初始化一個參數w;

(2)按當前的w值,用BP計算E(w)的梯度;

(3)按Gradient decent公式更新,得到一個新的參數w;

(4)反覆(2)和(3),直到w收斂。


6.Reference:

《Pattern Recognition and Machine Learning》ChristopherM. Bishop

《Pattern Recognition and Machine Learning》讀書筆記

UFLDL Tutorial  http://deeplearning.stanford.edu/wiki/index.php/UFLDL_Tutorial




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