隱藏層(hidden layer)
/ HID-un LAY-er /
隱藏層,是網路裡位於輸入與輸出之間的任何一層神經元——既不是你餵資料進去的那部分,也不是你讀答案出來的那部分。它被叫做「隱藏」,並不是因為它神秘,而僅僅是因為你從不直接看到它的數值;這些數值住在機器內部,做著中間的活兒。如果把網路比作一條流水線,輸入層是原材料,輸出層是成品,而隱藏層就是中間所有那些「半成品」的工位。
真正的「思考」就發生在隱藏層裡。每一層都把前一層找到的模式,組合成更抽象的東西。在一個圖像網路裡,靠前的隱藏層也許在探測邊緣,下一層也許把邊緣拼裝成眼睛、車輪這樣的形狀,更靠後的一層也許就認出整張臉或整輛車了。沒人告訴這些層要這樣分工——它們是在訓練中自己發現了這樣一種層級。網路的深度,說的就是它有多少個隱藏層;「深度學習」之名,正是源於把許多隱藏層疊在一起。
更多的隱藏層、更多的神經元,給網路更大的容量去表示複雜的模式——但這並非免費。更大的網路需要更多的資料和更多的算力來訓練,也更容易過擬合,也就是去死記訓練樣本裡的怪癖,而非學到那條普適的規律。該用多少個隱藏層、把它們造得多寬,是搭建網路時日常要做的平衡之一,沒有一條適合所有問題的公式。
一個識別手寫數字的網路,有 784 個輸入神經元(28×28 圖像的每個像素各一個)和 10 個輸出神經元(每個數字各一個)。在它們之間,你也許會放兩個隱藏層,比方說 128 個和 64 個神經元。你從不直接察看這 192 個隱藏的數值——但正是在隱藏層裡,像素悄然變成了筆畫,筆畫又變成了數字。
隱藏層是那些「中間階段」,原始輸入在這裡逐步變成抽象的特徵。
隱藏層越多並不會自動越好。超出你的資料和問題所需的那部分,多餘的深度主要徒增成本與過擬合的風險——而極深的堆疊還可能因為梯度在回傳途中消失而難以訓練。