Stanford UFLDL教程 深度网络概览
深度網絡概覽
Contents[hide]
|
概述
在之前的章節中,你已經構建了一個包括輸入層、隱藏層以及輸出層的三層神經網絡。雖然該網絡對于MNIST手寫數字數據庫非常有效,但是它還是一個非常“淺”的網絡。這里的“淺”指的是特征(隱藏層的激活值)只使用一層計算單元(隱藏層)來得到的。
在本節中,我們開始討論深度神經網絡,即含有多個隱藏層的神經網絡。通過引入深度網絡,我們可以計算更多復雜的輸入特征。因為每一個隱藏層可以對上一層的輸出進行非線性變換,因此深度神經網絡擁有比“淺層”網絡更加優異的表達能力(例如可以學習到更加復雜的函數關系)。
值得注意的是當訓練深度網絡的時候,每一層隱層應該使用非線性的激活函數 。這是因為多層的線性函數組合在一起本質上也只有線性函數的表達能力(例如,將多個線性方程組合在一起僅僅產生另一個線性方程)。因此,在激活函數是線性的情況下,相比于單隱藏層神經網絡,包含多隱藏層的深度網絡并沒有增加表達能力。
深度網絡的優勢
為什么我們要使用深度網絡呢?使用深度網絡最主要的優勢在于,它能以更加緊湊簡潔的方式來表達比淺層網絡大得多的函數集合。正式點說,我們可以找到一些函數,這些函數可以用 層網絡簡潔地表達出來(這里的簡潔是指隱層單元的數目只需與輸入單元數目呈多項式關系)。但是對于一個只有 層的網絡而言,除非它使用與輸入單元數目呈指數關系的隱層單元數目,否則不能簡潔表達這些函數。
舉一個簡單的例子,比如我們打算構建一個布爾網絡來計算 個輸入比特的奇偶校驗碼(或者進行異或運算)。假設網絡中的每一個節點都可以進行邏輯“或”運算(或者“與非”運算),亦或者邏輯“與”運算。如果我們擁有一個僅僅由一個輸入層、一個隱層以及一個輸出層構成的網絡,那么該奇偶校驗函數所需要的節點數目與輸入層的規模 呈指數關系。但是,如果我們構建一個更深點的網絡,那么這個網絡的規模就可做到僅僅是 的多項式函數。
當處理對象是圖像時,我們能夠使用深度網絡學習到“部分-整體”的分解關系。例如,第一層可以學習如何將圖像中的像素組合在一起來檢測邊緣(正如我們在前面的練習中做的那樣)。第二層可以將邊緣組合起來檢測更長的輪廓或者簡單的“目標的部件”。在更深的層次上,可以將這些輪廓進一步組合起來以檢測更為復雜的特征。
最后要提的一點是,大腦皮層同樣是分多層進行計算的。例如視覺圖像在人腦中是分多個階段進行處理的,首先是進入大腦皮層的“V1”區,然后緊跟著進入大腦皮層“V2”區,以此類推。
訓練深度網絡的困難
雖然幾十年前人們就發現了深度網絡在理論上的簡潔性和較強的表達能力,但是直到最近,研究者們也沒有在訓練深度網絡方面取得多少進步。問題原因在于研究者們主要使用的學習算法是:首先隨機初始化深度網絡的權重,然后使用有監督的目標函數在有標簽的訓練集 上進行訓練。例如通過使用梯度下降法來降低訓練誤差。然而,這種方法通常不是十分奏效。這其中有如下幾方面原因:
數據獲取問題
使用上面提到的方法,我們需要依賴于有標簽的數據才能進行訓練。然而有標簽的數據通常是稀缺的,因此對于許多問題,我們很難獲得足夠多的樣本來擬合一個復雜模型的參數。例如,考慮到深度網絡具有強大的表達能力,在不充足的數據上進行訓練將會導致過擬合。
局部極值問題
使用監督學習方法來對淺層網絡(只有一個隱藏層)進行訓練通常能夠使參數收斂到合理的范圍內。但是當用這種方法來訓練深度網絡的時候,并不能取得很好的效果。特別的,使用監督學習方法訓練神經網絡時,通常會涉及到求解一個高度非凸的優化問題(例如最小化訓練誤差,其中參數 是要優化的參數。對深度網絡而言,這種非凸優化問題的搜索區域中充斥著大量“壞”的局部極值,因而使用梯度下降法(或者像共軛梯度下降法,L-BFGS等方法)效果并不好。
梯度彌散問題
梯度下降法(以及相關的L-BFGS算法等)在使用隨機初始化權重的深度網絡上效果不好的技術原因是:梯度會變得非常小。具體而言,當使用反向傳播方法計算導數的時候,隨著網絡的深度的增加,反向傳播的梯度(從輸出層到網絡的最初幾層)的幅度值會急劇地減小。結果就造成了整體的損失函數相對于最初幾層的權重的導數非常小。這樣,當使用梯度下降法的時候,最初幾層的權重變化非常緩慢,以至于它們不能夠從樣本中進行有效的學習。這種問題通常被稱為“梯度的彌散”.
與梯度彌散問題緊密相關的問題是:當神經網絡中的最后幾層含有足夠數量神經元的時候,可能單獨這幾層就足以對有標簽數據進行建模,而不用最初幾層的幫助。因此,對所有層都使用隨機初始化的方法訓練得到的整個網絡的性能將會與訓練得到的淺層網絡(僅由深度網絡的最后幾層組成的淺層網絡)的性能相似。
逐層貪婪訓練方法
那么,我們應該如何訓練深度網絡呢?逐層貪婪訓練方法是取得一定成功的一種方法。我們會在后面的章節中詳細闡述這種方法的細節。簡單來說,逐層貪婪算法的主要思路是每次只訓練網絡中的一層,即我們首先訓練一個只含一個隱藏層的網絡,僅當這層網絡訓練結束之后才開始訓練一個有兩個隱藏層的網絡,以此類推。在每一步中,我們把已經訓練好的前 層固定,然后增加第 層(也就是將我們已經訓練好的前 的輸出作為輸入)。每一層的訓練可以是有監督的(例如,將每一步的分類誤差作為目標函數),但更通常使用無監督方法(例如自動編碼器,我們會在后邊的章節中給出細節)。這些各層單獨訓練所得到的權重被用來初始化最終(或者說全部)的深度網絡的權重,然后對整個網絡進行“微調”(即把所有層放在一起來優化有標簽訓練集上的訓練誤差).
逐層貪婪的訓練方法取得成功要歸功于以下幾方面:
數據獲取
雖然獲取有標簽數據的代價是昂貴的,但獲取大量的無標簽數據是容易的。自學習方法(self-taught learning)的潛力在于它能通過使用大量的無標簽數據來學習到更好的模型。具體而言,該方法使用無標簽數據來學習得到所有層(不包括用于預測標簽的最終分類層) 的最佳初始權重。相比純監督學習方法,這種自學習方法能夠利用多得多的數據,并且能夠學習和發現數據中存在的模式。因此該方法通常能夠提高分類器的性能。
更好的局部極值
當用無標簽數據訓練完網絡后,相比于隨機初始化而言,各層初始權重會位于參數空間中較好的位置上。然后我們可以從這些位置出發進一步微調權重。從經驗上來說,以這些位置為起點開始梯度下降更有可能收斂到比較好的局部極值點,這是因為無標簽數據已經提供了大量輸入數據中包含的模式的先驗信息。
在下一節中,我們將會具體闡述如何進行逐層貪婪訓練。
中英文對照
總結
以上是生活随笔為你收集整理的Stanford UFLDL教程 深度网络概览的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Stanford UFLDL教程 从自我
- 下一篇: Stanford UFLDL教程 栈式自