2022年3月31日 星期四

機器學習筆記 : 深度學習的 16 堂課 (六)

本篇繼續整理 "深度學習的16堂課" 這本書的讀後筆記, 本系列之前的文章參考 : 


以下是我讀第六章 "神經網路的基礎-人工神經元與激活函數" 的摘要筆記, 本章主要在解釋神經元構造與動作原裡, 以及常用的 sigmoid, softmax 等激活函數 :
  1. 美國神經生物學家 Frank Rosenblatt 於 1950 年代將自己對生物神經元的認識轉成感知器 (perceptron) 演算法, 這是最早的人工神經元. 他大部分的研究都是在任職於康乃爾航空實驗室時完成. 他打造的 Mark I 感知器是人工智慧的老祖宗. 
  2. 感知器的運作機制如下 : 
    (1). 接收其他神經元之輸入訊號
    (2). 計算各輸入作加權總合
    (3). 若加權總合超過閥值 (threshold) 就將訊號傳給其他神經元
    以數學表示 : z=xw+b 
    x=輸入向量, w=權重矩陣, b=偏值向量 (=閥值的負數), 建構神經網路的最重要任務是找出最佳的權重參數, 這必須透過訓練神經網路才能達到. 
  3. 感知器中超過閥值就輸出訊號的行為稱為激活函數 (activation function), 具體而言就是 step (步進) 函數, 除此外還有 sigmoid, tanh, ReLu, 與 softmax 等函數. 激活函數必須是非線性函數, 這樣才能增加神經元對非線性規則的學習能力. 
  4. Step 雖然是非線性激活函數, 但加權總合 z 不管多小, 只要超過 0 就輸出 1, 小於 0 就輸出 0, 在訓練神經網路時只要稍微調整 w 與 b 參數就會讓輸出在 0 與 1 之間來回變動, 使得感知器的輸出變化較極端, 這種情況可以用 sigmoid 激活函數來改善, 它是函數值介於 0~1 的平滑非線性函數 : sigmoid=1/(1 + exp(-z)), Python 程式碼如下 :

    from math import e
    def sigmoid(z):
        return 1/(1+e**-z)

    不過 sigmoid 有神經元飽和問題, 當 z 趨近 0 與 1 時, 調整 w 與 b 參數對輸出幾乎毫無影響, 神經元像是死掉了, 很難再訓練神經網路. 
  5. 激活函數 tanh 與 sigmoid 圖形很像, 都是非線性的平滑曲線 :
    tanh=(exp(z)-exp(-z))/(exp(z)+exp(-z))
    差別是 sigmoid 的輸出值在 0~1 之間, 而 tanh 的輸出值則在 -1 ~ 1 之間. 
  6. 激活函數 ReLu 事實上是由兩個線性函數組成的非線性函數 :
    在 z<=0 時一律輸出 0, z 為正值時輸出 z.
    許多深度神經網路的中間隱藏層大多使用 ReLu
  7. 在深度學習架構中, 激活函數的非線性性質非常重要, 正因為這些非線性的轉換與篩選, 才讓模型有逼近任何連續函數的能力. 
  8. 如何選擇激活函數 :
    (1). step 函數 :
    容易讓輸出值劇烈震盪, 不適合用在神經網路模型. 
    (2). sigmoid 函數 :
    加權總和較大正負值時容易飽和使訓練效率低下, 只適合用在二元分類的輸出層.
    (3). softmax 函數 :
    適用於多元分類.
    (4). tanh 函數 :
    比 sigmoid 訓練效率佳, 但普及程度不如 ReLu.
    (5). ReLu 函數 :
    首選, 可在最短時間訓練出優良的神經網路.
  9. 還有更多進階的激活函數, 例如 leaky ReLu, parametric ReLu 等, 參考 :
    http://keras.io/layers/advanced-activations
2022-04-05 補充 :

關於啟動 (激活) 函數我之前有寫過筆記, 參考 :


沒有留言 :