深度神經網路為何很難訓練?
假設你是一名工程師,接到一項從頭開始設計計算機的任務。某天,你在工作室工作,設計邏輯電路,構建AND門,OR門等等時,老闆帶著壞訊息進來:客戶剛剛新增了一個奇特的設計需求:整個計算機的線路的深度必須只有兩層:
你驚呆了,跟老闆說道:“這貨瘋掉了吧!”
老闆說:“我也認為他們瘋了,但是客戶的需求比天大,我們要滿足它。”
實際上,在某種程度上看,他們的客戶並沒有太瘋狂。假設你可以使用某種特殊的邏輯閘,它讓你對任意多的輸入做AND運算。同樣也能使用多輸入的NAND門——可以對多個輸入做AND運算並取負的門。有了這類特殊的門,構建出來的兩層深度的電路可以計算任何函式。
但是僅僅因為某件事是理論上可能的,並不代表這是一個好的想法。在實踐中,在解決線路設計問題(或者大多數的其他演算法問題)時,我們通常考慮如何解決子問題,然後逐步地整合這些子問題的解。換句話說,我們通過多層的抽象來獲得最終的解答。
例如,假設我們來設計一個邏輯線路來做兩個數的乘法。我們希望在已經有了計算兩個數加法的子線路基礎上建立這個邏輯線路。計算兩個數和的子線路也是構建在用於兩個位元相加的子子線路上的。粗略地講我們的線路看起來像這個樣子:
最終的線路包含至少三層線路的基本部分。實際上,這個線路很可能會超過三層,因為我們可以將子任務分解成比上述更小的單元。但是基本思想就是這樣。
因此深度線路讓這樣的設計過程變得更加簡單。但是這對於設計本身幫助並不大。其實,數學證明對於某些函式設計的⾮常淺的線路可能需要指數級的線路單元來計算。例如,在1980 年代早期的一系列著名的論文已經給出了計算位元的集合的奇偶性通過淺的線路來計算需要指數級的門。另一當面,如果你使⽤更深的線路,那麼可以使用規模很小的線路來計算奇偶性:僅僅需要計算位元的對的奇偶性,然後使用這些結果來計算位元對的對的奇偶性,以此類推,構建出總共的奇偶性。深度線路這樣就能從本質上獲得超過淺線路的更強的能力。
幾乎我們遇到的所有的網路就只包括一層隱藏神經元(另外還有輸入輸出層):
這些簡單的網路已經非常有用了:在前面的章節中,我們使用這樣的網路可以進行準確率高達98% 的手寫數字的識別!而且,憑直覺地看,我們期望擁有更多隱藏層的神經網路能夠變的更加強大:
這樣的網路可以使用中間層構建出多層的抽象,正如我們在布林線路中做的那樣。例如,如果我們在進行視覺模式識別,那麼在第一層的神經元可能學會識別邊,在第二層的神經元可以在邊的基礎上學會識別出更加複雜的形狀,例如三⻆形或者矩形。第三層將能夠識別更加複雜的形狀。以此類推。這些多層的抽象看起來能夠賦予深度網路一種學習解決複雜模式識別問題的能力。然後,正如線路的示例中看到的那樣,存在著理論上的研究結果告訴我們深度網路在本質上比淺層網路更加強大。
你驚呆了,跟老闆說道:“這貨瘋掉了吧!”
老闆說:“我也認為他們瘋了,但是客戶的需求比天大,我們要滿足它。”
實際上,在某種程度上看,他們的客戶並沒有太瘋狂。假設你可以使用某種特殊的邏輯閘,它讓你對任意多的輸入做AND運算。同樣也能使用多輸入的NAND門——可以對多個輸入做AND運算並取負的門。有了這類特殊的門,構建出來的兩層深度的電路可以計算任何函式。
但是僅僅因為某件事是理論上可能的,並不代表這是一個好的想法。在實踐中,在解決線路設計問題(或者大多數的其他演算法問題)時,我們通常考慮如何解決子問題,然後逐步地整合這些子問題的解。換句話說,我們通過多層的抽象來獲得最終的解答。
例如,假設我們來設計一個邏輯線路來做兩個數的乘法。我們希望在已經有了計算兩個數加法的子線路基礎上建立這個邏輯線路。計算兩個數和的子線路也是構建在用於兩個位元相加的子子線路上的。粗略地講我們的線路看起來像這個樣子:
最終的線路包含至少三層線路的基本部分。實際上,這個線路很可能會超過三層,因為我們可以將子任務分解成比上述更小的單元。但是基本思想就是這樣。
因此深度線路讓這樣的設計過程變得更加簡單。但是這對於設計本身幫助並不大。其實,數學證明對於某些函式設計的⾮常淺的線路可能需要指數級的線路單元來計算。例如,在1980 年代早期的一系列著名的論文已經給出了計算位元的集合的奇偶性通過淺的線路來計算需要指數級的門。另一當面,如果你使⽤更深的線路,那麼可以使用規模很小的線路來計算奇偶性:僅僅需要計算位元的對的奇偶性,然後使用這些結果來計算位元對的對的奇偶性,以此類推,構建出總共的奇偶性。深度線路這樣就能從本質上獲得超過淺線路的更強的能力。
幾乎我們遇到的所有的網路就只包括一層隱藏神經元(另外還有輸入輸出層):
這些簡單的網路已經非常有用了:在前面的章節中,我們使用這樣的網路可以進行準確率高達98% 的手寫數字的識別!而且,憑直覺地看,我們期望擁有更多隱藏層的神經網路能夠變的更加強大:
這樣的網路可以使用中間層構建出多層的抽象,正如我們在布林線路中做的那樣。例如,如果我們在進行視覺模式識別,那麼在第一層的神經元可能學會識別邊,在第二層的神經元可以在邊的基礎上學會識別出更加複雜的形狀,例如三⻆形或者矩形。第三層將能夠識別更加複雜的形狀。以此類推。這些多層的抽象看起來能夠賦予深度網路一種學習解決複雜模式識別問題的能力。然後,正如線路的示例中看到的那樣,存在著理論上的研究結果告訴我們深度網路在本質上比淺層網路更加強大。
相關文章
- 《神經網路和深度學習》系列文章三十八:深度神經網路為何很難訓練?神經網路深度學習
- Batch Normalization: 如何更快地訓練深度神經網路BATORM神經網路
- 3.3 神經網路的訓練神經網路
- 深度學習與CV教程(6) | 神經網路訓練技巧 (上)深度學習神經網路
- 如何用C++在TensorFlow中訓練深度神經網路C++神經網路
- 機器學習之訓練神經網路:最佳做法機器學習神經網路
- 談談如何訓練一個效能不錯的深度神經網路神經網路
- 何為神經網路卷積層?神經網路卷積
- 使用tf.estimator.Estimator訓練神經網路神經網路
- 谷歌力作:神經網路訓練中的Batch依賴性很煩?那就消了它!谷歌神經網路BAT
- 如何應對訓練的神經網路不工作?神經網路
- 從零開始:教你如何訓練神經網路神經網路
- 訓練神經網路時如何確定batch size?神經網路BAT
- 用神經網路測量訓練集的半衰期神經網路
- 訓練自己的Android TensorFlow神經網路Android神經網路
- umich cv-5-1 神經網路訓練1神經網路
- umich cv-5-2 神經網路訓練2神經網路
- 深度神經網路的分散式訓練概述:常用方法和技巧全面總結神經網路分散式
- 訓練深度神經網路失敗的罪魁禍首不是梯度消失,而是退化神經網路梯度
- 【人工神經網路基礎】為什麼神經網路選擇了“深度”?神經網路
- 用神經網路訓練一個文字分類器神經網路文字分類
- 白話深度神經網路神經網路
- 零基礎入門深度學習(一):用numpy實現神經網路訓練深度學習神經網路
- 【python實現卷積神經網路】開始訓練Python卷積神經網路
- 【深度學習篇】--神經網路中的卷積神經網路深度學習神經網路卷積
- 如何優化深度神經網路?優化神經網路
- 深度剖析卷積神經網路卷積神經網路
- 神經網路和深度學習神經網路深度學習
- 神經網路訓練的三個基本概念Epoch, Batch, Iteration神經網路BAT
- 如何入門Pytorch之四:搭建神經網路訓練MNISTPyTorch神經網路
- 【機器學習】李宏毅——類神經網路訓練不起來怎麼辦機器學習神經網路
- 神經網路之反向傳播訓練(8行程式碼)神經網路反向傳播行程
- 深度學習 | 訓練網路trick——mixup深度學習
- 使用深度神經網路為什麼8位足夠?神經網路
- 使用人工神經網路訓練手寫數字識別模型神經網路模型
- 面向統一的AI神經網路架構和預訓練方法AI神經網路架構
- 【深度學習】神經網路入門深度學習神經網路
- 再聊神經網路與深度學習神經網路深度學習