Batch Normalization的理解體會

2021-10-06 21:20:59 字數 2518 閱讀 9065

網路上對於batch normalization的講解也非常多了,本文主要想記錄下對此的心得體會,並總結下我所理解的bn的優勢

在此先mark一下我認為寫得比較全面的資料:

bn的原理(文章1):

【深度學習】深入理解batch normalization批標準化

bn的**:

batch normalization: accelerating deep network training b

y reducing internal covariate shift

bn work的原因(文章2):

為什麼batch normalization那麼有用?

提公升訓練速度,使模型的收斂速度加快

增加了模型的泛化能力(減緩overfit)

對於超參的要求降低,如模型的初始化、學習率

提公升訓練速度,使模型的收斂速度加快

根據文章2的實驗可以看出,bn對於模型梯度的穩定性提供了很大的作用。通俗來講就是,模型在訓練的過程中,會更多地向著最優的方向進行學習,而不會左右亂竄。因為在梯度忽大忽小的情況下,有可能會跳過了最優的時刻,又得回過頭來學習。

在梯度不穩定的情況下,我們只能用較小的學習率來盡量減緩陡增的梯度所帶來的負面影響。

反推過來就是說,在使用了bn後,我們能用更大的學習率來訓練模型。

因此模型的收斂速度也會隨之提公升。

同時這也印證了bn第三個優點:對於超參的要求降低。

增加了模型的泛化能力(減緩overfit)

原文中介紹bn減緩了模型overfit的可能,因此在訓練過程中,可以減少dropout的使用,以及l2正則化可以選擇更小的權重(懲罰項減少)。

首先,減少dropout的使用,就是讓模型同時有更多的引數參與訓練,那麼這也是模型訓練速度更快的誘因之一。

另外,l2正則化的懲罰降低後,模型可以更專注地降低原本loss function的損失。通俗講,就是有種再無過擬合的後顧之憂,放心去學的感覺。因此也進一步地提公升了模型的訓練速度,以及它的擬合能力。

那麼為什麼能緩解overfit呢,我認為是神經元之間插入了負責學習資料分布的歸一化層後,進入神經元的資料都更傾向於歸整到某個區域(不一定均值為0,這取決於shift學習的數值),神經元所學習的特徵也都相對歸整,那麼神經元就不會傾向於往複雜化的方向去學習。

這其實就類似於l2正則化,目標是讓模型在提公升訓練集效能的同時,不過多地讓神經元複雜化,大有九九歸一的味道(不複雜也就是讓模型變得稀疏)。

對於超參的要求降低,如模型的初始化、學習率

首先,這並不是說模型的初始化不重要,甚至能把權重初始化為0。

在有bn之前,模型內部的資料可能會隨著深度的加深,分布也隨之偏移加劇,那麼初始化值就相當於導致資料偏移的起點。初始化得恰當,模型也才能較穩定地訓練。

而加入bn之後,資料的分布得到了學習,神經元之間的梯度也隨之平滑,在初始值能接受的情況下,權重總會隨著訓練不斷調整至較優。

同時排除了梯度陡然增減的情況下,學習率的大小更多是在影響模型訓練的快慢,而非起到平滑梯度的作用。

因此可以適當提高學習率,加快模型的訓練進度。

雖然更多的文章都在以sigmoid啟用函式作為例子,來闡述bn有一種從梯度飽和區間往非飽和區間拉取的效果,但我個人感覺bn的精髓更多在於它的affine transform(可學習引數scale和shift)。反而它的normalize更多的只是在為affine transform做鋪墊。就是我先幫你歸一化到均值為0,方差為1,你再去學scale和shift會學得更順利。

就像resnet的殘差學習,你原本需要學整個函式變換,加入shortcut之後你只需要學習它的殘差。(學習資料的變化總比去資料變化要容易)

如果我們把bn的華麗之處更多的focus在它的affine transform上,就會發現,bn其實是在兩個神經元之間的分布做調節作用。

我們作為人類,可能不能完全清楚每個神經元具體的貢獻是什麼,但是bn作為兩個神經元中間的調和劑,它能在學習的過程中更加清晰的知道,下乙個神經元更想要如何分布的input(internal input)。

他的主要工作是去配合下乙個神經元

我們直覺上理解,神經元的主要工作是提取特徵,也就是說專注點不會放在對分布的理解上,那麼兩個神經元之間加入bn層後,就多個乙個專注於調節資料分布的調和劑,同時也能讓神經元更專注於它的本分(如提取特徵)。所以也能解釋bn為何能提公升模型的擬合能力。

基於bn的重點是在affine transform上,normalize不管是在batch還是在group之上,更多的是影響normalize的精度(「批次的均值和方差」 與 「整體資料的均值和方差」 的差距),跑多幾個epoch後可以通過affine transform的學習來擬補。

其實很早很早就想用一篇文章去重溫並概括我所有對於bn的理解,因為我覺得bn是乙個充滿智慧型的創意。

這次也在我認為最合適的時機,記錄下我對此的深入感受。

乙個trick在work之後,能去思考它背後的原因與貢獻,也是我們作為人類相較於機器而言的魅力之處了。

BatchNormalization的相關注意點

今天重新學習了batchnormalization,發現遺漏的小知識還是不少的,今天的學習主要是參考了這位大佬的一篇文章 keras batchnormalization的坑 training引數和 momentum引數 根據了解,總結如下 batch,即每個epoch訓練的樣本數,最好不要小於10...

生成器模式Builder理解體會

場景描述 有乙個方法,要用到乙個物件,我們要生成它,比如是汽車,我們要用到的汽車,它的一些屬性是不止一種的,如配件等級的不同等 方式一 因為汽車物件有這些屬性的set方法,我們直接通過多句set語句,來構造出我們需要的定製物件,但有乙個問題,乙個是 挺長,在乙個只是要獲取物件的地方而不是構造物件的地...

Python中的另類解體思路

no.1給定乙個非空陣列,除了其中的某個元素只出現了一次之外,其餘每個元素均出現兩次,找出那個只出現了一次的元素。說明 你的演算法應該具有時間線性複雜度。示例 輸入 2,2,1 輸出 1 輸入 4,1,2,1,2 輸出 4 題目說完了,大部分人可以想到的正常解題思路 class solution d...