從小批次(mini-batch)的統計數據進行標準化
根據前一篇後面提到的原理,要把全神經網路架構,每一層的輸入輸出同時做標準化是相當耗費資源的。於是作者群想了兩個步驟簡化這個流程:首先是不再一口氣將全部的神經網路架構同時做標準化,而是分開處理每一層。這裡針對的是神經網路本身,不是訓練資料。一樣是調整為平均為0,變異數/標準差為1。假設有一層神經網路其輸入為d維,則我們可以對每一維標準化處理:
當然,平均數和變異數是根據資料集計算的。
這裡要注意一個問題,就是將每一層的輸入標準化有可能會改變該層的呈現。例如有一層神經網路是用sigmoid函數,這是非線性的函數。如果將輸入標準化之後,有可能會將其非線性的部分去除,導致輸入被侷限在線性的部分。要解決這個問題,則必須確保輸入在標準化的過程中仍維持恆等。為了做到這樣,文章引入兩個變數γ、β來協助每個啟動函數調整(放大/縮小、位移)標準化後的數值:
這兩個參數會和神經網路的其他參數一樣用學習的方式調整。事實上,如果令γ為公式1的分母,β為分子中的E[x],則兩式幾乎相同,也是最後努力的目標。
另一個步驟則是用mini-batch取代整個資料集。每一批次的資料可以針對每個啟動函數「預測」其標準化該有的平均數和變異數。這樣,標準化的數據也可以參與反向傳播,不會被遺漏。要注意的是能使用mini-batch是依據我們針對每一維的輸入計算得到的變異數,而非整體的共變異數;否則後續可能還需要正規化。(這一段文字敘述牽涉到一點線性代數,留待之後討論)
現在假設一個mini-batch B有m筆資料。現在我們把標準化在每一層神經網路分開執行,使我們可以專注在特定一層x。在這一層經過啟動函數之後得到的值有m個。將其標準化的值定為
而其線性轉移則為y1…ym。然則batch normalization可以表示為
可以把它視為一種函數對應關係。以下是推導的流程:
在normalize中分母裡的ε是新加入的,為了維持數學上的穩定性。
BN在學習中主要調整的參數是γ、β,但要注意的是這個學習步驟不是獨立於每筆資料,而是同時依賴單筆資料和整組mini-batch的資料。y會傳到其他層,而標準化後的x對神經網路是內在的變化。如果我們每次採樣組成mini-batch的資料是來自同一個分布,而且先忽略ε,則這些標準化後的x其期望值(平均值)為0,變異數為1,是一個常態分佈。每一個標準化後的x可以視為一個子網路,這個子網路的函數就是公式2.,然後再疊上其他原本神經網路的架構。這些子網路的輸入有固定的平均值和變異數,即使標準化的x其分布隨訓練有變化,仍然可以保持訓練的速度,而讓整個神經網路學習速率更快。
接下來文章中有一段在講如何把反向傳播推廣到BN裡。利用鏈鎖律可以發現BN本身是可微分的,而且也適用反向傳播調整其內的參數,因此不影響整個神經網路學習,還能加速其學習效率。這部分的推導就不放上來了,有興趣的朋友可以自行翻閱論文(P.4左半)。
利用mini-batch訓練及預測
承前述,要將一個神經網路「BN」化(batch-normalized),可以先針對單一層作處理。將輸入經過標準化處理,再放入啟動函數。整個神經網路架構依然可以運用各種梯度下降方式修正參數,BN架構裡的參數不妨礙更新,而且也會一起更新。但在進行預測時,mini-batch的使用並不恰當,因為我們要直接對每筆資料做出判斷,讓神經網路實戰了。因此,輸出只要根據輸入就好。一旦訓練完成,就把標準化,也就是推導1.中normalize的式子
的數據從mini-batch改成全體(population)。不考慮ε的情況下,它的平均值是0而變異數是1。Var[x]要修正為
其中σB²是樣本變異數。總之,BN是一個線性函數,以下是訓練一個含有BN神經穩路的流程推導:
步驟1到7是訓練。8開始是預測,把平均數、變異數做調整(調整原因是將資料從mini-batch換成整組population),並取代原本的BN線性轉換式。原式在推導1.的最後一行。
BN化的卷積網路
讓我們重新把注意力放回一個簡單的非線性模型
其中W和b是要學習的參數(權重和誤差),g則是一個非線性的啟動函數(例如sigmoid或ReLu)。這種形式基本上涵蓋全連接層或卷積層,亦即這兩種形式的神經網路層都可以用這種表示式。現在把BN層放在啟動函數前,使x=Wu+b,將x標準化。其實我們也可以對u標準化,但因為u是前一層非線性的輸出,有可能在訓練過程中改變分布,所以標準化u比較沒有辦法改善變項移動的問題。相反,Wu+b較容易維持常態分布(我的理解是有經過權重和誤差的修正),標準化它比較容易維持啟動函數的分布,減少變項移動。
不過,其實誤差b在標準化中會被消掉(其角色由推導1.中的β取代),所以實際上公式6.會被代換成
當然,每一維的x=Wu會被獨立進行標準化轉換,其有各自的γ、β要學習,這和前面的論點一致。
在卷積層,除了上述的式子,還額外希望BN保有卷積的特性,所以同一張特徵圖的不同位置,其標準化轉換是一樣的。也就是說在一個mini-batch裡,同一特徵圖內所有的啟動函數一起標準化(在單一層的卷積裡)。因此,推導1.中的B,若在一個mini-batch裡仍為m組資料,且其特徵圖的大小為p×q,則其有效資料量m’為m×pq。γ、β變成以一個特徵圖為單位,而不是個別的啟動函數。推導2.也是一樣的方式調整,所以BN化情況下的infernece其k也變成以特徵圖為單位,不是個別維度(或畫素)的啟動函數。
BN如何提供較高的學習速率
在傳統深度學習中,學習速率太高的問題是導致梯度消失或爆炸,以及陷入局部最小值。BN將啟動函數標準化以後,減少因為局部小更動而放大梯度,也降低現在非線性函數飽和區的問題。
BN也可以讓參數的倍數(或規模,scale)變得有彈性。例如我們將倍數a套用在公式7.上面,變成BN((aW)u)。依照反向傳播中的偏微分:
倍數不再影響梯度變化,被BN「過濾」掉了。此外,大的權重常造成較小的梯度,而BN可以減少這個問題。
此外,作者群推測BN可以使每層的Jacobian(按:函數一階導數的矩陣),其奇異值(按:奇異值分解,SVD,在這邊可以概略的視為萃取特性的矩陣,但這個特性與CNN中的萃取特徵無關)接近1,而這被認為可能有助於訓練[1]。其推導如下:考慮兩個連續的神經網路層,且兩層都有標準化的輸入。這兩層間的轉換可以表示為
若z、x皆為常態分佈且互不關聯,則可以用線性轉換的方式表示為
且x和z有單位共變異數。即
從仿射變換[2]的性質推導得
但Cov[x]也是單位矩陣,所以最後會等於
所有J的奇異值為1,這樣可以保持反向傳播時的梯度。用一張圖表示[3]:
在圖左時,某些方向的梯度不均勻。換成圖右時,可以讓梯度一致,學習比較快。圖片雖然是在說feature scaling,不過我覺得論文這個段落應該是試著解釋怎麼做到這樣的。
在實務上x、z必定不會單純線性且互不相關,甚至也未必是常態分佈。但作者群希望藉由BN可以讓梯度下降/學習的效率更好一點。關於這方面,論文在這個段落的最後留下一句,The precise effect of Batch Normalizationon gradient propagation remains an area of further study.
留待各位繼續去探索了。
BN調節(正規化,regularize)模型
模型BN化時,在一個mini-batch裡每筆資料是有連結的。神經網路也不再針對每一筆資料提出一個決定性的值。這讓模型一般化(泛化,generalization)更容易。在AlexNet中提出dropout的作法,但作者群認為,有了BN之後可以減少dropout的使用,甚至完全不用。他們在實驗中也驗證了這個想法。
下一篇把實驗和結論一起做完。這篇真的累,尤其最後面這邊...可能還要多讀幾次才會懂。歡迎有識之人分享您的心得,幫助我更快學習,謝謝!
Reference
[1] 這段敘述真的很難理解。 首先是Jacobian(雅可比),根據維基百科的敘述,這是函數的一階偏導數以一定方式排列成的矩陣。(原文)姑且把它認為是把函數偏微分後形成的矩陣吧。
奇異值分解是線性代數的專有名詞,定義為若一矩陣A,可找到兩向量矩陣U、V及一矩陣Σ使A=UΣV^T(V的轉置矩陣),則稱Σ為A的奇異矩陣,其為一對角矩陣,故其內每一行/列只有一值為非0,該值統稱為奇異值。U為左特徵向量矩陣,V為右特徵向量矩陣,且U/V階為正交矩陣。
奇異值分解的好處是所有實數矩陣皆有奇異值矩陣,但未必有特徵值矩陣。在實用上主要是做函數的旋轉伸縮,在這裡則可以視為一種特性的萃取。
論文中提到奇異值為1有助於訓練的引用論文在此:Saxe, Andrew M., McClelland, James L., and Ganguli, Surya. Exact solutions to the nonlinear dynamics of learning in deep linear neural networks. CoRR, abs/1312.6120, 2013.
[2] https://ccjou.wordpress.com/2014/06/03/%E5%85%B1%E8%AE%8A%E7%95%B0%E6%95%B8%E7%9F%A9%E9%99%A3%E7%9A%84%E6%80%A7%E8%B3%AA/ 現代啟示錄。超神的線代網頁。
[3] http://violin-tao.blogspot.com/2018/02/ml-batch-normalization.html 李宏毅老師的投影片也很棒!