深度学习基础之BatchNorm和LayerNorm
文章目錄
- BatchNorm
- LayerNorm
- 總結(jié)
- 參考
BatchNorm
Batch Normalization(下文簡(jiǎn)稱(chēng) Batch Norm)是 2015 年提出的方法。Batch Norm雖然是一個(gè)問(wèn)世不久的新方法,但已經(jīng)被很多研究人員和技術(shù)人員廣泛使用。實(shí)際上,看一下機(jī)器學(xué)習(xí)競(jìng)賽的結(jié)果,就會(huì)發(fā)現(xiàn)很多通過(guò)使用這個(gè)方法而獲得優(yōu)異結(jié)果的例子。
Batch Norm有以下優(yōu)點(diǎn)。
(1) 可以使學(xué)習(xí)快速進(jìn)行(可以增大學(xué)習(xí)率)。
(2)不那么依賴(lài)初始值(對(duì)于初始值不用那么神經(jīng)質(zhì))。
(3)抑制過(guò)擬合(降低Dropout等的必要性)
Batch Norm,顧名思義,以進(jìn)行學(xué)習(xí)時(shí)的mini-batch為單位,按mini-batch進(jìn)行正規(guī)化。具體而言,就是進(jìn)行使數(shù)據(jù)分布的均值為0、方差為1的正規(guī)化。用數(shù)學(xué)式表示的話(huà),如下所示。
看公式,是不是有點(diǎn)像經(jīng)典機(jī)器學(xué)習(xí)里為了消除量綱的標(biāo)準(zhǔn)化的操作。
這就是Batch Normalization的算法了。
簡(jiǎn)單來(lái)說(shuō),其實(shí)就是對(duì)一個(gè)batch的數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化操作。
我們可以使用pytorch為我們寫(xiě)好的方法直接調(diào)用驗(yàn)證一下:
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)
眾所周知,浮點(diǎn)數(shù)運(yùn)算會(huì)飄,所以2.3842e-07就相當(dāng)于是0了
方差差計(jì)算出來(lái)是1
正好符合計(jì)算的結(jié)果。
所以batch norm是對(duì)一個(gè)batch的所有數(shù)據(jù)一起進(jìn)行標(biāo)準(zhǔn)化操作。
這是使用手寫(xiě)數(shù)據(jù)集進(jìn)行的測(cè)試實(shí)驗(yàn),發(fā)現(xiàn)初始化參數(shù)不同時(shí),對(duì)學(xué)習(xí)效果的影響是很大的,但是使用了batch norm之后,受到的影響就比較小了。
batch norm主要用于CV領(lǐng)域
LayerNorm
layer norm也是一種標(biāo)準(zhǔn)化的方法,公式也差不多,不過(guò)是對(duì)每個(gè)batch(3維)里的每個(gè)樣本的每行進(jìn)行標(biāo)準(zhǔn)化,主要是用于NLP領(lǐng)域的。
話(huà)不多說(shuō),上代碼:
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 對(duì)應(yīng)到NLP里就是相當(dāng)于對(duì)每個(gè)詞向量各自進(jìn)行標(biāo)準(zhǔn)化。
總結(jié)
batch norm適用于CV,因?yàn)橛?jì)算機(jī)視覺(jué)喂入的數(shù)據(jù)都是像素點(diǎn),可以說(shuō)數(shù)據(jù)點(diǎn)與點(diǎn)之間是可以比較的,所以使用batch norm可以有比較好的效果,而NLP里,每個(gè)詞的詞向量是一組向量表示一個(gè)詞,一個(gè)詞向量割裂開(kāi)來(lái)看是沒(méi)有意義的,因此不同詞向量里的數(shù)據(jù)點(diǎn)是不能混為一談的,所以batch norm之后可能會(huì)使得詞損失語(yǔ)義,效果就可能不好了,但是使用layer norm只是讓各個(gè)詞向量進(jìn)行標(biāo)準(zhǔn)化,就能夠有比較理想的效果了。
參考
深度學(xué)習(xí)老師的課件
總結(jié)
以上是生活随笔為你收集整理的深度学习基础之BatchNorm和LayerNorm的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 简洁消息通知单页html源码模板
- 下一篇: Linux 浮点数运算