一、Sigmoid函数
Sigmoid函数是最经典的激活函数之一,具有将实数映射到(0, 1)的特性,其公式如下:
def sigmoid(x):
return 1 / (1 + np.exp(-x))
其中,np.exp()表示$e^x$函数。
Sigmoid函数的优点是其能够将输出映射成概率形式,因此在分类问题中得到了广泛的应用。但是其存在梯度问题,容易出现梯度消失或梯度爆炸的情况,同时输出不是以零为中心的,对后续网络的学习带来一定的困难。
二、ReLU函数
ReLU(Rectified Linear Unit)函数是近些年来最流行的激活函数,具有非线性特性,其公式如下:
def relu(x):
return np.maximum(0, x)
其中,np.maximum()函数表示取x与0的最大值。
ReLU函数相比于Sigmoid函数,具有计算速度快的优点,同时梯度计算也比较简单。但是当输入为负数时,其梯度为0,导致神经元失活,这也是ReLU函数的不足之处。
三、LeakyReLU函数
LeakyReLU函数是对ReLU函数的改进,其公式如下:
def leaky_relu(x, alpha=0.01):
return np.where(x > 0, x, alpha*x)
其中,np.where()表示当x>0时,输出x;当x<=0时,输出alpha*x。
LeakyReLU函数在输入为负数时,梯度不为0,避免了神经元失活问题,并且可以克服ReLU函数在参数更新时的死亡Relu问题。但是需要小心设置alpha值,其值过大或过小都会导致梯度问题。
四、ELU函数
ELU(Exponential Linear Unit)是一种带负数饱和度的非线性函数,其公式如下:
def elu(x, alpha=1.0):
return np.where(x > 0, x, alpha*(np.exp(x)-1))
由公式可知,当x>0时,输出x;当x<=0时,输出$alpha*(e^x-1)$,其与ReLU相比,具有输出以零为中心的优点。同时,ELU函数能够避免ReLU函数在输入为负时产生的梯度问题,且梯度不会饱和。
五、Softmax函数
Softmax函数是一种将多个输出变量映射为概率分布的函数,其公式如下:
def softmax(x):
exp_x = np.exp(x)
return exp_x / np.sum(exp_x, axis=1, keepdims=True)
其中,np.sum()函数表示将exp_x矩阵的每个元素相加,axis=1表示对每行进行相加,keepdims=True表示保留行维度。
Softmax函数适用于多分类问题,将输出映射为概率分布形式,方便后续的训练和预测。但是其存在梯度消失和梯度爆炸问题,需要小心设置学习率。
总结
常见的激活函数有Sigmoid函数、ReLU函数、LeakyReLU函数、ELU函数和Softmax函数,每种激活函数都有其特点和不足,需要根据具体情况选择合适的函数。