PyTorch常用的初始化和正則

原文: https://www.pytorchtutorial.com/pytorch-goodies/

模型統(tǒng)計(jì)數(shù)據(jù)(Model Statistics)

統(tǒng)計(jì)參數(shù)總數(shù)量
num_params = sum(param.numel() for param in model.parameters())

參數(shù)初始化(Weight Initialization)

PyTorch 中參數(shù)的默認(rèn)初始化在各個(gè)層的 reset_parameters() 方法中抱婉。例如:nn.Linear 和 nn.Conv2D档叔,都是在 [-limit, limit] 之間的均勻分布(Uniform distribution),其中 limit 是 1. / sqrt(fan_in) 蒸绩,fan_in 是指參數(shù)張量(tensor)的輸入單元的數(shù)量

下面是幾種常見(jiàn)的初始化方式。

Xavier Initialization

Xavier初始化的基本思想是保持輸入和輸出的方差一致铃肯,這樣就避免了所有輸出值都趨向于0患亿。這是通用的方法,適用于任何激活函數(shù)。

# 默認(rèn)方法
for m in model.modules():
    if isinstance(m, (nn.Conv2d, nn.Linear)):
        nn.init.xavier_uniform(m.weight)

也可以使用 gain 參數(shù)來(lái)自定義初始化的標(biāo)準(zhǔn)差來(lái)匹配特定的激活函數(shù):

for m in model.modules():
    if isinstance(m, (nn.Conv2d, nn.Linear)):
        nn.init.xavier_uniform(m.weight(), gain=nn.init.calculate_gain(\\'relu\\'))

參考資料:

He et. al Initialization

He initialization的思想是:在ReLU網(wǎng)絡(luò)中步藕,假定每一層有一半的神經(jīng)元被激活惦界,另一半為0。推薦在ReLU網(wǎng)絡(luò)中使用咙冗。

# he initialization
for m in model.modules():
    if isinstance(m, (nn.Conv2d, nn.Linear)):
        nn.init.kaiming_normal(m.weight, mode=\\'fan_in\\')

正交初始化(Orthogonal Initialization)

主要用以解決深度網(wǎng)絡(luò)下的梯度消失沾歪、梯度爆炸問(wèn)題,在RNN中經(jīng)常使用的參數(shù)初始化方法

for m in model.modules():
    if isinstance(m, (nn.Conv2d, nn.Linear)):
        nn.init.orthogonal(m.weight)

Batchnorm Initialization

在非線性激活函數(shù)之前雾消,我們想讓輸出值有比較好的分布(例如高斯分布)灾搏,以便于計(jì)算梯度和更新參數(shù)。Batch Normalization 將輸出值強(qiáng)行做一次 Gaussian Normalization 和線性變換:

image.png
for m in model:
    if isinstance(m, nn.BatchNorm2d):
        nn.init.constant(m.weight, 1)
        nn.init.constant(m.bias, 0)

參數(shù)正則化(Weight Regularization)

L2/L1 Regularization

機(jī)器學(xué)習(xí)中幾乎都可以看到損失函數(shù)后面會(huì)添加一個(gè)額外項(xiàng)立润,常用的額外項(xiàng)一般有兩種狂窑,稱作L1正則化和L2正則化,或者L1范數(shù)和L2范數(shù)桑腮。

L1 正則化和 L2 正則化可以看做是損失函數(shù)的懲罰項(xiàng)泉哈。所謂 “懲罰” 是指對(duì)損失函數(shù)中的某些參數(shù)做一些限制。

L1 正則化是指權(quán)值向量 w 中各個(gè)元素的絕對(duì)值之和破讨,通常表示為 ||w||1
L2 正則化是指權(quán)值向量 w 中各個(gè)元素的平方和然后再求平方根丛晦,通常表示為 ||w||2
下面是L1正則化和L2正則化的作用,這些表述可以在很多文章中找到提陶。

L1 正則化可以產(chǎn)生稀疏權(quán)值矩陣采呐,即產(chǎn)生一個(gè)稀疏模型,可以用于特征選擇
L2 正則化可以防止模型過(guò)擬合(overfitting)搁骑;一定程度上斧吐,L1也可以防止過(guò)擬合

  • L2 正則化的實(shí)現(xiàn)方法:
reg = 1e-6
l2_loss = Variable(torch.FloatTensor(1), requires_grad=True)
for name, param in model.named_parameters():
    if \'bias\' not in name:
        l2_loss = l2_loss   (0.5 * reg * torch.sum(torch.pow(W, 2)))
  • L1 正則化的實(shí)現(xiàn)方法:
reg = 1e-6
l1_loss = Variable(torch.FloatTensor(1), requires_grad=True)
for name, param in model.named_parameters():
    if \'bias\' not in name:
        l1_loss = l1_loss   (reg * torch.sum(torch.abs(W)))
  • Orthogonal Regularization
reg = 1e-6
orth_loss = Variable(torch.FloatTensor(1), requires_grad=True)
for name, param in model.named_parameters():
    if \'bias\' not in name:
        param_flat = param.view(param.shape[0], -1)
        sym = torch.mm(param_flat, torch.t(param_flat))
        sym -= Variable(torch.eye(param_flat.shape[0]))
        orth_loss = orth_loss   (reg * sym.sum())
  • Max Norm Constraint
    簡(jiǎn)單來(lái)講就是對(duì) w 的指直接進(jìn)行限制。
ef max_norm(model, max_val=3, eps=1e-8):
    for name, param in model.named_parameters():
        if \'bias\' not in name:
            norm = param.norm(2, dim=0, keepdim=True)
            desired = torch.clamp(norm, 0, max_val)
            param = param * (desired / (eps   norm))
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末仲器,一起剝皮案震驚了整個(gè)濱河市煤率,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌乏冀,老刑警劉巖蝶糯,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異辆沦,居然都是意外死亡昼捍,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門肢扯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)妒茬,“玉大人,你說(shuō)我怎么就攤上這事蔚晨≌ё辏” “怎么了肛循?”我有些...
    開(kāi)封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)银择。 經(jīng)常有香客問(wèn)我多糠,道長(zhǎng),這世上最難降的妖魔是什么浩考? 我笑而不...
    開(kāi)封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任夹孔,我火速辦了婚禮,結(jié)果婚禮上析孽,老公的妹妹穿的比我還像新娘搭伤。我一直安慰自己,他們只是感情好绿淋,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布闷畸。 她就那樣靜靜地躺著,像睡著了一般吞滞。 火紅的嫁衣襯著肌膚如雪佑菩。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天裁赠,我揣著相機(jī)與錄音殿漠,去河邊找鬼。 笑死佩捞,一個(gè)胖子當(dāng)著我的面吹牛绞幌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播一忱,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼莲蜘,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了帘营?” 一聲冷哼從身側(cè)響起票渠,我...
    開(kāi)封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎芬迄,沒(méi)想到半個(gè)月后问顷,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡禀梳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年杜窄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片算途。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡塞耕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出郊艘,到底是詐尸還是另有隱情荷科,我是刑警寧澤唯咬,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布纱注,位于F島的核電站畏浆,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏狞贱。R本人自食惡果不足惜刻获,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瞎嬉。 院中可真熱鬧蝎毡,春花似錦、人聲如沸氧枣。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)便监。三九已至扎谎,卻和暖如春袖扛,著一層夾襖步出監(jiān)牢的瞬間跷睦,已是汗流浹背茵瘾。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工视哑, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留琢融,地道東北人芙沥。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓薄嫡,卻偏偏與公主長(zhǎng)得像失仁,于是被迫代替她去往敵國(guó)和親胳泉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拐叉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容