LRN和Batch Norm
LRN
LRN全稱為L(zhǎng)ocal Response Normalization,局部相應(yīng)歸一化層。
message LRNParameter {optional uint32 local_size = 1 [default = 5];optional float alpha = 2 [default = 1.]; optional float beta = 3 [default = 0.75];enum NormRegion {ACROSS_CHANNELS = 0; WITHIN_CHANNEL = 1; }optional NormRegion norm_region = 4 [default = ACROSS_CHANNELS];optional float k = 5 [default = 1.]; enum Engine {DEFAULT = 0; CAFFE = 1; CUDNN = 2; }optional Engine engine = 6 [default = DEFAULT]; }NormRegion選擇通道間歸一化還是通道內(nèi)空間區(qū)域歸一化,默認(rèn)是AcrOSS_CHANNELS,通道間。
local_size表示:通道間時(shí)為求和的通道數(shù),通道內(nèi)是為求和的區(qū)間邊長(zhǎng),默認(rèn)為5。
alpha縮放因子,beta指數(shù)項(xiàng)。
在通道間歸一化模式中,局部區(qū)域范圍是:local_size*1*1;在通道內(nèi)歸一化模式中,局部區(qū)域范圍是:1*local_size*local_size。歸一化后的值:
實(shí)現(xiàn)代碼見:lrn_layer.cpp,也比較簡(jiǎn)單。
Batch Normalization
ZCA白化:http://blog.csdn.net/hjimce/article/details/50864602
對(duì)輸入數(shù)據(jù)進(jìn)行預(yù)處理,減均值->zscore->白化可以逐級(jí)提升隨機(jī)初始化的權(quán)重對(duì)數(shù)據(jù)分割的有效性,還可以降低overfit的可能性。Google的這篇論文http://arxiv.org/pdf/1502.03167v3.pdf, 提出了BN層。
首先,BN不是針對(duì)x(輸入的),而是針對(duì)Wx+b的,論文的解釋是:Wx+b每維的均值本身就接近0、方差接近1,所以在Wx+b后使用Batch Normalization能得到更穩(wěn)定的結(jié)果。
文中使用了類似z-score的歸一化方式:每一維度減去自身均值,再除以自身標(biāo)準(zhǔn)差。由于使用的是隨機(jī)梯度下降法,這些均值和方差也只能在當(dāng)前迭代的batch中計(jì)算。Wx+b的均值和方差是對(duì)整張map求得的,在batch_size * channel * height * width這么大的一層中,對(duì)總共batch_size*height*width個(gè)像素點(diǎn)統(tǒng)計(jì)得到一個(gè)均值和一個(gè)標(biāo)準(zhǔn)差,共得到channel組參數(shù)。
在Normalization完成后,Google的研究員仍對(duì)數(shù)值穩(wěn)定性不放心,又加入了兩個(gè)參數(shù)gamma和beta,使得:
在BP的時(shí)候,我們需要求最終的損失函數(shù)對(duì)gamma和beta兩個(gè)參數(shù)的導(dǎo)數(shù),還要求損失函數(shù)對(duì)Wx+b中的x的導(dǎo)數(shù),以便使誤差繼續(xù)向后傳播。
在訓(xùn)練的最后一個(gè)epoch時(shí),要對(duì)這一epoch所有的訓(xùn)練樣本的均值和標(biāo)準(zhǔn)差進(jìn)行統(tǒng)計(jì),這樣在一張測(cè)試圖片進(jìn)來(lái)時(shí),使用訓(xùn)練樣本中的標(biāo)準(zhǔn)差的期望和均值的期望對(duì)測(cè)試數(shù)據(jù)進(jìn)行歸一化,注意這里標(biāo)準(zhǔn)差使用的期望是其無(wú)偏估計(jì):
優(yōu)勢(shì)是:更高的學(xué)習(xí)率,更快的訓(xùn)練過(guò)程;防止過(guò)擬合,移除或使用較小的dropout;取消LRN層。
caffe的BN
參數(shù)定義:
message BatchNormParameter {// If false, accumulate global mean/variance values via a moving average. If// true, use those accumulated values instead of computing mean/variance// across the batch.optional bool use_global_stats = 1;// How much does the moving average decay each iteration?optional float moving_average_fraction = 2 [default = .999];// Small value to add to the variance estimate so that we don't divide by// zero.optional float eps = 3 [default = 1e-5]; }use_global_stats如果是真使用保存的均值和方差,否則使用滑動(dòng)平均計(jì)算新的均值和方差。測(cè)試時(shí)為真,訓(xùn)練時(shí)為假。
moving_average_fraction滑動(dòng)平均的衰減系數(shù);eps為分母附加項(xiàng)。
均值和方差的更新
BN層共存儲(chǔ)了3個(gè)數(shù)值:均值滑動(dòng)和、方差滑動(dòng)和、滑動(dòng)系數(shù)和,計(jì)算公式如下:
設(shè)moving_average_fraction為, 計(jì)算元素的數(shù)目為,均值滑動(dòng)和為,方差滑動(dòng)和為,滑動(dòng)系數(shù)和為。
如果當(dāng)前batch的均值和方差為,,則更新后:
(無(wú)偏估計(jì))
均值和方差的使用
caffe到目前仍然沒(méi)有實(shí)現(xiàn)和論文原文保持一致的BN層,即沒(méi)有 α和β 參數(shù),因此更新公式就比較簡(jiǎn)單了,為每一個(gè)channel施加如下公式:
但是需要注意的是,我們存儲(chǔ)的是均值和方差的滑動(dòng)和,因此還要做一些處理。
首先計(jì)算縮放因子: .如果,s=0.
處理后得:
均值:
標(biāo)準(zhǔn)差:??
caffe中使用batch_norm_layer和scale_layer兩個(gè)層可以達(dá)到google論文中的效果,示例:https://github.com/KaimingHe/deep-residual-networks/blob/master/prototxt/ResNet-50-deploy.prototxt
總結(jié)
以上是生活随笔為你收集整理的LRN和Batch Norm的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: html表格有哪些标签
- 下一篇: 互联网产品设计常用文档类型-BRD、MR