Squareplus:一种类似softplus的代数整流器.

ReLU激活函数在$x=0$处不可导,它的一种连续的近似替代是Softplus,定义如下:

\[\text{softplus}(x) =\log(1+e^x)\]

然而这类近似替代引入了指数运算,增加了激活函数的计算复杂度。本文提出了一种与Softplus相似的激活函数,只使用代数运算(加法、乘法和平方根)实现,称之为Squareplus,其表达式如下:

\[\text{squareplus}(x,b) =\frac{1}{2}(x+\sqrt{x^2+b})\]

超参数$b$定义了函数在$x=0$处的弯曲大小。Squareplus的一阶导数和二阶导数如下:

\[\frac{d}{dx}\text{squareplus}(x,b) = \frac{1}{2}(1+\frac{x}{\sqrt{x^2+b}})\] \[\frac{d^2}{dx^2}\text{squareplus}(x,b) = \frac{1}{2}(\frac{b}{(x^2+b)^{3/2}})\]

Softplus的一阶导数是S型曲线,而Squareplus的一阶导数是代数S型曲线;Softplus的二阶导数是logistic分布的概率密度函数,而Squareplus的二阶导数是student-t分布的概率密度函数。

当$b=0$时,Squareplus退化为ReLU

\[\text{squareplus}(x,0) =\frac{x+|x|}{2} = \text{relu}(x)\]

下面计算使得SquareplusSoftplus。将问题建模成min-max形式,即希望函数$\text{softplus}(x)$和$\text{squareplus}(x,b)$在全局的最大差异尽可能小,表示为下述问题:

\[\mathop{\min}_{b} \mathop{\max}_{x} \quad |\frac{1}{2}(x+\sqrt{x^2+b})-\log(1+e^x)|\]

上式可以通过非线性规划求解:

import numpy as np
from scipy.optimize import minimize

def f(x, b):
    a = np.sqrt(2 / np.pi)
    return np.abs(0.5*(x+np.sqrt(x**2+b))-np.log(1+np.exp(x)))

def g(b):
    return np.max([f(x, b) for x in np.arange(-2, 4, 0.001)])

options = {'xtol': 1e-10, 'ftol': 1e-10, 'maxiter': 100000}
result = minimize(g, 0, method='Powell', options=options)
print(result.x) # [1.52382104]

注意到SquareplusSoftplus都是ReLU的上界,如果希望SquareplusSoftplus的上界,则应有:

\[\frac{1}{2}(x+\sqrt{x^2+b}) \geq \log(1+e^x) \\ b \geq 4\log(1+e^x)[\log(1+e^x)-x]\]

可以证明,右式在$x=0$处取极大值,因此应有$b\geq 4 \log^2 2$。尽管SquareplusSoftplus都是ReLU的近似,当输入值较大时,Softplus的数值不稳定,将会偏离ReLU

CPU上,Squareplus的计算速度比Softplus快$6$倍,与ReLU相当。在GPU上,Squareplus的加速并不明显,这是因为带宽的限制。这表明Squareplus在计算资源有限的情况是Softplus的理想替代品。