当前位置: 首页 > news >正文

【深度学习】关键技术-激活函数(Activation Functions)

激活函数(Activation Functions)

激活函数是神经网络的重要组成部分,它的作用是将神经元的输入信号映射到输出信号,同时引入非线性特性,使神经网络能够处理复杂问题。以下是常见激活函数的种类、公式、图形特点及其应用场景。


1. 常见激活函数及其公式与代码示例

1. Sigmoid 激活函数

公式:

\sigma(x) = \frac{1}{1 + e^{-x}}

特点:
  • 输出范围为 (0, 1)。
  • 对输入较大的值趋于 1,较小的值趋于 0。
  • 常用于神经网络输出层处理二分类问题。
  • 优点
    • 将输入映射为概率值,直观且常用于概率任务。
  • 缺点
    • 梯度消失:输入很大或很小时,梯度趋近 0,导致反向传播时权重更新变慢。
    • 输出不以 0 为中心,不利于零均值数据。
代码示例:
import numpy as np
import matplotlib.pyplot as pltdef sigmoid(x):return 1 / (1 + np.exp(-x))# 示例
x = np.linspace(-10, 10, 100)
y = sigmoid(x)plt.plot(x, y)
plt.title("Sigmoid Activation Function")
plt.xlabel("x")
plt.ylabel("sigmoid(x)")
plt.grid()
plt.show()
运行结果: 


2. Tanh(双曲正切)激活函数

公式:

\text{Tanh}(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}

特点:
  • 输出范围为 (-1, 1)。
  • 优点
    • 比 Sigmoid 更对称,输出以 0 为中心,更适合零均值数据。
  • 缺点
    • 梯度消失问题依然存在。
代码示例:
import numpy as np
import matplotlib.pyplot as plt
def tanh(x):return np.tanh(x)x = np.linspace(-10, 10, 100)
y = tanh(x)plt.plot(x, y)
plt.title("Tanh Activation Function")
plt.xlabel("x")
plt.ylabel("tanh(x)")
plt.grid()
plt.show()
运行结果: 


3. ReLU(Rectified Linear Unit)激活函数

公式:

f(x) = max(0, x)

特点:
  • 输出范围为 [0, +∞)。
  • 优点
    • 简单高效,计算速度快。
    • 解决了梯度消失问题,几乎是所有深度学习模型的默认选择。
  • 缺点
    • “死亡神经元”:当输入总是小于 0 时,梯度为 0,神经元可能永远不会被激活。
代码示例:
import numpy as np
import matplotlib.pyplot as pltdef relu(x):return np.maximum(0, x)x = np.linspace(-10, 10, 100)
y = relu(x)plt.plot(x, y)
plt.title("ReLU Activation Function")
plt.xlabel("x")
plt.ylabel("ReLU(x)")
plt.grid()
plt.show()
运行结果: 


4. Leaky ReLU 激活函数

公式:

f(x) = \begin{cases} x & \text{if } x > 0 \\ \alpha x & \text{if } x \leq 0 \end{cases}

其中,α 是一个小于 1 的常数,通常取 0.01。

特点:
  • 优点
    • 解决 ReLU 的“死亡神经元”问题。
    • 在负数输入上具有小的线性斜率。
  • 缺点
    • 引入了超参数 α,需手动调节。
代码示例:
import numpy as np
import matplotlib.pyplot as plt
def leaky_relu(x, alpha=0.01):return np.where(x > 0, x, alpha * x)x = np.linspace(-10, 10, 100)
y = leaky_relu(x)plt.plot(x, y)
plt.title("Leaky ReLU Activation Function")
plt.xlabel("x")
plt.ylabel("Leaky ReLU(x)")
plt.grid()
plt.show()
运行结果: 


5. ELU(Exponential Linear Unit)激活函数

公式:

f(x) = \begin{cases} x & \text{if } x > 0 \\ \alpha (e^x - 1) & \text{if } x \leq 0 \end{cases}

其中,α 通常取 1。

特点:
  • 优点
    • 负数部分平滑处理,有助于减少梯度消失问题,训练更稳定。
    • 能加速模型收敛。
  • 缺点
    • 计算复杂度稍高。
代码示例:
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.title("ELU Activation Function")
plt.xlabel("x")
plt.ylabel("ELU(x)")
plt.grid()
plt.show()
运行结果: 


6. Softmax 激活函数

公式:

\text{Softmax}(x_i) = \frac{e^{x_i}}{\sum_{j=1}^n e^{x_j}}

特点:
  • 将输入映射为概率分布,适用于多分类问题,常用于多分类问题的最后一层。
  • 输出范围为 (0, 1),且总和为 1。
代码示例:
import numpy as npdef softmax(x):exp_x = np.exp(x - np.max(x))  # 防止数值溢出return exp_x / np.sum(exp_x)# 示例
x = np.array([1.0, 2.0, 3.0, 6.0])
y = softmax(x)print("Softmax Output:", y)
print("Sum of Softmax Output:", np.sum(y))  # 确保总和为 1
运行结果:
Softmax Output: [0.00626879 0.01704033 0.04632042 0.93037047]
Sum of Softmax Output: 1.0


7. Swish 激活函数

公式:

f(x) = x \cdot \text{Sigmoid}(\beta x)

其中,β 是可学习参数,通常默认为 1。

特点:
  • 优点
    • 平滑可微,能捕获复杂特征。
    • 在深度网络中比 ReLU 表现更优。
代码示例:
import numpy as np
import matplotlib.pyplot as pltdef sigmoid(x):return 1 / (1 + np.exp(-x))
def swish(x, beta=1.0):return x * sigmoid(beta * x)x = np.linspace(-10, 10, 100)
y = swish(x)plt.plot(x, y)
plt.title("Swish Activation Function")
plt.xlabel("x")
plt.ylabel("Swish(x)")
plt.grid()
plt.show()
运行结果: 


2. 激活函数的选择与应用

任务导向的选择:
  • 分类问题:
    • 二分类:Sigmoid 或 Softmax。
    • 多分类:Softmax。
  • 回归问题:
    • 使用线性激活函数或无激活函数。
  • 深度学习(卷积网络、RNN 等):
    • 通常采用 ReLU 及其变种(Leaky ReLU、ELU)。
层次结构的选择:
  • 隐藏层:
    • 一般使用 ReLU 或其变种。
  • 输出层:
    • 分类:Softmax 或 Sigmoid。
    • 回归:线性激活函数。

3.激活函数对比总结

激活函数输出范围是否有梯度消失是否有“死亡神经元”常见应用场景
Sigmoid(0, 1)二分类输出
Tanh(-1, 1)RNN 或零均值数据
ReLU[0, +∞)深层网络的隐藏层
Leaky ReLU(−∞, +∞)深层网络
ELU(−α, +∞)深度网络
Softmax(0, 1)多分类输出层
Swish(−∞, +∞)深度网络或复杂任务

通过结合理论和代码示例,可以根据任务特点选择合适的激活函数以优化模型性能。


4. 未来趋势

  • 现代深度学习中,激活函数的发展更加注重可学习性性能优化
  • 像 Swish 和 GELU 等新型激活函数正在逐步取代传统激活函数,尤其在深度和复杂的网络中表现更优。
http://www.lryc.cn/news/522120.html

相关文章:

  • 网关相关知识
  • SpringBoot整合SpringSecurity详解
  • 【C++基础】enum,union,uint8_t,static
  • 单片机的原理及其应用:从入门到进阶的全方位指南
  • 如何使用 Go语言操作亚马逊 S3 对象云存储
  • 2025年应用与API安全展望:挑战与机遇并存
  • Linux安装docker,安装配置xrdp远程桌面
  • VD:生成a2l文件
  • 【SpringBoot应用篇】SpringBoot+MDC+自定义Filter操作traceId实现日志链路追踪
  • unity2022以上导出到AndroidStudio后更新步骤
  • 【ArcGIS初学】产生随机点计算混淆矩阵
  • Harmony面试模版
  • PCM5142集成32位384kHz PCM音频立体声114dB差分输出DAC编解码芯片
  • 浪潮云财务系统xtdysrv.asmx存在命令执行漏洞
  • 【网络编程】基础知识
  • ResNet (Residual Network) - 残差网络:深度卷积神经网络的突破
  • MOSFET体二极管的反向恢复分析
  • 80_Redis内存策略
  • 【HarmonyOS NAPI 深度探索6】使用 N-API 创建第一个 Hello World 原生模块
  • Java语言的软件工程
  • 【Mysql进阶知识】Mysql 程序的介绍、选项在命令行配置文件的使用、选项在配置文件中的语法
  • wireshark抓路由器上的包 抓包路由器数据
  • 玩转大语言模型——使用graphRAG+Ollama构建知识图谱
  • python flask简单实践
  • JAVA实现五子棋小游戏(附源码)
  • kotlin的dagger hilt依赖注入
  • 速通Docker === 常用命令
  • 【redis】键的全局命令
  • 深度学习-卷积神经网络实战文档注释
  • GR2103高压半桥栅极驱动芯片