深度學習基本概念:Activation functions

Ying-Yu Chen
7 min readOct 15, 2022

--

前陣子收到某家公司的線上筆試,看到時間限制只有 40 分鐘但竟然有兩題 coding problems 和四題問答題要完成(!!),當下實在有點慌了手腳。

不過事後想起來,其實有些問答題是十分基本的,例如考 activation functions 的使用目的和類型,如果事前有好好讀書並順過想法應該可以答得更快更好。除了應付考試,我也覺得對於基本知識的掌握也對工作的判斷上有很大的幫助。那就廢話不多說開始複習深度學習的其中一個重要概念-activation functions 吧:

為什麼 neural networks 需要 activation functions?

我們建構 neural networks 所使用的 activation functions 通常是非線性的,最重要的目的就是為模型加入非線性的特性。透過非線性的 activation functions 的堆疊,模型可以捕捉到複雜的資料背後蘊含的規則。這也是深度學習能夠如此強大的原因之一。如果深度模型都是由線性函數堆疊而成,其實就完全可以用一層線性函數表示,如此就無法捕捉非線性的變化,也失去堆疊深度模型的意義。

另外,activation functions 也具有明確的輸出範圍,因此我們可以針對輸出的特性選擇合適的 activation function,例如如果預期輸出為機率,則可以選擇輸出範圍為 0 到 1 的 activation function。

常見的 activation functions 類型

Sigmoid

數學表示:f(x) = 1/(1+exp(-x))

特性:

  1. 可微分且有平滑的 gradient。
  2. 輸出範圍為 0~1,輸入數值越大(正值)則輸出越接近 1,輸入數值越小(負值)則輸出越接近 0,因此適合做為機率預測模型的輸出層。
  3. 當輸入數值大於或小於一定的範圍時,sigmoid 的輸出差異不大,因此 gradient 極小,這會導致訓練模型時遭遇梯度消失(vanishing gradients)的問題。這樣的問題在深度模型會更明顯,因為變化極大的輸入經過多次的壓縮到很小的輸出範圍,gradient 更可能小到無法有效訓練模型。

Tanh

數學表示:f(x) = (exp(x)-exp(-x))/(exp(x)+exp(-x))

特性:

  1. 可微分且有平滑的 gradient。
  2. 與 sigmoid 相似,但輸出範圍為 -1~1。由於輸出以 0 為中心,適合用在預測正向、中性與負向關係模型的輸出層。另外用於 hidden layers 時可以將輸入標準化(normalization)且以 0 為中心,據說(?)有助於後面的 layers 的學習。
  3. 另一個與 sigmoid 相似的點是 tanh 也會遭遇梯度消失(vanishing gradients)的問題,儘管 tanh 的 gradient 已經比 sigmoid 的 gradient 更陡峭。

ReLU

數學表示:f(x) = max(0, x)

特性:

  1. 只將大於 0 的輸入維持原樣輸出,小於 0 的輸入全都轉換為 0。可以想成只在輸入大於 0 時 activated,計算上比較有效率。
  2. 不會飽和(non-saturating)的特性可免於梯度消失(vanishing gradients)的問題,使得模型更容易收斂,是目前很常使用的 activation function。
  3. 如果輸入都是負的,將會全部被轉換為 0,使得梯度為 0,因此部分的 weights 和 biases 就無法被更新,進而可能使得 neurons 成為永遠不會 activated 的 dead neurons,這會讓訓練模型缺乏效率(Dying ReLU Problem)。

為了解決 Dying ReLU Problem,研究人員逐漸發展出好幾種 ReLU 的變形:

  1. Leaky ReLU:f(x) = max(0.1x, x),使得輸入為負值時模型參數也能小幅更新。
  2. Parametric ReLU:f(x) = max(ax, x),a 是可學習的參數,比 Leaky ReLU 更有彈性。
  3. Exponential linear units (ELU):可想成平滑版的 ReLU,在輸入為負值時 gradient 不為 0,但由於引入 exponential 因此會增加計算時間。

Softmax

數學表示:Softmax(x_i) = exp(x_i)/sum_j(exp(x_j))

特性:

  1. 將一個數值陣列轉換為總合為 1 的機率分布,適合做為多類別分類(multi-class classification)模型的輸出層。

-

其實後來還發展出非常多複雜的 activation functions,讓人眼花撩亂XD 不過知道以上幾種常見的 activation functions 應該就足以完成許多任務。

如何選擇 activation functions?

關於這個問題我們可以拆開成兩個部分來看,分別是 hidden layers 要選擇什麼樣的 activation functions 和 output layer 要選擇什麼樣的 activation functions:

對於 hidden layers:

  1. 一般同一個模型的所有 hidden layers 都會使用同一種 activation function。
  2. 通常會選擇最常使用的 ReLU 開始嘗試,視是否達到預期成果再進行調整。
  3. 避免在非常多層的 network 的 hidden layers 使用 sigmoid 或 tanh,否則很可能遭遇梯度消失(vanishing gradients)的問題。
  4. 聽說(?) swish 適合用於超過 40 層的 networks,有機會想試試看。

對於 output layer,則要依據任務以及預期的輸出範圍決定:

  1. 二元分類(Binary classification):Sigmoid。
  2. 多類別分類(Muticlass classification):Softmax。
  3. 多標籤分類(Multilabel classification):Sigmoid,預測結果可能多於一個 labels,因此每個類別以 0 到 1 的機率個別表示該類別是 label 的機率,所有機率不須總和為 1。
  4. 輸出數值的正負代表正向及負向意義:Tanh。

參考資料

  1. 【機器學習2021】預測本頻道觀看人數 (下) — 深度學習基本概念簡介|Hung-yi Lee
  2. Activation Functions in Neural Networks [12 Types & Use Cases]|Pragati Baheti

不過回想那次線上筆試經驗,40 分鐘內要寫完兩題程式題和四題問答題實在是不太可能,不禁想這難道是公司為了考驗應徵者在面對一堆任務時會如何取捨嗎?

然而,我還是想不清楚到底是集中火力處理有把握的任務好,還是每個任務都做一點比較好。看到這裡如果有想法的話,歡迎留言告訴我:)

--

--

Ying-Yu Chen

目前為菜鳥 AI 工程師,主要研究興趣為影像相關的深度學習應用,希望應用日新月異的演算法開發貼近生活需求的科技產品。這裡會分享一些菜鳥工程師的經驗、學習隨筆。