一文搞懂神经网络常用的激活函数
Sigmoid函数是一种常用的非线性激活函数,它将输入值压缩到(0, 1)之间,常用于二分类问题的输出层,可以将神经网络的输出解释为概率。Tanh函数(双曲正切函数)是Sigmoid函数的变体,它将输入值压缩到(-1, 1)之间,输出以0为中心,解决了Sigmoid函数输出不是零均值的问题。ReLU(Rectified Linear Unit,修正线性单元)函数是目前神经网络中最流行的激活函数之一
激活函数是神经网络模型重要的组成部分,本文将从激活函数的数学原理出发,详解了常用激活函数的原理、实现方式、优缺点。
激活函数
激活函数在神经网络模型中主要作用是提供网络的非线性建模能力。如果没有激活函数,那么该网络仅能够表达线性映射,此时即便有再多的隐藏层,其整个网络跟单层神经网络也是等价的。因此,只有加入了激活函数之后,深度神经网络才具备了分层的非线性映射学习能力。
激活函数有哪几种?各自特点及其使用场景?
1. Sigmoid函数
1.1定义及数学公式
Sigmoid函数是一种常用的非线性激活函数,它将输入值压缩到(0, 1)之间,常用于二分类问题的输出层,可以将神经网络的输出解释为概率。
1.2 代码实现:
import numpy as np
import matplotlib.pyplot as plt
def sigmoid(x):
return 1 / (1 + np.exp(-x))
x = np.linspace(-10, 10, 400)
y = sigmoid(x)
plt.plot(x, y)
plt.title('Sigmoid Activation Function')
plt.xlabel('Input')
plt.ylabel('Output')
plt.grid(True)
plt.show()

1.3 优缺点:
优点:输出范围在(0, 1)之间,适合表示概率。 连续可导,便于使用梯度下降算法进行优化。
缺点:当输入值极大或极小时,梯度趋近于零,容易引发梯度消失问题,导致深层网络难以训练。
输出值恒大于0,不是零均值输出,会影响后一层神经元的输入。 计算包含指数运算,计算量较大。
2. Tanh函数
2.1 定义及数学公式
Tanh函数(双曲正切函数)是Sigmoid函数的变体,它将输入值压缩到(-1, 1)之间,输出以0为中心,解决了Sigmoid函数输出不是零均值的问题。
2.2 代码实现:
def tanh(x):
return np.tanh(x)
x = np.linspace(-10, 10, 400)
y = tanh(x)
plt.plot(x, y)
plt.title('Tanh Activation Function')
plt.xlabel('Input')
plt.ylabel('Output')
plt.grid(True)
plt.show()

2.3 优缺点:
优点:输出以0为中心,改善了Sigmoid函数的非零均值问题。 连续可导,便于使用梯度下降算法进行优化。
缺点:当输入值极大或极小时,梯度趋近于零,同样存在梯度消失问题。 计算包含指数运算,计算量较大。
3. ReLU函数
3.1 定义及数学公式
ReLU(Rectified Linear Unit,修正线性单元)函数是目前神经网络中最流行的激活函数之一。它在输入为正时输出等于输入,输入为负时输出为零,具有简单高效的特点。
3.2 实现方式:
def relu(x):
return np.maximum(0, x)
x = np.linspace(-10, 10, 400)
y = relu(x)
plt.plot(x, y)
plt.title('ReLU Activation Function')
plt.xlabel('Input')
plt.ylabel('Output')
plt.grid(True)
plt.show()

3.3 优缺点:
优点:计算简单高效,只需判断输入是否大于零。 在正区间内梯度恒为1,解决了梯度消失问题。 收敛速度快,有助于加速神经网络的训练。
缺点:当输入为负时,输出为零,梯度也为零,可能导致神经元“死亡”,无法被激活。 输出不是零均值,可能影响后一层神经元的输入。
4. Leaky ReLU函数
4.1 定义及数学公式
Leaky ReLU函数是ReLU函数的改进版本,它在输入为负时给予一个很小的斜率(如0.01),避免了ReLU函数中的“死亡神经元”问题。

其中,α是一个很小的常数,通常取0.01。
3.2 实现方式:
def leaky_relu(x, alpha=0.01):
return np.where(x > 0, x, alpha * x)
x = np.linspace(-10, 10, 400)
y = leaky_relu(x)
plt.plot(x, y)
plt.title('Leaky ReLU Activation Function')
plt.xlabel('Input')
plt.ylabel('Output')
plt.grid(True)
plt.show()

4.3 优缺点:
优点:解决了ReLU函数中的“死亡神经元”问题。 计算相对简单,效率较高。
缺点:需要额外确定一个超参数α。
5. Softmax函数
5.1 定义及数学公式
Softmax函数用于多分类问题的输出层,它将输入向量转换为概率分布,每个分量的取值范围在(0, 1)之间,且所有分量的和为1。
5.2 代码实现:
def softmax(x):
e_x = np.exp(x - np.max(x)) # 减去最大值,防止溢出
return e_x / e_x.sum(axis=0)
x = np.array([2.0, 1.0, 0.1])
y = softmax(x)
print(y)
5.3 优缺点:
优点:输出为概率分布,适合多分类问题。 可导,便于使用梯度下降算法进行优化。
缺点:计算包含指数运算,计算量较大。
说了这么多那么在搭建神经网络的时候,到底该如何选择激活函数?
如果搭建的神经网络的层数不多的时候,选择sigmoid、tanh、relu都可以。
如果搭建的网络层数较多的时候,选择不当不当会造成梯度消失的问题,此时一般不宜选择sigmoid、tanh激活函数,最好选择relu激活函数。
在二分类问题中,网络的最后一层适合使用sigmoid激活函数;而多分类任务中,网络的最后一层使用softmax激活函数。
如果想学习更多机器学习和神经网络知识,可以关注作者。
更多推荐


所有评论(0)