python神經(jīng)網(wǎng)絡(luò)Batch?Normalization底層原理詳解
什么是Batch Normalization
Batch Normalization是神經(jīng)網(wǎng)絡(luò)中常用的層,解決了很多深度學(xué)習(xí)中遇到的問(wèn)題,我們一起來(lái)學(xué)習(xí)一哈。
Batch Normalization是由google提出的一種訓(xùn)練優(yōu)化方法。參考論文:Batch Normalization Accelerating Deep Network Training by Reducing Internal Covariate Shift。
Batch Normalization的名稱(chēng)為批標(biāo)準(zhǔn)化,它的功能是使得輸入的X數(shù)據(jù)符合同一分布,從而使得訓(xùn)練更加簡(jiǎn)單、快速。
一般來(lái)講,Batch Normalization會(huì)放在卷積層后面,即卷積 + 標(biāo)準(zhǔn)化 + 激活函數(shù)。
其計(jì)算過(guò)程可以簡(jiǎn)單歸納為以下3點(diǎn):
1、求數(shù)據(jù)均值。
2、求數(shù)據(jù)方差。
3、數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化。
Batch Normalization的計(jì)算公式
Batch Normalization的計(jì)算公式主要看如下這幅圖:
這個(gè)公式一定要靜下心來(lái)看,整個(gè)公式可以分為四行:
1、對(duì)輸入進(jìn)來(lái)的數(shù)據(jù)X進(jìn)行均值求取。
2、利用輸入進(jìn)來(lái)的數(shù)據(jù)X減去第一步得到的均值,然后求平方和,獲得輸入X的方差。
3、利用輸入X、第一步獲得的均值和第二步獲得的方差對(duì)數(shù)據(jù)進(jìn)行歸一化,即利用X減去均值,然后除上方差開(kāi)根號(hào)。方差開(kāi)根號(hào)前需要添加上一個(gè)極小值。
4、引入γ和β變量,對(duì)輸入進(jìn)來(lái)的數(shù)據(jù)進(jìn)行縮放和平移。利用γ和β兩個(gè)參數(shù),讓我們的網(wǎng)絡(luò)可以學(xué)習(xí)恢復(fù)出原始網(wǎng)絡(luò)所要學(xué)習(xí)的特征分布。
前三步是標(biāo)準(zhǔn)化工序,最后一步是反標(biāo)準(zhǔn)化工序。
Bn層的好處
1、加速網(wǎng)絡(luò)的收斂速度。在神經(jīng)網(wǎng)絡(luò)中,存在內(nèi)部協(xié)變量偏移的現(xiàn)象,如果每層的數(shù)據(jù)分布不同的話,會(huì)導(dǎo)致非常難收斂,如果把每層的數(shù)據(jù)都在轉(zhuǎn)換在均值為零,方差為1的狀態(tài)下,這樣每層數(shù)據(jù)的分布都是一樣的,訓(xùn)練會(huì)比較容易收斂。
2、防止梯度爆炸和梯度消失。對(duì)于梯度消失而言,以Sigmoid函數(shù)為例,它會(huì)使得輸出在[0,1]之間,實(shí)際上當(dāng)x到了一定的大小,sigmoid激活函數(shù)的梯度值就變得非常小,不易訓(xùn)練。歸一化數(shù)據(jù)的話,就能讓梯度維持在比較大的值和變化率;
對(duì)于梯度爆炸而言,在方向傳播的過(guò)程中,每一層的梯度都是由上一層的梯度乘以本層的數(shù)據(jù)得到。如果歸一化的話,數(shù)據(jù)均值都在0附近,很顯然,每一層的梯度不會(huì)產(chǎn)生爆炸的情況。
3、防止過(guò)擬合。在網(wǎng)絡(luò)的訓(xùn)練中,Bn使得一個(gè)minibatch中所有樣本都被關(guān)聯(lián)在了一起,因此網(wǎng)絡(luò)不會(huì)從某一個(gè)訓(xùn)練樣本中生成確定的結(jié)果,這樣就會(huì)使得整個(gè)網(wǎng)絡(luò)不會(huì)朝這一個(gè)方向使勁學(xué)習(xí)。一定程度上避免了過(guò)擬合。
為什么要引入γ和β變量
Bn層在進(jìn)行前三步后,會(huì)引入γ和β變量,對(duì)輸入進(jìn)來(lái)的數(shù)據(jù)進(jìn)行縮放和平移。
γ和β變量是網(wǎng)絡(luò)參數(shù),是可學(xué)習(xí)的。
引入γ和β變量進(jìn)行縮放平移可以使得神經(jīng)網(wǎng)絡(luò)有自適應(yīng)的能力,在標(biāo)準(zhǔn)化效果好時(shí),盡量不抵消標(biāo)準(zhǔn)化的作用,而在標(biāo)準(zhǔn)化效果不好時(shí),盡量去抵消一部分標(biāo)準(zhǔn)化的效果,相當(dāng)于讓神經(jīng)網(wǎng)絡(luò)學(xué)會(huì)要不要標(biāo)準(zhǔn)化,如何折中選擇。
Bn層的代碼實(shí)現(xiàn)
Pytorch代碼看起來(lái)比較簡(jiǎn)單,而且和上面的公式非常符合,可以學(xué)習(xí)一下,參考自
http://www.dbjr.com.cn/article/247197.htm
def batch_norm(is_training, x, gamma, beta, moving_mean, moving_var, eps=1e-5, momentum=0.9): if not is_training: x_hat = (x - moving_mean) / torch.sqrt(moving_var + eps) else: mean = x.mean(dim=0, keepdim=True).mean(dim=2, keepdim=True).mean(dim=3, keepdim=True) var = ((x - mean) ** 2).mean(dim=0, keepdim=True).mean(dim=2, keepdim=True).mean(dim=3, keepdim=True) x_hat = (x - mean) / torch.sqrt(var + eps) moving_mean = momentum * moving_mean + (1.0 - momentum) * mean moving_var = momentum * moving_var + (1.0 - momentum) * var Y = gamma * x_hat + beta return Y, moving_mean, moving_var class BatchNorm2d(nn.Module): def __init__(self, num_features): super(BatchNorm2d, self).__init__() shape = (1, num_features, 1, 1) self.gamma = nn.Parameter(torch.ones(shape)) self.beta = nn.Parameter(torch.zeros(shape)) self.register_buffer('moving_mean', torch.zeros(shape)) self.register_buffer('moving_var', torch.ones(shape)) def forward(self, x): if self.moving_mean.device != x.device: self.moving_mean = self.moving_mean.to(x.device) self.moving_var = self.moving_var.to(x.device) y, self.moving_mean, self.moving_var = batch_norm(self.training, x, self.gamma, self.beta, self.moving_mean, self.moving_var, eps=1e-5, momentum=0.9) return y
以上就是python神經(jīng)網(wǎng)絡(luò)Batch Normalization底層原理詳解的詳細(xì)內(nèi)容,更多關(guān)于Batch Normalization底層原理的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- python報(bào)錯(cuò)解決之python運(yùn)行bat文件的各種問(wèn)題處理
- python實(shí)現(xiàn)遠(yuǎn)程運(yùn)行bat文件
- Windows11使用Cpython?編譯文件報(bào)錯(cuò)?error:?Unable?to?find?vcvarsall.bat?完美解決方法
- python神經(jīng)網(wǎng)絡(luò)之批量學(xué)習(xí)tf.train.batch函數(shù)示例
- python生成器generator:深度學(xué)習(xí)讀取batch圖片的操作
- Python產(chǎn)生batch數(shù)據(jù)的操作
- python非阻塞式后臺(tái)如何運(yùn)行bat腳本
相關(guān)文章
Python爬蟲(chóng)使用bs4方法實(shí)現(xiàn)數(shù)據(jù)解析
這篇文章主要介紹了Python爬蟲(chóng)使用bs4方法實(shí)現(xiàn)數(shù)據(jù)解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08python 實(shí)現(xiàn)提取PPT中所有的文字
這篇文章主要介紹了python 實(shí)現(xiàn)提取PPT中所有的文字,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03Python 3.8 新功能來(lái)一波(大部分人都不知道)
Python 3.8 是Python語(yǔ)言的最新版本,它適合用于編寫(xiě)腳本、自動(dòng)化以及機(jī)器學(xué)習(xí)和Web開(kāi)發(fā)等各種任務(wù)。這篇文章主要介紹了Python 3.8 新功能(大部分人都不知道),需要的朋友可以參考下2020-03-03Python實(shí)現(xiàn)將MP4視頻轉(zhuǎn)化為GIF圖像
與靜態(tài)圖像相比,動(dòng)態(tài)的?GIF?圖片更能吸引各位讀者的注意力,還可以提供更生動(dòng)、有趣和引人入勝的內(nèi)容,本文為大家介紹了Python將MP4視頻轉(zhuǎn)化為GIF圖像的方法,需要的可以參考下2023-06-06PyTorch中的神經(jīng)網(wǎng)絡(luò) Mnist 分類(lèi)任務(wù)
這篇文章主要介紹了PyTorch中的神經(jīng)網(wǎng)絡(luò) Mnist 分類(lèi)任務(wù),在本次的分類(lèi)任務(wù)當(dāng)中,我們使用的數(shù)據(jù)集是 Mnist 數(shù)據(jù)集,這個(gè)數(shù)據(jù)集大家都比較熟悉,需要的朋友可以參考下2023-03-03一文了解Python中NotImplementedError的作用
NotImplementedError是一個(gè)內(nèi)置異常類(lèi),本文主要介紹了一文了解Python中NotImplementedError的作用,具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03Python虛擬環(huán)境virtualenv創(chuàng)建及使用過(guò)程圖解
這篇文章主要介紹了Python虛擬環(huán)境virtualenv創(chuàng)建及使用過(guò)程圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-12-12