為什麼要做 batch normalization
首先看一下什麼是一般的 normalization:
在機器學習中,我們需要對輸入的資料做預處理,
可以用 normalization 歸一化 ,或者 standardization 標準化,
用來將資料的不同 feature 轉換到同一範圍內,
normalization 歸一化 :將資料轉換到 [0, 1] 之間,
standardization 標準化:轉換後的資料符合標準正態分佈

為什麼需要做歸一化 標準化等 feature scaling?

因為如果不做這樣的處理,不同的特徵具有不同數量級的資料,它們對線性組合後的結果的影響所佔比重就很不相同,數量級大的特徵顯然影響更大。
進一步體現在損失函式上,影響也更大,可以看一下,feature scaling 之前,損失函式的切面圖是橢圓的,之後就變成圓,無論優化演算法在何處開始,都更容易收斂到最優解,避免了很多彎路。
在神經網路中,不僅僅在輸入層要做 feature scaling,在隱藏層也需要做。
尤其是在神經網路中,特徵經過線性組合後,還要經過啟用函式,
如果某個特徵數量級過大,在經過啟用函式時,就會提前進入它的飽和區間,
即不管如何增大這個數值,它的啟用函式值都在 1 附近,不會有太大變化,
這樣啟用函式就對這個特徵不敏感。
在神經網路用 SGD 等演算法進行優化時,不同量綱的資料會使網路失衡,很不穩定。

在神經網路中,這個問題不僅發生在輸入層,也發生在隱藏層,
因為前一層的輸出值,對後面一層來說,就是它的輸入,而且也要經過啟用函式,

所以就需要做 batch normalization

就是在前一層的線性輸出 z 上做 normalization:需要求出這一 batch 資料的平均值和標準差,
然後再經過啟用函式,進入到下一層。

在 Keras 可以這樣應用:
# import BatchNormalization from keras.layers.normalization import BatchNormalization # instantiate model model = Sequential() # we can think of this chunk as the input layer model.add(Dense(64, input_dim=14, init='uniform')) model.add(BatchNormalization()) model.add(Activation('tanh')) model.add(Dropout(0.5)) # we can think of this chunk as the hidden layer model.add(Dense(64, init='uniform')) model.add(BatchNormalization()) model.add(Activation('tanh')) model.add(Dropout(0.5)) # we can think of this chunk as the output layer model.add(Dense(2, init='uniform')) model.add(BatchNormalization()) model.add(Activation('softmax')) # setting up the optimization of our weights sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True) model.compile(loss='binary_crossentropy', optimizer=sgd) # running the fitting model.fit(X_train, y_train, nb_epoch=20, batch_size=16, show_accuracy=True, validation_split=0.2, verbose = 2)
學習資料:
ofollow,noindex">https://arxiv.org/pdf/1502.03167v3.pdf
https://www.youtube.com/watch?v=BZh1ltr5Rkg
https://www.youtube.com/watch?v=dXB-KQYkzNU
https://youtu.be/-5hESl-Lj-4推薦閱讀歷史技術博文連結彙總
http://www.jianshu.com/p/28f02bb59fe5
也許可以找到你想要的:
[入門問題][TensorFlow][深度學習][強化學習][神經網路][機器學習][自然語言處理][聊天機器人]