機器學習知識體系 - 神經網絡(基礎)


轉載:http://www.jianshu.com/p/a3b89d79f325

 

引言
本系列是本人第一次在簡書寫東西,想將手頭上正在學的神經網絡歸納整理,盡量詳細地介紹神經網絡的結構、計算公式與C語言實現。文中內容基本參考消化了計算機的潛意識的博文,文中圖片基本來自他的博文和Ng老師的課件,所用的符號和上下標與Ng老師的一致,在此感謝。


神經網絡結構

說到神經網絡,對神經網絡有概念的人第一個冒出來的肯定是下面這幅圖,這是最基本的3層神經網絡,圖中圓圈標識神經元,有輸入層、1層隱藏層、輸出層。輸入層有3個輸入單元,隱藏層有4個單元,輸出層有2個單元,中間交錯的是傳遞路線。輸入層一般表示每個樣本(sample)的特征(features),特征是根據不同的樣本我們自己提取的(例如一段聲音波形,我提取了最大值、總能量等作為特征,根據這些特征,我們可以把這段聲音歸類,而歸類的依據就是輸出層的輸出結果)。


神經網絡基本結構


神經網絡中有一些設計規則需要記住:

  1. 設計一個神經網絡時,輸入層與輸出層的節點數往往是固定的,中間層則可以自由指定;
  2. 神經網絡結構圖中的拓撲與箭頭代表着預測過程時數據的流向,跟訓練時的數據流有一定的區別;
  3. 結構圖里的關鍵不是圓圈(代表“神經元”),而是連接線(代表“神經元”之間的連接)。每個連接線對應一個不同的權重(其值稱為權值),這是需要訓練得到的。

神經元模型

神經元模型包括輸入、輸出和計算模塊,如下圖所示是經典的神經元模型,神經元首先對輸入信號進行加權求和,這里的權值在神經網絡計算中是很重要,一個神經網絡算法就是不斷地調整每一層的權值矩陣來使得整個網絡的預測結果達到最佳。求和之后經過一個非線性函數后輸出,這個非線性函數在很多地方被稱為激活函數。


神經元的計算模型

我們用Ng老師的符號來表示上圖,得到下面圖所示,輸出z是在輸入和權值的線性加權和疊加了一個函數g的值。在MP模型里,函數g是sgn函數,也就是取符號函數。這個函數當輸入大於0時,輸出1,否則輸出0。很多地方為了簡化,會把sum和函數g放在同一個圈內作為一個節點,當看到一個節點時,一定要知道節點內部是有這些計算過程的。


神經元計算模型(符號)

1943年發布的MP模型,雖然簡單,但已經建立了神經網絡大廈的地基。但是,MP模型中,權重的值都是預先設置的,因此不能學習。
1949年心理學家Hebb提出了Hebb學習率,認為人腦神經細胞的突觸(也就是連接)上的強度上可以變化的。於是計算科學家們開始考慮用調整權值的方法來讓機器學習。這為后面的學習算法奠定了基礎。

單層神經網絡

1958年,計算科學家Rosenblatt提出了由兩層神經元組成的神經網絡。他給它起了一個名字--“感知器”(Perceptron)。 在“感知器”中,有兩個層次。分別是輸入層和輸出層。輸入層里的“輸入單元”只負責傳輸數據,不做計算。輸出層里的“輸出單元”則需要對前面一層的輸入進行計算。

我們把需要計算的層次稱之為“計算層”,並把擁有一個計算層的網絡稱之為“單層神經網絡”。有一些文獻會按照網絡擁有的層數來命名,例如把“感知器”稱為兩層神經網絡。但在本文里,我們根據計算層的數量來命名。

如下圖是一個兩個輸出的單層神經網絡,這里我們的預測目標不再是一個值,而是兩個值,一般用向量表示。那么單層網絡模型的計算公式如下圖所示。(注意權值w的下標,如W1,2表示這一層第1個神經元對前一層第二個神經元的權重)


單層神經網絡

我們仔細看輸出的計算公式,會發現這兩個公式就是線性代數方程組。因此可以用矩陣乘法來表達這兩個公式。例如,輸入的變量是[a1,a2,a3]T,用向量a來表示。方程的左邊是[z1,z2]T,用向量z來表示,權重則是矩陣W(2行3列的矩陣),於是,輸出公式可以改寫成:
g(W a) = z

這個公式就是神經網絡中從前一層計算后一層的矩陣運算。

兩層神經網絡

介紹

Minsky說過單層神經網絡無法解決異或問題。但是當增加一個計算層以后,兩層神經網絡不僅可以解決異或問題,而且具有非常好的非線性分類效果。不過兩層神經網絡的計算是一個問題,沒有一個較好的解法。

1986年,Rumelhar和Hinton等人提出了反向傳播(Backpropagation,BP)算法,解決了兩層神經網絡所需要的復雜計算量問題,從而帶動了業界使用兩層神經網絡研究的熱潮。目前,大量的教授神經網絡的教材,都是重點介紹兩層(帶一個隱藏層)神經網絡的內容。

結構

兩層神經網絡除了包含一個輸入層,一個輸出層以外,還增加了一個中間層(即開頭我們給出的模型)。此時,中間層和輸出層都是計算層。現在,我們的權值矩陣增加到了兩個,Ng老師用上標來區分不同層次之間的變量。
例如ax(i)代表第i層的第x個節點。a1(2),a2(2)的計算公式如下圖所示:


兩層神經網絡-中間層計算

計算最終輸出z的方式是利用了中間層的a1(2),a2(2)和第二個權值矩陣W(2)計算得到的,如下圖。


兩層神經網絡-輸出層計算

假設我們的預測目標是一個向量,那么與前面類似,只需要在“輸出層”再增加節點即可。我們使用向量和矩陣來表示層次中的變量。a(1),a(2),z是網絡中傳輸的向量數據。W(1)和W(2)是網絡的矩陣參數。


兩層神經網絡-向量表示

計算公式為:
g(W(1) a(1)) = a(2)
g(W(2) a(2)) = z

至今為止,我們對神經網絡的結構圖的討論中都沒有提到偏置節點(bias unit)。事實上,這些節點是默認存在的。它本質上是一個只含有存儲功能,且存儲值永遠為1的單元。在神經網絡的每個層次中,除了輸出層以外,都會含有這樣一個偏置單元。正如線性回歸模型與邏輯回歸模型中的一樣。偏置單元與后一層的所有節點都有連接,我們設這些參數值為向量b,稱之為偏置。如下圖。


Paste_Image.png

有些神經網絡的結構圖中會把偏置節點明顯畫出來,有些不會。一般情況下,我們都不會明確畫出偏置節點。 在考慮了偏置以后的一個神經網絡的矩陣運算如下:
g(W(1) a(1) + b(1)) = a(2)
g(W(2) a(2) + b(2)) = z

 需要說明的是,在兩層神經網絡中,我們不再使用sgn函數作為函數g,而是使用平滑函數sigmoid作為函數g。我們把函數g也稱作激活函數(active function)。

事實上,神經網絡的本質就是通過參數與激活函數來擬合特征與目標之間的真實函數關系。初學者可能認為畫神經網絡的結構圖是為了在程序中實現這些圓圈與線,但在一個神經網絡的程序中,既沒有“線”這個對象,也沒有“單元”這個對象。實現一個神經網絡最需要的是線性代數庫。

分類效果

與單層神經網絡不同。理論證明,兩層神經網絡可以無限逼近任意連續函數。這是什么意思呢?也就是說,面對復雜的非線性分類任務,兩層(帶一個隱藏層)神經網絡可以分類的很好。下面就是一個例子(此兩圖來自colah的博客),紅色的線與藍色的線代表數據。而紅色區域和藍色區域代表由神經網絡划開的區域,兩者的分界線就是決策分界。


兩層神經網絡-決策分類

可以看到,這個兩層神經網絡的決策分界是非常平滑的曲線,而且分類的很好。有趣的是,前面已經學到過,單層網絡只能做線性分類任務。而兩層神經網絡中的后一層也是線性分類層,應該只能做線性分類任務。為什么兩個線性分類任務結合就可以做非線性分類任務?我們可以把輸出層的決策分界單獨拿出來看一下。就是下圖。


兩層神經網絡-空間變換

可以看到,輸出層的決策分界仍然是直線。關鍵就是,從輸入層到隱藏層時,數據發生了空間變換。也就是說,兩層神經網絡中,隱藏層對原始的數據進行了一個空間變換,使其可以被線性分類,然后輸出層的決策分界划出了一個線性分類分界線,對其進行分類。
這樣就導出了兩層神經網絡可以做非線性分類的關鍵--隱藏層。聯想到我們一開始推導出的矩陣公式,我們知道,矩陣和向量相乘,本質上就是對向量的坐標空間進行一個變換。因此,隱藏層的參數矩陣的作用就是使得數據的原始坐標空間從線性不可分,轉換成了線性可分。
兩層神經網絡通過兩層的線性模型模擬了數據內真實的非線性函數。因此,多層的神經網絡的本質就是復雜函數擬合。

神經網絡設計與訓練

在設計一個神經網絡時,輸入層的節點數需要與特征的維度匹配,輸出層的節點數要與目標的維度匹配。而中間層的節點數,卻是由設計者指定的。因此,“自由”把握在設計者的手中。但是,節點數設置的多少,卻會影響到整個模型的效果。如何決定這個自由層的節點數呢?目前業界沒有完善的理論來指導這個決策。一般是根據經驗來設置。較好的方法就是預先設定幾個可選值,通過切換這幾個值來看整個模型的預測效果,選擇效果最好的值作為最終選擇。這種方法又叫做Grid Search(明明就是瞎猜法)。

機器學習的訓練,機器學習模型訓練的目的,就是使得參數盡可能的與真實的模型逼近。具體做法是這樣的。首先給所有參數賦上隨機值。我們使用這些隨機生成的參數值,來預測訓練數據中的樣本。樣本的預測目標為h(x)
,真實目標為y。那么,定義一個值cost,計算公式如下:
cost = (h(x) - y)2
我們的目標就是使對所有訓練數據的損失和(cost)盡可能的小。如果將先前的神經網絡預測的矩陣公式帶入到h(x)中(z=h(x)),那么我們可以把cost寫為關於參數(parameter)的函數,這個函數稱之為損失函數(cost function)。下面的問題就是求:如何優化參數,能夠讓損失函數的值最小。cost function一般用

來表示。
在線性回歸中,cost function可以表示為


線性回歸中cost function

但是在logistic回歸中,cost function 就不一樣了。


Paste_Image.png

此時這個問題就被轉化為一個優化問題,一個常用的方法就是高等數學中的求導,但是這里的問題是由於參數不止一個,求導后計算導數等於0的運算量很大,所以一般來說解決這個優化問題使用的是梯度下降算法。梯度下降算法每次計算參數(權重矩陣w中的每一個值)在當前的梯度(偏導數),然后讓參數向着梯度的反方向前進一段距離,不斷重復,直到梯度接近0。一般這個時候,所有的參數恰好達到使損失函數達到最低值的狀態。還有一種在多元回歸中用的標准公式法。都能夠計算出使cost function達到最小值的參數矩陣。

在神經網絡模型中,由於結構復雜,每次計算梯度的代價很大。因此還需要使用反向傳播算法。反向傳播算法是利用了神經網絡的結構進行的計算。不一次計算所有參數的梯度,而是從后往前。首先計算輸出層的梯度,然后是第二個參數矩陣的梯度,接着是中間層的梯度,再然后是第一個參數矩陣的梯度,最后是輸入層的梯度。計算結束以后,所要的兩個參數矩陣的梯度就都有了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM