【週末AI課堂】認識批標準化的三種境界(理論篇)
AI課堂開講,就差你了!
很多人說,看了再多的文章,可是沒有人手把手地教授,還是很難真正地入門AI。為了將AI知識體系以最簡單的方式呈現給你,從這個星期開始,芯君邀請AI專業人士開設“週末學習課堂”——每週就AI學習中的一個重點問題進行深度分析,課程會分為理論篇和程式碼篇,理論與實操,一個都不能少!
來,退出讓你廢寢忘食的遊戲頁面,取消只有胡吃海塞的週末聚會吧。未來你與同齡人的差異,也許就從每週末的這堂AI課開啟了!
讀芯術讀者交流群,請加小編微訊號:zhizhizhuji。等你。後臺回覆“週末AI課堂”,查閱相關原始碼。
全文共2788字,預計學習時長6分鐘
批標準化(Batch Normalization)於2015年提出,現在已經成為深度學習的標準技術。在工程師看來,它的操作在工程上非常簡單,在啟用函式之前加入一個BN層,就可以使模型更容易優化。稍微深入一些,我們就會知道它在訓練過程中,是將此批次的均值和標準差算出來,然後做正常的標準化處理:
如果我們想讓BN更加靈活一些,那麼可以加上兩個線性變換的可學習引數(再縮放參數),最終變為:
如果我們僅僅停留在使用BN上,那麼現成的框架只需要一行就可以新增到模型中。我們真正想知道的是,隱藏在BN的背後深度學習的問題,以及這樣簡單的操作是如何奏效的。
理解BN的三重境界
境界一:特徵縮放
在資料預處理階段,有一種很常見的技術叫做標準化(zero-centered),它對於資料的每一個特徵作如下操作:
分別是樣本的均值和標準差。它的優點有很多:
- 縮小取值範圍。各個特徵的取值範圍可能存在嚴重的不協調,甚至有的特徵比另外的特徵數值高几個數量級,比如我們拿到富豪的資料分析任務,馬雲的體重可能是60kg,他的財產是$100000.....第二個特徵比第一個高出了不止一個數量級,我們就可以通過標準化的方法來進行縮小取值範圍,這樣的表示在特徵空間上更容易收斂。
如圖,我們在特徵空間做簡單的Loss示意,左圖未經過縮放,可以看出如果我們的優化初始點未選擇好,就會迭代緩慢,需要27秒才會收斂,而右圖經過縮放,收斂極快。注意,這裡的縮放指的是歸一化而非標準化。
- 作為一種無量綱化的線性辦法,標準化體現了更多的樣本資訊。同樣是縮小取值範圍,歸一化(normalization)技術甚至可以將樣本範圍縮小到[0,1]:
但這樣的縮小範圍,只利用了最大值和最小值,而且在資料不穩定的情況下,受到異常值和極端值影響較大,所以並沒有標準化更加廣泛的被使用。
- 特徵取值的“序”不會發生變化,將所有的特徵放在一個標準下處理,在距離計算(相似度估計)上存在優勢,可能會使其更精確。
我們從特徵縮放的角度來理解批標準化,那麼就是在模型的每一層做特徵縮放,又儘可能的保留了資訊,類比標準化的特徵更容易被訓練,所以新增BN的深度學習模型也就更容易被優化。
這是絕大部分同學理解的BN,但是,如果只是按照這樣理解,我們只需要在資料傳入的第一層做特徵縮放就可以了,為什麼需要每一層都需要做呢?
境界二:Covariate Shift和Internal Covariate Shift
我對上一個問題的回答是,因為在深度學習中會存在internal covariate shift.
covariate shift是緣於統計學的一個概念,它描述了源域(S)和目標域(T)邊緣分佈的不一致,,但是他們的條件分佈卻是相同的,。簡單在機器學習中來說,從概率的視角,條件分佈是我們得到的模型,如果我們的訓練集的
分佈與測試集的分佈存在差異,那麼就會出現covariate shift,此時會出現兩個結果:
- 我們利用從訓練集得到的模型,去在測試集上做效能評估,得到的並不會是模型的真實水平。
- 訓練集和測試集的分佈差異太大,我們訓練出的模型並不是真實的模型。
如圖,在樣本空間中,紅色點表示訓練集,黑色點表示測試集,真實的擬合直線是黑線,而我們學習到的卻是紅線。
我們在統計學習中就曾介紹過獨立同分布(iid)的重要性,獨立同分布要求訓練集和測試集的樣本都從同一個分佈獨立取樣而來,這在理論上是一個強力的保證。但在實際過程中,我們無法做出完全的iid分佈,我們一般會採用權重分佈來參與學習,使得訓練集和測試集分佈差異較小的樣本點來佔據更大的權重。
最重要的是,所謂的標準化就是減小分佈差異的一種方式,因為預處理會讓每個特徵服從標準高斯分佈。我們在資料預處理的時候,往往會得到訓練集的均值和標準差,並將其直接用在測試集上,這種資訊共享的方式可以說是將獨立同分布用到了極致。
但在深度學習中,這個現象加劇為internal covariate shift。我在《理解softmax函式》中說過:
從表示學習的角度來看,神經網路前面的所有層,都可以看做獲得一個更好的表示,隱藏單元的最大作用是非線性,使得神經網路在最基本的乘法中獲得足夠的複雜性,只有最後一層將表示轉化為輸出,所以只有最後一層可以看作統計學習中的學習器。
正因為前面所有的層都是在獲得一個更好的表示,而非直接做學習,所以經過層和啟用函式的處理,我們獲得的還是,而非
,而這樣是非常有可能加劇covariate shift的程度(當然,也有可能減弱),這就是Internal covariate shift中Internal (內部的)的含義。
所以我們在很多層都會做這樣的標準化操作,為的就是儘量減弱internal covariate shift的帶來的影響。特別需要注意,在一開始介紹的可學習的兩個引數也可以理解為,普通的BN操作會對原本學習好的特徵分佈造成破壞,加上這兩個引數可以取得一定的彌補效果。
境界三:重引數化
正如我們在之前的課程中所講,深度學習在使用BP演算法反向更新時,我們假設了其他層保持不變,但在實際中,某一層的更新程度取決於其他層的引數大小,我們在《理解梯度下降》中用泰勒級數將Loss展開到一階,去分析學習率的最佳值,大多程度上忽略了高階項(相互作用項)的影響。我們仍然採用在《設計隱藏單元》中所提到的最簡單的假設:總共有 層,每一層都只有一個神經元,沒有閾值,並且不使用啟用函式,那麼就有輸出:
定性的來說,我們考慮兩種情況,一種是權值係數全為1,一種是,其餘權值均為0.1。這兩種情況下,輸入輸出都是一樣的,當我們接受損失函式傳來的誤差梯度資訊,對引數進行更新的時候,第一種情況,所有的權值係數的變化至少在一個量級上,而第二種情況下,非常可能大的引數變化小,小的引數變化大,訓練過程就會劇烈的波動,很不穩定。
我們可以寫出某一層引數的更新公式:
定量的來說,在第二種情況下,假如在傳播過程中損失函式的梯度為1,那麼在輸入一定的情形下,大的引數會發生
個量級的變化,相當於沒有變化,而引數
會發生
個量級的變化,發生了鉅變。
這個極端的例子非常重要,請大家牢牢記住。層與層之間總是協調更新,解決這個問題有兩個思路:
• 調整學習率,使得在更新引數
時變得大一點,就可以保證引數的更新與自身的量級相匹配(自適應學習率演算法)。
• 調整後面的項,使得輸出對引數的梯度(也就是上述例子中,後面的連乘項)不要太大也不要太小,太大對應著梯度爆炸,太小對應著梯度消失,(當然,梯度消失更常見一點),希望它最好穩定在一個範圍。
第二條思路正是我們所作的BN,這種重引數化的辦法,對每一層引數進行標準化,本質上不是希望獲得更優的表示,而是巧妙地削弱了將層與層之間的複雜依賴性,使得每一層的引數更新輕微的獨立於其他層的引數,訓練的更加好也更加快。
讀芯君開扒
課堂TIPS
• 我們為什麼不對啟用函式做BN,而是要放在啟用函式前面做BN呢?這裡面的原因並沒有統一的說法,有時候我們放在後面也會起到不錯的效果,事實上,實踐證明,放在後面是更好的。
• 在測試階段,對於單個樣本,我們無法使用BN是因為均值和方差不存在,此時我們會利用在訓練階段的每一層的均值和方差的執行均值設定BN層。
留言 點贊 發個朋友圈
我們一起分享AI學習與發展的乾貨
作者:唐僧不用海飛絲