深度学习基础之BatchNorm和LayerNorm
文章目錄
- BatchNorm
- LayerNorm
- 總結
- 參考
BatchNorm
Batch Normalization(下文簡稱 Batch Norm)是 2015 年提出的方法。Batch Norm雖然是一個問世不久的新方法,但已經被很多研究人員和技術人員廣泛使用。實際上,看一下機器學習競賽的結果,就會發現很多通過使用這個方法而獲得優異結果的例子。
Batch Norm有以下優點。
(1) 可以使學習快速進行(可以增大學習率)。
(2)不那么依賴初始值(對于初始值不用那么神經質)。
(3)抑制過擬合(降低Dropout等的必要性)
Batch Norm,顧名思義,以進行學習時的mini-batch為單位,按mini-batch進行正規化。具體而言,就是進行使數據分布的均值為0、方差為1的正規化。用數學式表示的話,如下所示。
看公式,是不是有點像經典機器學習里為了消除量綱的標準化的操作。
這就是Batch Normalization的算法了。
簡單來說,其實就是對一個batch的數據進行標準化操作。
我們可以使用pytorch為我們寫好的方法直接調用驗證一下:
import torch.nn as nn import torch as th data = [[[1,2,5],[2,5,8.5],[3,3,3]],[[2,8,4],[1,3,9],[2,6,4]],[[1,1,1],[1,3,5],[0.5,6,0.2]]] data = th.tensor(data) data_bn = nn.BatchNorm1d(3)(data) data_ln = nn.LayerNorm(3)(data) mean = th.sum(data_bn) mu = th.sum(th.pow(data_bn-mean, 2) / 27) print(data_bn) print(mean) print(mu)
眾所周知,浮點數運算會飄,所以2.3842e-07就相當于是0了
方差差計算出來是1
正好符合計算的結果。
所以batch norm是對一個batch的所有數據一起進行標準化操作。
這是使用手寫數據集進行的測試實驗,發現初始化參數不同時,對學習效果的影響是很大的,但是使用了batch norm之后,受到的影響就比較小了。
batch norm主要用于CV領域
LayerNorm
layer norm也是一種標準化的方法,公式也差不多,不過是對每個batch(3維)里的每個樣本的每行進行標準化,主要是用于NLP領域的。
話不多說,上代碼:
import torch.nn as nn import torch as th data = [[[1,2,5],[2,5,8.5],[3,3,3]],[[2,8,4],[1,3,9],[2,6,4]],[[1,1,1],[1,3,5],[0.5,6,0.2]]] data = th.tensor(data) data_ln = nn.LayerNorm(3)(data) print(data_ln) for b in data_ln:for line in b:mean = th.sum(line)mu = th.sum(th.pow(line-mean, 2))print(mean, mu / line.shape[0])輸出:
所有,使用layer norm 對應到NLP里就是相當于對每個詞向量各自進行標準化。
總結
batch norm適用于CV,因為計算機視覺喂入的數據都是像素點,可以說數據點與點之間是可以比較的,所以使用batch norm可以有比較好的效果,而NLP里,每個詞的詞向量是一組向量表示一個詞,一個詞向量割裂開來看是沒有意義的,因此不同詞向量里的數據點是不能混為一談的,所以batch norm之后可能會使得詞損失語義,效果就可能不好了,但是使用layer norm只是讓各個詞向量進行標準化,就能夠有比較理想的效果了。
參考
深度學習老師的課件
總結
以上是生活随笔為你收集整理的深度学习基础之BatchNorm和LayerNorm的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 简洁消息通知单页html源码模板
- 下一篇: 梳理百年深度学习发展史-七月在线机器学习