Sigmoid转tanh:为何要对x进行缩放?
为什么tanh函数要用s(2x)而不是s(x)?
好问题!这绝对不是随便拍脑袋定义的,背后藏着让tanh成为更实用激活函数的关键逻辑,咱们从直观和数学两个层面拆解:
1. 先看数学等价性:这是tanh的自然推导
首先咱们把s(2x)代入表达式展开:
2s(2x) - 1 = 2*(1/(1+e^(-2x))) - 1 = (2 - (1+e^(-2x)))/(1+e^(-2x)) = (1 - e^(-2x))/(1+e^(-2x))
而tanh的标准定义是 (e^x - e^(-x))/(e^x + e^(-x)),把分子分母同乘e^(-x),就得到上面的结果——所以用s(2x)其实只是tanh的另一种写法,和标准定义完全等价。
2. 直观理解:让函数在原点附近更“好用”
咱们对比两个函数:2s(x)-1 和 2s(2x)-1(也就是tanh):
- 对称性:两者都满足关于原点对称(x=0时输出为0,输入-x时输出为-输出),这是我们想要的——因为tanh是Sigmoid的对称版本,能输出正负值,比只能输出正值的Sigmoid更适合处理中心对称的数据。
- 陡峭程度/导数特性:这是关键差异!
- Sigmoid在x=0处的导数是0.25(
s'(x)=s(x)(1-s(x)),代入x=0得0.5*0.5=0.25); - 如果直接用
2s(x)-1,它的导数是2*s'(x)=0.5,在x=0处的变化率还是比较小; - 而tanh(
2s(2x)-1)的导数是4*s(2x)(1-s(2x)),代入x=0得40.50.5=1——这个导数正好是1,意味着在x接近0的时候,tanh近似于线性函数y=x,这在神经网络训练初期非常有用:输入接近0时,梯度不会被过度缩小,能有效缓解梯度消失问题。
- Sigmoid在x=0处的导数是0.25(
- 饱和速度:原Sigmoid在x≈±2时就开始饱和(输出接近0或1),而tanh在x≈±1时就饱和——因为x被缩放了2倍,相当于把x轴“压缩”了一半,这样tanh对输入的变化更敏感,在小输入范围就能完成从-1到1的映射,更适合需要快速区分正负激活的场景。
3. 总结:这是兼顾对称性和实用性的选择
简单说,用s(2x)不是为了标新立异,而是为了让tanh同时满足:
- 值域落在(-1,1),关于原点对称;
- 在原点附近的导数为1,近似线性,训练更友好;
- 和tanh的标准数学定义完全等价。
内容的提问来源于stack exchange,提问作者alwayscurious
相关产品推荐
相关产品推荐

