如何選擇前饋神經網絡中隱藏層和節點的數量?
在前饋神經網絡中,是否有標準且可接受的方法來選擇層數和每層中的節點數?我對構建神經網絡的自動化方式很感興趣。
我意識到這個問題已經得到回答,但我認為現存的答案除了指向通常與問題主題相關的鏈接之外,並沒有真正涉及到這個問題。特別是,該鏈接描述了一種用於程序化網絡配置的技術,但這不是網絡配置的“ [a] 標準和公認方法”。
通過遵循一小組明確的規則,可以以編程方式設置一個稱職的網絡架構(即神經元層的數量和類型以及構成每一層的神經元的數量)。遵循此架構,這將為您提供一個稱職的架構,但可能不是最佳架構。
但是一旦這個網絡被初始化,你可以在訓練期間使用一些輔助算法迭代地調整配置;其中一個家族通過在一定數量的訓練時期後基於權重向量的(小)值修剪節點 - 換句話說,消除不必要的/冗餘節點(更多內容見下文)。
所以每個 NN 都有三種類型的層:輸入、隱藏和輸出。
因此,創建 NN 架構意味著為每種類型的層數和每個層中的節點數計算值。
輸入層
很簡單——每個 NN 都有其中的一個——我知道沒有例外。
關於構成該層的神經元數量,一旦您知道訓練數據的形狀,該參數就會完全且唯一地確定。具體來說,構成該層的神經元數量等於數據中特徵(列)的數量。一些 NN 配置為偏置項添加了一個額外的節點。
輸出層
與輸入層一樣,每個 NN 都只有一個輸出層。確定其大小(神經元數量)很簡單;它完全由所選模型配置決定。
您的 NN 是在機器模式還是回歸模式下運行(使用統計中也使用的術語但為其分配不同含義的 ML 約定非常令人困惑)。機器模式:返回一個類標籤(例如,“Premium Account”/“Basic Account”)。回歸模式返回一個值(例如,價格)。
如果 NN 是回歸器,則輸出層只有一個節點。
如果 NN 是分類器,那麼它也只有一個節點,除非使用softmax,在這種情況下,輸出層在模型中的每個類標籤都有一個節點。
隱藏層
因此,這幾條規則設置了輸入層和輸出層的層數和大小(神經元/層)。這留下了隱藏層。
有多少隱藏層?好吧,如果您的數據是線性可分的(在您開始編寫 NN 時您通常知道這一點),那麼您根本不需要任何隱藏層。當然,您也不需要 NN 來解析您的數據,但它仍然可以完成這項工作。
除此之外,您可能知道,還有大量關於 NN 中隱藏層配置問題的評論(有關該評論的精彩摘要,請參閱瘋狂透徹和富有洞察力的NN FAQ)。該主題中達成共識的一個問題是與添加額外隱藏層的性能差異:通過第二個(或第三個等)隱藏層提高性能的情況很少。對於大多數問題,一個隱藏層就足夠了。
那麼隱藏層的大小呢——多少個神經元?有一些經驗得出的經驗法則,其中最常依賴的是“隱藏層的最佳大小通常介於輸入層的大小和輸出層的大小之間”。Jeff Heaton,《Java 神經網絡簡介》一書的作者提供了更多內容。
總而言之,對於大多數問題,通過僅使用兩條規則設置隱藏層配置,可能可以獲得不錯的性能(即使沒有第二個優化步驟):(i)隱藏層的數量等於 1;(ii) 該層中神經元的數量是輸入和輸出層中神經元的平均值。
網絡配置優化
修剪描述了一組技術來修剪網絡大小(通過節點而不是層)以提高計算性能,有時甚至是分辨率性能。這些技術的要點是在訓練期間通過識別那些如果從網絡中移除不會顯著影響網絡性能(即數據的分辨率)的節點來從網絡中移除節點。(即使不使用正式的剪枝技術,您也可以通過在訓練後查看權重矩陣來粗略了解哪些節點不重要;查看非常接近於零的權重——通常是這些權重兩端的節點修剪期間刪除。)顯然,如果您在訓練期間使用修剪算法,那麼從更可能有多餘(即“可修剪”)節點的網絡配置開始 - 換句話說,
換句話說,通過在訓練期間對網絡應用剪枝算法,您可以接近最優網絡配置;您是否可以在單個“預先”(例如基於遺傳算法的算法)中做到這一點我不知道,儘管我現在知道,這種兩步優化更常見。