Sigmoid函数指S型的函数,盘点一下都有哪些?

Sigmoid函数指S型的函数,在一段区间内较快增长,该区间外区域饱和。

形形色色的Sigmoid函数

形形色色的Sigmoid函数,我们可以大致分为指数类型、代数类型以及基于误差函数逼近等思路。S性函数有一个特点就是,当$x$较小时,有

例如当$x$较小时,$\tanh(x) \approx x$。

指数形式

Logistic函数,

这种形式的函数事实上来自增长模型,微分方程表示为,

$P$为种群数量,$r$为增长率,$K$为环境容量,方程解得,

把参数简约掉,就得到Logistic函数。过去的文章也提供光滑近似的导出思路,见Sigmoid函数导出的另外一个角度

Logit,顾名思义log it,对$\operatorname{odds}(p)$​取对数变换,

这里$\text{odds}(p) = \frac{p}{1-p}$,于是$\operatorname{logits}(p) \in [-\infty, +\infty]$没有上下限,于是可以方便地进行建模。例如最简单的线性模型,

因此有,

这个函数其实很漂亮,其导数可以用自身来表示,

可以在里面添加一个参数控制增长的陡峭程度,

广义的Logistic函数,

$\tanh(x)$,

事实上,我们注意到,

同上,可以添加参数控制增长区间内的陡峭程度,

这些S型函数都是基于$f(x) = e^{x}$,因此具有很好的梯度特性。

代数函数

纯粹的代数函数也可以构造S型函数,如

特殊形式如取$k=2$,有,

其出发点其实是逼近$\displaystyle \operatorname {sign} (x) = \frac{x}{|x|}$这种形式。

从误差函数出发

误差函数,

是一个像logistics函数图像一样的函数,易证$\operatorname{erf}(\frac{x}{\sqrt{2}}) \in (-1, 1)$​​,函数图像如下,

该函数有一个有趣的性质,

误差函数的定义是积分形式,无法直接用初等函数直接计算。这里我们对其进行逼近。$\operatorname{erf}(\frac{x}{\sqrt{2}})$图像最容易让人联想到的函数是$\tanh(x)$,它们之间的区别就在陡峭程度上。容易推导GELU与正态分布的累积分布函数$\Phi_{\sigma}(x) $或误差函数$\operatorname{erf}(x)$​的关系,

这里我们直接借鉴论文Gaussian Error Linear Units (GELUs)中的结论,注意到论文中有结论,

于是有,

这个近似形式上还是关于$e^x$,因此能否用$\sigma(\alpha x)$​来逼近呢?答案是可以的,可参看以上论文。

逼近符号函数

不严格来说,符合函数也可以看做是S型函数,

由于$\displaystyle \operatorname {sign} (x) = \frac{x}{|x|}$​,因此可以构造很多光滑版本,如,

其中$\varepsilon$​​是一个接近0的数。稍微推广一下,

其实就是上述$\displaystyle f(x)=\frac {x}{(1+|x|^{k})^{1/k}}$​​​这种形式。此外还可以在$|x|$上修改,例如,

不过这种S型是不对称的,因为$e^x$​的增长并不是平缓的。于是,可以改造为对称形式,

还有一种比较优雅的做法,注意到max函数可以表示为logsumexp形式,

于是有,

其中$\alpha$是一个较大的数。

逼近阶跃(Heaviside step)函数

类似地,还有阶跃(Heaviside step)函数,其实和符号函数很像,前者把$x \lt 0$部分向上平移一个单位,

其光滑形式就是参数化的Logistic函数$\displaystyle \sigma_k(x) = \frac{1}{1 + e^{-kx}}$。Heaviside step函数还有一种关于狄拉克函数(dirac function)的定义,

其中狄拉克函数为,

狄拉克函数满足,

狄拉克函数使用正态分布逼近,

因此其积分,即正态分布的累积分布函数可以作为$H(x)$​​的光滑近似。标准正态分布的累积分布函数可以用$\operatorname{erf}(x)$​​​表示,

因此,对于一般正态分布函数,其累积分布函数为,

其中$\mu = 0$,$\sigma$控制S形状以不同程度逼近$\displaystyle H(x)$。

总结

本文总结了形形色色的S型函数,那么你心中完美的S型函数是谁呢?

转载请包括本文地址:https://allenwind.github.io/blog/13658
更多文章请参考:https://allenwind.github.io/blog/archives/