深度学习中 batchnorm 层是咋回事?
作者:Double_V_?來源:CSDN?原文:https://blog.csdn.net/qq_25737169/article/details/79048516?版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請附上博文鏈接!
作者:Double_V_?來源:CSDN?原文:https://blog.csdn.net/qq_25737169/article/details/79048516?版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請附上博文鏈接!
作者:Double_V_?來源:CSDN?原文:https://blog.csdn.net/qq_25737169/article/details/79048516?版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請附上博文鏈接!
作者:Double_V_?來源:CSDN?原文:https://blog.csdn.net/qq_25737169/article/details/79048516?版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請附上博文鏈接!
參考了這個博客, 博主寫的非常好? ? ?https://blog.csdn.net/qq_25737169/article/details/79048516
?
?前言:Batchnorm是深度網(wǎng)絡(luò)中經(jīng)常用到的加速神經(jīng)網(wǎng)絡(luò)訓(xùn)練,加速收斂速度及穩(wěn)定性的算法,可以說是目前深度網(wǎng)絡(luò)必不可少的一部分。
本文旨在用通俗易懂的語言,對深度學(xué)習(xí)的常用算法–batchnorm的原理及其代碼實現(xiàn)做一個詳細的解讀。本文主要包括以下幾個部分。
?
第一節(jié):Batchnorm主要解決的問題
首先,此部分也即是講為什么深度網(wǎng)絡(luò)會需要batchnormbatchnormbatchnorm,我們都知道,深度學(xué)習(xí)的話尤其是在CV上都需要對數(shù)據(jù)做歸一化,因為深度神經(jīng)網(wǎng)絡(luò)主要就是為了學(xué)習(xí)訓(xùn)練數(shù)據(jù)的分布,并在測試集上達到很好的泛化效果,但是,如果我們每一個batch輸入的數(shù)據(jù)都具有不同的分布,顯然會給網(wǎng)絡(luò)的訓(xùn)練帶來困難。另一方面,數(shù)據(jù)經(jīng)過一層層網(wǎng)絡(luò)計算后,其數(shù)據(jù)分布也在發(fā)生著變化,此現(xiàn)象稱為InternalInternalInternal?CovariateCovariateCovariate?ShiftShiftShift,接下來會詳細解釋,會給下一層的網(wǎng)絡(luò)學(xué)習(xí)帶來困難。batchnormbatchnormbatchnorm直譯過來就是批規(guī)范化,就是為了解決這個分布變化問題。
1.1 Internal Covariate Shift
Internal?Covariate?Shift?:此術(shù)語是google小組在論文BatchBatchBatch?NormalizatoinNormalizatoinNormalizatoin?中提出來的,其主要描述的是:訓(xùn)練深度網(wǎng)絡(luò)的時候經(jīng)常發(fā)生訓(xùn)練困難的問題,因為,每一次參數(shù)迭代更新后,上一層網(wǎng)絡(luò)的輸出數(shù)據(jù)經(jīng)過這一層網(wǎng)絡(luò)計算后,數(shù)據(jù)的分布會發(fā)生變化,為下一層網(wǎng)絡(luò)的學(xué)習(xí)帶來困難(神經(jīng)網(wǎng)絡(luò)本來就是要學(xué)習(xí)數(shù)據(jù)的分布,要是分布一直在變,學(xué)習(xí)就很難了),此現(xiàn)象稱之為InternalInternalInternal?CovariateCovariateCovariate?ShiftShiftShift。
Batch?Normalizatoin?之前的解決方案就是使用較小的學(xué)習(xí)率,和小心的初始化參數(shù),對數(shù)據(jù)做白化處理,但是顯然治標不治本。
1.2 covariate shift
Internal?Covariate?Shift?和CovariateShift具有相似性,但并不是一個東西,前者發(fā)生在神經(jīng)網(wǎng)絡(luò)的內(nèi)部,所以是Internal,后者發(fā)生在輸入數(shù)據(jù)上。Covariate?Shift主要描述的是由于訓(xùn)練數(shù)據(jù)和測試數(shù)據(jù)存在分布的差異性,給網(wǎng)絡(luò)的泛化性和訓(xùn)練速度帶來了影響,我們經(jīng)常使用的方法是做歸一化或者白化。想要直觀感受的話,看下圖:
?
Covariate?Shift?就是描述的輸入數(shù)據(jù)分布不一致的現(xiàn)象,對數(shù)據(jù)做歸一化當然可以加快訓(xùn)練速度,能對數(shù)據(jù)做去相關(guān)性,突出它們之間的分布相對差異就更好了。Batchnorm做到了,前文已說過,Batchnorm是歸一化的一種手段,極限來說,這種方式會減小圖像之間的絕對差異,突出相對差異,加快訓(xùn)練速度。所以說,并不是在深度學(xué)習(xí)的所有領(lǐng)域都可以使用BatchNorm,下文會寫到其不適用的情況。
第二節(jié):Batchnorm 原理解讀
本部分主要結(jié)合原論文部分,排除一些復(fù)雜的數(shù)學(xué)公式,對BatchNorm的原理做盡可能詳細的解釋。
之前就說過,為了減小Internal?Covariate?Shift,對神經(jīng)網(wǎng)絡(luò)的每一層做歸一化不就可以了,假設(shè)將每一層輸出后的數(shù)據(jù)都歸一化到0均值,1方差,滿足正太分布,但是,此時有一個問題,每一層的數(shù)據(jù)分布都是標準正太分布,導(dǎo)致其完全學(xué)習(xí)不到輸入數(shù)據(jù)的特征,因為,費勁心思學(xué)習(xí)到的特征分布被歸一化了,因此,直接對每一層做歸一化顯然是不合理的。
但是如果稍作修改,加入可訓(xùn)練的參數(shù)做歸一化,那就是BatchNorm實現(xiàn)的了,接下來結(jié)合下圖的偽代碼做詳細的分析:
之所以稱之為batchnorm是因為所norm的數(shù)據(jù)是一個batch的,
1.先求出此次批量數(shù)據(jù)xxx的均值
2.求出此次batch的方差
3.接下來就是對xxx做歸一化
轉(zhuǎn)載于:https://www.cnblogs.com/Lin-Yi/p/10406568.html
總結(jié)
以上是生活随笔為你收集整理的深度学习中 batchnorm 层是咋回事?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavsScript中比较大小总结---
- 下一篇: autoenv的使用方法