關於神經網路輸入標準化

用過神經網路模型(或者SVM等)的都知道,在數據輸入前進行標準化可以非常有效的提升收斂速度和效果,本文在此對其中的一些動機進行分析。

如果我們的激活函數是sigmoid或者tanh,其梯度最大的區間是0附近,當輸入值很大或者很小的時候,sigmoid或者tanh的變化就基本平坦了(sigmoid的導數sig(1-sig)會趨於0),也就是進行梯度下降進行優化的時候,梯度會趨於0,而倒是優化速度很慢。

如果輸入不進行歸一化,由於我們初始化的時候一般都是0均值的的正太分布或者小範圍的均勻分布(Xavier),如果輸入中存在著尺度相差很大的特徵,例如(10000,0.001)這樣的,很容易導致激活函數的輸入w1*x1+w2*x2+b變的很大或者很小,從而引起梯度趨於0.

所以總結來說,對於sigmoid以及tanh等激活函數,我們是要利用其非線性部分,也就是0附近-2到2左右的區間,因此我們需要保證輸入在此範圍內,在初始化為0均值的情況下,為了保證X·W在這一範圍內,最簡單好用的方法就是進行z-score,pca-白化等標準化的方法,把輸入縮放到0均值,標準方差。

這從一定程度上解釋了batch norm的原因。

從另一個角度來考慮,盜一下@王贇 Maigo 的圖,如果不歸一化,那麼不同維度特徵的量剛不同,其目標函數就會呈現這種情況,也就是扁的:

理論上對於每一種特徵,我們需要使用不同的學習率來保證其方向是往最小值收斂,但是由於梯度下降法只有一個學習率,那麼在進行梯度下降的時候,就會收到數值比較大的特徵的影響,而偏離最佳的下降路徑。

如果進行了歸一化,那麼目標函數就會比較圓:

梯度下降法就很好的能夠進行迭代收斂。

不過是否標準化是針對優化演算法來說的,目前的優化演算法應該是都需要的(如果有不需要的話請告訴我,另外AdaDelta確實有自適應學習率的操作,但是他並不能再初始階段就為每個個維度都設置合適的學習率,實際上並沒有解決根本問題,但是確實加快了收斂),如果有人能找到一種特別牛的優化演算法,對數據每個維度都有自己的學習率那我們到時候可能就不需要標準化了。


推薦閱讀:

用Python實現BP神經網路(附代碼)
什麼是 DQN (強化學習)
Learn R | 機器學習中的人工神經網路(四)
神經網路普遍性的直觀解釋
Python · NN(一) · 神經網路入門

TAG:人工智能 | 神经网络 | 深度学习DeepLearning |