我剛剛聽說,從$(\ frac {-1} {\ sqrt d},\ frac {1} {\ sqrt d}} $範圍中選擇神經網絡的初始權重是一個好主意。 ,其中$ d $是給定神經元的輸入數量。假設這些集合已標準化-均值0,方差1(不知道這是否重要)。
為什麼這是個好主意?
我剛剛聽說,從$(\ frac {-1} {\ sqrt d},\ frac {1} {\ sqrt d}} $範圍中選擇神經網絡的初始權重是一個好主意。 ,其中$ d $是給定神經元的輸入數量。假設這些集合已標準化-均值0,方差1(不知道這是否重要)。
為什麼這是個好主意?
我假設您正在使用邏輯神經元,並且您正在通過梯度下降/反向傳播進行訓練。
對於大的正或負輸入,邏輯函數接近於平坦。輸入為$ 2 $時的導數約為$ 1/10 $,但是輸入為$ 10 $時的導數約為$ 1/22000 $。這意味著如果邏輯神經元的輸入為$ 10 $,那麼對於給定的訓練信號,神經元將學習的$ 2200 $比輸入$ 2 $慢兩倍。
如果希望神經元快速學習,則需要產生巨大的訓練信號(例如具有交叉熵損失函數),或者希望導數較大。為了使導數變大,您可以設置初始權重,以便經常獲得在$ [-4,4] $範圍內的輸入。
您賦予的初始權重可能會或可能不會起作用。這取決於如何標準化輸入。如果將輸入歸一化為均值$ 0 $和標準差$ 1 $,則將$ d $項的隨機總和的權重統一為$(\ frac {-1} {\ sqrt {d}},\ frac {1} {\ sqrt {d}})$將具有均值$ 0 $和方差$ \ frac {1} {3} $,獨立於$ d $。您獲得$ [-4,4] $之外的款項的可能性很小。這意味著當您增加$ d $時,您不會使神經元開始飽和,從而使它們不學習。
對於未歸一化的輸入,這些權重可能無法有效避免飽和。
[1]解決了這個問題:
首先,不應該將權重設置為零,以便在反向傳播時打破對稱性:
通常可以將偏差設置為初始化為零,但權重需要仔細初始化以打破同一層隱藏單元之間的對稱性。由於不同的輸出單元接收到不同的梯度信號,因此這種對稱破壞問題與輸出權重(進入輸出單元)無關,因此也可以將其設置為零。
一些初始化策略:
W = np.rand om.randn(ndim,ndim); u,s,v = np.linalg.svd(W)
,然後使用 u
作為您的初始化矩陣。此外,無監督的預訓練在某些情況下可能會有所幫助:
一個重要的選擇是,是否應該使用無監督的預訓練(以及要使用哪種無監督的特徵學習算法)來初始化參數。在大多數情況下,我們發現無監督的預訓練可以幫助您,很少受到傷害,但這當然意味著額外的訓練時間和其他超參數。
一些ANN庫也有一些有趣的地方清單,例如千層面:
Constant([val])用恆定值初始化權重。Normal([std,mean])從高斯分佈中採樣初始權重。Uniform([range,std,mean])從均值中採樣初始權重distribution.Glorot(initializer [,gain,c01b])Glorot權重初始化.GlorotNormal([gain,c01b])具有從正態分佈中採樣的權重的Glorot.GlorotUniform([gain,c01b])具有從Uniform分佈中採樣的權重的Glorot。 He(initializer [,gain,c01b])He權重初始化。HeNormal([gain,c01b])He初始化器,其權重從正態分佈中採樣。HeUniform([gain,c01b])He初始化器,其權重從Uniform分佈中採樣。 Orthogonal([gain])將權重初始化為正交矩陣。Sparse([sparsity,std])將權重初始化為稀疏矩陣。
[1] Bengio,Yoshua。 “ 基於梯度的深度架構培訓的實用建議。”“神經網絡:交易技巧”。 Springer Berlin Heidelberg,2012年。437-478。
[2] LeCun,Y.,Bottou,L.,Orr,G. B.和Muller,K.(1998a)。 高效的反向傳播器。在神經網絡中,交易技巧。
[3] Glorot,Xavier和Yoshua Bengio。 “ 理解訓練深度前饋神經網絡的困難。”國際人工智能與統計會議。 2010。
以下解釋摘自《克里斯托弗·畢曉普(Christopher Bishop)》一書中的“用於模式識別的神經網絡”。很棒的書!假設您先前已將輸入單元的輸入加白,即$$ <x_ {i} > = 0 $$和$$ <x_ {i} ^ {2} > = 1 $$
問題是:如何最好地選擇權重?這個想法是按照分佈隨機選擇權重的值,這有助於優化過程收斂到有意義的解決方案。
您必須激活第一層的單位,$ y = g(a)$$,其中$$ a = \ sum_ {i = 0} ^ {d} w_ {i} x_ {i} $$。現在,由於您從輸入中獨立選擇權重,因此$$ <a> = \ sum_ {i = 0} ^ {d} <w_ {i} x_ {i} > = \ sum_ {i = 0} ^ {d} <w_ { i} ><x_ {i} > = 0 $$和$$ <a ^ 2> = \ left< \ left(\ sum_ {i = 0} ^ {d} w_ {i} x_ {i} \ right)\ left(\ sum_ {i = 0} ^ {d} w_ {i} x_ {i} \ right)\ right> = \ sum_ {i = 0} ^ {d} <w_ {i} ^ {2} ><x_ {i} ^ {2} > = \ sigma ^ {2} d $$,其中sigma是權重分佈的方差。要得出此結果,您需要回想一下權重是相互獨立初始化的,即$$ <w_ {i} w_ {j} > = \ delta_ {ij} $$
作為更新,深入整流器:超越人的性能n He等人的ImageNet分類引入了一種初始化方式,特別是初始化方式 w = U([0,n])* sqrt(2.0 / n)
,其中 n
是您的NN的輸入數量。我已經看到許多最近的作品(也與ReLU一起使用)使用了這種初始化。他們實際上顯示了這是如何開始以比您提到的(-1 / n,1 / n)更快的速度降低錯誤率的。有關詳細說明,請參見本文,但收斂速度有多快:
這個想法是,您希望以確保網絡中良好的前後數據流的方式初始化權重。也就是說,您不希望激活過程隨著網絡的發展而持續縮小或增加。
此圖顯示了一次MNIST通過網絡後,在3種不同的初始化策略下5層ReLU多層感知器的激活情況。
在所有三種情況下,權重均從零中心正態分佈中得出,該分佈由其標準偏差確定。您會看到,如果初始權重太小(標準偏差太小),則激活會被阻塞,而如果權重太大,則激活會爆炸。可以通過設置權重來找到中間值,即大約正確的值,以使激活和梯度更新的方差與您通過網絡時保持大致相同。
我寫了有關體重初始化的博客文章,其中有更詳細的內容,但基本思想如下。
如果$ x ^ {(i)} $表示第$ i $層的激活,則$ n_i $表示該層的大小,而$ w ^ {(i)} $表示將它們連接到第二層的權重。 $(i + 1)$-st層,那麼可以證明對於激活函數$ f $和$ f'(s)\大約1 $,我們有
$$ \ text {Var}(x ^ {(i + 1)})= n_i \ text {Var}(x ^ {(i)})\ text {Var}(w ^ {{i}}) $$
為了獲得$ \ text {Var}(x ^ {(i + 1)})= \ text {Var}(x ^ {(i + 1}})$,我們必須施加條件
$$ \ text {Var}(w ^ {(i)})= \ frac {1} {n_i} \,。 $$
如果我們用$ \ Delta_j ^ {{i)} $表示$ \ frac {\ partial L} {\ partial x_j ^ {{i}}} $,則在向後傳遞時,我們同樣希望
$$ \ text {Var}(\ Delta ^ {(i)})= n_ {i + 1} \ text {Var}(\ Delta ^ {{i + 1)})\ text {Var}(w ^ {(i )})\,.。 $$
除非$ n_i = n_ {i + 1} $,否則我們必須在這兩個條件之間折衷,並且合理的選擇是諧波均值
$$ \ text {Var}(w ^ {(i)})= \ frac {2} {n_i + n_ {i + 1}} \,。 $$
如果我們從正態分佈$ N(0,\ sigma)$中採樣權重,則可以使用$ \ sigma = \ sqrt {\ frac {2} {n_i + n_ {i + 1}}} $滿足此條件。 對於統一分佈$ U(-a,a)$,我們應該採用$ a = \ sqrt {\ frac {6} {n_i + n_ {i + 1}}}} $,因為$ \ text {Var} \ left(U(-a,a)\ right)= a ^ 2/3 $。 因此,我們到達了Glorot初始化。例如,這是Keras中密集和2D卷積層的默認初始化策略。
Glorot初始化對於微不足道的激活和$ \ tanh $激活非常有效,但對於$ \ text {ReLU} $則效果不佳。 幸運的是,由於$ f(s)= \ text {ReLU}(s)$只是將負輸入歸零,因此可以大致消除一半的方差,並且可以通過將上面的條件之一乘以2來輕鬆修改:
$$ \ text {Var}(w ^ {(i)})= \ frac {2} {n_i} \。 $$
另一種減輕權重初始化問題的技術是Batch Normalization。它用於標準化每個單元的均值和方差,以穩定學習,如原始論文中所述。實際上,使用批處理規範化(BN)的網絡對於不良的初始化要強大得多。 BN的工作方式如下: $$ \ mu_B = \ frac {1} {m} \ sum_ {i = 1} ^ {M} x_i ~~~ and ~~~ \ sigma_ {B} ^ {2} = \ frac {1} {m} \ sum_ {i = 1} ^ {m}(x_i-\ mu_B)^ {2} \\ \ hat {x} _i = \ frac {x_i-\ mu_B} {\ sqrt {\ sigma_ {B} ^ {2} + \ epsilon}} ~~~ and ~~~ BN(x_i)= \ gamma \ hat { x} _i + \ beta $$ 我們為每個小批量計算經驗均值和方差,然後標準化輸入$ x_i $並通過將$ \ hat {x} _i $縮放$ \ gamma $並加上$ \ beta來形成輸出$ BN(x_i)$ $兩者都是在培訓期間學習的。
BN每次激活都會引入兩個額外的參數($ \ gamma $和$ \ beta $),這些參數允許$ \ hat {x} _i $具有任何均值和標準差。這樣做的原因是規範化$ x_i $會降低其表達能力。這種新的參數化具有更好的學習動態:在舊的參數化中,$ x_i $的平均值由所有先前層的參數之間的複雜交互作用確定-因此,隨著網絡變得更深,網絡參數的細微變化會放大。在新的參數化中,$ \ hat {x} _i $的平均值由我們在訓練過程中與$ \ gamma $一起學習的$ \ beta $決定。因此,批標準化可穩定學習。
因此,批處理規範化通過使用更高的學習率來實現更快的訓練,並減輕了初始化錯誤的問題。 BN還可以通過防止網絡陷入飽和模式來使用飽和非線性。總而言之,批歸一化是可微分的轉換,它將歸一化的激活引入網絡。實際上,可以在完全連接的層之後立即插入BN層。