math.tanh() 是 javascript 中输出范围为 (-1, 1) 的平滑可导激活函数,定义为 (eˣ − e⁻ˣ)/(eˣ + e⁻ˣ),前向传播直接调用,反向传播梯度为 1 − a²,适用于浅层网络或教学演示。

Math.tanh() 是 JavaScript 中直接可用的双曲正切函数,它天然适合作为神经网络中简单激活函数的模拟工具——输出范围严格在 (-1, 1) 之间,具备平滑、可导、中心对称等关键特性。
理解 Math.tanh() 的数学行为
双曲正切定义为 tanh(x) = (eˣ − e⁻ˣ) / (eˣ + e⁻ˣ),其图像呈 S 形,输入趋近正无穷时输出逼近 1,趋近负无穷时逼近 -1,x=0 时输出恰好为 0。这使它比 sigmoid 更适合中心化数据的建模。
在 JavaScript 中调用非常直接:
- Math.tanh(0) → 0
- Math.tanh(1) → ≈ 0.7616
- Math.tanh(-2) → ≈ -0.9640
- Math.tanh(10) → ≈ 0.9999999959
在前向传播中用作激活函数
假设你有一个简单的神经元:输入 x,权重 w,偏置 b,则加权和 z = w * x + b,再经 tanh 激活得到输出 a = tanh(z)。可封装为可复用函数:
function tanhActivation(z) {
return Math.tanh(z);
}
<p>// 示例:单个神经元前向计算
const x = 0.8;
const w = 1.5;
const b = -0.3;
const z = w * x + b; // → 0.9
const a = tanhActivation(z); // → ≈ 0.7163
</p>
反向传播需配套导数:tanh 的梯度是 1 − a²
训练时必须实现其导数:d(tanh(z))/dz = 1 − tanh²(z)。由于前向已算出激活值 a,梯度可直接复用,无需重新计算 tanh:
- 若前向输出 a = tanh(z),则梯度就是 1 - a * a
- 例如 a = 0.7163 → 梯度 ≈ 1 − 0.5131 = 0.4869
- 该性质大幅节省计算,是 tanh 在手动实现小规模网络时的优势
注意事项与实际限制
Math.tanh() 是标量函数,仅处理单个数字。若需批量处理数组(如一批神经元输出),须配合 map 或循环:
const inputs = [−1.2, 0.0, 2.5, −0.7]; const activations = inputs.map(Math.tanh); // → [−0.8337, 0, 0.9866, −0.6044]
注意:JavaScript 数值精度有限,当 |z| > 20 时,Math.tanh(z) 实际已饱和至 ±1,此时梯度接近 0,易引发梯度消失——这是 tanh 在深层网络中少用的根本原因,但在浅层或教学演示中依然清晰可靠。











