1. 程式人生 > 實用技巧 >Accelerating Deep Network Training by Reducing Internal Covariate Shift-BN歸一化解讀

Accelerating Deep Network Training by Reducing Internal Covariate Shift-BN歸一化解讀

作者:18屆CYL

日期:2020-9-1

期刊:arxiv

標籤: BN歸一化

論文:《Batch Nomalization:Accelerating Deep Network Training by Reducing Internal Covariate Shift》

一、背景知識

1、2015年 收錄在arxiv。 介紹了一種歸一化方法,可以加快收斂速度,減少學習率,dropout比例這種超引數的設計。在15年之後的模型中基本都會用到。作者:Sergey loffe、Christian Szegedy

2、機器學習領域有一個很重要的假設:IID獨立同分布。(測試集和訓練集的分佈完全相同)。而神經網路其實的整體目標可以說是學習資料的分佈。

3、神經網路中通常都會設定一個batch_size,也就是一次訓練扔進去的資料數量(平行計算),合適大小的batch_size可以防止每次訓練單獨的資料導致的神經網路一直被‘區域性視野困擾而四處亂撞’難以收斂。也不需要一次性扔進所有資料(計算能力受限)。
在這裡插入圖片描述

4、深層神經網路訓練收斂慢的原因之一是:非線性變換前的啟用輸入值隨著訓練的進行朝著兩個極端前進,導致梯度彌散。
在這裡插入圖片描述

5、神經網路的輸入通常需要做歸一化,已經證明了這種方式可以提高正確率,最有效的歸一化是“白化”,可以降低特徵相關性,均值為0,方差為1。但是缺點是降低特徵相關性這一步計算量巨大。還有一個缺點是白化操作不是處處可微的。

二、提出問題

1、由於在訓練過程中前一層的引數一直在變化,所以導致後一層的輸入的分佈在不斷的改變,這就是internal covariate shift (內部協變數轉變)現象,會讓深層網路更加難以收斂,而且會導致學習率、dropout率、batch_size大小、初始值等等超引數需要小心翼翼的除錯。

三、解決方法

1、然後作者受到白化的啟發 想:每一層的輸入之前都做一下歸一化它不香嗎?實際上他也的確是採用了白化的簡易版本。具體就是想辦法對深層網路前一層的非線性變換前的啟用輸入做歸一化,歸一成均值為0,方差為1。這樣一是解決 輸入的分佈在不斷的改變(internal covariate shift)這個主要問題,二是在一定程度上解決梯度彌散問題。

在這裡插入圖片描述

四、具體方法&關注細節

1、BN歸一化(batch normalization)的基本公式
均值為0,方差為1:
在這裡插入圖片描述

評價:前面說過了變成均值為0,方差為1的正態分佈,可以統一每一層的輸入分佈,也會在非線性變換之前將向兩端靠攏的值拉到中間。 但是我們也可以很容易理解:這樣簡單粗暴的標準歸一化後讓上一層學到的非線性特徵被消沒了,該有的變化也沒有了(一直沒有變化還學習啥呀)

2、BN歸一化的實際公式
在原有的基礎上加一點偏離
在這裡插入圖片描述

為了解決標準歸一化帶來的問題引入了兩個調節引數(自學習引數scale和shift),這兩個引數是通過訓練學習到的,用來使網路的表達能力增強,論文說這兩個引數自學習的最終結果可以既達到歸一化的優點又維持原輸入學習到的特徵。我個人理解:既然我們的自學習過程總會朝向最優的情況前進,那麼我們在理解引入的自學習引數時,只需要考慮這兩個引數最終在無限好的情況下是否能好到讓x^這個標準歸一化通過平移變胖變瘦來改變分佈到達原輸入的有效分佈。

3、最終流程
在這裡插入圖片描述
(其實與上面一毛一樣)

四、BN訓練和測試時的小細節

BN在訓練時由於一個batch_size大小的資料被一次性扔進去,而且是平行計算,所以E(x)是這幾個資料輸入後同一個神經元的值的平均值,方差同理。那麼再測試的時候一次只扔進去一個數據該咋辦?那就是:採用全域性統計量做輸入的時候的平均值和方差。

五、閃耀的結果

1、視覺化with或without BN的訓練過程

在這裡插入圖片描述
圖a:正確率-訓練輪次圖 圖bc:輸入分佈變化圖

2、超級加速

在這裡插入圖片描述

3、其他優點

  • 初始學習率可以非常大,讓模型快速收斂,而且不需要謹小慎微的調學習率
  • 一些情況下可以取代dropout
  • 一定程度的正確率提升
    在這裡插入圖片描述

注:個人理解,若有差錯請指正。若有侵權請聯絡我們。