【深度學(xué)習(xí)】神經(jīng)網(wǎng)絡(luò)中的權(quán)重初始化:Why and How

前言

神經(jīng)網(wǎng)絡(luò)中的權(quán)重(weight)初始化是個(gè)常常被忽略的問題鹰椒。

最近在手寫一個(gè)Python的神經(jīng)網(wǎng)絡(luò)庫(GitHub:hamaa)沼死,剛開始為了測(cè)試代碼是否寫對(duì)着逐,搭建了一個(gè)2->4->2的單隱層神經(jīng)網(wǎng)絡(luò)來擬合異或運(yùn)算,擬合結(jié)果十分完美意蛀。但是在做MNIST手寫數(shù)字識(shí)別耸别,將網(wǎng)絡(luò)擴(kuò)展到了784->100->10時(shí),發(fā)現(xiàn)損失函數(shù)一直不下降县钥,訓(xùn)練準(zhǔn)確率一直停留在10%左右(和隨機(jī)猜的命中概率一樣嘛)秀姐。一直以為是back propagation的代碼寫錯(cuò)了,debug了整整兩天都沒發(fā)現(xiàn)錯(cuò)誤魁蒜,結(jié)果輸出中間weights的梯度dw看看囊扳,發(fā)現(xiàn)兩個(gè)權(quán)重矩陣的梯度都是在1e-10左右的數(shù)量級(jí)。后來查詢了一些資料兜看,原來是代碼缺少了權(quán)重初始化(weight initialization)及其重要的一步锥咸。增加了權(quán)重初始化后擬合結(jié)果終于正常。

在以前看一些關(guān)于神經(jīng)網(wǎng)絡(luò)的資料時(shí)细移,我也經(jīng)巢瑁看到“權(quán)重初始化”這一步,但一直錯(cuò)誤地以為“權(quán)重初始化”等價(jià)于“權(quán)重隨機(jī)初始化”弧轧,以為僅僅將權(quán)重初始化為很小的隨機(jī)數(shù)即可雪侥,但其實(shí)它的原因除了打破梯度更新對(duì)稱性之外,還有更深層次的原因精绎。所以接下來文章分為兩部分速缨,分別介紹為什么需要進(jìn)行權(quán)重初始化,以及如何進(jìn)行權(quán)重初始化代乃。

權(quán)重初始化:Why

在創(chuàng)建了神經(jīng)網(wǎng)絡(luò)后旬牲,通常需要對(duì)權(quán)重和偏置進(jìn)行初始化,大部分的實(shí)現(xiàn)都是采取Gaussian distribution來生成隨機(jī)初始值搁吓。假設(shè)現(xiàn)在輸入層有1000個(gè)神經(jīng)元原茅,隱藏層有1個(gè)神經(jīng)元,輸入數(shù)據(jù)x為一個(gè)全為1的1000維向量堕仔,采取高斯分布來初始化權(quán)重矩陣w擂橘,偏置b取0。下面的代碼計(jì)算隱藏層的輸入z:

# -*- coding:utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt

def run():
    x = np.ones(1000)
    w = np.random.randn(1000)
    b = 0
    # z為加權(quán)和
    z = np.sum(x * w) + b
    print z

然而通過上述初始化后摩骨,因?yàn)閣服從均值為0通贞、方差為1的正太分布朗若,x全為1,b全為0滑频,輸入層一共1000個(gè)神經(jīng)元捡偏,所以z服從的是一個(gè)均值為0唤冈、方差為1000的正太分布峡迷。修改代碼如下,生成20000萬個(gè)z并查看其均值你虹、方差以及分布圖像:


def  run():
    # z的個(gè)數(shù)
    t = 20000
    z_lst = np.empty(t)

    x = np.ones(1000)
    b = 0

    for i in xrange(t):
        w = np.random.randn(1000)
        z = np.sum(x * w) + b
        z_lst[i] = z

    print 'z 均值:', np.mean(z_lst)
    print 'z 方差:', np.var(z_lst)
    plt.hist(z_lst, bins=100)
    plt.show()

輸出結(jié)果如下:

z 均值: -0.0402106463845
z 方差: 997.082082524

輸出圖像如下:


z分布(1)

在此情況下绘搞,z有可能是一個(gè)遠(yuǎn)小于-1或者遠(yuǎn)大于1的數(shù),通過激活函數(shù)(比如sigmoid)后所得到的輸出會(huì)非常接近0或者1傅物,也就是隱藏層神經(jīng)元處于飽和的狀態(tài)夯辖。所以當(dāng)出現(xiàn)這樣的情況時(shí),在權(quán)重中進(jìn)行微小的調(diào)整僅僅會(huì)給隱藏層神經(jīng)元的激活值帶來極其微弱的改變董饰。而這種微弱的改變也會(huì)影響網(wǎng)絡(luò)中剩下的神經(jīng)元蒿褂,然后會(huì)帶來相應(yīng)的代價(jià)函數(shù)的改變。結(jié)果就是卒暂,這些權(quán)重在我們進(jìn)行梯度下降算法時(shí)會(huì)學(xué)習(xí)得非常緩慢[1]啄栓。

因此,我們可以通過改變權(quán)重w的分布也祠,使|z|盡量接近于0昙楚。這就是我們?yōu)槭裁葱枰M(jìn)行權(quán)重初始化的原因了。

權(quán)重初始化:How

一種簡(jiǎn)單的做法是修改w的分布诈嘿,使得z服從均值為0堪旧、方差為1的標(biāo)準(zhǔn)正態(tài)分布。根據(jù)正太分布期望與方差的特性奖亚,將w除以sqrt(1000)即可淳梦。修改后代碼如下:

def run():
    # z的個(gè)數(shù)
    t = 20000
    z_lst = np.empty(t)

    # 輸入神經(jīng)元個(gè)數(shù)
    m = 1000
    x = np.ones(m)
    b = 0

    for i in xrange(t):
        w = np.random.randn(m) / np.sqrt(m)
        z = np.sum(x * w) + b
        z_lst[i] = z

    print 'z 均值:', np.mean(z_lst)
    print 'z 方差:', np.var(z_lst)
    # 保持與z分布(1)圖像橫坐標(biāo)刻度不變,使得結(jié)果更加直觀
    plt.xlim([-150, 150])
    plt.hist(z_lst, bins=10)
    plt.show()

輸出結(jié)果如下:

z 均值: 0.013468729222
z 方差: 1.00195898464

輸出圖像如下:

z分布(2)

這樣的話z的分布就是一個(gè)比較接近于0的數(shù)昔字,使得神經(jīng)元處于不太飽和的狀態(tài)爆袍,讓BP過程能夠正常進(jìn)行下去。

除了這種方式之外(除以前一層神經(jīng)元的個(gè)數(shù)n_in的開方)李滴,還有許多針對(duì)不同激活函數(shù)的不同權(quán)重初始化方法螃宙,比如兼顧了BP過程的除以( (n_in + n_out)/2 )。具體可以參考Stanford CS231n課程中提到的各種方法所坯。

后記

最后強(qiáng)烈安利Stanford CS231n的官方授權(quán)中文翻譯專欄知乎專欄:智能單元谆扎,感謝各位Zhihuer的辛勤翻譯,為后輩的學(xué)習(xí)與快速上手提供了極大的便利芹助。

參考

[1] www.neuralnetworksanddeeplearning.com堂湖,第三章
[2] Stanford CS231n
[3] Stanford CS231n官方授權(quán)中文翻譯闲先,知乎專欄:智能單元

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市无蜂,隨后出現(xiàn)的幾起案子伺糠,更是在濱河造成了極大的恐慌,老刑警劉巖斥季,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件训桶,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡酣倾,警方通過查閱死者的電腦和手機(jī)舵揭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來躁锡,“玉大人午绳,你說我怎么就攤上這事∮持” “怎么了拦焚?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長杠输。 經(jīng)常有香客問我赎败,道長,這世上最難降的妖魔是什么抬伺? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任螟够,我火速辦了婚禮,結(jié)果婚禮上峡钓,老公的妹妹穿的比我還像新娘妓笙。我一直安慰自己,他們只是感情好能岩,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布寞宫。 她就那樣靜靜地躺著,像睡著了一般拉鹃。 火紅的嫁衣襯著肌膚如雪辈赋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天膏燕,我揣著相機(jī)與錄音钥屈,去河邊找鬼。 笑死坝辫,一個(gè)胖子當(dāng)著我的面吹牛篷就,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播近忙,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼竭业,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼智润!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起未辆,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤窟绷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后咐柜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體兼蜈,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年炕桨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了饭尝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡献宫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出实撒,到底是詐尸還是另有隱情姊途,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布知态,位于F島的核電站捷兰,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏负敏。R本人自食惡果不足惜贡茅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望其做。 院中可真熱鬧顶考,春花似錦、人聲如沸妖泄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蹈胡。三九已至渊季,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間罚渐,已是汗流浹背却汉。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留荷并,地道東北人合砂。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像璧坟,于是被迫代替她去往敵國和親既穆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子赎懦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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