什麼是 tanh 函數?
雙曲正切函數,寫作 \(\tanh(x)\),是一條平滑的 S 形(sigmoidal)曲線,對任何實數 \(x\) 都有定義。它的定義是指數函數 \(e^x\) 與 \(e^{-x}\) 之差除以兩者之和。\(\tanh(x)\) 的輸出值永遠嚴格落在 \(-1\) 與 \(1\) 之間,而且它是奇函數,也就是 \(\tanh(-x) = -\tanh(x)\)。在機器學習中,tanh 是很受歡迎的神經元激活函數,因為它以 0 為中心(zero-centered),相較於輸出範圍為 0 到 1 的 sigmoid,常常能讓以梯度為基礎的訓練收斂得更快。
如何使用這個計算機
只要輸入任意實數 \(x\),工具就會立即回傳 \(\tanh(x)\),並附上兩個選用的導數,這些在微積分、物理與反向傳播(back-propagation)中都很實用。負數、小數,甚至絕對值非常大的數值都能接受。當 \(x\) 為很大的正數時,數值會趨近並飽和於 \(+1\);當 \(x\) 為很大的負數時,則飽和於 \(-1\)。
公式解析
核心定義為 $$\tanh(x) = \frac{e^{x} - e^{-x}}{e^{x} + e^{-x}}$$ 由於分母至少為 2,因此永遠不會發生除以零的情況。一階導數可由一個優雅的恆等式得出:$$f'(x) = 1 - \tanh^{2}(x)$$ 也可寫成 \(\operatorname{sech}^2(x)\)。再微分一次便得到二階導數 $$f''(x) = -2\,\tanh(x)\left(1 - \tanh^{2}(x)\right)$$ 為了在 \(|x|\) 非常大時維持數值穩定,內部採用以 \(e^{-2x}\) 改寫的形式,以避免溢位(overflow)。
實例演算(x = 0.5)
代入 \(e^{0.5} = 1.6487212707\) 與 \(e^{-0.5} = 0.6065306597\),可得 $$\tanh(0.5) = \frac{1.0421906110}{2.2552519304} = 0.4621171573$$ 一階導數為 \(1 - 0.4621171573^{2} = 0.7864477623\),二階導數則為 \(-2 \times 0.4621171573 \times 0.7864477623 = -0.7269989018\)。
常見問題
tanh 的值域是多少?開區間 \((-1, 1)\);它會無限趨近但永遠不會真正等於這兩個端點。
tanh(0) 等於多少?恰好為 0,此時 \(f'(0) = 1\)、\(f''(0) = 0\)。
為什麼用 tanh 而不用 sigmoid?tanh 以 0 為中心(輸出對稱於 0),可以加快神經網路的學習速度;而 logistic sigmoid 只會輸出 0 到 1 之間的正值。