淺談神經網絡算法

咱們在設計機器學習系統時,特別但願可以創建相似人腦的一種機制。神經網絡就是其中一種。可是考慮到實際狀況,通常的神經網絡(BP網絡)不須要設計的那麼複雜,不須要包含反饋和遞歸。
人工智能的一大重要應用,是分類問題。本文經過分類的例子,來介紹神經網絡。node

1.最簡單的線性分類

一個最簡單的分類,是在平面上畫一條直線,左邊爲類0,右邊爲類1,直線表示爲\(z=ax+by+c\)
這是一個分類器,輸入(x,y),那麼,要求的參數有三個:a,b,c。另外注意c的做用,若是沒有c,這條直線必定會過原點。
最簡單的神經網絡
所以,咱們能夠設計一個簡單的神經網絡,包含兩層,輸入層有三個節點,表明x,y,1,三條線分別表明a,b,cg(z)對傳入的值x進行判別,並輸出結果。
\[z=θ_0+θ_1X_1+θ_2X_2\]
可是,因爲z的值可能爲[\(-\infty,+\infty\)],爲了方便處理,須要將其壓縮到一個合理的範圍,還需sigmoid函數:
\[a(z)=\frac{1}{1-e^{-z}}\]
這樣的激勵函數,可以將剛纔的區間,壓縮到\([0,1]\)
至於如何訓練,會在以後的章節中講解。算法

2.多層級神經網絡

剛纔展現了最簡單的二分類,若是有四個分類,那一條線就沒法知足要求了。想象兩條直線,就會將平面劃分爲四個區域,一個三角區域至關於兩個子平面求交集。
所以直覺告訴咱們,若是有多個神經元,那麼這樣的問題能表現爲問題的「邏輯與」操做。將第一節中介紹的神經網絡的輸出,再作一個判斷層,即多層網絡。
單層感知器
可是,如何實現邏輯與呢?用下面的圖一目瞭然:
此處輸入圖片的描述
仔細看下,這至關於建立一條線,除非\(x_1\)\(x_2\)都等於1,不然\(h_\theta(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層,每層的節點分別爲\(node_0,node_1...node_m\),節點最多的層,有m個節點,那麼咱們能夠將其表達爲一個矩陣W,規模爲\(m*n\),內部有些值是沒有定義的。性能

4.訓練算法

線性可分

若是輸入和輸出是線性關係(或者是正相關),那麼想象咱們在調節一個參數時,當輸出過大,那就把輸入調小一些,反之調大一些,最後當輸出和咱們想要的很是接近時,訓練結束。這個就比如,在平面上,若是一個點被分配到了錯誤的輸出,就應該對直線平移和扭轉,減小該直線到這個點的距離,從而實現從新分區。
進一步地,若是向量的多個份量互相獨立,那麼方法也和上面的相似\(x_1=>y_1,x_2=>y_2\),分別調節\(x_1\)\(x_2\)的參數,最終讓結果接近,訓練結束。
此處輸入圖片的描述
而一個感知器結構可表示以下:
感知器結構
反思上面的過程,咱們其實是在衡量偏差,根據偏差來修改權重。學習

線性不可分

若是輸入和輸出的關係比較複雜,如二次函數\(y=x^2\),那當超過x=0的位置以後,反而成了遞增了,此時一個線性的判斷函數就不起做用了。所以,上面的方法,不能推廣到全部的前饋網絡中。
怎麼辦?那就只能使用梯度(LMS)法了。
梯度法,是對於樣本集\(X_1,X_2..X_n\),找到一個\(W^*\),使得\(f(W^* \dot X_i) X_i\)與輸出\(Y_i\)儘量接近,其中\(f\)是激勵函數。偏差表示爲:
\[e= \frac{1}{2}\sum_{i=1}^{n}{(Y_i-Y_i^*)}^{2}\]
爲了可以調節偏差e,使之儘量小,則須要求其導數,發現其降低的方向:
\[grad_w e= \frac{\partial e}{\partial W} = \sum_{k=1}^{n}\frac{\partial e_k}{\partial W}\]
其中:
\[e_k=\frac{1}{2} {(Y_k-Y^-_k)}^2\]
對偏導進行求解:
此處輸入圖片的描述
每次迭代的計算公式爲:
此處輸入圖片的描述
最終:
此處輸入圖片的描述
其幾何意義就是,偏差的偏導,等於在\(X_k\)位置上的值,乘以偏差,再乘以激勵函數的偏導。
因此,每次的權重矩陣\(W\)的修改,應當經過求偏差的偏導(梯度)來實現。比以前的直接經過偏差來調整,具有更好的適應性。
可是,這樣的梯度法,對於實際學習來講,效率仍是太慢,咱們須要更快的收斂方法。人工智能

BP算法

BP算法就是所謂的反向傳播算法,它將偏差進行反向傳播,從而獲取更高的學習效率。這很像烽火臺,若是前線戰敗了,那麼消息就經過烽火臺傳遞迴指揮部,指揮部去反思問題,最終改變策略。
但這帶來一個問題,中間層的偏差怎麼計算?咱們能簡單地將權重和殘差的乘積,返回給上一層節點(這種想法真暴力,從左到右和從右到左是同樣的)。
此處輸入圖片的描述spa

這至關於三次傳播:設計

-第一步:從前向後傳播FP
-第二步:獲得值z,偏差爲y,將偏差反向傳播,得到每一個節點的誤差$\sigma$
-第三步:再次正向傳播,經過上一步的$\sigma$,再乘以步長,修改每個神經元突觸的權重。

下面一張圖展現了完整的BP算法的過程,我看了不下20遍:
此處輸入圖片的描述
更有趣的是,sigmoid求導以後,特別像高斯(正態)分佈,並且sigmoid求導很是容易。

5.總結

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

相關文章
相關標籤/搜索