深度神經網路為何很難訓練?

shenmanli發表於2017-12-21
假設你是一名工程師,接到一項從頭開始設計計算機的任務。某天,你在工作室工作,設計邏輯電路,構建AND門,OR門等等時,老闆帶著壞訊息進來:客戶剛剛新增了一個奇特的設計需求:整個計算機的線路的深度必須只有兩層:

你驚呆了,跟老闆說道:“這貨瘋掉了吧!”
老闆說:“我也認為他們瘋了,但是客戶的需求比天大,我們要滿足它。”
實際上,在某種程度上看,他們的客戶並沒有太瘋狂。假設你可以使用某種特殊的邏輯閘,它讓你對任意多的輸入做AND運算。同樣也能使用多輸入的NAND門——可以對多個輸入做AND運算並取負的門。有了這類特殊的門,構建出來的兩層深度的電路可以計算任何函式。
但是僅僅因為某件事是理論上可能的,並不代表這是一個好的想法。在實踐中,在解決線路設計問題(或者大多數的其他演算法問題)時,我們通常考慮如何解決子問題,然後逐步地整合這些子問題的解。換句話說,我們通過多層的抽象來獲得最終的解答。


例如,假設我們來設計一個邏輯線路來做兩個數的乘法。我們希望在已經有了計算兩個數加法的子線路基礎上建立這個邏輯線路。計算兩個數和的子線路也是構建在用於兩個位元相加的子子線路上的。粗略地講我們的線路看起來像這個樣子:



最終的線路包含至少三層線路的基本部分。實際上,這個線路很可能會超過三層,因為我們可以將子任務分解成比上述更小的單元。但是基本思想就是這樣。


因此深度線路讓這樣的設計過程變得更加簡單。但是這對於設計本身幫助並不大。其實,數學證明對於某些函式設計的⾮常淺的線路可能需要指數級的線路單元來計算。例如,在1980 年代早期的一系列著名的論文已經給出了計算位元的集合的奇偶性通過淺的線路來計算需要指數級的門。另一當面,如果你使⽤更深的線路,那麼可以使用規模很小的線路來計算奇偶性:僅僅需要計算位元的對的奇偶性,然後使用這些結果來計算位元對的對的奇偶性,以此類推,構建出總共的奇偶性。深度線路這樣就能從本質上獲得超過淺線路的更強的能力。


幾乎我們遇到的所有的網路就只包括一層隱藏神經元(另外還有輸入輸出層):



這些簡單的網路已經非常有用了:在前面的章節中,我們使用這樣的網路可以進行準確率高達98% 的手寫數字的識別!而且,憑直覺地看,我們期望擁有更多隱藏層的神經網路能夠變的更加強大:



這樣的網路可以使用中間層構建出多層的抽象,正如我們在布林線路中做的那樣。例如,如果我們在進行視覺模式識別,那麼在第一層的神經元可能學會識別邊,在第二層的神經元可以在邊的基礎上學會識別出更加複雜的形狀,例如三⻆形或者矩形。第三層將能夠識別更加複雜的形狀。以此類推。這些多層的抽象看起來能夠賦予深度網路一種學習解決複雜模式識別問題的能力。然後,正如線路的示例中看到的那樣,存在著理論上的研究結果告訴我們深度網路在本質上比淺層網路更加強大。

相關文章