神經網絡算法

咱們在設計機器學習系統時,特別但願可以創建相似人腦的一種機制。神經網絡就是其中一種。可是考慮到實際狀況,通常的神經網絡(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)<0atom


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

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

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(遞歸神經網絡)。

相關文章
相關標籤/搜索