|
用神經(jīng)網(wǎng)絡(luò)的小伙伴都知道,數(shù)據(jù)需要做歸一化,但是為什么要做歸一化,這個(gè)問(wèn)題一直模梭兩可,網(wǎng)上也沒(méi)有較全的回答,小編花費(fèi)了一段時(shí)間,作了一些研究,給大家仔細(xì)分析分析,為什么要做歸一化:
1.數(shù)值問(wèn)題。 無(wú)容置疑,歸一化的確可以避免一些不必要的數(shù)值問(wèn)題。輸入變量的數(shù)量級(jí)未致于會(huì)引起數(shù)值問(wèn)題吧,但其實(shí)要引起也并不是那么困難。因?yàn)閠ansig的非線性區(qū)間大約在[-1.7,1.7]。意味著要使神經(jīng)元有效,tansig( w1*x1 w2*x2 b) 里的 w1*x1 w2*x2 b 數(shù)量級(jí)應(yīng)該在 1 (1.7所在的數(shù)量級(jí))左右。這時(shí)輸入較大,就意味著權(quán)值必須較小,一個(gè)較大,一個(gè)較小,兩者相乘,就引起數(shù)值問(wèn)題了。 假如你的輸入是421,你也許認(rèn)為,這并不是一個(gè)太大的數(shù),但因?yàn)橛行?quán)值大概會(huì)在1/421左右,例如0.00243,那么,在matlab里輸入 421*0.00243 == 0.421*2.43 可以看到兩者不相等了,說(shuō)明已經(jīng)引起數(shù)值問(wèn)題了。
2.求解需要 我們建立了神經(jīng)網(wǎng)絡(luò)模型后,只要找到的解足夠好,我們的網(wǎng)絡(luò)就能夠正確的預(yù)測(cè)了。在訓(xùn)練前我們將數(shù)據(jù)歸一化,說(shuō)明數(shù)據(jù)歸是為了更方便的求解。
那么,究竟給求解帶來(lái)了什么方便呢? 這個(gè)問(wèn)題不能一概而論,不同的算法,在歸一化中得到的好處各不相同。假若有一個(gè)很牛B的求解算法,那完全用不著歸一化,不過(guò)目前大部算法,都比較需要?dú)w一化,特別是常用的梯度下降法(或梯度下降的衍生方法),歸一化和不歸一化,對(duì)梯度下降法的影響非常大。不同的算法,對(duì)歸一化的依賴(lài)程序不同,例如列文伯格-馬跨特算法(matlab工具箱的trainlm法)對(duì)歸一化的依賴(lài)就沒(méi)有梯度下降法(matlab里的traingd)那么強(qiáng)烈。 既然不同的算法對(duì)歸一化有不同的理由,篇幅有限,本文就僅以梯度下降法舉例。 重溫一下梯度法,梯度法一般初始化一個(gè)初始解,然后求梯度,再用新解=舊解-梯度*學(xué)習(xí)率 的方式來(lái)迭代更新解。直到滿足終止迭代條件,退出循環(huán)。
先看歸一化對(duì)初始化的好處: (1)初始化 過(guò)初始化的同學(xué)會(huì)發(fā)現(xiàn),輸入數(shù)據(jù)的范圍會(huì)影響我們初始化的效果。例如,某個(gè)神經(jīng)元的值為tansig(w1*x1 w2*x2 b),由于tansig函數(shù)只有在[-1.7,1.7]的范圍才有較好的非線性,所以w1*x1 w2*x2 b的取值范圍就要與 [-1.7,1.7]有交集(實(shí)際上需要更細(xì)膩的條件),這個(gè)神經(jīng)元才能利用到非線性部分。 我們希望初始化的時(shí)候,就把每個(gè)神經(jīng)元初始化成有效的狀態(tài),所以,需要知道w1*x1 w2*x2 b的取值范圍,也就需要知道輸入輸出數(shù)據(jù)的范圍。 輸入數(shù)據(jù)的范圍對(duì)初始化的影響是無(wú)法避免的,一般討論初始化方法時(shí),我們都假設(shè)它的范圍就是[0,1]或者[-1,1],這樣討論起來(lái)會(huì)方便很多。就這樣,若果數(shù)據(jù)已經(jīng)歸一化的話,能給初始化模塊帶來(lái)更簡(jiǎn)便,清晰的處理思路。 注:matlab工具箱在初始化權(quán)值閾值的時(shí)候,會(huì)考慮數(shù)據(jù)的范圍,所以,即使你的數(shù)據(jù)沒(méi)歸一化,也不會(huì)影響matlab工具箱的初始化
(2)梯度 以輸入-隱層-輸出這樣的三層BP為例,我們知道對(duì)于輸入-隱層權(quán)值的梯度有2e*w*(1-a^2)*x的形式(e是誤差,w是隱層到輸出層的權(quán)重,a是隱層神經(jīng)元的值,x是輸入),若果輸出層的數(shù)量級(jí)很大,會(huì)引起e的數(shù)量級(jí)很大,同理,w為了將隱層(數(shù)量級(jí)為1)映身到輸出層,w也會(huì)很大,再加上x(chóng)也很大的話,從梯度公式可以看出,三者相乘,梯度就非常大了。這時(shí)會(huì)給梯度的更新帶來(lái)數(shù)值問(wèn)題。 (3)學(xué)習(xí)率 由(2)中,知道梯度非常大,學(xué)習(xí)率就必須非常小,因此,學(xué)習(xí)率(學(xué)習(xí)率初始值)的選擇需要參考輸入的范圍,不如直接將數(shù)據(jù)歸一化,這樣學(xué)習(xí)率就不必再根據(jù)數(shù)據(jù)范圍作調(diào)整。 隱層到輸出層的權(quán)值梯度可以寫(xiě)成 2e*a,而輸入層到隱層的權(quán)值梯度為 2e *w*(1-a^2)*x ,受 x 和 w 的影響,各個(gè)梯度的數(shù)量級(jí)不相同,因此,它們需要的學(xué)習(xí)率數(shù)量級(jí)也就不相同。對(duì)w1適合的學(xué)習(xí)率,可能相對(duì)于w2來(lái)說(shuō)會(huì)太小,若果使用適合w1的學(xué)習(xí)率,會(huì)導(dǎo)致在w2方向上步進(jìn)非常慢,會(huì)消耗非常多的時(shí)間,而使用適合w2的學(xué)習(xí)率,對(duì)w1來(lái)說(shuō)又太大,搜索不到適合w1的解。 如果使用固定學(xué)習(xí)率,而數(shù)據(jù)沒(méi)歸一化,則后果可想而知。 不過(guò),若果像matlab工具箱一樣,使用自適應(yīng)學(xué)習(xí)率,學(xué)習(xí)率的問(wèn)題會(huì)稍稍得到一些緩和。 (4)搜索軌跡 前面已說(shuō)過(guò),輸入范圍不同,對(duì)應(yīng)的 w 的有效范圍就不同。假設(shè) w1 的范圍在 [-10,10],而w2的范圍在[-100,100],梯度每次都前進(jìn)1單位,那么在w1方向上每次相當(dāng)于前進(jìn)了 1/20,而在w2上只相當(dāng)于 1/200!某種意義上來(lái)說(shuō),在w2上前進(jìn)的步長(zhǎng)更小一些,而w1在搜索過(guò)程中會(huì)比w2“走”得更快。這樣會(huì)導(dǎo)致,在搜索過(guò)程中更偏向于w1的方向。 拋開(kāi)哪種路線更有效于找到最佳解的問(wèn)題不談,兩點(diǎn)之間直線距離最短,這種直角路線明顯會(huì)更耗時(shí)間,所以不歸一化,時(shí)間會(huì)明顯增加。
從上面的分析總結(jié),除去數(shù)值問(wèn)題的影響,最主要的影響就是,每一維的偏導(dǎo)數(shù)計(jì)算出來(lái)數(shù)量級(jí)會(huì)不一致。下面我們來(lái)個(gè)試驗(yàn)。 3.小實(shí)驗(yàn) 假設(shè)我們有兩個(gè)輸入變量,x1范圍是[-1,1],但x2是[-100,100],輸出范圍是[-1,1]。x2在輸入數(shù)據(jù)上沒(méi)有做歸一化,怎么修改訓(xùn)練過(guò)程,才能讓訓(xùn)練結(jié)果如同數(shù)據(jù)歸一化了一樣呢。 通過(guò)上面的討論,我們知道x2增大了,會(huì)使w2的梯度也很大,因此我們?cè)谟?jì)算w2梯度時(shí),需要把它的梯度除以100.才能得到它的梯度數(shù)量級(jí)與w1的一致。然后在更新w步長(zhǎng)的時(shí)候,w1的有效取值范圍(1/1)是w2的有效取值范圍(1/100)的100倍,因此w2走的時(shí)候,應(yīng)該以1/100的步去走。所以w2的學(xué)習(xí)率也需要除以100。 這樣,若果不考慮數(shù)值問(wèn)題,會(huì)和數(shù)據(jù)作了歸一化的結(jié)果是一樣的。這里就不展示實(shí)驗(yàn)的代碼了,因?yàn)樾枰婕罢麄€(gè)BP代碼。有興趣研究的同學(xué)在自己的編寫(xiě)的代碼上動(dòng)下刀。 這是一個(gè)案例分析,說(shuō)明不考慮數(shù)值問(wèn)題的話,只是影響了這兩個(gè)地方。假設(shè),x2的輸入范圍是[100,300],那肯定不是除以100就可以了,需要更復(fù)雜一些的變換,這里不再深入糾結(jié)。
為什么要?dú)w一化,對(duì)于使用梯度下降法訓(xùn)練的三層BP神經(jīng)網(wǎng)絡(luò)總結(jié)出的就是這些原因了。對(duì)于其他的神經(jīng)網(wǎng)絡(luò)模型,會(huì)有其它的原因,這里就不再作分析。
4.對(duì)使用matlab工具箱的建議 關(guān)于使用matlab工具箱需要注意的兩點(diǎn)
但若果用默認(rèn)的trainlm法,而不是梯度下降法 traingd的話,那影響不會(huì)像 traingd這么嚴(yán)重,我們可以看到 trainlm(列文伯格-馬跨特法) 對(duì)方向 h 的計(jì)算公式是: 由于JJ和Jf的數(shù)量級(jí)不會(huì)差太多,而且由于有u的調(diào)整,最終會(huì)得到一個(gè)適當(dāng)?shù)膆。
3.使用matlab2012b(或以上)工具箱得到的網(wǎng)絡(luò)權(quán)值,是面向作了歸一化后的數(shù)據(jù)的。所以使用時(shí),需要先對(duì)數(shù)據(jù)進(jìn)行歸一化,再將歸一化后的輸入數(shù)據(jù)放到網(wǎng)絡(luò)中計(jì)算網(wǎng)絡(luò)輸出,再將輸出反歸一化,才是真正的預(yù)測(cè)結(jié)果。如果想把歸一化過(guò)程揉合到網(wǎng)絡(luò)的權(quán)值的話,請(qǐng)參考文章:<提取對(duì)應(yīng)原始數(shù)據(jù)的權(quán)重和閾值>
5.個(gè)人見(jiàn)解 下面是網(wǎng)友關(guān)于為什么要?dú)w一化的一些回答(歡迎補(bǔ)充): 1.避免數(shù)值問(wèn)題。 2.使網(wǎng)絡(luò)快速的收斂。 3.樣本數(shù)據(jù)的評(píng)價(jià)標(biāo)準(zhǔn)不一樣,需要對(duì)其量綱化,統(tǒng)一評(píng)價(jià)標(biāo)準(zhǔn) 4.bp中常采用sigmoid函數(shù)作為轉(zhuǎn)移函數(shù),歸一化能夠防止凈輸入絕對(duì)值過(guò)大引起的神經(jīng)元輸出飽和現(xiàn)象 。 5.保證輸出數(shù)據(jù)中數(shù)值小的不被吞食 。
事實(shí)上本文的研究大部分都是借鑒了網(wǎng)友的見(jiàn)解,基于這些觀點(diǎn)進(jìn)一步探討所得,但對(duì)部分觀點(diǎn),本人略有不同看法: (1)使網(wǎng)絡(luò)快速的收斂:贊同。 (2)避免數(shù)值問(wèn)題:贊同。 (3)統(tǒng)一量綱:本人認(rèn)為這從屬于業(yè)務(wù)層,與網(wǎng)絡(luò)的訓(xùn)練無(wú)關(guān)。 (4)避免神經(jīng)元飽和:與權(quán)值閾值相乘后,才是sigmoid的輸入值,初始化得好的話,并不會(huì)飽和輸出。若果使用“把權(quán)值和閾值隨機(jī)初始化為[-1,1]之間的值”這種初始化方法,那不歸一化就會(huì)引起神經(jīng)元輸出飽和現(xiàn)象。 (5)大數(shù)吞小數(shù):若果我們找到適合的權(quán)值,是不會(huì)吞掉的,例如x1=10000,x2=1, 而w1=0.0001,w2=1,那么w1*x1是不會(huì)吞掉w2*x1的。
后語(yǔ) 本文在很多細(xì)節(jié)之處,都沒(méi)有作深入的討論,一來(lái)展開(kāi)這些討論會(huì)讓文章非常冗贅,失去主題。二來(lái)(也是最主要的原因),對(duì)歸一化作用的研究,只能讓我們更清晰歸一化的好處,減少我們對(duì)歸一化的疑惑,并不能促進(jìn)我們更好的改進(jìn)網(wǎng)絡(luò)效果。所以本文,都僅從大方面,不十分嚴(yán)謹(jǐn)?shù)奶峒皻w一化在訓(xùn)練過(guò)程各方面的好處。 感謝大家的閱讀。 ==============<原創(chuàng)文章,轉(zhuǎn)載請(qǐng)說(shuō)明來(lái)自神經(jīng)網(wǎng)絡(luò)之家www. > ================ ==========<請(qǐng)保留本文的地址:http://www./nninfo/editText.jsp?id=37>============= |
|
|