日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Batch Normalization 学习笔记

發布時間:2025/3/21 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Batch Normalization 学习笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載自:http://blog.csdn.net/hjimce/article/details/50866313

可參閱:知乎http://www.zhihu.com/question/38102762

一、背景意義

本篇博文主要講解2015年深度學習領域,非常值得學習的一篇文獻:《Batch Normalization: Accelerating Deep Network Training by ?Reducing Internal Covariate Shift》,這個算法目前已經被大量的應用,最新的文獻算法很多都會引用這個算法,進行網絡訓練,可見其強大之處非同一般啊。

近年來深度學習捷報連連、聲名鵲起,隨機梯度下架成了訓練深度網絡的主流方法。盡管隨機梯度下降法對于訓練深度網絡簡單高效,但是它有個毛病,就是需要我們人為的去選擇參數,比如學習率、參數初始化、權重衰減系數、Drop out比例等。這些參數的選擇對訓練結果至關重要,以至于我們很多時間都浪費在這些的調參上。那么學完這篇文獻之后,你可以不需要那么刻意的慢慢調整參數。BN算法(Batch Normalization)其強大之處如下:

(1)你可以選擇比較大的初始學習率,讓你的訓練速度飆漲。以前還需要慢慢調整學習率,甚至在網絡訓練到一半的時候,還需要想著學習率進一步調小的比例選擇多少比較合適,現在我們可以采用初始很大的學習率,然后學習率的衰減速度也很大,因為這個算法收斂很快。當然這個算法即使你選擇了較小的學習率,也比以前的收斂速度快,因為它具有快速訓練收斂的特性;

(2)你再也不用去理會過擬合中drop out、L2正則項參數的選擇問題,采用BN算法后,你可以移除這兩項了參數,或者可以選擇更小的L2正則約束參數了,因為BN具有提高網絡泛化能力的特性;

(3)再也不需要使用使用局部響應歸一化層了(局部響應歸一化是Alexnet網絡用到的方法,搞視覺的估計比較熟悉),因為BN本身就是一個歸一化網絡層;

(4)可以把訓練數據徹底打亂(防止每批訓練的時候,某一個樣本都經常被挑選到,文獻說這個可以提高1%的精度,這句話我也是百思不得其解啊)。

開始講解算法前,先來思考一個問題:我們知道在神經網絡訓練開始前,都要對輸入數據做一個歸一化處理,那么具體為什么需要歸一化呢?歸一化后有什么好處呢?原因在于神經網絡學習過程本質就是為了學習數據分布,一旦訓練數據與測試數據的分布不同,那么網絡的泛化能力也大大降低;另外一方面,一旦每批訓練數據的分布各不相同(batch 梯度下降),那么網絡就要在每次迭代都去學習適應不同的分布,這樣將會大大降低網絡的訓練速度,這也正是為什么我們需要對數據都要做一個歸一化預處理的原因。

對于深度網絡的訓練是一個復雜的過程,只要網絡的前面幾層發生微小的改變,那么后面幾層就會被累積放大下去。一旦網絡某一層的輸入數據的分布發生改變,那么這一層網絡就需要去適應學習這個新的數據分布,所以如果訓練過程中,訓練數據的分布一直在發生變化,那么將會影響網絡的訓練速度。

我們知道網絡一旦train起來,那么參數就要發生更新,除了輸入層的數據外(因為輸入層數據,我們已經人為的為每個樣本歸一化),后面網絡每一層的輸入數據分布是一直在發生變化的,因為在訓練的時候,前面層訓練參數的更新將導致后面層輸入數據分布的變化。以網絡第二層為例:網絡的第二層輸入,是由第一層的參數和input計算得到的,而第一層的參數在整個訓練過程中一直在變化,因此必然會引起后面每一層輸入數據分布的改變。我們把網絡中間層在訓練過程中,數據分布的改變稱之為:“Internal ?Covariate?Shift”。Paper所提出的算法,就是要解決在訓練過程中,中間層數據分布發生改變的情況,于是就有了Batch??Normalization,這個牛逼算法的誕生。

二、初識BN(Batch??Normalization)

1、BN概述

就像激活函數層、卷積層、全連接層、池化層一樣,BN(Batch Normalization)也屬于網絡的一層。在前面我們提到網絡除了輸出層外,其它層因為低層網絡在訓練的時候更新了參數,而引起后面層輸入數據分布的變化。這個時候我們可能就會想,如果在每一層輸入的時候,再加個預處理操作那該有多好啊,比如網絡第三層輸入數據X3(X3表示網絡第三層的輸入數據)把它歸一化至:均值0、方差為1,然后再輸入第三層計算,這樣我們就可以解決前面所提到的“Internal?Covariate?Shift”的問題了。

而事實上,paper的算法本質原理就是這樣:在網絡的每一層輸入的時候,又插入了一個歸一化層,也就是先做一個歸一化處理,然后再進入網絡的下一層。不過文獻歸一化層,可不像我們想象的那么簡單,它是一個可學習、有參數的網絡層。既然說到數據預處理,下面就先來復習一下最強的預處理方法:白化。

2、預處理操作選擇

說到神經網絡輸入數據預處理,最好的算法莫過于白化預處理。然而白化計算量太大了,很不劃算,還有就是白化不是處處可微的,所以在深度學習中,其實很少用到白化。經過白化預處理后,數據滿足條件:a、特征之間的相關性降低,這個就相當于pca;b、數據均值、標準差歸一化,也就是使得每一維特征均值為0,標準差為1。如果數據特征維數比較大,要進行PCA,也就是實現白化的第1個要求,是需要計算特征向量,計算量非常大,于是為了簡化計算,作者忽略了第1個要求,僅僅使用了下面的公式進行預處理,也就是近似白化預處理:


公式簡單粗糙,但是依舊很牛逼。因此后面我們也將用這個公式,對某一個層網絡的輸入數據做一個歸一化處理。需要注意的是,我們訓練過程中采用batch 隨機梯度下降,上面的E(xk)指的是每一批訓練數據神經元xk的平均值;然后分母就是每一批數據神經元xk激活度的一個標準差了。

三、BN算法實現

1、BN算法概述

經過前面簡單介紹,這個時候可能我們會想當然的以為:好像很簡單的樣子,不就是在網絡中間層數據做一個歸一化處理嘛,這么簡單的想法,為什么之前沒人用呢?然而其實實現起來并不是那么簡單的。其實如果是僅僅使用上面的歸一化公式,對網絡某一層A的輸出數據做歸一化,然后送入網絡下一層B,這樣是會影響到本層網絡A所學習到的特征的。打個比方,比如我網絡中間某一層學習到特征數據本身就分布在S型激活函數的兩側,你強制把它給我歸一化處理、標準差也限制在了1,把數據變換成分布于s函數的中間部分,這樣就相當于我這一層網絡所學習到的特征分布被你搞壞了,這可怎么辦?于是文獻使出了一招驚天地泣鬼神的招式:變換重構,引入了可學習參數γ、β,這就是算法關鍵之處:

?

每一個神經元xk都會有一對這樣的參數γ、β。這樣其實當:


是可以恢復出原始的某一層所學到的特征的。因此我們引入了這個可學習重構參數γ、β,讓我們的網絡可以學習恢復出原始網絡所要學習的特征分布。最后Batch?Normalization網絡層的前向傳導過程公式就是:

?

上面的公式中m指的是mini-batch?size。

2、源碼實現

m = K.mean(X, axis=-1, keepdims=True)#計算均值std = K.std(X, axis=-1, keepdims=True)#計算標準差X_normed = (X - m) / (std + self.epsilon)#歸一化out = self.gamma * X_normed + self.beta#重構變換 上面的x是一個二維矩陣,對于源碼的實現就幾行代碼而已,輕輕松松。

3、實戰使用

(1)可能學完了上面的算法,你只是知道它的一個訓練過程,一個網絡一旦訓練完了,就沒有了min-batch這個概念了。測試階段我們一般只輸入一個測試樣本,看看結果而已。因此測試樣本,前向傳導的時候,上面的均值u、標準差σ?要哪里來?其實網絡一旦訓練完畢,參數都是固定的,這個時候即使是每批訓練樣本進入網絡,那么BN層計算的均值u、和標準差都是固定不變的。我們可以采用這些數值來作為測試樣本所需要的均值、標準差,于是最后測試階段的u和σ 計算公式如下:


上面簡單理解就是:對于均值來說直接計算所有batch u值的平均值;然后對于標準偏差采用每個batch?σB的無偏估計。最后測試階段,BN的使用公式就是:


(2)根據文獻說,BN可以應用于一個神經網絡的任何神經元上。文獻主要是把BN變換,置于網絡激活函數層的前面。在沒有采用BN的時候,激活函數層是這樣的:

z=g(Wu+b)

也就是我們希望一個激活函數,比如s型函數s(x)的自變量x是經過BN處理后的結果。因此前向傳導的計算公式就應該是:

z=g(BN(Wu+b))

其實因為偏置參數b經過BN層后其實是沒有用的,最后也會被均值歸一化,當然BN層后面還有個β參數作為偏置項,所以b這個參數就可以不用了。因此最后把BN層+激活函數層就變成了:

z=g(BN(Wu))

四、Batch Normalization在CNN中的使用

通過上面的學習,我們知道BN層是對于每個神經元做歸一化處理,甚至只需要對某一個神經元進行歸一化,而不是對一整層網絡的神經元進行歸一化。既然BN是對單個神經元的運算,那么在CNN中卷積層上要怎么搞?假如某一層卷積層有6個特征圖,每個特征圖的大小是100*100,這樣就相當于這一層網絡有6*100*100個神經元,如果采用BN,就會有6*100*100個參數γ、β,這樣豈不是太恐怖了。因此卷積層上的BN使用,其實也是使用了類似權值共享的策略,把一整張特征圖當做一個神經元進行處理。

卷積神經網絡經過卷積后得到的是一系列的特征圖,如果min-batch?sizes為m,那么網絡某一層輸入數據可以表示為四維矩陣(m,f,p,q),m為min-batch?sizes,f為特征圖個數,p、q分別為特征圖的寬高。在cnn中我們可以把每個特征圖看成是一個特征處理(一個神經元),因此在使用Batch?Normalization,mini-batch?size 的大小就是:m*p*q,于是對于每個特征圖都只有一對可學習參數:γ、β。說白了吧,這就是相當于求取所有樣本所對應的一個特征圖的所有神經元的平均值、方差,然后對這個特征圖神經元做歸一化。下面是來自于keras卷積層的BN實現一小段主要源碼:

input_shape = self.input_shapereduction_axes = list(range(len(input_shape)))del reduction_axes[self.axis]broadcast_shape = [1] * len(input_shape)broadcast_shape[self.axis] = input_shape[self.axis]if train:m = K.mean(X, axis=reduction_axes)brodcast_m = K.reshape(m, broadcast_shape)std = K.mean(K.square(X - brodcast_m) + self.epsilon, axis=reduction_axes)std = K.sqrt(std)brodcast_std = K.reshape(std, broadcast_shape)mean_update = self.momentum * self.running_mean + (1-self.momentum) * mstd_update = self.momentum * self.running_std + (1-self.momentum) * stdself.updates = [(self.running_mean, mean_update),(self.running_std, std_update)]X_normed = (X - brodcast_m) / (brodcast_std + self.epsilon)else:brodcast_m = K.reshape(self.running_mean, broadcast_shape)brodcast_std = K.reshape(self.running_std, broadcast_shape)X_normed = ((X - brodcast_m) /(brodcast_std + self.epsilon))out = K.reshape(self.gamma, broadcast_shape) * X_normed + K.reshape(self.beta, broadcast_shape)

個人總結:2015年個人最喜歡深度學習的一篇paper就是Batch Normalization這篇文獻,采用這個方法網絡的訓練速度快到驚人啊,感覺訓練速度是以前的十倍以上,再也不用擔心自己這破電腦每次運行一下,訓練一下都要跑個兩三天的時間。另外這篇文獻跟空間變換網絡《Spatial Transformer Networks》的思想神似啊,都是一個變換網絡層。

參考文獻:

1、《Batch Normalization: Accelerating Deep Network Training by ?Reducing Internal Covariate Shift》

2、《Spatial Transformer Networks》

3、https://github.com/fchollet/keras



總結

以上是生活随笔為你收集整理的Batch Normalization 学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 人妻一区二区三区在线 | 男女插插插网站 | 国产一区二区伦理 | av自拍一区 | 五月天亚洲综合 | 成人福利视频在线观看 | 我的邻居在线观看 | 天堂网资源 | 四虎影城库 | 亚洲天堂偷拍 | 免费无遮挡无码永久在线观看视频 | 9i在线看片成人免费 | 青青草国产精品 | 亚洲第一国产 | 日韩激情床戏 | 国产午夜三级一区二区三 | 殴美一级黄色片 | 久久中文字幕一区二区 | 鲁啊鲁在线视频 | 精品爆乳一区二区三区 | 一级淫片a | 操她视频在线观看 | 日韩精品视频在线观看网站 | 欧美性生交片4 | 久久99精品久久久久久琪琪 | 好吊日精品视频 | 欧美xxxxxhd | 国产精品我不卡 | 日韩精品1区 | 色哟哟日韩精品 | 日日夜夜撸撸 | 冲田杏梨在线 | 欧美久久成人 | 久久精品色妇熟妇丰满人妻 | 天堂中文在线最新 | 国产成人精品一区二区三区在线 | 韩国中文字幕hd久久精品 | 一道本一区二区 | 另类图片亚洲色图 | 免费看av网 | 久久午夜无码鲁丝片午夜精品 | 国产十八熟妇av成人一区 | 国产精品无码午夜福利 | 人妻无码久久一区二区三区免费 | 永久av在线免费观看 | 亚洲老女人视频 | 黄色片视频在线观看 | 国产精品久久久久久久久久久不卡 | 亚洲女人天堂成人av在线 | 免费黄色av电影 | 狗爬女子的视频 | 日韩欧美www | 亚洲 欧美 日韩 在线 | 妞干网这里只有精品 | 免费国产一级 | 性生活三级视频 | 久久免费一区 | 国产尤物视频在线观看 | 麻豆一区二区三区四区 | 欧美粗又大 | a在线免费 | 色婷网 | 亚洲一区二区自拍偷拍 | 91精品免费视频 | 国产精品亚洲五月天丁香 | 黄色一及毛片 | 海角社区登录 | 国产又爽又黄无码无遮挡在线观看 | 女同动漫免费观看高清完整版在线观看 | 亚洲综合情 | 日韩美一区二区 | 无码国内精品人妻少妇蜜桃视频 | 久久国产柳州莫菁门 | 91春色| 亚洲国产日韩a在线播放性色 | 亚洲妇熟xx妇色黄蜜桃 | 国产精品第六页 | 久久综合九色综合欧美狠狠 | 肉大榛一进一出免费视频 | 亚洲爱| 国产性av | 丰满大肥婆肥奶大屁股 | 有码av在线 | 日韩一区网站 | 国产精品成熟老女人 | 麻豆视频国产精品 | 91麻豆国产 | 成人国产在线视频 | wwwxxxx国产 | 超碰97在线资源 | 91免费在线观看网站 | 中国一级特黄真人毛片免费观看 | 国产三级国产精品国产专区50 | 在线国产精品一区 | 在线观看av不卡 | 中国超碰| 青青国产在线观看 | 日本美女黄色大片 | 粉嫩av国产一区二区三区 |