淺談神經網絡算法


我們在設計機器學習系統時,特別希望能夠建立類似人腦的一種機制。神經網絡就是其中一種。但是考慮到實際情況,一般的神經網絡(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+θ_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算法就是所謂的反向傳播算法,它將誤差進行反向傳播,從而獲取更高的學習效率。這很像烽火台,如果前線戰敗了,那么消息就通過烽火台傳遞回指揮部,指揮部去反思問題,最終改變策略。
但這帶來一個問題,中間層的誤差怎么計算?我們能簡單地將權重和殘差的乘積,返回給上一層節點(這種想法真暴力,從左到右和從右到左是一樣的)。
此處輸入圖片的描述

這相當於三次傳播:

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

下面一張圖展示了完整的BP算法的過程,我看了不下20遍:
此處輸入圖片的描述
更有趣的是,sigmoid求導之后,特別像高斯(正態)分布,而且sigmoid求導非常容易。

5.總結

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


免責聲明!

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



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