********************====這裡是分割線*************************===
1.數值問題。
無容置疑,歸一化的確可以避免一些不必要的數值問題。輸入變數的數量級未致於會引起數值問題吧,但其實要引起也並不是那麼困難。因為tansig的非線性區間大約在[-1.7,1.7]。意味著要使神經元有效,tansig( w1*x1 + w2*x2 +b) 裡的 w1*x1 +w2*x2 +b 數量級應該在 1 (1.7所在的數量級)左右。這時輸入較大,就意味著權值必須較小,乙個較大,乙個較小,兩者相乘,就引起數值問題了。
假如你的輸入是421,你也許認為,這並不是乙個太大的數,但因為有效權值大概會在1/421左右,例如0.00243,那麼,在matlab裡輸入 421*0.00243 == 0.421*2.43
可以看到兩者不相等了,說明已經引起數值問題了。
2.求解需要
我們建立了神經網路模型後,只要找到的解足夠好,我們的網路就能夠正確的**了。在訓練前我們將資料歸一化,說明資料歸是為了更方便的求解。
那麼,究竟給求解帶來了什麼方便呢?
這個問題不能一概而論,不同的演算法,在歸一化中得到的好處各不相同。假若有乙個很牛b的求解演算法,那完全用不著歸一化,不過目前大部演算法,都比較需要歸一化,特別是常用的梯度下降法(或梯度下降的衍生方法),歸一化和不歸一化,對梯度下降法的影響非常大。不同的演算法,對歸一化的依賴程式不同,例如列文伯格-馬跨特演算法(matlab工具箱的trainlm法)對歸一化的依賴就沒有梯度下降法(matlab裡的traingd)那麼強烈。
既然不同的演算法對歸一化有不同的理由,篇幅有限,本文就僅以梯度下降法舉例。
重溫一下梯度法,梯度法一般初始化乙個初始解,然後求梯度,再用新解=舊解-梯度*學習率 的方式來迭代更新解。直到滿足終止迭代條件,退出迴圈。
先看歸一化對初始化的好處:
(1)初始化
過初始化的同學會發現,輸入資料的範圍會影響我們初始化的效果。例如,某個神經元的值為tansig(w1*x1+w2*x2+b),由於tansig函式只有在[-1.7,1.7]的範圍才有較好的非線性,所以w1*x1+w2*x2+b的取值範圍就要與 [-1.7,1.7]有交集(實際上需要更細膩的條件),這個神經元才能利用到非線性部分。
我們希望初始化的時候,就把每個神經元初始化成有效的狀態,所以,需要知道w1*x1+w2*x2+b的取值範圍,也就需要知道輸入輸出資料的範圍。
輸入資料的範圍對初始化的影響是無法避免的,一般討論初始化方法時,我們都假設它的範圍就是[0,1]或者[-1,1],這樣討論起來會方便很多。就這樣,若果資料已經歸一化的話,能給初始化模組帶來更簡便,清晰的處理思路。
注:matlab工具箱在初始化權值閾值的時候,會考慮資料的範圍,所以,即使你的資料沒歸一化,也不會影響matlab工具箱的初始化
(2)梯度
以輸入-隱層-輸出這樣的三層bp為例,我們知道對於輸入-隱層權值的梯度有2e*w*(1-a^2)*x的形式(e是誤差,w是隱層到輸出層的權重,a是隱層神經元的值,x是輸入),若果輸出層的數量級很大,會引起e的數量級很大,同理,w為了將隱層(數量級為1)映身到輸出層,w也會很大,再加上x也很大的話,從梯度公式可以看出,三者相乘,梯度就非常大了。這時會給梯度的更新帶來數值問題。
(3)學習率
由(2)中,知道梯度非常大,學習率就必須非常小,因此,學習率(學習率初始值)的選擇需要參考輸入的範圍,不如直接將資料歸一化,這樣學習率就不必再根據資料範圍作調整。
隱層到輸出層的權值梯度可以寫成 2e*a,而輸入層到隱層的權值梯度為 2e *w*(1-a^2)*x ,受 x 和 w 的影響,各個梯度的數量級不相同,因此,它們需要的學習率數量級也就不相同。對w1適合的學習率,可能相對於w2來說會太小,若果使用適合w1的學習率,會導致在w2方向上步進非常慢,會消耗非常多的時間,而使用適合w2的學習率,對w1來說又太大,搜尋不到適合w1的解。
如果使用固定學習率,而資料沒歸一化,則後果可想而知。
不過,若果像matlab工具箱一樣,使用自適應學習率,學習率的問題會稍稍得到一些緩和。
(4)搜尋軌跡
前面已說過,輸入範圍不同,對應的 w 的有效範圍就不同。假設 w1 的範圍在 [-10,10],而w2的範圍在[-100,100],梯度每次都前進1單位,那麼在w1方向上每次相當於前進了 1/20,而在w2上只相當於 1/200!某種意義上來說,在w2上前進的步長更小一些,而w1在搜尋過程中會比w2「走」得更快。這樣會導致,在搜尋過程中更偏向於w1的方向。
拋開哪種路線更有效於找到最佳解的問題不談,兩點之間直線距離最短,這種直角路線明顯會更耗時間,所以不歸一化,時間會明顯增加。
從上面的分析總結,除去數值問題的影響,最主要的影響就是,每一維的偏導數計算出來數量級會不一致。下面我們來個試驗。
3.小實驗
假設我們有兩個輸入變數,x1範圍是[-1,1],但x2是[-100,100],輸出範圍是[-1,1]。x2在輸入資料上沒有做歸一化,怎麼修改訓練過程,才能讓訓練結果如同資料歸一化了一樣呢。
通過上面的討論,我們知道x2增大了,會使w2的梯度也很大,因此我們在計算w2梯度時,需要把它的梯度除以100.才能得到它的梯度數量級與w1的一致。然後在更新w步長的時候,w1的有效取值範圍(1/1)是w2的有效取值範圍(1/100)的100倍,因此w2走的時候,應該以1/100的步去走。所以w2的學習率也需要除以100。
這樣,若果不考慮數值問題,會和資料作了歸一化的結果是一樣的。這裡就不展示實驗的**了,因為需要涉及整個bp**。有興趣研究的同學在自己的編寫的**上動下刀。
這是乙個案例分析,說明不考慮數值問題的話,只是影響了這兩個地方。假設,x2的輸入範圍是[100,300],那肯定不是除以100就可以了,需要更複雜一些的變換,這裡不再深入糾結。
為什麼要歸一化,對於使用梯度下降法訓練的三層bp神經網路總結出的就是這些原因了。對於其他的神經網路模型,會有其它的原因,這裡就不再作分析。
4.對使用matlab工具箱的建議
關於使用matlab工具箱需要注意的兩點
matlab2012b已經會自動將輸入資料歸一化,所以不必再自己去做資料的預處理,直接用原始資料建立網路就可以。
但輸出需要做歸一化,因為工具箱計算誤差的時候,使用的是原始資料的誤差,因此誤差數量級可能很大,這樣一來梯度就很大了,在學習率還沒來得及自適應減小的時候,梯度就一下子把原來初始化好的權重給吞掉了,使網路的權重掉到乙個離最優解非常遠的地方。所以使用matlab神經網路工具箱,而又要用梯度下降法的話,輸出一定要做歸一化。
但若果用預設的trainlm法,而不是梯度下降法 traingd的話,那影響不會像 traingd這麼嚴重,我們可以看到 trainlm(列文伯格-馬跨特法) 對方向 h 的計算公式是:
由於jj和jf的數量級不會差太多,而且由於有u的調整,最終會得到乙個適當的h。
3.使用matlab2012b(或以上)工具箱得到的網路權值,是面向作了歸一化後的資料的。所以使用時,需要先對資料進行歸一化,再將歸一化後的輸入資料放到網路中計算網路輸出,再將輸出反歸一化,才是真正的**結果。如果想把歸一化過程揉合到網路的權值的話,請參考文章:《提取對應原始資料的權重和閾值》
5.個人見解
下面是網友關於為什麼要歸一化的一些回答(歡迎補充):
1.避免數值問題。
2.使網路快速的收斂。
3.樣本資料的評價標準不一樣,需要對其量綱化,統一評價標準
4.bp中常採用sigmoid函式作為轉移函式,歸一化能夠防止淨輸入絕對值過大引起的神經元輸出飽和現象 。
5.保證輸出資料中數值小的不被吞食 。
(1)使網路快速的收斂:贊同。
(2)避免數值問題:贊同。
(3)統一量綱:本人認為這從屬於業務層,與網路的訓練無關。
(4)避免神經元飽和:與權值閾值相乘後,才是sigmoid的輸入值,初始化得好的話,並不會飽和輸出。若果使用「把權值和閾值隨機初始化為[-1,1]之間的值」這種初始化方法,那不歸一化就會引起神經元輸出飽和現象。
(5)大數吞小數:若果我們找到適合的權值,是不會吞掉的,例如x1=10000,x2=1, 而w1=0.0001,w2=1,那麼w1*x1是不會吞掉w2*x1的。
後語
本文在很多細節之處,都沒有作深入的討論,一來展開這些討論會讓文章非常冗贅,失去主題。二來(也是最主要的原因),對歸一化作用的研究,只能讓我們更清晰歸一化的好處,減少我們對歸一化的疑惑,並不能促進我們更好的改進網路效果。所以本文,都僅從大方面,不十分嚴謹的提及歸一化在訓練過程各方面的好處。
神經網路為什麼要歸一化
神經網路為什麼要歸一化 1.數值問題。無容置疑,歸一化的確可以避免一些不必要的數值問題。輸入變數的數量級未致於會引起數值問題吧,但其實要引起也並不是那麼困難。因為tansig的非線性區間大約在 1.7,1.7 意味著要使神經元有效,tansig w1 x1 w2 x2 b 裡的 w1 x1 w2 x...
神經網路為什麼要歸一化
這裡是分割線 1.數值問題。無容置疑,歸一化的確可以避免一些不必要的數值問題。輸入變數的數量級未致於會引起數值問題吧,但其實要引起也並不是那麼困難。因為tansig的非線性區間大約在 1.7,1.7 意味著要使神經元有效,tansig w1 x1 w2 x2 b 裡的 w1 x1 w2 x2 b 數...
神經網路為什麼要歸一化1
1.數值問題2.求解需要 1 初始化 2 梯度 3 學習率 4 搜尋軌跡 引用鏈結 本markdown編輯器使用stackedit修改而來,用它寫部落格,將會帶來全新的體驗哦 markdown 是一種輕量級標記語言,它允許人們使用易讀易寫的純文字格式編寫文件,然後轉換成格式豐富的html頁面。維基百...