1. 简介
激活函数是一种非线性函数,应用于神经网络的每个神经元上。它的作用是引入非线性映射,使神经网络能够学习和表示复杂的函数关系。激活函数能够增加网络的表达能力,解决线性不可分问题,并提取数据的高级特征和抽象表示,从而提高模型的拟合能力和学习能力。简而言之,激活函数使神经网络能够更好地适应复杂的任务和数据模式。
2. 常用的激活函数
2.1 Sigmoid函数
Sigmoid函数将输入的实数值映射到一个介于0和1之间的输出。它在前向传播过程中具有平滑的激活特性,通常用于二分类问题或需要将输出限制在概率范围内的情况。
2.1.1 数学公式
Sigmoid(x) = 1 / (1 + exp(-x))
2.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, 100)
y = sigmoid(x)
plt.plot(x, y)
plt.xlabel('x')
plt.ylabel('Sigmoid(x)')
plt.title('Sigmoid Function')
plt.grid(True)
plt.show()
2.1.2 图片
2.2 ReLU函数
ReLU函数(Rectified Linear Unit)在输入大于0时返回输入值,而在输入小于等于0时返回0。ReLU函数具有简单的计算和导数计算,可以在许多深度学习模型中使用。
2.2.1 数学公式
ReLU(x) = max(0, x)
2.2.2 代码
import numpy as np
import matplotlib.pyplot as plt
def relu(x):
return np.maximum(0, x)
x = np.linspace(-10, 10, 100)
y = relu(x)
plt.plot(x, y)
plt.xlabel('x')
plt.ylabel('ReLU(x)')
plt.title('ReLU Function')
plt.grid(True)
plt.show()
2.2.2 图片
2.3 Leaky ReLU函数
Leaky ReLU函数是ReLU函数的变种,在输入小于0时引入一个小的斜率,以解决ReLU函数中可能出现的死亡神经元问题。Leaky ReLU函数在负数区域具有非零梯度,可以在一定程度上避免梯度消失的问题。
2.3.1 数学公式
LeakyReLU(x) = max(0.01x, x)
其中,0.01是一个小的斜率(或称为Leak)
2.3.2 代码
import numpy as np
import matplotlib.pyplot as plt
def leaky_relu(x):
return np.maximum(0.01 * x, x)
x = np.linspace(-10, 10, 100)
y = leaky_relu(x)
plt.plot(x, y)
plt.xlabel('x')
plt.ylabel('Leaky ReLU(x)')
plt.title('Leaky ReLU Function')
plt.grid(True)
plt.show()
2.3.3 图片
2.4 ELU函数
ELU函数(Exponential Linear Unit)在输入小于0时引入一个小的斜率,同时在输入大于等于0时返回输入值。ELU函数在负数区域具有非零梯度,可以在一定程度上缓解梯度消失的问题。
2.4.1 数学公式
ELU(x) = { x, x >= 0; alpha * (exp(x) - 1), x < 0 }
其中,alpha是一个可调参数,用于控制负数区域的斜率。
2.4.2 代码
import numpy as np
import matplotlib.pyplot as plt
def elu(x, alpha=1.0):
return np.where(x >= 0, x, alpha * (np.exp(x) - 1))
x = np.linspace(-10, 10, 100)
y = elu(x)
plt.plot(x, y)
plt.xlabel('x')
plt.ylabel('ELU(x)')
plt.title('ELU Function')
plt.grid(True)
plt.show()
2.4.3 图片
2.5 Tanh函数
Tanh函数(双曲正切函数)将输入的实数值映射到一个介于-1和1之间的输出。它在前向传播过程中具有平滑的激活特性,常用于隐藏层的激活函数。
2.5.1 数学公式
Tanh(x) = (exp(x) - exp(-x)) / (exp(x) + exp(-x))
2.5.2 代码
import numpy as np
import matplotlib.pyplot as plt
def tanh(x):
return (np.exp(x) - np.exp(-x)) / (np.exp(x) + np.exp(-x))
x = np.linspace(-10, 10, 100)
y = tanh(x)
plt.plot(x, y)
plt.xlabel('x')
plt.ylabel('Tanh(x)')
plt.title('Tanh Function')
plt.grid(True)
plt.show()
2.5.3 图片
2.6 Softmax函数
Softmax函数通常用于多分类问题,将输入向量转换为一个概率分布,使得所有元素的和等于1。Softmax函数对于输出类别之间的概率关系建模,常用于最后一层的激活函数。
2.6.1 数学公式
Softmax(x_i) = exp(x_i) / sum(exp(x_j))
2.6.2 代码
import numpy as np
import matplotlib.pyplot as plt
def softmax(z):
e_z = np.exp(z)
return e_z / np.sum(e_z)
x = np.linspace(-10, 10, 100)
y = softmax(x)
plt.plot(x, y)
plt.xlabel('x')
plt.ylabel('softmax(x)')
plt.title('Softmax Function')
plt.grid(True)
plt.show()
2.6.3 图片
2.6.4 注意
在计算Softmax函数时,减去最大值是为了提高数值的稳定性。这是因为指数函数的值在输入较大的情况下会变得非常大,导致数值溢出的问题。通过减去最大值,可以将输入值的范围控制在相对较小的范围内,避免指数函数的计算结果过大而导致数值溢出。
减去最大值后,输入向量的最大值变为0,其他元素相对于最大值的差值也变小。这使得指数函数的计算结果在数值上更加稳定
此时代码:
import matplotlib.pyplot as plt
import numpy as np
def softmax(x):
e_x = np.exp(x - np.max(x))
return e_x / np.sum(e_x)
x = np.linspace(-10, 10, 100)
y = softmax(x)
plt.plot(x, y)
plt.xlabel('x')
plt.ylabel('softmax(x)')
plt.title('Softmax Function')
plt.grid(True)
plt.show()