雙曲正切函數(tanh)將任意實數映射到區間(-1, 1),呈現平滑的S形曲線。這個特性使其在神經網路中作為激活函數時,能引入非線性且保持輸出有界;在音訊信號處理中,則提供自然的軟削波效果,適用於飽和與失真效果。無論在神經網路推論中每次前向傳遞需計算數百萬次tanh,或音訊處理需在44.1 kHz以上的取樣率下即時運算,速度都是關鍵。標準函式庫的精確實作計算量較大,因此本文調查多種tanh近似方法,包括傳統的多項式方法如泰勒級數、Padé近似與樣條函數,以及利用IEEE-754浮點數表示法的位元操作技巧,達成高速度且計算量低的近似。
首先介紹幾種常見的快速近似方法:
§ 泰勒級數
泰勒級數是利用函數的連續導數展開成無限多項式和的形式,取前幾項即可得到粗略近似。以下為Rust語言實作的tanh近似函數,當輸入絕對值大於1.365時直接回傳符號值1,以避免多項式尾端偏差過大。
§ Padé近似
Padé近似是兩個多項式的比值,通常比泰勒多項式更精確,但需多次乘法與除法運算。以下為JUCE函式庫FastMathApproximations中tanh的[7/6] Padé近似Rust版本,適用於輸入範圍-5到5。
§ 樣條函數
樣條函數將函數區間分割成多段,對每段使用三次多項式近似。本文引用一篇研究神經網路傳遞函數中tanh近似的論文,該論文以速度為優先,精度次之。範例中將[0,18]區間分為三段,分別使用三次多項式近似。
§ 利用浮點格式近似
IEEE-754浮點數由符號、指數與尾數組成,可用來設計快速近似演算法。K-TanH演算法利用整數運算與512位元查找表,透過指數與尾數的部分位元組合索引查表,快速計算tanh。查找表的參數透過離線優化計算得出,適合硬體實作與SIMD指令加速。
§ Schraudolph演算法
1999年Schraudolph提出一種利用浮點數位元表示近似指數函數的技巧,類似Quake III Arena的快速反平方根技巧。此方法將浮點數位元當作整數操作,利用指數欄位近似對數,快速計算指數函數。將此方法應用於tanh,可透過指數函數定義近似tanh。
§ Schraudolph-NG改良版
2018年Schraudolph提出改良版,透過分子與分母使用相同的分段線性近似並利用指數函數的恆等式,達成誤差抵銷,提升精度。此方法在ARM NEON架構下亦有優化實作。
本文最後提供多種近似方法的誤差比較圖,展示各方法在不同輸入範圍的最大與平均誤差,為選擇適合應用的tanh近似方法提供參考。