批歸一化技術(batch normalization)是深度學習中最近出現的乙個有效的技術,已經被廣泛證明其有效性,並很快應用於研究和應用中去。這篇文章假設讀者知道什麼是批歸一化,並對批歸一化有一定程度的了解,知道它是如何工作的。如果你是剛剛接觸這個概念,或者需要複習一下,您可以在後面的鏈結位址找到批歸一化的簡要概述(
本文使用兩種不同方法實現了一種神經網路。每一步都輸入相同的資料。網路具有完全相同的損失函式、完全相同的超引數和完全相同的優化器。然後在完全相同數量的 gpu 上進行訓練。結果是其中乙個版本的分類準確度比另一種低2%,並且這種效能的下降表現地很穩定。
我們拿乙個簡單的 mnist 和 svhn 的分類問題為例。
在***種實現中,抽取一批 mnist 資料和一批 svhn 資料,將它們合併到一起,然後將其輸入網路。
在第二種實現中,建立兩個副本的網路,並共享權重。乙個副本輸入 mnist 資料,另乙個副本輸入 svhn 資料。
請注意,在這兩種實現裡,一半的資料是 mnist,另一半是 svhn。另外由於第二種實現共享權重,使得兩個模型的引數數量相同,且其更新方式也相同。
簡單地想一下,這兩個模型的訓練過程中梯度應該是相同的。事實也是如此。但是在加入批歸一化之後情況就不同了。在***種實現中,同一批資料中同時包含 mnist 資料和 svhn 資料。而在第二種方法中,該模型分兩批進行訓練,一批只訓練 mnist 資料,另一批只訓練 svhn 資料。
導致這個問題的原因就是:在訓練的時候,在兩個網路共享引數的同時,其資料集均值和方差的移動平均也是被共享的。這個引數的更新也是應用在兩套資料集上的。在第二種方法中,圖中上方的網路用來自 mnist 資料的平均值和方差的估計值進行訓練,而下方的網路用 svhn 資料平均值和方差的估計值進行訓練。但是由於移動平均在兩個網路之間共享,所以移動平均收斂到 mnist 和 svhn 資料的平均值。
因此,在測試時,測試集使用的批歸一化的縮放和平移(某一種資料集的平均值)與模型預期的(兩種資料集的平均值)是不同的。當測試的歸一化與訓練的歸一化不同時,模型會得到如下結果。
該圖是在另乙個相似資料集上(不是例子中的 mnist 或 svhn)用五個隨機種子的得到的***、中間和最差的模型的效能。當使用兩個共享權重的網路時,不僅效能下降明顯,而且輸出結果的方差也增加。
每當單個小批次(minibatch)的資料不能代表整個資料的分布時,都會遇到這樣的問題。這就意味著忘記將輸入隨機打亂順序的情況下使用批歸一化是很危險的。這在最近流行的生成對抗網路(gan)裡也是非常重要的。gan中的判別器通常是對假資料和真實資料的混合進行訓練。如果在判別器中使用了批歸一化,在純假資料的批次或純真實資料批次之間進行交替是不正確的。每個小批次需要是兩者的均勻混合(各 50%)。
值得一提的是,在實踐中,使用分離批歸一化變數而共享其他變數的網路結構得到了***的結果。雖然這樣實現起來比較複雜,但的確是比其他方法有效的(見下圖)。
批歸一化:萬惡之源
縱觀上述問題,作者得出了能不用就不用批歸一化的結論。
這個結論是從工程的角度來分析的。
大體來講,當**出問題的時候,原因往往不外乎下面兩個:
很明顯的錯誤。比如變數名輸錯了,或忘記呼叫某個函式。
**對與其互動的其他**的行為有沒有寫明的依賴條件,並且的確有些條件沒有滿足。這些錯誤往往更加有害,因為一般需要花很長時間來弄清楚**依賴什麼樣的條件。
這兩個錯誤都是不可避免的。第二類錯誤可以依靠使用更簡單的方法和重用已有**來減少。
批歸一化的方法有兩個基本的性質:
在訓練時,單個輸入 xi 的輸出受制於小批次中的其他 xj 。
在測試時,模型的計算路徑發生了變化。因為現在它使用移動平均值而不是小批次平均值來進行歸一化。
當然,你可以將批歸一化看作***歸一化黑盒,而且還挺好用的。但是在實踐中,抽象洩漏總是存在的,批歸一化也不例外,而且其特性使它更容易洩漏。
為什麼大家還不放棄批歸一化?
計算機學界有一封著名的文章: dijkstra 的「 goto 語句是有害的」。在其中,dijkstra 認為應該避免使用 goto 語句,因為它使得**更難閱讀,任何使用 goto 的程式都可以換種不用 goto 語句的方法重寫。
作者想要宣告「批歸一化是有害的」的觀點,但無奈找不到太好的理由,畢竟批歸一化實在太有用了。
沒錯,批歸一化的確存在問題。但當你做的一切都正確時,模型的確訓練地快的多。批歸一化的**有超過 1400 次的引用不是白來的。
批歸一化有很多的替代方法,但它們也有自己的不足。層歸一化(layer normalization)與 rnn 合用才更有效,而且用於卷積層有時會有問題。權重歸一化(weight normalization)和余弦歸一化(cosine normalization)都是比較新型的歸一化方法。權重歸一化文章中表示,權重歸一化能夠適用於一些批歸一化不起作用的問題上。但是這些方法迄今為止並沒有太多應用,或許這只是個時間問題。層歸一化,權重歸一化和余弦歸一化都解決了上述批歸一化的問題。如果你在做乙個新問題而且想冒點險的話,推薦試一下這些歸一化方法。畢竟不論用哪一種方法,都需要做超引數調整。調整好後,各種方法之間的區別應該是不大的。
(如果你足夠勇敢的話,甚至可以嘗試批重歸一化(batch renormalization),不過它仍然只在測試時使用移動平均值。 )
使用批歸一化可以看作是深度學習中的「魔鬼的契約」。換來的是高效的訓練,失去的是可能的不正常的結果(insanity)。每個人都在簽著這個契約。
譯者注作者關於」批歸一化是有害的「,以及「盡可能不使用批歸一化」的觀點不免有些偏激。但文中提到的批歸一化的陷阱的確是不得不防的。因為批歸一化的有效性,很多深度學習的研究者的確將其當作是「魔法黑箱」,將其應用到每乙個可以用的地方。因為這種簡單粗暴的方法對於訓練速度的提高是很有效的。但大家很難將準確率的降低歸咎於批歸一化,畢竟從沒有見人提到過批歸一化會降低訓練準確率。
我的訓練資料集的每批樣本是否平均?
我的訓練資料集的每批均值是否和測試時的移動平均一致?
否則的話,就有必要使用下面中的一種或幾種方法來避免文中的問題:
隨機取樣訓練資料集來確保批次平均;
像文中的例子一樣修改模型來避免上述問題;
使用層歸一化,權重歸一化或者余弦歸一化來替代批歸一化;
不使用歸一化方法。
點讚 0
批歸一化(Batch Normalization)
深度學習 批歸一化 batch normalization bn是由google於2015年提出,這是乙個深度神經網路訓練的技巧,它不僅可以加快了模型的收斂速度,而且更重要的是在一定程度緩解了深層網路中 梯度瀰散 的問題,從而使得訓練深層網路模型更加容易和穩定。所以目前bn已經成為幾乎所有卷積神經網...
(九)批量歸一化
1 引入 對輸入資料做了歸一化處理,就是將每個特徵在所有樣本上的值轉歸一化成均值0方差1。這樣我們保證訓練資料裡數值都同樣量級上,從而使得訓練的時候數值更加穩定。對於淺層模型來說,通常資料歸一化預處理足夠有效。輸出數值在只經過幾個神經層後通常不會出現劇烈變化。但對於深層神經網路來說,情況一般比較複雜...
歸一化的作用
一 定義 標準化是將不同變化範圍的值對映到相同的固定範圍中,常見的是 0,1 此時亦稱歸一化,也可以是 1,1 範圍。二 形式 1.min max標準化 也稱為離差標準化,是對原始資料的線性變換,使結果值對映到 0 1 之間。轉換函式如下 2.z score標準化方法 這種方法給予原始資料的均值 m...