自定义类Sigmoid函数的设计方案咨询
当然可以基于标准sigmoid函数修改来实现你的需求,完全不用从零搭建,下面是一步步的设计思路和具体实现方案:
核心思路
标准sigmoid函数$\sigma(t) = \frac{1}{1+e^{-t}}$的特性是:中心在$t=0$、值域$[0,1]$、单调递增,我们只需要通过输入映射、归一化调整、值域缩放平移这三步,就能把它适配到你的需求里,同时保留陡峭度可控的能力。
具体步骤与实现
1. 输入映射:对齐中心与区间范围
你的目标定义域是$[0.15, 0.25]$,中心在$x=0.2$。我们先把输入$x$映射到对称区间$[-1,1]$,这样方便后续利用sigmoid的对称性:
t = 20 * (x - 0.2)
当$x=0.15$时,$t=-1$;$x=0.2$时,$t=0$;$x=0.25$时,$t=1$,完美对齐中心与端点。
2. 归一化sigmoid:匹配端点值
标准sigmoid在$t=-1$时输出$\sigma(-k)$($k$是陡峭度参数),在$t=1$时输出$\sigma(k)$,不符合我们“端点输出0和1”的要求。我们对其做归一化处理,得到一个新的函数$g(t)$:
$$
g(t) = \frac{\sigma(k \cdot t) - \sigma(-k)}{\sigma(k) - \sigma(-k)}
$$
这个函数的特性:
- $t=-1$时,$g(-1)=0$;$t=1$时,$g(1)=1$;$t=0$时,$g(0)=0.5$,完全符合对称、端点值的要求
- $k$是陡峭度参数:$k$越大,函数在$t=0$(对应$x=0.2$)附近越陡峭;$k$越小,函数越接近线性
3. 值域缩放平移:适配目标输出范围
你的目标值域是$[0.25, 0.75]$,我们把$g(t)$的输出($[0,1]$)缩放平移到这个区间:
$$
f(x) = 0.25 + 0.5 \cdot g\left(20(x-0.2)\right)
$$
整合后的完整表达式
把步骤整合起来,最终的函数是:
$$
f(x) = 0.25 + 0.5 \cdot \frac{\sigma\left( k \cdot 20(x - 0.2) \right) - \sigma(-k)}{\sigma(k) - \sigma(-k)}
$$
其中$\sigma(z) = \frac{1}{1+e^{-z}}$
可选方案:基于tanh的实现
如果你觉得tanh函数的数值稳定性更好,也可以用它来替代sigmoid,思路完全一致:
$$
f(x) = 0.25 + 0.5 \cdot \frac{\tanh\left( k \cdot 20(x - 0.2) \right) + \tanh(k)}{2 \tanh(k)}
$$
同样,$k$控制陡峭度,特性和sigmoid版本一致。
验证与效果说明
- 边界值验证:当$x=0.15$时,$f(x)=0.25$;$x=0.25$时,$f(x)=0.75$,完全符合你的要求
- 中心对称:$x=0.2$时,$f(x)=0.5$,且满足$f(0.2+a) + f(0.2-a) = 1$,完美对称
- 陡峭度控制:$k=1$时函数平缓,接近线性;$k=10$时在$x=0.2$附近急剧变化;$k \to \infty$时趋近于阶跃函数
备注:内容来源于stack exchange,提问作者Andrei-Cristian Rad

