机器学习读书笔记:神经网络
文章目錄
- 神經(jīng)元
- 感知機 & 多層神經(jīng)網(wǎng)絡(luò)
- 神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)
- 多層神經(jīng)網(wǎng)絡(luò)
- 誤差逆?zhèn)鞑ニ惴?#xff1a;BP(BackPropagation)
- 神經(jīng)網(wǎng)絡(luò)過擬合問題
- 局部最小與全局最小
? 現(xiàn)在的深度學(xué)習(xí)大行其道,深度學(xué)習(xí)就是利用深度神經(jīng)網(wǎng)絡(luò)來進行學(xué)習(xí)。而什么是深度網(wǎng)絡(luò)呢,就是隱層大于1的網(wǎng)絡(luò)(實際上遠遠大于1)。那啥時候又是隱層呢?這都需要從神經(jīng)元開始說起。
神經(jīng)元
? 看看下面這樣圖:
? 這就是神經(jīng)網(wǎng)絡(luò)中最基本的單元:M-P 神經(jīng)元。神經(jīng)元是模仿人類的神經(jīng)單元組織出現(xiàn)的。
? 神經(jīng)元將輸入轉(zhuǎn)成輸出:
-
輸入。輸入又包含兩個部分,輸入數(shù)值x1,x2...xn{x_1, x_2 ... x_n}x1?,x2?...xn?和每個輸入對應(yīng)的權(quán)值w1,w2...wn{w_1, w_2 ... w_n}w1?,w2?...wn?。
-
輸出。輸出yyy包含了包含了計算方式fff和閾值θ\thetaθ兩個部分。
-
激活函數(shù)。一般來說,輸出通過fff計算之后,為了模仿人類神經(jīng)元的“興奮”、“抑制”的二值狀態(tài),會再fff之后增加一個激活函數(shù)。
最簡單的激活函數(shù)是sgn(x)={1,x≥00,x<0sgn(x) = \begin{cases} 1, x \geq 0 \\ 0, x<0 \end{cases}sgn(x)={1,x≥00,x<0?,但是一般來說會使用數(shù)學(xué)性質(zhì)更好的Sigmoid函數(shù):sigmoid(x)=11+e?xsigmoid(x) = \frac{1}{1+e^{-x}}sigmoid(x)=1+e?x1?。
? 把這樣的神經(jīng)元前后連到一起,就形成了神經(jīng)網(wǎng)絡(luò)。
感知機 & 多層神經(jīng)網(wǎng)絡(luò)
? 感知機是一種最簡單的神經(jīng)元連接方法:
神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)
? 神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)是通過一個學(xué)習(xí)率來調(diào)整各個參數(shù)。
? 對于一個最簡單的M-P神經(jīng)元模型來說,假設(shè)有n個輸入,那么對應(yīng)了n個權(quán)重:w1,w2...wn{w_1, w_2 ... w_n}w1?,w2?...wn?。還有一個閾值θ\thetaθ。假設(shè)把這個θ\thetaθ也放入到www的向量中去,就可以統(tǒng)一的寫成,對于每一個訓(xùn)練樣本,我們要計算獲得:
wi=wi+ΔwiΔwi=η(y?y~)xiw_i = w_i + \Delta w_i \\ \Delta w_i = \eta(y-\tilde{y})x_i wi?=wi?+Δwi?Δwi?=η(y?y~?)xi?
? 也就是說,根據(jù)每次訓(xùn)練樣本中的fff的輸入y~\tilde yy~?和真實值yyy的差值,然后再乘以學(xué)習(xí)率η\etaη來計算得到每個www分量的調(diào)整量。根據(jù)這個調(diào)整量來調(diào)整模型中的www。通過大量的訓(xùn)練樣本迭代來獲得最優(yōu)化的www向量。這就是神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)過程。
多層神經(jīng)網(wǎng)絡(luò)
? 在這個模型中,只有兩層神經(jīng)元。《機器學(xué)習(xí)》的書上是提出了這個可以用于“與”、“或”、“非”三種邏輯運算的。但是如果碰到像“異或”這種線性不可分的問題,感知機(二層網(wǎng)絡(luò))就無法進行區(qū)分了。
? 這時候,就需要在輸入層和輸出層之間增加其他的層:就是多層神經(jīng)網(wǎng)絡(luò),除了輸入層和輸出層,其他的層統(tǒng)一叫做:“隱層”。
? 像上面的異或問題,加上一層神經(jīng)元節(jié)點就可以搞定這個問題:
? 那么如果碰到更復(fù)雜的問題,可能就需要加上更多的隱層:
? 上面所有的網(wǎng)絡(luò),因為我們的計算方向都是從輸入層 -> 隱層 -> 輸出層,可以說都是“往前“的,所以都叫做前饋網(wǎng)絡(luò)。
? 一直增加隱層的數(shù)量,比如100層,200層,網(wǎng)絡(luò)的結(jié)構(gòu)越來越深,這樣就演變成了深度神經(jīng)網(wǎng)絡(luò),用深度神經(jīng)網(wǎng)絡(luò)來進行學(xué)習(xí)的方式就叫做深度學(xué)習(xí)。
誤差逆?zhèn)鞑ニ惴?#xff1a;BP(BackPropagation)
? 針對多隱層的神經(jīng)網(wǎng)絡(luò),不像感知機一樣只有兩層,也就是說不止一層的www向量需要進行學(xué)習(xí)。那么對于這種神經(jīng)網(wǎng)絡(luò),需要更加厲害一點的學(xué)習(xí)算法來進行。
? 誤差逆?zhèn)鞑?#xff0c;也就是把這個誤差一層一層從輸出層往輸入層傳播。
? 我們來看一下是怎么個一層一層的傳播法,拿單隱層的網(wǎng)絡(luò)來看,多隱層的類推:
- lll表示輸出層的節(jié)點數(shù),y1,y2,...yl{y_1, y_2, ... y_l}y1?,y2?,...yl?表示每個輸出層節(jié)點。
- qqq表示隱層的節(jié)點數(shù),b1,b2...bqb_1, b_2 ... b_qb1?,b2?...bq?表示每個隱層節(jié)點。
- ddd表示輸入層的節(jié)點數(shù),x1,x2...xdx_1, x_2 ... x_dx1?,x2?...xd?表示每個輸入層節(jié)點。
- θj,j∈(1,2...l)\theta_{j}, j \in (1,2...l)θj?,j∈(1,2...l)表示每個輸出層節(jié)點中的閾值。
- γh,h∈(1,2...q)\gamma_h, h \in (1,2...q)γh?,h∈(1,2...q)表示每個隱層節(jié)點中的閾值。
- 每個輸出層的輸入就是qqq個隱層節(jié)點的鏈接,那么對于第jjj的輸入節(jié)點的輸入就是βj=∑h=1qwhjbh\beta_j = \sum_{h=1}^q{w_{hj}b{_h}}βj?=∑h=1q?whj?bh?,其中whjw_{hj}whj?為第hhh的隱層節(jié)點到第jjj個輸出層的權(quán)重。bhb_hbh?則為第hhh個隱層節(jié)點的輸出值。
- 類似地,每個隱層的輸出值bhb_hbh?由與第hhh個隱層節(jié)點的所有輸入層節(jié)點來決定:αj=∑i=1dvihxi\alpha_j = \sum_{i=1}^d{v_{ih}x_i}αj?=∑i=1d?vih?xi?,其中vihv_{ih}vih?為第iii個輸入層節(jié)點到第hhh個隱層的權(quán)重。xix_ixi?則為每個輸入層節(jié)點的輸入。
- 如果有多個隱層,就一層一層的推下去。
- 隱層和輸出層的fff都定義為Sigmoid函數(shù)。
? 基于上面的一些定義,可以得到:
-
對于每個訓(xùn)練樣本(xk,yk)(x_k, y_k)(xk?,yk?)輸出層的輸出向量:yk~=(y1k~,y2k~...ylk~)\tilde{y_k} = (\tilde{y_1^k}^, \tilde{y_2^k}... \tilde{y_l^k})yk?~?=(y1k?~?,y2k?~?...ylk?~?)。其中yjk=f(βj?θj),j∈(1,2...l)y_j^k = f(\beta_j-\theta_j), j \in (1,2...l)yjk?=f(βj??θj?),j∈(1,2...l)。那么這個網(wǎng)絡(luò)在這個樣本上的均方誤差就是:Ek=12∑j=1l(yjk~?yjk)2E_k = \frac{1}{2}\sum_{j=1}^l{(\tilde{y_j^k} - y_j^k)^2}Ek?=21?∑j=1l?(yjk?~??yjk?)2。
-
如果針對上面公式里面的yjk~\tilde{y_j^k}yjk?~?進行展開,代入上面的β\betaβ和α\alphaα的話,總共就有(d+l+1)q+l(d+l+1)q+l(d+l+1)q+l個參數(shù)需要進行學(xué)習(xí)。才能確定網(wǎng)絡(luò)模型。
-
對上述的所有的參數(shù),我們需要計算出每次的調(diào)整量Δv\Delta vΔv,然后進行調(diào)整:v←v+Δvv\leftarrow v + \Delta vv←v+Δv。
-
Δv\Delta vΔv使用梯度下降的策略去對參數(shù)進行計算。給定一個學(xué)習(xí)率η\etaη,對其中一個參數(shù)whjw_{hj}whj?的調(diào)整計算為(用EEE去對這個參數(shù)whjw_{hj}whj?求偏導(dǎo),梯度下降就是找梯度最大,加個負號就是找下降最快的方向):Δwhj=?η?Ek?whj\Delta{w_{hj}} = -\eta\frac{\partial E_k}{\partial w_{hj}}Δwhj?=?η?whj??Ek??,然后通過鏈式法則去一層層推導(dǎo)。我理解這里就體現(xiàn)除了逆?zhèn)鞑ミ@個概念吧。具體通過鏈式法則怎么一步一步推導(dǎo)的,因為自己數(shù)學(xué)水平有限,有興趣的朋友可以自己去搜一搜。
-
最終可以算出來幾個值為:
Δwhj=ηgjbh\Delta w_{hj} = \eta g_j b_hΔwhj?=ηgj?bh?
Δθj=?ηgj\Delta \theta_j = -\eta g_jΔθj?=?ηgj?
Δvih=ηehxi\Delta v_{ih} = \eta e_h x_iΔvih?=ηeh?xi?
Δγh=?ηeh\Delta \gamma_h = -\eta e_hΔγh?=?ηeh?
其中:
gj=yjk~(1?yjk~)(yjk?yjk)g_j = \tilde{y_j^k}(1-\tilde{y_j^k})(y_j^k-y_j^k)gj?=yjk?~?(1?yjk?~?)(yjk??yjk?)
eh=bh(1?bh)∑j=1whjgje_h = b_h(1-b_h)\sum_{j=1}{w_{hj}g_j}eh?=bh?(1?bh?)∑j=1?whj?gj?
-
這里一個關(guān)鍵的點在于學(xué)習(xí)率η\etaη,每個參數(shù)都可以使用不同的η\etaη來確定,因為過大的η\etaη會導(dǎo)致震蕩,過小又過收斂過慢,導(dǎo)致大量的計算。
? 一般把停止條件設(shè)置為損失達到某個較小的值。
? 上面講的是針對一個樣本(xk,yk)(x_k, y_k)(xk?,yk?)的均方誤差計算,也就是說假設(shè)有mmm個樣本的數(shù)據(jù)集DDD,針對每一個樣本都進行一次誤差反向傳播,來進行參數(shù)更新。這樣參數(shù)會及時更新,但是問題在于:參數(shù)可能會來回震蕩,因為樣本之間的誤差可能會相互抵消。但實際上可能就是前kkk個樣本計算后,基本上就穩(wěn)定收斂了。
? 也可以將mmm個樣本分成nnn個批次,每個批次是有t=m/nt = m/nt=m/n個樣本,但是BP算法的目標是要最小化訓(xùn)練集上的累積誤差E=1t∑j=1tEjE=\frac{1}{t}\sum_{j=1}^t{E_j}E=t1?∑j=1t?Ej?。根據(jù)你這個公式去做上述的推導(dǎo)和計算。
- 一個一個樣本計算的稱為:標準BP算法
- 一批一批樣本計算的稱為:累積BP算法
神經(jīng)網(wǎng)絡(luò)過擬合問題
? 因為多層神經(jīng)網(wǎng)絡(luò)的擬合能力非常強,一些復(fù)雜的關(guān)系也可以通過增加隱層的層數(shù)來達到擬合。所以是需要解決過擬合的問題。
? 一般采用兩種策略來解決這個過擬合的問題:
-
早停。顧名思義,就是讓這個反向傳播算法的參數(shù)更新早點停止,不需要把所有的樣本全部訓(xùn)練完。將數(shù)據(jù)分成訓(xùn)練集和驗證集(不是測試集,測試集是用于訓(xùn)練完成后評估網(wǎng)絡(luò)的泛化誤差的,這里的驗證集我理解是用于在不斷更新參數(shù)的過程中來控制過擬合的)。訓(xùn)練批次完成后(標準BP或者是累積BP),就用驗證集數(shù)據(jù)評估一下誤差,如果誤差比之前升高了,就停止繼續(xù)迭代。
-
正則化。通過引入一個參數(shù): λ\lambdaλ,然后把網(wǎng)絡(luò)學(xué)習(xí)的參數(shù)向量www也納入到誤差計算公式EEE中,并且通過λ\lambdaλ控制之前的EEE和向量www:
E=λ1m∑k=1mEk+(1?λ)∑iwi2E = \lambda\frac{1}{m}\sum_{k=1}^m{E_k} + (1-\lambda)\sum_{i}w_i^2 E=λm1?k=1∑m?Ek?+(1?λ)i∑?wi2?
書上說是通過λ\lambdaλ來控制,讓反向傳播的過程中會挑選較小的www,網(wǎng)絡(luò)的權(quán)重會比較光滑,從而降低過擬合的概率,不太懂是為什么。先這么記著吧。
局部最小與全局最小
? 使用梯度下降方法來找最小值,假設(shè)上面的EkE_kEk?函數(shù)在坐標系中的曲線為:
? 網(wǎng)絡(luò)的參數(shù)往往剛開始都是設(shè)置一個隨機值開始,假設(shè)是從左邊的某個點開始下降,很容易就陷入到局部最小的情況,然后算法停止。當然也有可能有右邊開始下降,就可以找到全局最小。我們需要找到一個更有效的方法,防止梯度下降的時候盡可能小的陷入局部最小的情況。
- 既然隨機的話,就多選機組隨機參數(shù)值開始進行下降算法,選其中讓均方誤差EkE_kEk?最小的那一個,可以降低。
- 模擬退火算法,在每一次的計算中,按照一定的概率選擇次選方案進行下降。
- 隨機梯度下降,在梯度下降的時候,加入隨機因素。
總結(jié)
以上是生活随笔為你收集整理的机器学习读书笔记:神经网络的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Akka and Actors
- 下一篇: easyui的filebox赋值回显