[轉]DeepLearning(基於caffe)優化策略--Normalization:BN、WN、LN

轉自:龍王Black的博客http://blog.csdn.net/sihailongwang/article/details/72818603
Yelena_11的博客:http://blog.csdn.net/yelena_11/article/details/53924225
非常感謝!
另外還有一部分資料內容:
知乎:請問batch_normalization做了normalization後爲什麼要變回來?:
https://www.zhihu.com/question/55917730/answer/154269264
[深度學習] Batch Normalization算法介紹 :http://blog.csdn.net/lhanchao/article/details/70308092

BN的好處:更高的學習率,更快的訓練過程,防止過擬合,移除或使用較小的dropout,取消局部響應歸一化層。

第一部分

一、簡介

如果將googlenet稱之爲google家的inception v1的話,其Batch Normalization(http://arxiv.org/pdf/1502.03167v3.pdf)文章講的就是BN-inception v1。

它不是網絡本身本質上的內容修改,而是爲了將conv層的輸出做normalization以使得下一層的更新能夠更快,更準確。

二、網絡分析

caffe官方將BN層拆成兩個層來實驗,一個是https://github.com/BVLC/caffe/blob/master/include/caffe/layers/batch_norm_layer.hpp

另外一個是https://github.com/BVLC/caffe/blob/master/include/caffe/layers/scale_layer.hpp

其具體使用方法可以參考:https://github.com/KaimingHe/deep-residual-networks/blob/master/prototxt/ResNet-50-deploy.prototxt

中的BatchNorm與Scale。

BN-inceptionv1訓練速度較原googlenet快了14倍,在imagenet分類問題的top5上達到4.8%,超過了人類標註top5準確率

補充說明:

在Caffe中使用Batch Normalization需要注意以下兩點,

  1. 要配合Scale層一起使用,具體參見http://blog.csdn.net/sunbaigui/article/details/50807398以及Residual Network

  2. 訓練的時候,將BN層的use_global_stats設置爲false,然後測試的時候將use_global_stats設置爲true,不然訓練的時候會報“NAN”或者模型不收斂 —— 這個其實挺難注意到的

另附caffe框架學習的源碼鏈接:
https://github.com/BVLC/caffe
http://caffe.berkeleyvision.org/

第二部分

        我們知道,深度學習是一種高性能的解決模式識別問題的模型算法,尤其是在計算機視覺方面,但隨之而來的,對深度學習進行優化也成爲了一個大家討論的話題。這次總結的是三種深度學習的Normalization。

一、Batch Normalization

什麼是Batch Normalization?

        即批標準化,和普通的標準化類似,是將數據進行歸一化的操作,在網絡(Network)中也屬於一層操作。

爲什麼需要Batch Normalization?

        衆所周知,深度學習中的學習率(Learning Rate)是我們需要調整的參數之一,學習率太高,會導致Loss值“爆炸”(所謂爆炸,就是loss值過於大,失去了其的意義);學習率太小,Loss值一直處於平緩的狀態,尋找一個合適的Rate,與你初始的學習率是有關的,如果初始的太大,會導致需要太多的時間,如果初始的太小,有可能錯失了“最優參數”,於是BN算法就此誕生。

Batch Normalization的優點

        1.因爲BN可以使得訓練的速度飆升,所以就可以選擇較大的初始學習率,它能夠使得衰減的速度變快,從而得到“最優學習率”,再也不用慢慢的調整學習率了
        2.採用BN之後,你就可以移除dropout、L2正則項參數了,因爲BN可以提高網絡泛化的能力(有待以後去體會)
        3.不用再使用局部相應歸一化層了,因爲BN本身就是歸一化操作

怎麼使用Batch Normalization?

        具體操作如下:

        我們需要輸入的是待歸一化的Xi,最後我們得到的是BN之後的Xi

        特此說明:提出BN的大佬爲了保持模型的表達能力,又增加了兩個變量參數

        

Batch Normalization用在何處?

        一般情況下,用在非線性激活函數之前,或者非線性激活函數之後

如何在caffe中進行應用呢?

        在caffe中,BN被拆成兩個文件(scale_layer.cpp和batch_normalization_layer.cpp)

        訓練時,在deploy.prototxt中寫如下代碼:

  1. layer{  
  2.     bottom: “conv1”  
  3.     top: “conv1”  
  4.     name: “bn_conv1”  
  5.     type: “BatchNorm”  
  6.     batch_norm_param {  
  7.         use_global_stats: false  
  8.     }  
  9. }  
  10.   
  11. layer{  
  12.     bottom: “conv1”  
  13.     top: “conv1”  
  14.     name: “scale_conv1”  
  15.     type: “Scale”  
  16.     scale_param {  
  17.         bias_term: false  
  18.     }  
  19. }  
layer{ 
bottom: “conv1”
top: “conv1”
name: “bn_conv1”
type: “BatchNorm”
batch_norm_param {
use_global_stats: false
}
}

layer{
bottom: “conv1”
top: “conv1”
name: “scale_conv1”
type: “Scale”
scale_param {
bias_term: false
}
}

        測試時,在deploy.prototxt中寫如下代碼:

  1. layer{  
  2.     bottom: “conv1”  
  3.     top: “conv1”  
  4.     name: “bn_conv1”  
  5.     type: “BatchNorm”  
  6.     batch_norm_param {  
  7.         use_global_stats: true  
  8.     }  
  9. }  
  10.   
  11. layer{  
  12.     bottom: “conv1”  
  13.     top: “conv1”  
  14.     name: “scale_conv1”  
  15.     type: “Scale”  
  16.     scale_param {  
  17.         bias_term: false  
  18.     }  
  19. }  
layer{ 
bottom: “conv1”
top: “conv1”
name: “bn_conv1”
type: “BatchNorm”
batch_norm_param {
use_global_stats: true
}
}

layer{
bottom: “conv1”
top: “conv1”
name: “scale_conv1”
type: “Scale”
scale_param {
bias_term: false
}
}

二、Layer Normalization

什麼是Layer Normalization?

         即層標準化,和普通的標準化類似,是將網絡中的層進行歸一化的操作。

爲什麼需要Layer Normalization?

        對於RNN模型來說,歸一化的時候Batch Normalization不再適合,在RNN模型裏,sequence的長度是不一致的,正是由於這種不一致的問題,導致BN使用起來效果不佳,借用網上的一句話,RNN的深度不是固定的,不同的time-step需要保存不同的statics特徵,可能存在一個特殊的sequence比其sequence長,所以對sequence進行Batch Normalization計算起來比較麻煩。於是乎,Layer Normalization登場了。

Layer Normalization的優點

        跟BN類似,也具有Normalization的優點,更適用於RNN模型

怎麼使用Layer Normalization?

        我們需要明確的是LN是對層進行歸一化的,但是也是對某一層所有的dataset進行歸一化的。

        具體操作如下:

        一般的通式

        針對RNN的公式

        由此可見,LN中同層輸入擁有相同的均值和方差,不同輸入擁有不同的均值和方差;而BN是同一個minibatch中的輸入擁有相同的均值和方差,而不同minibatch的輸入擁有不同的均值和方差

三、Weight Normalization

什麼是Weight Normalization?

        即權重歸一化,也就是對權重值進行歸一化。

Weight Normalization的優點

        1.WN是通過重寫深度網絡的權重來進行加速的,沒有引入對minibatch的依賴,更適合於RNN網絡

        2.引入更少的噪聲

        3.不需要額外的空間進行存儲minibatch的均值和方差,對時間的開銷也小,所以速度會更快

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章