神經網絡算法


我們在設計機器學習系統時,特別希望能夠建立類似人腦的一種機制。神經網絡就是其中一種。但是考慮到實際情況,一般的神經網絡(BP網絡)不需要設計的那么復雜,不需要包含反饋和遞歸。
人工智能的一大重要應用,是分類問題。本文通過分類的例子,來介紹神經網絡。

1.最簡單的線性分類

一個最簡單的分類,是在平面上畫一條直線,左邊為類0,右邊為類1,直線表示為z=ax+by+c


這是一個分類器,輸入(x,y),那么,要求的參數有三個:a,b,c。另外注意c的作用,如果沒有c,這條直線一定會過原點。
最簡單的神經網絡
因此,我們可以設計一個簡單的神經網絡,包含兩層,輸入層有三個節點,代表x,y,1,三條線分別代表a,b,cg(z)對傳入的值x進行判別,並輸出結果。

z=θ0+θ1X1+θ2X2


但是,由於z的值可能為[,+],為了方便處理,需要將其壓縮到一個合理的范圍,還需sigmoid函數:

a(z)=11ez


這樣的激勵函數,能夠將剛才的區間,壓縮到[0,1]


至於如何訓練,會在之后的章節中講解。

2.多層級神經網絡

剛才展示了最簡單的二分類,如果有四個分類,那一條線就無法滿足要求了。想象兩條直線,就會將平面划分為四個區域,一個三角區域相當於兩個子平面求交集。
因此直覺告訴我們,如果有多個神經元,那么這樣的問題能表現為問題的“邏輯與”操作。將第一節中介紹的神經網絡的輸出,再做一個判斷層,即多層網絡。
單層感知器
但是,如何實現邏輯與呢?用下面的圖一目了然:
此處輸入圖片的描述
仔細看下,這相當於創建一條線,除非x1

x2都等於1,否則hθ(x)<0


進一步地,如果我們能夠對區域求並集,那么總可以對不同的子區域求並。而實現並操作和與操作是類似的:
此處輸入圖片的描述
此處就能看到sigmoid函數的作用了,如果沒有它對數值的放縮,並和與的操作就無法實現了。
輸出還能作為下一級的輸入,從而增加了一個隱層,產生了單隱層神經網絡,再復雜一些,如果網絡層數特別多,則叫做深度學習網絡,簡稱深度學習。
此處輸入圖片的描述
之前針對一個線性不可分的區域,需要將其變換到更高維度的空間去處理。但如果用神經網絡,你總可以通過n條直線,將整個區間圍起來。只要直線數量夠多,總能繪制出任意復雜的區域。每一個子區域都是凸域:
此處輸入圖片的描述
簡直不能更酷!下面這張圖總結了不同類型的神經網絡具備的功能:
此處輸入圖片的描述
數學家證明了,雙隱層神經網絡能夠解決任意復雜的分類問題。但我們的問題到此為止了嗎?不見得!
這里還有幾個問題:

  • 異或如何實現?異或肯定是不能通過一條直線區分的,因此單層網絡無法實現異或,但兩層(包含一個隱層)就可以了。
  • 過擬合問題:過多的隱層節點,可能會將訓練集里的點全部圍進去,這樣系統就沒有擴展性了。如何防止過擬合?
  • 如何訓練:如何計算出合理的神經網絡參數?(隱層節點數)

3.如何訓練神經網絡

如果一個平面,有6個點,分成三類。如何設計呢?
此處輸入圖片的描述
一種最狂暴的方法,是對每一個點都用四條線圍起來,之后,再對六個區域兩兩取並集。形成下面這張超復雜的圖:
此處輸入圖片的描述
解釋一下為什么要有這么多個節點:
第一層:x,y再加bias,三個
第二層:每個點需要四條線圍起來,加上bias,總共4*6+1=25個
第三層:一個節點處於該類的條件是在四條線的中間(交集),因此每四個點匯成一個點,24/4+1=7個
第四層:三分類問題,需要對每兩個區域求並集,因此需要6/2+1=4個

但這樣的解法,使用了3+25+7+4=39個節點,需要111個參數。這樣的系統非常復雜,對未知節點幾乎沒有任何擴展性。
仔細思考這個問題, 我們能夠通過更少的節點和層數,來簡化這個問題嘛?只要三條直線就可以!節點數量大大減少。不僅訓練效率更高,而且可擴展能力很強。對更復雜的例子,我們又不是神仙,怎么知道設計幾個隱層和多少個節點呢?
所謂超參數,就是模型之外的參數,在這個例子中,就是隱層的數量和節點的數量。通常來說,線性分類器(回歸)只需要兩層即可,對於一般的分類問題,三層足夠。
一個三層的神經網絡,輸入和輸出節點的數量已經確定,那如何確定中間層(隱層)的節點數量呢?一般有幾個經驗:

      • 隱層節點數量一定要小於N-1(N為樣本數)
      • 訓練樣本數應當是連接權(輸入到第一隱層的權值數目+第一隱層到第二隱層的權值數目+...第N隱層到輸出層的權值數目,不就是邊的數量么)的2-10倍(也有講5-10倍的),另外,最好將樣本進行分組,對模型訓練多次,也比一次性全部送入訓練強很多。
      • 節點數量盡可能少,簡單的網絡泛化能力往往更強
      • 確定隱層節點的下限和上限,依次遍歷,找到收斂速度較快,且性能較高的節點數

如何表示一個神經網絡?網絡有m層,每層的節點分別為node0,node1...nodem

,節點最多的層,有m個節點,那么我們可以將其表達為一個矩陣W,規模為mn,內部有些值是沒有定義的。

 

4.訓練算法

線性可分

如果輸入和輸出是線性關系(或者是正相關),那么想象我們在調節一個參數時,當輸出過大,那就把輸入調小一些,反之調大一些,最后當輸出和我們想要的非常接近時,訓練結束。這個就好比,在平面上,如果一個點被分配到了錯誤的輸出,就應該對直線平移和扭轉,減少該直線到這個點的距離,從而實現重新分區。
進一步地,如果向量的多個分量互相獨立,那么方法也和上面的類似x1=>y1,x2=>y2

,分別調節x1x2

的參數,最終讓結果接近,訓練結束。
http://www.funnyai.com/AI/Book/DigtalNN/images/4.2.ht11.gif?_=5437973
而一個感知器結構可表示如下:

反思上面的過程,我們實際上是在衡量誤差,根據誤差來修改權重。

其幾何意義就是,誤差的偏導,等於在Xk位置上的值,乘以誤差,再乘以激勵函數的偏導。

所以,每次的權重矩陣W的修改,應當通過求誤差的偏導(梯度)來實現。比之前的直接通過誤差來調整,具備更好的適應性。

但是,這樣的梯度法,對於實際學習來說,效率還是太慢,我們需要更快的收斂方法。

更有趣的是,sigmoid求導之后,特別像高斯(正態)分布,而且sigmoid求導非常容易。

5.總結

這樣的一篇文章真是夠長了,原本還想再介紹一個神經網絡的Python實現,可是考慮到篇幅的限制,最終作罷。在下一期繼續介紹如何實現BP神經網絡和RNN(遞歸神經網絡)。


免責聲明!

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



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