赞
踩
在神经网络中,激活函数是一个非常重要的组成部分,它为神经元引入了非线性特性,使得神经网络可以拟合各种复杂的函数关系。本文将介绍9种常见的激活函数,包括它们的概述、公式以及用Python实现示例代码,并对它们进行比较和总结。
激活函数是神经网络中的一个关键组件,它决定了神经元的输出是否被激活。在神经网络的每一层中,都会使用激活函数对输入进行非线性变换,从而使得神经网络可以逼近复杂的函数关系。
Sigmoid函数是一种常用的激活函数,它将输入的值映射到0到1之间的输出。
公式:
σ
(
x
)
=
1
1
+
e
−
x
\sigma(x) = \frac{1}{1 + e^{-x}}
σ(x)=1+e−x1
TanH函数是Sigmoid函数的变体,将输入的值映射到-1到1之间的输出。
公式:
tanh
(
x
)
=
e
x
−
e
−
x
e
x
+
e
−
x
\text{tanh}(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}
tanh(x)=ex+e−xex−e−x
ReLU函数是一种简单而有效的激活函数,它将所有负值都设置为零,保持正值不变。
公式:
f
(
x
)
=
max
(
0
,
x
)
f(x) = \max(0, x)
f(x)=max(0,x)
Leaky ReLU函数是对ReLU的改进,它在负值部分引入了一个小的斜率,避免了ReLU可能出现的“神经元死亡”问题。
公式:
f
(
x
)
=
{
x
,
if
x
>
0
α
x
,
otherwise
f(x) =
PReLU函数是Leaky ReLU的进一步改进,它允许斜率成为可学习的参数,而不是固定的超参数。
公式:
f
(
x
)
=
{
x
,
if
x
>
0
α
x
,
otherwise
f(x) =
ELU函数在负值部分引入了一个非线性项,相对于ReLU,它在负值区域的输出更接近于零。
公式:
f
(
x
)
=
{
x
,
if
x
>
0
α
(
e
x
−
1
)
,
otherwise
f(x) =
Swish函数是一种新型的激活函数,它结合了Sigmoid函数和ReLU函数的特点,具有平滑的非线性性质。
公式:
Swish
(
x
)
=
x
⋅
σ
(
x
)
\text{Swish}(x) = x \cdot \sigma(x)
Swish(x)=x⋅σ(x)
Softplus函数是一种平滑的近似于ReLU函数的激活函数,它可以保证输出是非负的。
公式:
Softplus
(
x
)
=
ln
(
1
+
e
x
)
\text{Softplus}(x) = \ln(1 + e^x)
Softplus(x)=ln(1+ex)
Mish函数是一种新型的激活函数,具有类似于Swish函数的性质,但更平滑,并且在实践中表现良好。
公式:
Mish
(
x
)
=
x
⋅
tanh
(
ln
(
1
+
e
x
)
)
\text{Mish}(x) = x \cdot \tanh(\ln(1 + e^x))
Mish(x)=x⋅tanh(ln(1+ex))
下面将用Python实现示例代码,并通过可视化的方式展示不同激活函数的效果。
import numpy as np import matplotlib.pyplot as plt # 定义各种激活函数 def sigmoid(x): return 1 / (1 + np.exp(-x)) def tanh(x): return np.tanh(x) def relu(x): return np.maximum(0, x) def leaky_relu(x, alpha=0.01): return np.where(x > 0, x, alpha * x) def parametric_relu(x, alpha=0.01): return np.where(x > 0, x, alpha * x) def elu(x, alpha=1.0): return np.where(x > 0, x, alpha * (np.exp(x) - 1)) def swish(x): return x * sigmoid(x) def softplus(x): return np.log(1 + np.exp(x)) def mish(x): return x * np.tanh(np.log(1 + np.exp(x))) # 生成输入数据 x = np.linspace(-5, 5, 100) # 计算各个激活函数的输出 y_sigmoid = sigmoid(x) y_tanh = tanh(x) y_relu = relu(x) y_leaky_relu = leaky_relu(x) y_parametric_relu = parametric_relu(x) y_elu = elu(x) y_swish = swish(x) y_softplus = softplus(x) y_mish = mish(x) # 绘制结果 plt.figure(figsize=(14, 10)) plt.subplot(3, 3, 1) plt.plot(x, y_sigmoid, label='Sigmoid', color='blue') plt.title('Sigmoid') plt.grid(True) plt.subplot(3, 3, 2) plt.plot(x, y_tanh, label='TanH', color='red') plt.title('TanH') plt.grid(True) plt.subplot(3, 3, 3) plt.plot(x, y_relu, label='ReLU', color='green') plt.title('ReLU') plt.grid(True) plt.subplot(3, 3, 4) plt.plot(x, y_leaky_relu, label='Leaky ReLU', color='orange') plt.title('Leaky ReLU') plt.grid(True) plt.subplot(3, 3, 5) plt.plot(x, y_parametric_relu, label='PReLU', color='purple') plt.title('Parametric ReLU ') plt.grid(True) plt.subplot(3, 3, 6) plt.plot(x, y_elu, label='ELU', color='brown') plt.title('ELU') plt.grid(True) plt.subplot(3, 3, 7) plt.plot(x, y_swish, label='Swish', color='cyan') plt.title('Swish') plt.grid(True) plt.subplot(3, 3, 8) plt.plot(x, y_softplus, label='Softplus', color='magenta') plt.title('Softplus') plt.grid(True) plt.subplot(3, 3, 9) plt.plot(x, y_mish, label='Mish', color='olive') plt.title('Mish') plt.grid(True) plt.tight_layout() plt.show()
导入库:
numpy
:用于数值计算。matplotlib.pyplot
:用于数据可视化。定义激活函数:
sigmoid
:实现Sigmoid激活函数。tanh
:实现TanH激活函数。relu
:实现ReLU激活函数。leaky_relu
:实现Leaky ReLU激活函数。parametric_relu
:实现Parametric ReLU激活函数。elu
:实现ELU激活函数。swish
:实现Swish激活函数。softplus
:实现Softplus激活函数。mish
:实现Mish激活函数。生成输入数据:
numpy
的linspace
函数生成范围在-5到5之间的100个均匀间隔的数据点。计算各个激活函数的输出:
绘制结果:
matplotlib.pyplot
绘制了一个3x3的子图,每个子图表示一个激活函数的输出。plot
函数绘制了输入数据和对应激活函数的输出曲线。title
函数添加了每个子图的标题,表示对应的激活函数名称。grid
函数添加了网格线,增强了可视化效果。tight_layout
函数调整子图布局,使得各个子图之间的间距合适。显示图像:
show
函数显示绘制的图像。本文介绍了神经网络中常见的9种激活函数,包括它们的概述、公式和用Python实现示例代码,并通过可视化展示了它们的效果。每种激活函数都有其特点和适用场景,选择合适的激活函数对于神经网络的训练和性能至关重要。读者可以根据实际问题的需求和数据的特点,选择合适的激活函数来提高神经网络的性能和效果。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。