讀書筆記 初始化神經網路

2022-04-18 04:03:14 字數 3023 閱讀 1881

(本文是根據 neuralnetworksanddeeplearning 這本書的第三章improving the way neural networks learn整理而成的讀書筆記,根據個人口味做了刪減)

上一章,我們介紹了神經網路容易出現的過擬合問題,並學習了最常用的正則化方法,以及其他一些技巧,今天,我們將介紹本章節最後兩個問題:權重初始化超引數的選擇

到目前為止,我們都是用歸一化高斯分布來初始化權值,但是,我們很想知道是否有其他初始化方法可以讓網路訓練得更好。

事實上,確實存在比高斯分布更好的方法。不過,我們需要先了解高斯分布的初始化會存在哪些缺陷。

假設我們有如下的網路結構,其中包含 1000 個輸入神經元:

也就是說,大部分情況下 \(z \gg 1\) 或者 \(z \ll 1\)。對於採用 sigmoid 函式的 \(\sigma(z)\) 來說,這就意味著隱藏層可能已經收斂了(所謂收斂,就是訓練開始變緩或停止了,而導致收斂的原因在於,偏導中的 \(\sigma'(z)\) 在 \(|z|>1\) 時趨於 0,這樣梯度下降就沒法更新引數了)。之前我們用交叉熵函式解決了輸出層中學習率低的問題,但對於中間的隱藏層並沒有作用。而且,前一層隱藏層的輸出如果也成高斯分布,那麼再往後的隱藏層也會收斂。

改善這種問題的措施也很簡單,既然問題根源在於高斯分布太「寬」,那麼我們就想辦法讓它變「窄」,也就是標準差要變小。假設乙個神經元有 \(n_\) 個輸入權值,那麼我們只需要將所有權值按照均值為 0,標準差為 \(1/\sqrt}\) 的高斯分布初始化即可。這樣得到的新的高斯分布就會「瘦高」得多。對於之前的例子,在 500 個輸入為 0,500 個為 1 的情況下,新高斯分布的均值為 0,標準差為 \(\sqrt=1.22…\),如下圖所示:

這樣一來,\(z\) 的值普遍在 \([0, 1]\) 內,隱藏層過早收斂的情況也就有所緩解了。

我們再通過一組實驗來看看不同初始化方法的效果:

其中,橙線是用上面提及的新的高斯分布初始化,而藍線則是一般的高斯分布。從結果來看,新的初始化方法可以加速網路的訓練,但最終的準確率兩者相當。不過在某些情況下,\(1/\sqrt}\) 的初始化方式會提高準確率,在下一章中,我們將看到類似的例子。

要注意的一點是,以上的初始化都是針對權值 weight 的,對偏差 bias 的初始化不影響網路的訓練(原因暫時沒想明白)。

到目前為止,我們都沒有仔細討論超引數該如何選擇(如學習率 \(\eta\),正則化引數 \(\lambda\) 等等)。超引數的選擇對網路的訓練和效能都會產生影響。由於神經網路的複雜性,一旦網路出現問題,我們將很難定位問題的根源,搞不清楚到底是網路結構有問題,還是資料集有問題,還是超引數本身沒選好。因此,這一節我們將學習一些選擇超引數的「靈感」或者「準則」,減少在超引數選擇上的失誤。

寬泛的策略

之所以稱之為寬泛,是因為這種策略不告訴如何調整超引數,而是讓你盡可能快地得到反饋。只有盡快把握網路的學習情況,我們才有耐心和資訊繼續 debug(總不能每調整一次要等個十來分鐘才出結果吧)。我自己在 debug 網路的時候也經常採用這些做法,比如,只用很小的資料集訓練,或者將網路的結構變小等等。這些做法只有乙個目的:讓網路盡可能快地反饋結果,不管結果好壞,這是我們能繼續除錯下去的前提。在反覆除錯後,我們往往能得到一些「靈感」,之後再慢慢將問題變的更複雜一些,然後繼續除錯。

好了,下面我們針對學習率 \(\eta\)、l2 正則化引數 \(\lambda\) 和批訓練的資料集大小學習一些比較有效的準則。

學習率關於學習率的選擇,andrew ng 在他的 machine learning 課程中有過詳細的講解。這裡面最重要的是要避免學習率過大給梯度下降帶來「抖動」的問題,如下圖中的橙線所示。在設定學習率時,我們可以先設定乙個小一點的數值,如 0.1,如果這個數值太大,則調低乙個數量級到 0.01,甚至 0.001...如果發現學習過程中代價函式沒有出現「抖動」的情況,再適當提高學習率,如由原來的 0.1 提高到 0.2、0.5...但最終不能超過造成「抖動」的閾值。

early stopping 選擇訓練輪數

在神經網路中,並不是訓練得越多越好,之前已經提到過,訓練太多輪可能導致過擬合。因此,我們要採取盡可能合適的訓練輪數。early stopping 的具體做法是:在每一輪訓練後觀察驗證集上的準確率,當驗證集準確率不再上公升時,就停止訓練。這裡的準確率不再上公升指的是,在連續幾輪(比如 10 輪)的訓練後,準確率都不再有新的突破,始終維持在乙個穩定的數值。

調整學習率

前面說過,學習率過大可能導致梯度下降出現「抖動」,過小又會導致網路訓練太慢。在實際過程中,我們常常會遇到這樣的問題:當網路開始訓練時,由於 weights 不夠好,這個時候加大學習率可以快速改善網路;當網路訓練一段時間後,梯度下降開始到達最低點,這個時候小一點的學習率可以防治其越過最低點而出現「抖動」。因此,在訓練過程中,更好的方法不是固定乙個學習率,而是根據驗證集上的準確率情況,逐步調整學習率(比如一開始設為 0.1,當準確率上公升到 80% 後,調低到 0.01,上公升到 90% 後,再繼續調低,直到學習率只有初始值的千分之一為止)。

正則化引數

剛開始訓練時,最好將正則化引數 \(\lambda\) 設為 0.0,等學習率確定並且網路可以正常訓練後,再設定 \(\lambda\)。具體該設定為什麼,沒有通用的準則,只能根據實際情況判斷,可以是 1.0,或者 0.1,或者 10.0。總之,要根據驗證集上的準確率來判斷。

批訓練的資料集大小

理論上,我們完全可以在每次訓練時只用乙個樣本,但這樣會導致訓練過程相當漫長,而多個樣本進行批訓練,在當今計算機的快速矩陣運算下並不比單個樣本慢,這樣相當於同時訓練多個樣本的時間和單個樣本一樣(當然,將所有樣本都用於訓練還是會影響速度,所以才會採用隨機梯度訓練的批樣本)。另外,個人認為,綜合多個樣本再取均值進行訓練,可以抵消部分噪音樣本的影響。

《人工神經網路》讀書筆記

day 1 神經網路 指生物的大腦神經元,細胞,觸點等組成的網路,用於產生生物的意識,幫助生物進行思考和行動。人工神經網路 指旨在模仿人腦結構及其功能的資訊處理系統。人腦與計算機資訊處理機制的比較 1 系統結構 2 訊號形式 3 資訊儲存 4 資訊處理機制 1 系統結構 人腦 由數百億神經元相互連線...

神經網路的引數初始化

1.對於神經網路fminunc函式,我們需要初始化神經網路的initialtheta的引數。對於邏輯回歸來說,我們可以全部初始化為0,但是對於神經網路來說將initialtheta全部初始化為0是不可以的。2.為什麼全部初始化成0是不可以的呢?如果所有引數初始化成0,那麼隱藏層的每個節點的輸出都是相...

《python神經網路》讀書筆記(一)

大約三天讀完,這本書淺顯易懂,非常適合入門,只有權重調整值的推導過程看得不是很透徹。神經網路也是機器學習的一種實現,可以應用在有監督學習和無監督學習,因為中間可以有較多層,所以屬於深度學習方法。神經網路的名字很唬人,其實概念挺樸素的,是由含乙個輸入層乙個輸出層和若干隱藏層構成的有向無環圖 這名字也唬...