tanh(雙曲正切,tanh)
/ tanch (or "tan-AYCH") /
tanh——雙曲正切的簡稱——是 sigmoid 的近親。它是同樣平滑的 S 形,但不是把輸入壓進 0 到 1 的範圍,而是壓進 -1 到 1 的範圍。大的正輸入出來時接近 +1,大的負輸入接近 -1,而輸入為零時正好出來在零。就這一處不同——它以零為中心,而非以 0.5 為中心——結果卻很要緊。
為什麼以零為中心會有幫助?當某一層的輸出以零為中心時,下一層收到的便是正負信號均衡的混合,學習演算法往往能取得更乾淨、更直接的進展。sigmoid 則相反,它只會吐出正數,這會微妙地使更新偏向一側,並可能拖慢訓練。正因如此,在較早的網路裡,隱藏層一般偏好用 tanh 而非 sigmoid;它至今仍出現在某些架構內部,尤其是一些處理文本或音訊這類序列的循環網路。
不過,tanh 也分擔了 sigmoid 的弱點。它的兩端同樣平坦,所以對很大的輸入而言斜率接近零,在深層堆疊裡學習信號仍可能消失——還是那個梯度消失的陷阱。這就是為什麼對今天普通的深層網路來說,更簡單的 ReLU 通常更勝一籌。可以把 tanh 看作 S 形曲線家族裡更乖巧的那一員,但它終究還是一條 S 形曲線,帶著這意味著的種種侷限。
把數字 -3、0、3 餵進 tanh,你大致得到 -0.995、0、+0.995。把同樣的數字餵進 sigmoid,你大致得到 0.05、0.5、0.95。注意 tanh 是對稱地跨在零的兩側,而 sigmoid 整個都待在零之上——這種對稱,正是 tanh 往往比 sigmoid 訓練得稍好一點的實際原因。
tanh 是以零為中心的 S 形曲線(-1 到 1);sigmoid 是同樣的形狀往上挪(0 到 1)。
tanh 本質上就是一個經過縮放和平移的 sigmoid——它字面上等於 2·sigmoid(2x) − 1。它以零為中心的輸出是優勢,但它也繼承了 sigmoid 平坦的兩端,以及隨之而來的梯度消失風險。