天马行空,发挥想象力,设计自己的激活函数~

这一篇其实是上一篇函数光滑近似(4):Heaviside step函数很自然的衍生。

激活函数的数学本质

从函数光滑近似的角度统一理解激活函数中我们谈过,激活函数分量大类:

  • 第一类,逼近$H(x)$或$\operatorname{sign}(x)$​的激活函数,两种本质是一样的
  • 第二类,逼近$\operatorname{relu}(x)$​

考虑到,

因此,第一类是可以导出第二类,因此这里关注第二类即可。

当然,广义来说,还是不止这些,还包括maxout、softmax、Gaussian激活函数,不过这里不想把摊子铺太大,就专注这两类。

激活函数的设计思路

对于第一类激活函数,就是寻找$H(x)$的逼近形式,由于

这里$\delta(t)$为狄拉克函数,因此找到$\delta(t)$的光滑逼近也就找到$H(x)$​的光滑逼近。还有,

因此,找到$\max{0, x}$的光滑逼近也就是找到$H(x)$的光滑逼近。

对于第二类激活函数,就是寻找$\operatorname{relu}(x)$​的光滑逼近形式。注意到,

因此,这两类激活函数的设计思路本质上还是寻找$H(x)$的光滑逼近。为什么要求光滑呢?因为模型训练需要良好的梯度特性。假设有$\operatorname{relu}(x)$光滑逼近形式$\operatorname{relu}_s(x)$,其来自,

而$H_s(x)$往往是一个广义的“S”型函数,那么$\operatorname{relu}_s(x)$存在两类参数控制其形状:

  • 尺度参数,直观上看是$x$的缩放因子
  • 形状参数,控制$\operatorname{relu}_s(x)$​的形状,如单调区间

激活函数实例

因此,根据函数光滑近似(4):Heaviside step函数及其应用中的结论,容易设计$\operatorname{relu}(x)$光滑逼近形式$\operatorname{relu}_s(x)$。

激活函数$\operatorname{relu}_s(x)$形式一,

激活函数$\operatorname{relu}_s(x)$形式二,

激活函数$\operatorname{relu}_s(x)$形式三,

激活函数$\operatorname{relu}_s(x)$形式四,

该形式取$\sigma=1$就得到GELU激活函数。详细可见GELU由来:从狄拉克函数到GELU激活函数。该激活函数无法直接计算,因为$\operatorname {erf}(x)$是一个积分,需要初等函数逼近它。不同形式逼近$\operatorname {erf}(x)$,就获得不同的$\operatorname{relu}_s(x)$。论文Gaussian Error Linear Units (GELUs)中指出两种形式,可以看刚刚提及的那篇文章。

激活函数$\operatorname{relu}_s(x)$形式五,

激活函数$\operatorname{relu}_s(x)$形式六,

这里取$\alpha=1$就得到Swish激活函数,此外还有一种导出思路,详细见Google的激活函数Swish是怎么设计出来的?

激活函数$\operatorname{relu}_s(x)$形式七,

取$\alpha=1$​得Mish激活函数,详细见Mish激活函数的设计思路

基于广义正态分布的激活函数$\operatorname{relu}_s(x)$​,

其中$\beta$是$\operatorname{relu}_s(x)$的形状参数,$\alpha$是尺度参数。

实现和可视化

以上有六种激活函数,可视化对比一下,

基于广义正态分布的激活函数$\operatorname{relu}_s(x)$可视化如下,

以上光滑逼近及其可视化:https://github.com/allenwind/smooth-approximation-function

可能会根据情况持续更新~

其他的衍生思路

激活函数一般都是对输出单独使用,即

那么是否可以联合多个输出呢?如两个层的输出为未激活前的分别为$x, y$​​,那么多变量联合的激活函数形式为,

现有的具体形式是softmax。

或者,

这种形式不就是门机制么?

总结

激活函数是神经网络的重中之重,没有激活函数,神经网络不过是一个线性模型。本文虽说是天马行空地设计激活函数,但是以上的分析说明激活函数的设计是有章可循的—设计不同的激活函数的本质是寻找$H(x)$​的光滑逼近

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