層正規化(layer normalization)
/ LAY-ur nor-muh-luh-ZAY-shun /
層正規化幹的是和批次正規化一樣的「穩定」活兒——防止網路內部的數值漂移到極端的尺度——但它衡量「正常」範圍的方式截然不同。批次正規化是橫跨一個批裡的許多樣本,來判定什麼算正常。層正規化則是在單個樣本之內、橫跨該輸入在某一層產出的所有數值,把它們自顧自地穩住。它問的其實是「就這一句話而言,我的這些數還算均衡嗎?」,而不是「跟批裡其餘的相比怎樣」。
何必另起一套配方?因為批次正規化對「批」的依賴,恰恰在現代語言模型所棲身之處成了軟肋。在循環模型或 Transformer 裡,天然的單位是一條長度可變的序列,批可能很小,而且你常常一次只處理一個樣本——這些情形下,批的統計量要麼搖搖晃晃,要麼根本拿不到。層正規化把這些全繞開了:既然它是把每個樣本各自正規化,那麼無論你的批是一個還是一千個,它的行為都一模一樣,訓練時和推斷時也一模一樣。正是這種一致性,讓它成了 Transformer 內部默認的正規化方式。
和批次正規化一樣,層正規化也是把數值居中、重新縮放,再施加兩個學出來的數(一個縮放、一個平移),好讓網路去調整結果。該有的老實說法不是「誰比誰好」,而是它們適合不同形狀的問題。批次正規化往往在卷積視覺網路裡大放異彩——那裡批大而齊整;層正規化則在序列與語言模型裡稱王——那裡你需要的,正是不依賴於批。
某一層對一個輸入產出向量 [12, 18, 6, 24]。層正規化只在這四個數自己之間——只用這一個樣本——把它們重新居中、重新縮放成類似 [−1.0, 0.3, −1.8, 1.5] 的樣子。批裡別的樣本一概不參考。
在單個樣本之內正規化——於是批的大小再也無關緊要。
一字之差在於「方向」:批次正規化是橫跨樣本(沿著批的方向)正規化,層正規化是橫跨特徵(在單個樣本之內)正規化。正是這一個選擇,讓坐在每個 Transformer 內部的是層正規化,而不是批次正規化。