1. 程式人生 > 其它 >動手學深度學習 | 批量歸一化 | 26

動手學深度學習 | 批量歸一化 | 26

目錄

批量歸一化

現在卷積神經網基本都是要使用到BN層的。BN層的思想不新,但是這個特定的層確實是最近幾年才出來的,而且大家會發現效果很好。而且當大家要把網路做深的時候,這就是一個不可避免的層了。

梯度在上面的層會大,越往下面梯度會越來越小。

這就導致了一個很大的問題,就是上面的層梯度較大,那麼權重更新比較快,也就是收斂的快;但是下面的層因為梯度小,所以引數更新的慢,收斂的慢。但是因為底部的層是抽取比較底層的特徵,所以每次底層的引數一更新,高層的引數又需要重新訓練(底層的資訊一變,那麼上面就白學了)。

批量歸一化:我們能不能在學習底部的時候避免變化頂部層?

我們講數值穩定性的時候,為什麼引數會變?是因為不同層之間的方差和均值的整個分佈會變化。

那麼簡單的辦法是說,假設把分佈給固定住,就不管那一層,輸出也好,梯度也好,假設都符合某個分佈,那麼相對來說就會比較穩定。

BN的想法就是希望讓層和層之間的分佈保持一致。

批量的均值:

批量的方差:

這裡最後加一個很小的值就是為避免其方差為0。

\(x_{i+1}\)也就是下一層的輸出,保持在和\(x_i\)在同一個分佈,其中還有兩個可以學習的引數\(\gamma,\beta\)為什麼要有這兩個引數呢?因為如果均值為0,方差為1的效果不好的話,那麼可以再將這個均值和方差進行調整。

可以看看下面添加了BN層和未新增BN層的效果,前者的震動幅度較大,後者一開始損失什麼的基本就可以認為在“同一分佈”。後者收斂的速度更快,或者換句話說,未新增BN層可能過多幾個epoch(比如20個)也可以達到新增BN層少幾個epoch(比如10個)的效果。

程式碼

首先是簡潔實現

然後再是具體的實現程式碼

QA

  1. 在將xavier的時候,也講過類似normalization的東西,和BN什麼區別?

本質上沒有區別,是一個思想。就是模型的引數穩定了,收斂就不會慢。

xavier初始化是說在初始的時候,選取和合適的初始化引數能夠使得模型穩定,但是不能保證之後。BN層則是在訓練的時候,在每一層都進行一次“歸一化”。

  1. BN是不是和權重衰退的作用類似?

權重衰退可以認為是每次更新權重的時候都除了一個小值(就是不要讓權重的變化範圍太大)

但是BN卻不會太多的影響前一層的權重。

  1. BN能用在MLP中嗎?

可以的,但是如果網路不深的話其實作用不大。

一般都是網路較深的時候才會出現上層更新快,下層更新慢的問題。

也就是BN層一般用於深層網路,淺層的MLP加上BN效果不會見得很棒。

  1. 為什麼使用了BN收斂時間會變短?

因為BN可以讓梯度正大(就不會到底層的時候變的很小),那麼就可以適當增大學習率,加速收斂。

  1. 訓練時候如何對epoch,batch_size,lr的數值進行設定?

epoch數總是可以選擇大一點是沒有關係的,就是浪費點資源。

batch_size你要選到合適,不能選擇太大,也不能選擇太小,一般batch_size就調整到一個GPU效率比較高的情況。

lr是在batch_size後面在進行調整的。

  1. batch_size是把視訊記憶體佔滿好?還是利用率gpu-tuil 100%就可以了?還是需要同時達到100%?

利用率不要到100%,到90%就可以了。

或者這麼講,你去增加batch_size,去看看GPU每秒中能處理的樣本數,如果batch_size到一定程度沒有增加每秒處理樣本數的話,batch_size就可以停止了。