【深度學習】——BN層(batch normalization)

目錄

一、“Internal Covariate Shift”問題

二、BatchNorm的本質思想

兩個參數r和β的意義——精髓所在

三、訓練階段如何做BatchNorm

四、BatchNorm的推理(Inference)過程

五、BatchNorm的好處


一般使用在卷積層后、激活層前

Batch Normalization作為最近一年來DL的重要成果,已經廣泛被證明其有效性和重要性。雖然有些細節處理還解釋不清其理論原因,但是實踐證明好用才是真的好,別忘了DL從Hinton對深層網絡做Pre-Train開始就是一個經驗領先于理論分析的偏經驗的一門學問。本文是對論文《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》的導讀。

  機器學習領域有個很重要的假設:IID獨立同分布假設,就是假設訓練數據和測試數據是滿足相同分布的,這是通過訓練數據獲得的模型能夠在測試集獲得好的效果的一個基本保障。那BatchNorm的作用是什么呢?BatchNorm就是在深度神經網絡訓練過程中使得每一層神經網絡的輸入保持相同分布的。

  接下來一步一步的理解什么是BN。

  為什么深度神經網絡隨著網絡深度加深,訓練起來越困難,收斂越來越慢?這是個在DL領域很接近本質的好問題。很多論文都是解決這個問題的,比如ReLU激活函數,再比如Residual Network,BN本質上也是解釋并從某個不同的角度來解決這個問題的。

一、“Internal Covariate Shift”問題

  從論文名字可以看出,BN是用來解決“Internal Covariate Shift”問題的,那么首先得理解什么是“Internal Covariate Shift”?

  論文首先說明Mini-Batch SGD相對于One Example SGD的兩個優勢:梯度更新方向更準確;并行計算速度快;(為什么要說這些?因為BatchNorm是基于Mini-Batch SGD的,所以先夸下Mini-Batch SGD,當然也是大實話);然后吐槽下SGD訓練的缺點:超參數調起來很麻煩。(作者隱含意思是用BN就能解決很多SGD的缺點)

  接著引入covariate shift的概念如果ML系統實例集合<X,Y>中的輸入值X的分布老是變,這不符合IID假設,網絡模型很難穩定的學規律,這不得引入遷移學習才能搞定嗎,我們的ML系統還得去學習怎么迎合這種分布變化啊。對于深度學習這種包含很多隱層的網絡結構,在訓練過程中,因為各層參數不停在變化,所以每個隱層都會面臨covariate shift的問題,也就是在訓練過程中,隱層的輸入分布老是變來變去,這就是所謂的“Internal Covariate Shift”,Internal指的是深層網絡的隱層,是發生在網絡內部的事情,而不是covariate shift問題只發生在輸入層。

  然后提出了BatchNorm的基本思想:能不能讓每個隱層節點的激活輸入分布固定下來呢?這樣就避免了“Internal Covariate Shift”問題了。

  BN不是憑空拍腦袋拍出來的好點子,它是有啟發來源的:之前的研究表明如果在圖像處理中對輸入圖像進行白化(Whiten)操作的話——所謂白化就是對輸入數據分布變換到0均值,單位方差的正態分布——那么神經網絡會較快收斂,那么BN作者就開始推論了:圖像是深度神經網絡的輸入層,做白化能加快收斂,那么其實對于深度網絡來說,其中某個隱層的神經元是下一層的輸入,意思是其實深度神經網絡的每一個隱層都是輸入層,不過是相對下一層來說而已,那么能不能對每個隱層都做白化呢?這就是啟發BN產生的原初想法,而BN也確實就是這么做的,可以理解為對深層神經網絡每個隱層神經元的激活值做簡化版本的白化操作。

二、BatchNorm的本質思想

  BN的基本思想其實相當直觀:因為深層神經網絡在做非線性變換前的激活輸入值(就是那個x=WU+B,U是輸入)隨著網絡深度加深或者在訓練過程中,其分布逐漸發生偏移或者變動,之所以訓練收斂慢,一般是整體分布逐漸往非線性函數的取值區間的上下限兩端靠近(對于Sigmoid函數來說,意味著激活輸入值WU+B是大的負值或正值),所以這導致反向傳播時低層神經網絡的梯度消失,這是訓練深層神經網絡收斂越來越慢的本質原因而BN就是通過一定的規范化手段,把每層神經網絡任意神經元這個輸入值的分布強行拉回到均值為0方差為1的標準正態分布,其實就是把越來越偏的分布強制拉回比較標準的分布,這樣使得激活輸入值落在非線性函數對輸入比較敏感的區域,這樣輸入的小變化就會導致損失函數較大的變化,意思是這樣讓梯度變大,避免梯度消失問題產生,而且梯度變大意味著學習收斂速度快,能大大加快訓練速度。

  THAT’S IT。其實一句話就是:對于每個隱層神經元,把逐漸向非線性函數映射后向取值區間極限飽和區靠攏的輸入分布強制拉回到均值為0方差為1的比較標準的正態分布,使得非線性變換函數的輸入值落入對輸入比較敏感的區域,以此避免梯度消失問題。因為梯度一直都能保持比較大的狀態,所以很明顯對神經網絡的參數調整效率比較高,就是變動大,就是說向損失函數最優值邁動的步子大,也就是說收斂地快。BN說到底就是這么個機制,方法很簡單,道理很深刻。

  上面說得還是顯得抽象,下面更形象地表達下這種調整到底代表什么含義。

? 圖1 ?幾個正態分布

  假設某個隱層神經元原先的激活輸入x取值符合正態分布,正態分布均值是-2,方差是0.5,對應上圖中最左端的淺藍色曲線,通過BN后轉換為均值為0,方差是1的正態分布(對應上圖中的深藍色圖形),意味著什么,意味著輸入x的取值正態分布整體右移2(均值的變化),圖形曲線更平緩了(方差增大的變化)。這個圖的意思是,BN其實就是把每個隱層神經元的激活輸入分布從偏離均值為0方差為1的正態分布通過平移均值壓縮或者擴大曲線尖銳程度,調整為均值為0方差為1的正態分布。

  那么把激活輸入x調整到這個正態分布有什么用?首先我們看下均值為0,方差為1的標準正態分布代表什么含義:

圖2 ?均值為0方差為1的標準正態分布圖

  這意味著在一個標準差范圍內,也就是說64%的概率x其值落在[-1,1]的范圍內,在兩個標準差范圍內,也就是說95%的概率x其值落在了[-2,2]的范圍內。那么這又意味著什么?我們知道,激活值x=WU+B,U是真正的輸入,x是某個神經元的激活值,假設非線性函數是sigmoid,那么看下sigmoid(x)其圖形:

圖3. Sigmoid(x)

及sigmoid(x)的導數為:G’=f(x)*(1-f(x)),因為f(x)=sigmoid(x)在0到1之間,所以G’在0到0.25之間,其對應的圖如下:

圖4 ?Sigmoid(x)導數圖

  假設沒有經過BN調整前x的原先正態分布均值是-6,方差是1,那么意味著95%的值落在了[-8,-4]之間,那么對應的Sigmoid(x)函數的值明顯接近于0,這是典型的梯度飽和區,在這個區域里梯度變化很慢,為什么是梯度飽和區?請看下sigmoid(x)如果取值接近0或者接近于1的時候對應導數函數取值,接近于0,意味著梯度變化很小甚至消失。而假設經過BN后,均值是0,方差是1,那么意味著95%的x值落在了[-2,2]區間內,很明顯這一段是sigmoid(x)函數接近于線性變換的區域,意味著x的小變化會導致非線性函數值較大的變化,也即是梯度變化較大,對應導數函數圖中明顯大于0的區域,就是梯度非飽和區。

  從上面幾個圖應該看出來BN在干什么了吧?其實就是把隱層神經元激活輸入x=WU+B從變化不拘一格的正態分布通過BN操作拉回到了均值為0,方差為1的正態分布,即原始正態分布中心左移或者右移到以0為均值,拉伸或者縮減形態形成以1為方差的圖形。什么意思?就是說經過BN后,目前大部分Activation的值落入非線性函數的線性區內,其對應的導數遠離導數飽和區,這樣來加速訓練收斂過程。

兩個參數r和β的意義——精髓所在

  但是很明顯,看到這里,稍微了解神經網絡的讀者一般會提出一個疑問:如果都通過BN,那么不就跟把非線性函數替換成線性函數效果相同了?這意味著什么?我們知道,如果是多層的線性函數變換其實這個深層是沒有意義的,因為多層線性網絡跟一層線性網絡是等價的。這意味著網絡的表達能力下降了,這也意味著深度的意義就沒有了。所以BN為了保證非線性的獲得,對變換后的滿足均值為0方差為1的x又進行了scale加上shift操作(y=scale*x+shift),每個神經元增加了兩個參數scale和shift參數,這兩個參數是通過訓練學習到的,意思是通過scale和shift把這個值從標準正態分布左移或者右移一點并長胖一點或者變瘦一點,每個實例挪動的程度不一樣,這樣等價于非線性函數的值從正中心周圍的線性區往非線性區動了動。核心思想應該是想找到一個線性和非線性的較好平衡點,既能享受非線性的較強表達能力的好處,又避免太靠非線性區兩頭使得網絡收斂速度太慢。當然,這是我的理解,論文作者并未明確這樣說。但是很明顯這里的scale和shift操作是會有爭議的,因為按照論文作者論文里寫的理想狀態,就會又通過scale和shift操作把變換后的x調整回未變換的狀態,那不是饒了一圈又繞回去原始的“Internal Covariate Shift”問題里去了嗎,感覺論文作者并未能夠清楚地解釋scale和shift操作的理論原因。

三、訓練階段如何做BatchNorm

  上面是對BN的抽象分析和解釋,具體在Mini-Batch SGD下做BN怎么做?其實論文里面這塊寫得很清楚也容易理解。為了保證這篇文章完整性,這里簡單說明下。

  假設對于一個深層神經網絡來說,其中兩層結構如下:

? 圖5 ?DNN其中兩層

  要對每個隱層神經元的激活值做BN,可以想象成每個隱層又加上了一層BN操作層,它位于X=WU+B激活值獲得之后,非線性函數變換之前,其圖示如下:

? 圖6. BN操作

  對于Mini-Batch SGD來說,一次訓練過程里面包含m個訓練實例,其具體BN操作就是對于隱層內每個神經元的激活值來說,進行如下變換:

  要注意,這里t層某個神經元的x(k)不是指原始輸入,就是說不是t-1層每個神經元的輸出,而是t層這個神經元的線性激活x=WU+B,這里的U才是t-1層神經元的輸出。變換的意思是:某個神經元對應的原始的激活x通過減去mini-Batch內m個實例獲得的m個激活x求得的均值E(x)并除以求得的方差Var(x)來進行轉換。

  上文說過經過這個變換后某個神經元的激活x形成了均值為0,方差為1的正態分布,目的是把值往后續要進行的非線性變換的線性區拉動,增大導數值,增強反向傳播信息流動性,加快訓練收斂速度。但是這樣會導致網絡表達能力下降,為了防止這一點,每個神經元增加兩個調節參數(scale和shift),這兩個參數是通過訓練來學習到的,用來對變換后的激活反變換,使得網絡表達能力增強,即對變換后的激活進行如下的scale和shift操作,這其實是變換的反操作:

  BN其具體操作流程,如論文中描述的一樣:

  過程非常清楚,就是上述公式的流程化描述,這里不解釋了,直接應該能看懂。

四、BatchNorm的推理(Inference)過程

  BN在訓練的時候可以根據Mini-Batch里的若干訓練實例進行激活數值調整,但是在推理(inference)的過程中,很明顯輸入就只有一個實例,看不到Mini-Batch其它實例,那么這時候怎么對輸入做BN呢?因為很明顯一個實例是沒法算實例集合求出的均值和方差的。這可如何是好?

  既然沒有從Mini-Batch數據里可以得到的統計量,那就想其它辦法來獲得這個統計量,就是均值和方差。可以用從所有訓練實例中獲得的統計量來代替Mini-Batch里面m個訓練實例獲得的均值和方差統計量,因為本來就打算用全局的統計量,只是因為計算量等太大所以才會用Mini-Batch這種簡化方式的,那么在推理的時候直接用全局統計量即可。

  決定了獲得統計量的數據范圍,那么接下來的問題是如何獲得均值和方差的問題。很簡單,因為每次做Mini-Batch訓練時,都會有那個Mini-Batch里m個訓練實例獲得的均值和方差,現在要全局統計量,只要把每個Mini-Batch的均值和方差統計量記住,然后對這些均值和方差求其對應的數學期望即可得出全局統計量,即:

  有了均值和方差,每個隱層神經元也已經有對應訓練好的Scaling參數和Shift參數,就可以在推導的時候對每個神經元的激活數據計算NB進行變換了,在推理過程中進行BN采取如下方式:

  這個公式其實和訓練時

  是等價的,通過簡單的合并計算推導就可以得出這個結論。那么為啥要寫成這個變換形式呢?我猜作者這么寫的意思是:在實際運行的時候,按照這種變體形式可以減少計算量,為啥呢?因為對于每個隱層節點來說:

        

  

  都是固定值,這樣這兩個值可以事先算好存起來,在推理的時候直接用就行了,這樣比原始的公式每一步驟都現算少了除法的運算過程,乍一看也沒少多少計算量,但是如果隱層節點個數多的話節省的計算量就比較多了。

五、BatchNorm的好處

  BatchNorm為什么NB呢,關鍵還是效果好。不僅僅極大提升了訓練速度,收斂過程大大加快;②還能增加分類效果,一種解釋是這是類似于Dropout的一種防止過擬合的正則化表達方式,所以不用Dropout也能達到相當的效果;③另外調參過程也簡單多了,對于初始化要求沒那么高,而且可以使用大的學習率等。總而言之,經過這么簡單的變換,帶來的好處多得很,這也是為何現在BN這么快流行起來的原因。

作者:郭耀華
出處:http://www.guoyaohua.com

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/255811.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/255811.shtml
英文地址,請注明出處:http://en.pswp.cn/news/255811.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

打印池

餐飲行業&#xff0c;打印池是必要的部件。 實現原理&#xff1a;每一臺打印機都有自己的任務隊列和處理任務隊列的線程。 unit untPrintTask; interface uses System.SysUtils, System.Classes, Datasnap.DBClient, frxclass, System.Generics.Collections; type TBillContent…

JAXB vs XStream

2019獨角獸企業重金招聘Python工程師標準>>> JAXB vs XStream 博客分類&#xff1a; java JAXB vs XStream 這兩東東本質上是有差別的&#xff0c;JAXB稱為OX binding工具&#xff0c;XStream應該算序列化工具&#xff0c;但OX binding工具也會marshall和unmarsha…

ABB 機器人 DRVIO_1通信報警

ABB 機器人DRVIO_1通信報警 2014.06.13 ABB1600弧焊機器人&#xff0c;從A地搬運到B地&#xff0c;到達B地后&#xff0c;機器人上電&#xff0c;報DRVIO_1通信故障&#xff0c;機器人進入故障停止模式。 DRVIO_1為LOCAL_GENERIC類型的ABB內部LOCAL總線類型的單元實例。 故障…

S2SH CRUD 整合

S2SH CRUD 整合 采用的框架 Struts2Spring4Hbiernate4. 目錄結構 &#xff1a; EmployeeAction: 1 package com.xx.ssh.actions;2 3 import java.io.ByteArrayInputStream;4 import java.io.InputStream;5 import java.io.UnsupportedEncodingException;6 import java.util.…

ABB 機器人 添加多任務

首先&#xff0c;需要啟用多任務選項的控制器。 要做到這一點&#xff0c;創建一個新的機器人控制器RobotStudio站 - >選擇機器人&#xff08;控制器菜單&#xff09; - >.................. - >系統生成器 - >選擇控制器 - >修改...下一頁 - >下一步 - >…

poj2594(二分圖,最小路徑覆蓋變形)

Treasure ExplorationTime Limit: 6000MS Memory Limit: 65536KTotal Submissions: 7611 Accepted: 3126Description Have you ever read any book about treasure exploration? Have you ever see any film about treasure exploration? Have you ever explored treasure? …

【機器視覺】——相機鏡頭篇

目錄 一、相關概念 1、相機 2、鏡頭 二、相關參數 1、相機參數 1)芯片尺寸

閉包(計算機科學)

在計算機科學中&#xff0c;閉包&#xff08;Closure&#xff09;又稱詞法閉包或函數閉包。是引用了自由變量的函數。這個被引用的自由變量將會和函數在一起。即使離開了創建它的環境也不例外。所以另一種關于閉包的說法&#xff1a;由函數和其引用相關的環境構成的實體。閉包在…

C語言小機器人

[cpp] view plaincopyprint? # include <stdio.h> # include <stdlib.h> # define MAXSTR 200 # define REBOT "小C說: " # define YOUR "您 說: " # define EXIT "-e\n" # define NOREPLY "我不知道你說什么呢…

分享12306搶票心得-終極秒殺思路篇

12306搶票的關鍵拼的就是整點出票的速度&#xff0c;快的幾秒鐘&#xff0c;慢的幾分鐘&#xff0c;本文提供終極搶票攻略&#xff0c;通過多線程掃描上萬個CDN&#xff0c;來大幅度提升出票速度。準備一&#xff1a;需要了解CDN和切站的機制&#xff0c;請參考&#xff1a;分享…

JVM內幕:Java虛擬機詳解

為什么80%的碼農都做不了架構師&#xff1f;>>> 這篇文章解釋了Java 虛擬機&#xff08;JVM&#xff09;的內部架構。下圖顯示了遵守 Java SE 7 規范的典型的 JVM 核心內部組件。 上圖顯示的組件分兩個章節解釋。第一章討論針對每個線程創建的組件&#xff0c;第二章…

【機器視覺】——光源篇(分類、選型)

目錄 ? 一、光源相關知識 1、光的作用 2、光的顏色 二、光源的種類

ABB機器人 系統參數配置

系統參數用于定義系統配置并在出廠時根據客戶的需要定義。 可使用 FlexPendant 或 RobotStudio Online 編輯系統參數。 此步驟介紹如何查看 系統參數配置。 操作 &#xff1a; 1. 在 ABB 菜單上&#xff0c;點擊控制面板。 2. 點擊配置。顯示選定主題的可用類型列表。 3. 點…

MFC BCGControlBar 庫 使用方法

安裝 BCGControlBar 庫到你的計算機&#xff1a; 解壓縮 BCGControlBar.zip &#xff08;比如&#xff0c;到 c:\bcg 目錄中&#xff09;把 c:\bcg\bin 增加到你的 path 環境變量中&#xff0c;運行 Visual C 并且打開 Tools | Options 對話框&#xff0c;切換到Directories 頁…

四則運算2開發簡介

四則運算2在四則運算1的基礎之上&#xff0c;又添加了新的功能&#xff0c;但是我覺得四則運算2的難度比四則運算1增大了很多&#xff0c;我在編程的過程中&#xff0c;遇到的最大難度就是不知該如何更好的融合各個功能之間的關系。 寫到現在&#xff0c;四則運算2主要實現了以…

ABB機器人的 備份與恢復

保存內容 備份功能可保存上下文中的所有系統參數、系統模塊和程序模塊。 備份內容 數據保存于用戶指定的目錄中。 默認路徑可加以設置。 目錄分為四個子目錄&#xff1a;Backinfo、Home、Rapid 和 Syspar。 System.xml 也保存于包含用戶設置的 ../backup &#xff08;根…

flask項目開發中,遇到http 413錯誤

在flask項目中&#xff0c;上傳文件時后臺報http 413 Request Entity Too Large 請求體太大錯誤&#xff01; 解決的2種方法&#xff1a; 1.在flask配置中設置 MAX_CONTENT_LENGTH的值; 如設置為20M ( MAX_CONTENT_LENGTH20*1024*1024) 這時小于20M的文件都可以上傳 相關連接&…

【機器視覺】——畸變與矯正

目錄 一、什么是畸變?畸變的原因是什么? 1、徑向畸變(桶形畸變和枕形畸變)

ApplicationContextAware 接口

一、這個接口有什么用&#xff1f; 當一個類實現了這個接口&#xff08;ApplicationContextAware&#xff09;之后&#xff0c;這個類就可以方便獲得ApplicationContext中的所有bean。換句話說&#xff0c;就是這個類可以直接獲取spring配置文件中&#xff0c;所有有引用到的be…