歸一化
有一個步驟叫歸一化(normalization),就是將值壓到[-1, 1]之內。歸一化後訓練的效率更高。
所以,既然你發現了
當訓練資料和測試資料在-1到1之間的時候效果還不錯
而
訓練和測試資料一旦絕對值大於1的時候效果就很差
那解決方案很簡單,直接將輸入資料歸一化就可以。歸一化很簡單,假設你的輸入資料(包括訓練集和測試集)中最大的絕對值為|max|,那你直接把每個輸入資料除以|max|就可以(X = X / |max|)。
實際上,不僅是輸入資料,中間的網路層的輸出通常也最好是在[-1, 1]之間,所以在很多網路架構中,中間都會插入很多歸一化層(normalization layer)。
上面解釋了歸一化的概念,以及如何進行歸一化。從實踐層面上來說,你的問題已經得到解決。不過你也許好奇為什麼歸一化後訓練效率更高?
你提到
訓練迴歸(x的平方)
也就是是訓練的目標是最小化均方誤差(MSE)。換句話說,MSE越接近零越好。MSE的差距會反向傳播,透過網路層一層層地回傳到輸入層。
所以,一方面,不管你輸入層怎麼樣,最終的網路層的權重應該是在零周圍絕對值較小的數(比如位於[-1, 1]之間),這樣對MSE方面的差距才會比較敏感。舉個極端的例子,MSE減少了0.1——這其實已經是相當大的變動了,但是網路層的權重都是什麼2000、3000的,那MSE變動導致的那一點更新對權重而言根本感覺不大——所以說,梯度爆炸是不好的。。另一方面,既然輸出這一端權重是,比方說,[-1, 1]之間,而你輸入那段範圍遠遠大於[-1, 1],那其中的網路層必須至少有一層權重超出[-1, 1]的範圍(除非你的啟用函式很奇葩,有放大作用,但你用的ReLU負值歸零,正值保留 ,可沒有放大作用),換言之,需要梯度爆炸,輸入層和輸出層才接得起來。
那梯度都爆炸了,就別指望訓練效率高了。
歸一化
有一個步驟叫歸一化(normalization),就是將值壓到[-1, 1]之內。歸一化後訓練的效率更高。
所以,既然你發現了
當訓練資料和測試資料在-1到1之間的時候效果還不錯
而
訓練和測試資料一旦絕對值大於1的時候效果就很差
那解決方案很簡單,直接將輸入資料歸一化就可以。歸一化很簡單,假設你的輸入資料(包括訓練集和測試集)中最大的絕對值為|max|,那你直接把每個輸入資料除以|max|就可以(X = X / |max|)。
實際上,不僅是輸入資料,中間的網路層的輸出通常也最好是在[-1, 1]之間,所以在很多網路架構中,中間都會插入很多歸一化層(normalization layer)。
為何歸一化效率更高上面解釋了歸一化的概念,以及如何進行歸一化。從實踐層面上來說,你的問題已經得到解決。不過你也許好奇為什麼歸一化後訓練效率更高?
你提到
訓練迴歸(x的平方)
也就是是訓練的目標是最小化均方誤差(MSE)。換句話說,MSE越接近零越好。MSE的差距會反向傳播,透過網路層一層層地回傳到輸入層。
所以,一方面,不管你輸入層怎麼樣,最終的網路層的權重應該是在零周圍絕對值較小的數(比如位於[-1, 1]之間),這樣對MSE方面的差距才會比較敏感。舉個極端的例子,MSE減少了0.1——這其實已經是相當大的變動了,但是網路層的權重都是什麼2000、3000的,那MSE變動導致的那一點更新對權重而言根本感覺不大——所以說,梯度爆炸是不好的。。另一方面,既然輸出這一端權重是,比方說,[-1, 1]之間,而你輸入那段範圍遠遠大於[-1, 1],那其中的網路層必須至少有一層權重超出[-1, 1]的範圍(除非你的啟用函式很奇葩,有放大作用,但你用的ReLU負值歸零,正值保留 ,可沒有放大作用),換言之,需要梯度爆炸,輸入層和輸出層才接得起來。
那梯度都爆炸了,就別指望訓練效率高了。