神经网络中常见的激活函数:理解与实践

神经网络中常见的激活函数:理解与实践

在神经网络中,激活函数是一个非常重要的组成部分,它为神经元引入了非线性特性,使得神经网络可以拟合各种复杂的函数关系。本文将介绍9种常见的激活函数,包括它们的概述、公式以及用Python实现示例代码,并对它们进行比较和总结。

1. 概述

激活函数是神经网络中的一个关键组件,它决定了神经元的输出是否被激活。在神经网络的每一层中,都会使用激活函数对输入进行非线性变换,从而使得神经网络可以逼近复杂的函数关系。

2. 激活函数的公式

1. Sigmoid函数

Sigmoid函数是一种常用的激活函数,它将输入的值映射到0到1之间的输出。

公式:
σ ( x ) = 1 1 + e − x \sigma(x) = \frac{1}{1 + e^{-x}} σ(x)=1+e−x1

2. TanH函数

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

3. ReLU函数

ReLU函数是一种简单而有效的激活函数,它将所有负值都设置为零,保持正值不变。

公式:
f ( x ) = max ⁡ ( 0 , x ) f(x) = \max(0, x) f(x)=max(0,x)

4. Leaky ReLU函数

Leaky ReLU函数是对ReLU的改进,它在负值部分引入了一个小的斜率,避免了ReLU可能出现的"神经元死亡"问题。

公式:
f ( x ) = { x , if x > 0 α x , otherwise f(x) = \begin{cases} x, & \text{if } x > 0 \\ \alpha x, & \text{otherwise} \end{cases} f(x)={x,αx,if x>0otherwise

5. Parametric ReLU (PReLU)函数

PReLU函数是Leaky ReLU的进一步改进,它允许斜率成为可学习的参数,而不是固定的超参数。

公式:
f ( x ) = { x , if x > 0 α x , otherwise f(x) = \begin{cases} x, & \text{if } x > 0 \\ \alpha x, & \text{otherwise} \end{cases} f(x)={x,αx,if x>0otherwise

6. Exponential Linear Unit (ELU)函数

ELU函数在负值部分引入了一个非线性项,相对于ReLU,它在负值区域的输出更接近于零。

公式:
f ( x ) = { x , if x > 0 α ( e x − 1 ) , otherwise f(x) = \begin{cases} x, & \text{if } x > 0 \\ \alpha (e^x - 1), & \text{otherwise} \end{cases} f(x)={x,α(ex−1),if x>0otherwise

7. Swish函数

Swish函数是一种新型的激活函数,它结合了Sigmoid函数和ReLU函数的特点,具有平滑的非线性性质。

公式:
Swish ( x ) = x ⋅ σ ( x ) \text{Swish}(x) = x \cdot \sigma(x) Swish(x)=x⋅σ(x)

8. Softplus函数

Softplus函数是一种平滑的近似于ReLU函数的激活函数,它可以保证输出是非负的。

公式:
Softplus ( x ) = ln ⁡ ( 1 + e x ) \text{Softplus}(x) = \ln(1 + e^x) Softplus(x)=ln(1+ex)

9. Mish函数

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))

3. 用Python实现示例代码

下面将用Python实现示例代码,并通过可视化的方式展示不同激活函数的效果。

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()
  1. 导入库:

    • numpy:用于数值计算。
    • matplotlib.pyplot:用于数据可视化。
  2. 定义激活函数:

    • sigmoid:实现Sigmoid激活函数。
    • tanh:实现TanH激活函数。
    • relu:实现ReLU激活函数。
    • leaky_relu:实现Leaky ReLU激活函数。
    • parametric_relu:实现Parametric ReLU激活函数。
    • elu:实现ELU激活函数。
    • swish:实现Swish激活函数。
    • softplus:实现Softplus激活函数。
    • mish:实现Mish激活函数。
  3. 生成输入数据:

    • 使用numpylinspace函数生成范围在-5到5之间的100个均匀间隔的数据点。
  4. 计算各个激活函数的输出:

    • 分别对输入数据应用不同的激活函数,得到对应的输出值。
  5. 绘制结果:

    • 使用matplotlib.pyplot绘制了一个3x3的子图,每个子图表示一个激活函数的输出。
    • 在每个子图中,使用plot函数绘制了输入数据和对应激活函数的输出曲线。
    • 使用title函数添加了每个子图的标题,表示对应的激活函数名称。
    • 使用grid函数添加了网格线,增强了可视化效果。
    • 使用tight_layout函数调整子图布局,使得各个子图之间的间距合适。
  6. 显示图像:

    • 使用show函数显示绘制的图像。

总结

本文介绍了神经网络中常见的9种激活函数,包括它们的概述、公式和用Python实现示例代码,并通过可视化展示了它们的效果。每种激活函数都有其特点和适用场景,选择合适的激活函数对于神经网络的训练和性能至关重要。读者可以根据实际问题的需求和数据的特点,选择合适的激活函数来提高神经网络的性能和效果。

相关推荐
埃菲尔铁塔_CV算法22 分钟前
深度学习神经网络创新点方向
人工智能·深度学习·神经网络
艾思科蓝-何老师【H8053】40 分钟前
【ACM出版】第四届信号处理与通信技术国际学术会议(SPCT 2024)
人工智能·信号处理·论文发表·香港中文大学
weixin_452600691 小时前
《青牛科技 GC6125:驱动芯片中的璀璨之星,点亮 IPcamera 和云台控制(替代 BU24025/ROHM)》
人工智能·科技·单片机·嵌入式硬件·新能源充电桩·智能充电枪
学术搬运工1 小时前
【珠海科技学院主办,暨南大学协办 | IEEE出版 | EI检索稳定 】2024年健康大数据与智能医疗国际会议(ICHIH 2024)
大数据·图像处理·人工智能·科技·机器学习·自然语言处理
右恩1 小时前
AI大模型重塑软件开发:流程革新与未来展望
人工智能
图片转成excel表格2 小时前
WPS Office Excel 转 PDF 后图片丢失的解决方法
人工智能·科技·深度学习
ApiHug2 小时前
ApiSmart x Qwen2.5-Coder 开源旗舰编程模型媲美 GPT-4o, ApiSmart 实测!
人工智能·spring boot·spring·ai编程·apihug
哇咔咔哇咔3 小时前
【科普】简述CNN的各种模型
人工智能·神经网络·cnn
李歘歘3 小时前
万字长文解读深度学习——多模态模型CLIP、BLIP、ViLT
人工智能·深度学习