在先前的練習中,你已經看到,僅僅在網路中添加隱藏層不足以表示非線性。對線性運算進行線性運算仍是線性運算。
如何配置神經網路來學習數值之間的非線性關係?我們需要某種方法將非線性數學運算融入模型中。
如果這看起來有點眼熟,那是因為我們在課程前面部分已經對線性模型的輸出應用了非線性數學運算。在邏輯迴歸模組中,我們透過將模型的輸出通過sigmoid 函數,使線性迴歸模型輸出 0 到 1 之間的連續值(表示機率)。
我們可以將同樣的原理應用在神經網路上。讓我們回顧一下之前練習 2中的模型,但這一次,在輸出每個節點的值之前,我們將首先應用 sigmoid 函數:
點選「>| 」按鈕(位於播放按鈕右側),逐步查看每個節點的計算過程。在圖表下方的「計算」面板中,查看用於計算每個節點值的數學運算。請注意,每個節點的輸出現在是上一層節點線性組合的 sigmoid 變換,並且所有輸出值都壓縮到 0 到 1 之間。
在這裡,sigmoid 函數用作神經網路的激活函數,它是神經元輸出值在作為神經網路下一層計算的輸入之前進行非線性變換的結果。
現在我們加入了激活函數,增加層數的影響就更大了。透過疊加非線性函數,我們可以對輸入和預測輸出之間非常複雜的關係進行建模。簡而言之,每一層實際上都在學習一個基於原始輸入的更複雜、更高層次的函數。如果您想更深入地了解其工作原理,請參閱Chris Olah 的精彩部落格文章。
常見激活函數
sigmoid、tanh 和 ReLU 是三種常用的激活函數。
上文討論過的 sigmoid 函數對輸入 $x$ 執行以下變換,產生介於 0 和 1 之間的輸出值:
\[F(x)=\frac{1} {1+e^{-x}}\]
這是該函數的圖像:

tanh(「雙曲正切」的縮寫)函數將輸入 $x$ 轉換為介於 -1 和 1 之間的輸出值:
\[F(x)=tanh(x)\]
這是該函數的圖像:

修正線性單元激活函數(簡稱ReLU )使用以下演算法轉換輸出:
- 如果輸入值 $x$ 小於 0,則傳回 0。
- 如果輸入值 $x$ 大於或等於 0,則傳回輸入值。
ReLU 可以用 max() 函數做數學表示:
這是該函數的圖像:

ReLU 作為激活函數通常比 sigmoid 或 tanh 等平滑函數效果更好,因為它在神經網路訓練過程中不易受到梯度消失問題的影響。此外,ReLU 的計算也比這些函數容易得多。
其他激活函數
實際上,任何數學函數都可以作為激活函數。假設 \(\sigma\) 代表我們的激活函數。網路中節點的值由以下公式給出:
Keras為許多激活函數提供了開箱即用的支援。儘管如此,我們仍然建議從 ReLU 開始。
概括
以下影片總結了您目前為止所學的關於神經網路建構方式的所有內容:
現在,我們的模型具備了人們通常所說的神經網路的所有標準組成部分:
- 一組類似神經元的節點,依層排列。
- 一組學習得到的權重和偏置,表示神經網路中每一層與其下一層之間的連結。下一層可以是另一個神經網路層,也可以是其他類型的層。
- 激活函數用於轉換層中每個節點的輸出。不同的層可以有不同的激活函數。
需要注意的是:神經網路不一定總是比特徵交叉更好,但神經網路確實提供了一種靈活的替代方案,在許多情況下都能很好地發揮作用。