天天看點

煉丹知識點:秘制Normalization

煉丹知識點·第5期

作者:煉丹筆記

在實踐中,在不同階段對資料進行不同的正則化操作會有非常大的影響,在正确的位置進行正确的正則化操作可以為模型帶來巨大的提升。

同時,在CTR預估任務中,Normalization也有着迷之效果,本文作為“煉丹知識點”系列的第5期,我們來聊一聊到底什麼是Normalization。

什麼是BatchNormalization?

谷歌在2015年就提出了Batch Normalization(BN),該方法對每個mini-batch都進行normalize,下圖是BN的計算方式,會把mini-batch中的資料正規化到均值為0,标準差為1,同時還引入了兩個可以學的參數,分别為scale和shift,讓模型學習其适合的分布。

煉丹知識點:秘制Normalization

那麼為什麼在做過正規化後,又要scale和shift呢?

當通過正規化後,把尺度縮放到0均值,再scale和shift,不是有可能把資料變回"原樣"?因為scale和shift是模型自動學習的,神經網絡可以自己琢磨前面的正規化有沒有起到優化作用,沒有的話就"反"正規化,抵消之前的正規化操作帶來的影響。

BatchNormalization是對一批樣本進行處理, 對一批樣本的每個特征分别進行歸一化,舉個簡單的例子,加入我有一批樣本, 每個樣本有三個特征,,分别是身高,體重,年齡,那麼我做歸一化的時候,就是對體重做歸一化,對身高做歸一化,對年齡做歸一化,三者之間不會有交叉影響。

煉丹知識點:秘制Normalization

什麼是LayerNormalization?

LayerNormalization是對一個樣本進行處理,對一個樣本的所有特征進行歸一化,乍一看很沒有道理,因為如果對身高體重和年齡一起求一個均值方差,都不知道這些值有什麼含義,但存在一些場景卻非常有效果——NLP領域。

煉丹知識點:秘制Normalization

在NLP中,N個特征都可能表示不同的詞,這個時候我們仍然采用BatchNormalization的話,對第一個詞進行操作,很顯然意義就不是非常大了,因為任何一個詞都可以放在第一個位置,而且很多時候詞序對于我們對于句子的影響沒那麼大,而此時我們對N個詞進行Normalization等操作可以很好地反映句子的分布。(LN一般用在第三次元,[batchsize, seq_len,dims]),因為該次元特征的量綱是相同的,是以并沒有太多差別。

為什麼要用Normalization?

01

解決梯度消失問題

拿sigmoid激活函數距離,從圖中,我們很容易知道,資料值越靠近0梯度越大,越遠離0梯度越接近0,我們通過BN改變資料分布到0附近,進而解決梯度消失問題。

煉丹知識點:秘制Normalization

02

解決了Internal Covariate Shift(ICS)問題

先看看paper裡對ICS的定義:

煉丹知識點:秘制Normalization

由于訓練過程中參數的變化,導緻各層資料分布變化較大,神經網絡就要學習新的分布,随着層數的加深,學習過程就變的愈加困難,要解決這個問題需要使用較低的學習率,由此又産生收斂速度慢,是以引入BN可以很有效的解決這個問題。

03

加速了模型的收斂

和對原始特征做歸一化類似,BN使得每一維資料對結果的影響是相同的,由此就能加速模型的收斂速度。

煉丹知識點:秘制Normalization

04

具有正則化效果

BatchNormalization層和正規化/歸一化不同,BatchNormalization層是在mini-batch中計算均值方差,是以會帶來一些較小的噪聲,在神經網絡中添加随機噪聲可以帶來正則化的效果。

在CTR問題中的蜜汁效果

在非常多CTR相關的論文中,很多工作主要都Focus在模型結構方面的優化或者引入新的資訊等,而這麼做往往都忽略了模型中的一些小的子產品的作用,例如Normalization,在CTR相關的結構中我們發現,大家經常會把BatchNorm放在最後的MLP層, 但是這麼做夠嗎?Normalization是否發揮了最大的作用?是否是最優的方案?本文通過大量的系統的實驗,給出了結論:沒有,還有更好的方案, 本文通過在CTR模型的不同地方加入不同的正則化政策(BatchNorm,LayerNorm等),最終取得了非常好的效果。那究竟是怎麼做的呢?我們繼續往下看,下面的架構很簡單,顯示作者提出模型的核心組成部分VO-LayerNorm,然後是基于此提出的新的NormDNN,最後是實驗驗證部分。

Variance-Only LayerNorm

這是一個經驗得出來的操作,作者在大量的實驗中發現,原始的LayerNorm有些複雜化了,在對其進行不斷的精簡實驗後,作者發現在CTR資料集上的效果并沒有帶來下降,反而更好了。下面我們看看這一步步精簡的操作:

複雜版本LayerNorm

假設我們一個Batch有H個樣本, ,那麼我們的LayerNorm可以通過下面的方式計算得到:

煉丹知識點:秘制Normalization

其中

煉丹知識點:秘制Normalization

LayerNorm在NLP任務中取得了非常好的效果,但是實踐中,Xu等人發現這個LayerNorm的bias和gain增加了過拟合的風險,并且經過試驗他們發現簡化LayerNorm也可以取的非常不錯的效果。

簡化版的LayerNorm

我們把bias以及gain同時删除,得到精簡版的LayerNorm,

煉丹知識點:秘制Normalization

其中

煉丹知識點:秘制Normalization

在大量的實驗中,我們發現簡化版本的LayerNorm并沒有什麼性能損失,相反的還可以取的更好的效果。然後作者在CTR相關的資料集上又進行了大量的實驗,發現對模型效果影響最大的不是re-centering等操作,反而方差帶來的影響更大,于是作者提出了新的LayerNorm。

Variance-Only LayerNorm

煉丹知識點:秘制Normalization

其中

煉丹知識點:秘制Normalization

此處,作者直接除以了方差,雖然更加精簡了,但是實驗效果卻顯示這麼做在CTR資料集上卻可以取得更好的效果。

NormDNN

在不同的地方使用不同形式的Normalization政策會帶來什麼樣的影響呢?此處作者主要探索了兩個部分, 特征Embedding部分的Normalization以及MLP部分的Normalization。在大量的實驗之後,作者得到了一種提升最大的方案:

  1. 對于數值類的特征,我們使用Variance-Only LayerNorm或者LayerNorm;
  2. 對于類别特征,我們使用BatchNorm;
  3. 對于MLP部分,我們使用LayerNorm;

在特征Embedding層的Normalization

假設我們有個域,我們原始的embedding可以表示為:

煉丹知識點:秘制Normalization

表示每個field的embedding的次元;

我們在該基礎上加入Normalization,得到

煉丹知識點:秘制Normalization

此處的可以是LayerNorm,BatchNorm等。

在MLP處加入Normalization

此處作者發現在非線性的激活函數之前加入Normalization操作的效果是比先使用激活函數再做Normalization處理要好的。

為什麼Normalization是有效的?

作者最後分析了一下Normalization為什麼有效,并繪制了不同的Normalization對于我們均值和方差帶來的影響,從圖中以及實驗中看來,我們發現 Normalization有效的最大一個原因在于方差的影響而不是均值。

煉丹知識點:秘制Normalization

同時我們發現很多神經元的輸出大部分在使用Variance-Only LayerNorm之後都會被push輸出一個負數的值,然後被RELU過濾掉,這可以減少噪音帶來的影響,同樣的,我們将Normalization的導數表示為:

煉丹知識點:秘制Normalization

從上面的式子中我們也發現我們的Normalization對于是非常敏感的。

特征Embedding上加入Normalization是否有效?

煉丹知識點:秘制Normalization

從上面的實驗中,我們發現,在特征Embedding層加入Normalization都是有效的,而且LayerNorm以及相關的變種是效果相對穩定以及最好的;

Normalization對于MLP的影響

煉丹知識點:秘制Normalization

從上面的實驗中,我們發現,在MLP層加入Normalization都是有效的,但是具體選用哪種Normalization需要依據不同的任務進行選擇;

Normalization對于Feature EMbedding & MLP的影響

煉丹知識點:秘制Normalization

從上面的實驗中,我們發現,在MLP層以及特征Embedding層都加入Normalization都是比單個加入都有效的,在MLP側加入VO-LN的Normalization往往能取得更好的效果;

Normalization對于數值以及類别特征的 EMbedding的影響

煉丹知識點:秘制Normalization

從上面的實驗中,我們發現,對數值的EMbedding使用LayerNorm相關的效果更好,對數值特征使用LayerNorm相關的正則化方法,在MLP處使用VO-LN往往可以取得最好的效果.

NormDNN 與 其他網絡比較

煉丹知識點:秘制Normalization

出乎意料,在三個資料集上,我們隻需要對不同層做Normalization的處理就可以取得比DeepFM,xDeepFM更好的效果;

NormDNN: Numerical Embedding用LayerNorm相關的處理; Categorical Feature使用BatchNorm相關的處理; 在MLP部分使用VO-LN

泛化到其他Deep相關的模型

煉丹知識點:秘制Normalization

我們把初始化的方案應用到更加複雜的網絡結構上也都取得了更好的效果;也就是說這種Normalization的方案可以擴充到其他的所有最新網絡結構上;

小結

從上面的内容來看,Normalization對于模型的幫助是非常大的; 對Embedding之後的特征進行Normalization(數值Embedding處用LayerNorm相關的Normalization,Categorical部分使用BatchNorm相關的處理,MLP部分使用VO-LN)可以取得非常大的提升;非常值得一試。

參考資料

  1. batchNormalization與layerNormalization的差別:https://zhuanlan.zhihu.com/p/113233908
  2. NLP中 batch normalization與 layer normalization:https://zhuanlan.zhihu.com/p/74516930
  3. 深度學習中的Normalization模型:https://www.jiqizhixin.com/articles/2018-08-29-7
  4. Correct Normalization Matters: Understanding the Effect of Normalization On Deep Neural Network Models For Click-Through Rate Prediction:https://arxiv.org/pdf/2006.12753.pdf