前面我們知道了將簡單的模型進行融合之后會得到一個非常強大的模型。我們試著將感知器(簡單的二元分類模型)做線性融合之后得到下圖:
用融合模型做邏輯運算
我們試著用上面的融合模型去解決兩個感知器與運算的一個實例如下圖所示:
融合模型的極限
融合模型非常的強大,以致于能夠分割出VC維度為無限大的凸多邊形。當然這也免不了過擬合的危險。
除此之外融合模型也不是的比如它不能分割出一個異或的模型來如下圖:
多層的感知器:基礎的神經網絡
我們基于boolean邏輯運算的組合XOR(AND(-g1,g2),AND(g1,-g2))將神經網絡再次擴大一層我們就可以解決上面的問題了:
神經網絡與生物學神經的關系
一句話,只是有簡單的相似之處。神經網絡歸根結底是一個數學上的模型。就像我么造飛機一樣我們只有簡單的借鑒,其他的都是工程與科學的結合。我們不能做“鳥飛派”全盤的模仿。
神經網絡的原理
為神經網絡選擇一個輸出
我們的終目的就是要讓輸入的資料經過一層一層的轉換然后經過線性的融合得到一個綜合的模型。我們學過比較有代表性的線性模型就是線性二分、線性回歸、邏輯回歸。不同的模型會對應到每一層的轉換會有不同的意義。為了計算的方便起見我們使用平方誤差的線性回歸:
為中間的轉換選擇一個函數
①不使用線性二分的函數
在前面的討論中我們進行的是邏輯運算所以我們選擇了二分函數。但是在比較復雜的問題下我們使用線性二分函數的話在優化的時候就會非常困難,所以不選擇線性二分函數作為轉換函數。
②不使用線性函數
由于我們已經選擇了線性函數作為我們的融合模型。所以當我們轉換和輸出函數都是線性函數的時候我們所做的就只相當于將原來的輸入只做了一個線性的融合這樣的效果可想而知。沒有發揮出神經網絡轉換與融合的特點來。
③使用tanh函數
tanh也是一個平滑的連續的s型函數。這個函數有這樣的優點:首先,它比起線性二分函數更容易優化。其次,它是一個連續的函數這一點與生物學中的神經元運作很像。,這個函數與我們熟悉的邏輯回歸函數十分相近(只是簡單的平移與放縮)。
選擇的過程與tanh函數如下圖所示:
神經網絡模型符號上的表示
我們把整個神經網絡分為這樣幾個部分:
①將原始資料輸入的部分稱為輸入層,同時也是第0層。
②將輸出的那一層稱為輸出層,同時也是第L層。
③中間不停的做轉換的部分稱為隱藏層,也是第l層(1<=l<=L)。
④Wij是第i層到第j層之間的權重。
⑤s是上一層的輸出,也作為當前層的輸入資料x。
對于每一個節點都會有一組不同的權重值,也就是對于每一個節點都會有一個不同的權重向量。
神經網絡的物理意義
神經網絡的節點中,每一個節點都會對應一個權重向量W。這個向量會與前面的輸入所組合(透過tanh函數)組合后的輸出又當做是新一輪的輸入,那么這個過程就是對原來資料的一種特殊的轉換。那么什么時候這個tanh函數會很大呢(也就是得到+1的結果)?就是WX內積很大的時候,內積很大說明了X與W的相似度很高,這兩個向量越接近。所以我們的tanh函數很大時候的權重W就會與我們實際的數據有很高的相似性。也就是我們的W就是我們從數據中萃取出來的特性或者說是模式。
反向傳播算法
權重的決定
每一層的每個點應該對應什么權重這完全取決于我們結果的犯錯誤的大小,也就是損失函數的大小。我們總是希望能夠有一組權重會使得我們的損失函數小。這樣的權重就是我們想要的權重。出于一般性的考慮我們需要知道每個節點所對應的權重(Wij)與我們犯的錯誤(en)有什么聯系。也就是計算en與相對于每一個權重的偏微分,知道這個偏微分之后我們就能夠知道使得錯誤變小的方向在哪里進而去朝這個方向更新我們的權重如下圖所示:
我們先計算終的錯誤對于一層的權重的偏微分如下圖所示:
我們很輕易的得到了這個關系如上圖左方所示。依照這一步計算我們試圖去計算en對第l層的某一個節點的權重的偏微分。其中有對第i-1層的輸入X,還有一項為en對這個節點偏微分的結果我們稱它為δ。我們的下一步就是計算δ。
計算δ
單個節點的分數,權重與,輸出關系如下:
我們繼續使用微積分中的連鎖率去計算δ,會得到如下的結果:
這樣一來δ之間就會形成一個遞推的關系,他們都能夠由一個開始反向的計算出上一個直到地推到當前的δ為止。其中Wjk我們已經在手上了,tanh對于s的偏微分也可以計算,δ可以遞推的計算出來。
這樣我們得到了錯誤與我們一個點的權重我們也就可以重復上述步驟得到每個點對錯誤的影響,我們在根據這個影響調節每一個權重直到錯誤降到一個很低的值。
總的看來我們首先輸入一組值得到一個錯誤率,然后通過錯誤率反過來計算每個節點對它的權重的影響,進而使用梯度下降法調節權重。整個過程我們稱之為反向傳播算法。如下圖所示:
注意事項:
①初的梯度我們隨機給定。
②x的計算完全由的輸入、權重與tanh函數來正向計算得來。
③在使用梯度下降法更新權重的時候每一次的更新都會將反向傳播“跑一輪”比較耗時間。如果只使用一筆資料去更新的話會有一些不確定性在里面,如果使用所有的資料又顯得計算量很大。所以我們選擇了一個折中的方法就是選擇其中的一批資料去計算梯度然后求平均,在更新的時候我們用到的梯度就是我們所求的平均的梯度。這種更新梯度的方式我們稱之為mini-batch。
④返回的g就是從層開始不斷做線性組合-->tanh--->多個模型融合這個過程,
g = (...tanh(Σw*tanh(Σw*x)))。
神經網絡的優化
局部小與全局小
對于神經網絡的優化我們使用的是梯度下降法,但是當隱藏層變多的時候我們的損失函數就變成了一個非凸函數如下:
所以我們就很難使得錯誤率到達真正的點反而陷入局部的困境。
我們知道損失函數的解與我們的起始點有關,不同的起始點會有不同的解。一般來說權重大的時候我們的梯度較小下降速度較慢所以我們一般選擇的初始權重的時候會遵循隨機化與盡可能小的原則這樣可能會得到更好的效果。
神經網絡與VC維度
這里只給一個結論:dvc = (VD),V代表神經元的數量,D代表權重的數量。這里給我們的啟示就是:神經元越多我們的模型就能夠做更多的事情,但是太多的神經元會使得我們有過擬合的危險。
神經網絡的正則化
對于模型的正則化我們一般有L2與L1兩種選擇:
①單純的選擇L2的正則化,我們會使得權重變小但是只是同比的縮小,所以導致了雖然權重變小了但是大多數的權重值還不是0。這樣并沒有減少我們的運算量。
②單純的使用L1的正則化,我們倒是可以得到一些稀疏的的解。但是L1的正則化下的模型是不可微分的,這樣就破壞了我們神經網絡可微分的體系。
③我們就選擇了一種新的方式:將原來的L2正則化進行放縮,這次不是同比放縮而是固定的放縮。導致了一些小的權重值會趨向于0。這樣我們就達到了稀疏學習的目的。改版后的正則化如下圖所示:
其它的一些正則化
在梯度下降的過程中,我們會先看自己周圍的一堆權重然后進行跟新,到了一個新的點上我們又會去執行以上相同的步驟。隨著走的步數越多我們做的選擇就越多,我們的復雜度就會越大也就越容易過擬合。所以我們選擇早一點就停下來。
在VC里面的VC/Err圖也說明了解不在復雜度很高的地方,也就是不在步數走的多的時候出現。
至于應該在什么時刻選擇停止下來我們通常使用的就是模型檢測validation。
粵嵌科技創辦于2005年是一家IT高新技術企業,專注IT職業教育13年,主要培訓課程分別有嵌入式培訓、Java培訓、Unity游戲開發、Python人工智能、HTML5前端開發、全棧UI設計、網絡營銷、CCIE網絡等專業課程,咨詢電話:020-61038927