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