批次正規化(batch normalization)
/ batch nor-muh-luh-ZAY-shun /
批次正規化,是深度網路內部的一道「整理」工序,專門防止層與層之間流動的數值漂移到失控的尺度上。資料一層層穿過時,數值可能毫無規律地暴漲或縮水,讓訓練既慢又抽搐——有點像在一個音量忽而細語、忽而咆哮的房間裡硬要好好談話。批次正規化把這個音量穩住,讓每一層接到的輸入都落在一個正常、穩定的範圍裡。
具體地說,訓練是分成一小組一小組的樣本來進行的,這一小組叫作「批」(一次幾個到幾百個)。對每一個批,批次正規化都查看抵達某一層的數值,減去它們的平均值、再除以它們的離散程度,於是這些數出來時都以零為中心、帶著一個整齊的尺度。接著它再乘上兩個學出來的數——一個縮放、一個平移——這樣網路如果願意,可以在更有利的地方把正規化「撤銷」掉。這種即時的重新縮放,讓你能訓練得更快、用更大的學習率,也不必那麼操心權重當初究竟是怎麼初始化的。
也有該老實說的麻煩。由於正規化用的是整個批的統計量,批一旦很小,它就表現得古怪;而且在推斷時它還需要另一套記帳(這時你也許一次只餵一個樣本,用的是訓練時積累的滑動平均)。它和序列模型也配合得彆扭——在那裡,「批」並不是天然適合用來正規化的對象——這恰恰是「層正規化」作為替代方案被發明出來的原因。即便如此,批次正規化仍是一個轉折點:自 2015 年問世以來,深度網路忽然變得明顯更好訓練、也更快了。
如果某個批裡抵達某層的數是 [12, 18, 6, 24],批次正規化會把它們重新居中、重新縮放成類似 [−1.0, 0.3, −1.8, 1.5] 的樣子——大致以零為中心、離散整齊——再往下傳。之後,兩個學出來的旋鈕如果有用,還能把結果拉伸或平移。
把每個批重新居中、重新縮放,好讓下一層接到的數落在正常範圍裡。
批次正規化在訓練時(用當前批的統計量)和推斷時(用訓練中保存的滑動平均)行為不同。忘了切換這個開關是個臭名昭著的 bug——它會讓一個訓練時看著很棒的模型,在上線後表現糟糕。