第十節梯度下降之歸一化的各種方式和必要性(5)
上一節中我們講解了梯度下降的函式最優化演算法和梯度下降程式碼過程,瞭解了梯度下降的程式碼實現過程,本節的話我們講解一個梯度下降之前必要的資料準備,歸一化。
先看一個例子,假如你收集到一個資料集,一列是年齡,一列是身高(釐米)。比如體重的資料都是60,65。身高的資料是180,185,你發現它的量綱遠遠大於age,這樣會導致什麼?比如身高是W2,體重是W1,假如要根據這些資料預測壽命,比如結果是這樣的:
因為最後它們相乘相加等於你預測的年齡,那麼對資料本身來說量綱比較小的數字,它會乘的W比較大一些。因為體重乘上比較小的數字w1+身高乘以比較大的數字w2,才能等於最後的年齡。這麼想好像沒什麼問題,相當於程式給我們把資料自動修正了,身高資料大,我就自動W小點,預測也不會出問題,雖然看起來沒問題,但它在梯度下降的效率上會導致一定的問題。會導致一個什麼問題呢? 比如W2小,它越小,是不是越靈敏相當,那麼W2動一點就會怎麼樣?我們先看下上面資料訓練模型時如果不做歸一化的損失函式的等高線如圖:
等高線裡面,每一個圓的損失函式是一樣的。在這個例子裡面,你覺得θ1(即w1)和θ2(即w2),誰是age誰是height?實際上θ2是height,θ1是age,為什麼?因為W2是不是小,你動一點點,損失函式會變化的很多,所以圖中θ2一點點變化,損失函式就會從一個圓變到另一個圓,所以θ2對應著身高前面的引數。那麼這會導致什麼問題?我們看下圖中的θ1(即w1)和θ2(即w2)的更新引數:
無論對於W1來說還是W2來說,前邊部分有區別嗎? 沒區別吧?那麼體現在更新W1和W2的更新的不同,是Xj不同。在θ2的方向上,因為X2比較大,所以θ2方向每次加的都很大,而θ1方向每次加的又比較小,假如最開始在初始點那塊,θ2距離自己的終點也就是最後的最優解的點其實很近,而θ1距離自己的終點很遠,按理說θ1應該趕緊緊跑兩步對不對?而現在變成了θ2在反覆的震盪,而θ1在不著急得一步一步走,這樣的話會導致你的計算效率變得特別慢。梯度下降的過程中,你想讓W2是不是每一步更新更加細緻一點,更微小一點,更精準一點,讓W1每一步更大刀闊斧一點?所以如果量綱不一致,會導致本來需要一步一步慢慢走的這個維度W2,反倒震盪的特別厲害。W1想讓它變化快一點,但X1比較小,會導致它下降的速度反倒慢了,適得其反。講到這裡,有的人會說我調控每一步下降的中的α,也就是我們的λ,是不是可以控制下每次減的幅度?這裡想讓大家想一個問題,λ是隻有一個數還是說每個維度各有一個λ?如果每個維度各有一個λ就沒這問題了,你自己單獨的給它們調一下就行了,但是調參又變得複雜了,你有一千個維度,難道你還要手工設一千個λ,還要細緻地調嗎?不現實。這數根源就是因為只有一個λ管著我所有的W,那麼需要大的反倒小了,小的反倒大了。 所以我們怎麼辦?
我們就需要對資料進行一個歸一化。比如我原來原始資料身高是180,170,160,150,我做一個最大最小值歸一化,最大最小值歸一化公式是:
我用X減去最小的X,除以(最大的X,減去最小的X),假設這四個數,180,170,160,150。那麼此時180會變成什麼?你們根據這算一下。180變成1了,150變成什麼了?0了,中間是0到1的一些數相當於就把所有列,如果你都執行這麼一遍的話,是不是就變成了所有數都在0到1之間了。這樣他們的量綱就一樣了。這樣我們的損失函式就會從一個橢圓特別橢的圓變成一個比較圓的圓。如下面一樣:
因為各個維度的數值通過最大最小值歸一化之後會讓它兩邊的步伐速度是一致的,不會存在誰等誰的情況,所以損失函式等高線的圖就近似一個相對比較圓的圓。這樣會帶來更快的收斂步數和更快的收斂速度。除此之外,歸一化還有什麼好處?對one-hot編碼來說,有的維度轉變成one-hot編碼,比如性別轉成one-hot之後男的是0-1 女的是1-0,兩個維度標識性別,這樣相對公平,不至於男的性別是1 ,女的性別是0,這樣會給機器學習一種錯誤的輸入,男的比女的大的錯誤資訊,因此需要轉成one-hot編碼。但假如有的沒轉成one-hot編碼,比如身高,沒轉one_hot編碼的這些維度如果經過最大最小值歸一化都給它縮放到零和一之間後,這樣跟經過one-hot編碼的那些維度的量綱也都一致了,在訓練模型的時候,經過處理過的訓練集就是一堆你看不懂的數了,比如身高它就不再代表實際物理意義上的高度有多高了,但它是一個高度的評分,越近越1越代表你在這裡邊越高。例如170和160,經過最大值最小值歸一化之後,肯定170更接近數值1。
那麼當預測一條新資料的時候,怎麼預測? 你還能把原始資料直接丟進去算嗎?你是不是需要對新的資料要做最大最小值歸一化,用誰的最大值?誰的最小值?用你的訓練集中的最大值和訓練集中的最小值做歸一化,我們稱它為經驗最大值和經驗最小值。好在這些事情不需要你來手工處理,只要你把normalize=true,就可以了。
這一切的一切底層就幫你做好了。它做的不光是最大最小值歸一化,它還要做零均值化,它要把每一個X都減去這一列的平均值。為什麼要這麼做?比如看下面的例子:
假如你隨機到圖中這個點了,再接著往下,θ1需要增大減小?增大,對吧?θ2需要增大還是減小?減小。所以θ1需要增大,θ2需要減小,但θ1和θ2怎麼算的?我們們看隨機梯度下降,對於θ1也好,θ2也好,,這一項都一樣,能影響它到底增大還是減小,是不是取決於它Xj? 所以對於θ1就把X1帶進去,對於θ2就把X2代進去。通常訓練集裡的資料是不是都是正數?如果你不做零均值化的話,所有X都是正數,是不是所有的θ要增都增要減都減。對於這個例子,要想走到最優解,應該這樣走,如圖:
如果不去處理歸一化的話,這會只能θ1也增θ2也增,第一步θ2先少增一點,儘量等一下θ1,θ1多走點, 甚至走過θ1的最優值,然後,θ1減,θ2也減才能走到最後最優解的那個點,它不具備同時一個引數增另一個引數減的這麼一個功能。但假如你對它做一個零均值化,比如第二列X2,1.8米,1.7米,1.6米,1.5米,都減去均值後,這就變成了+1.5,+0.5,-0.5,-1.5,這會X是不是就有正有負了?有正有負了之後,是不是它就有可能進行這種有的增有的減的這種下降?所以說normalize裡面至少會同時做最大最小值歸一化來保證量綱一樣和零均值化讓所有的維度數值有大有小,這樣才能獲得更好的梯度下降效率。 如果你不做這些也能得到最優解,就是人家走10步你可能走15步這麼一個概念,它效率更低,做了這個能夠幫助你下降的更快,更好的找到這個結果。那麼來一條新資料,是不是也得減去平均值,減誰的平均值?減你訓練集裡邊的算出來平均值,能理解嗎?這個也叫經驗平均值。 經驗平均值這個東西在深度學習裡面一樣要這麼處理。只要用到梯度下降,就都需要這麼處理。只要有梯度下降,均值歸一化是必須的,沒有均值歸一化的話,它下降速率一定會慢好多,因為它老要走曲折的彎路。
對於有些演算法,還會使用方差均值標準化來調整資料使模型訓練擁有更好的效能。即:
所以歸一化方式是進行模型訓練前的必要步驟,也是資料處理的關鍵步驟。聊了這麼多梯度下降的邏輯和過程,有沒有對其底層原理感興趣,所以下一節我們將講解梯度下降的底層原理。