算法原理
概述:
算法通過構(gòu)建多層網(wǎng)絡(luò)解決單層感知機的非線性可分無法分割問題粟判,通過梯度下降法更新網(wǎng)絡(luò)中的各個權(quán)值向量,使得全局的損失函數(shù)極小化,從而實現(xiàn)對任意復(fù)雜的函數(shù)的擬合我碟,這在分類問題中表現(xiàn)為它能將任意復(fù)雜的數(shù)據(jù)劃分開,在回歸問題中表現(xiàn)為它能擬合任意復(fù)雜的回歸函數(shù)
其中梯度下降的核心是誤差反向傳播算法姚建,這個算法大大減少了梯度下降法的計算量矫俺,是多層神經(jīng)網(wǎng)絡(luò)得以復(fù)蘇的功臣,它使得當前層的梯度項能往后一層傳播掸冤,從而快速求得后一層的梯度
問題1:神經(jīng)網(wǎng)絡(luò)是如何解決非線性可分無法分割問題的厘托?
pla模型可以看做是神經(jīng)網(wǎng)絡(luò)的一個神經(jīng)元,我們知道稿湿,pla能對數(shù)據(jù)空間劃分一個超平面铅匹,簡單的實現(xiàn)分類任務(wù)。但是pla這種只會切一刀的模型無法解決異或問題饺藤。
而神經(jīng)網(wǎng)路可以通過增加一個2節(jié)點的隱藏層包斑,就相當于是放置了兩個pla,這兩個pla互相獨立策精,各自能在數(shù)據(jù)空間劃分一個超平面舰始,對于異或問題,它們將二維空間劃分為3到4個平面(圖2的A咽袜、B丸卷、C、D四個平面)询刹,然后隱藏層到輸出層再對這些平面做一次分割將其分成兩類(圖3的橙色與藍色)谜嫉,從而解決了非線性可分的異或問題
問題2:如何理解神經(jīng)網(wǎng)絡(luò)強大的擬合能力?
說真的凹联,我覺得神經(jīng)網(wǎng)絡(luò)比決策樹抽象太多了沐兰,不容易理解,下面只是我的一些膚淺的認識
①對于分類問題蔽挠,用空間切割的思想進行理解住闯,通過上述異或問題的例子我們看到,通過增加節(jié)點數(shù)澳淑,神經(jīng)網(wǎng)絡(luò)能將輸入數(shù)據(jù)的空間劃分成任意多的子空間比原,從而能對任意復(fù)雜的數(shù)據(jù)劃分開,例如下圖1可以經(jīng)過劃分將不同標簽劃分開(圖2)
②對于回歸問題杠巡,用數(shù)據(jù)空間變換的思想進行理解
- 權(quán)值向量對輸入數(shù)據(jù)的空間的不同維度執(zhí)行了放大縮小的操作
- 其偏置值對數(shù)據(jù)空間進行了平移
- 求和函數(shù)與不同層的節(jié)點數(shù)差異對空間進行了降維與升維
- 非線性激活函數(shù)對空間進行扭曲
通過這些操作的不同組合量窘,就能將變換后的數(shù)據(jù)擬合標簽值y,因為這些操作的組合就能任意變換數(shù)據(jù)空間氢拥,也就能擬合任意復(fù)雜的函數(shù)了
問題3:反向傳播算法如何進行蚌铜?
考慮下圖所示的一個簡單的神經(jīng)網(wǎng)絡(luò)锨侯,其中的權(quán)值向量等符號也在圖中定義,這里先不考慮偏置
現(xiàn)在計算該模型在 這個訓(xùn)練樣本上的損失以及對應(yīng)上圖藍色線和紅色線的反向傳播更新的梯度和
我們定義對這個樣本的損失是模型預(yù)測值與原來的的均方誤差冬殃,因此很明顯這個誤差就是我們在這個樣本上想要極小化的損失函數(shù)
重復(fù)一下囚痴,我們想要更新的是兩個權(quán)值(w和h),因此根據(jù)梯度下降法我們需要求這兩個權(quán)值對上述的損失函數(shù)的梯度审葬,然后根據(jù)求得的梯度對權(quán)值本身進行更新
損失函數(shù)對w_j求偏導(dǎo)渡讼,需要運用到鏈式求導(dǎo)的定律
從中定義一個g
損失函數(shù)對v_ih求偏導(dǎo),同樣需要運用到鏈式求導(dǎo)的定律
由于sigmoid函數(shù)導(dǎo)數(shù)的有這樣的性質(zhì)
根據(jù)上述①②兩式耳璧,可得結(jié)果如下,這里的g就是上一層求導(dǎo)產(chǎn)生的g
基于上述的求偏導(dǎo)展箱,就能對權(quán)值進行更新旨枯,注意這里只對權(quán)值的一維進行演示,我們對權(quán)值的每一維執(zhí)行上述計算就可以得到梯度混驰,然后更新攀隔,這樣一輪結(jié)束
關(guān)鍵代碼截圖(帶注釋)
思考題
1. 嘗試說明下其他激活函數(shù)的優(yōu)缺點?
- tanh函數(shù)
-
(優(yōu)點)在0附近的時候其梯度更大栖榨,最大值是sigmoid函數(shù)的4倍昆汹,因此當數(shù)據(jù)已經(jīng)預(yù)處理成在0附近的時候使用tanh的話梯度能下降更快,下圖是sigmoid和tanh的導(dǎo)數(shù)函數(shù)對比圖
- (優(yōu)點)其輸出是0均值的婴栽,這個我不是很懂满粗,看了很多博客都沒具體展開,最終找到一篇論文專門討論了tanh函數(shù)的優(yōu)點愚争,由于時間有限這次沒法認真研究映皆,羅列在此,以供日后鉆研--- Efficient Backprop by LeCun
- (缺點)它雖然比sigmoid函數(shù)好轰枝,但是有一個sigmoid的缺點它還是存在捅彻,就是飽和區(qū)太大(或說非飽和區(qū)太小)鞍陨,從上面的圖也可以看到步淹,當|x|大于2的時候,就基本上等于0了诚撵。這會導(dǎo)致很多問題缭裆,例如數(shù)據(jù)需要精心預(yù)處理才不會一下子進入飽和區(qū),又例如深層網(wǎng)絡(luò)中的梯度消失問題
- ReLU函數(shù)
- (優(yōu)點)可以用于解決深層網(wǎng)絡(luò)中的梯度消失問題(這在第3個問題中解釋)
- (優(yōu)點)導(dǎo)數(shù)或0或1砾脑,不需要復(fù)雜的求導(dǎo)過程幼驶,極大減少了運算量
- (缺點)由于ReLu會使得一部分神經(jīng)元不可逆的“死亡”,可能會導(dǎo)致網(wǎng)絡(luò)能學(xué)到的知識減少(注:這個點我不是很懂為什么節(jié)點死亡就一定不好)
- 為了解決ReLu的不可逆“死亡”的問題韧衣,提出一種激活函數(shù)為Leaky ReLU盅藻,它在x<0 時购桑,給出一個很小的負數(shù)梯度值,這樣使得該節(jié)點還能有機會“復(fù)活”氏淑,理論上我覺得Leaky ReLU是會優(yōu)于ReLU的
2. 有什么方法可以實現(xiàn)傳遞過程中不激活所有節(jié)點勃蜘?
答:使用reLu函數(shù)會使得有些節(jié)點直接死掉,死掉的節(jié)點輸出0梯度也0假残,梯度0就無法更新因此死掉的節(jié)點是不可逆的缭贡,也就永遠不激活了
3. 梯度消失和梯度爆炸是什么?可以怎么解決辉懒?
答:
當神經(jīng)網(wǎng)絡(luò)層數(shù)增加的時候阳惹,離輸入層越近的層它的梯度將是它之前的層的激活函數(shù)導(dǎo)數(shù)和權(quán)值的積的連乘
關(guān)于梯度消失和梯度爆炸,很多博客(例如這篇)眶俩,都是使用下圖這個簡單的深層神經(jīng)網(wǎng)絡(luò)為例子莹汤,這里同樣使用這個網(wǎng)絡(luò)進行分析,這里的C是網(wǎng)絡(luò)的輸出
根據(jù)反向傳播算法在計算梯度時的鏈式求導(dǎo)法則,很容易求得
可以看到颠印,是各個層的的連乘纲岭,這就很容易導(dǎo)致問題
- 如果小于1的話,那么連乘的數(shù)量越多的時候线罕,乘積將會一直一直的減少止潮,甚至導(dǎo)致乘積直接變成0,這也就是梯度消失了
- 如果大于1的話钞楼,那么連乘的數(shù)量越多的時候喇闸,乘積將會一直一直的增大,而且是指數(shù)增大询件,這也就是梯度爆炸了
對于sigmoid函數(shù)作為激活函數(shù)的網(wǎng)絡(luò)而言仅偎,由于sigmoid函數(shù)導(dǎo)數(shù)自身的性質(zhì)(見下)以及w與之間的相互關(guān)系(見下),使得大多數(shù)情況是梯度消失
- 最大值是0.25雳殊,而且在飽和區(qū)幾乎是0
- 小的時候較大橘沥,當大的時候又接近于0
解決方法:
- 對于梯度消失的問題,更多的是改用relu作為激活函數(shù)夯秃,因為它在x>0的時候?qū)?shù)是一直為1的座咆,能一定程度解決梯度消失
- 對于梯度爆炸問題,可以采用設(shè)置梯度閾值的方法仓洼,當梯度大于這個閾值的時候就直接將梯度設(shè)置成閾值