【激活函数】基础回顾:带你认识神经网络中常见的激活函数

简介: 【激活函数】基础回顾:带你认识神经网络中常见的激活函数

前言

  神经网络中的激活函数是神经网络中至关重要的一环,它们决定了神经网络的非线性特性,能够让神经网络学习非常复杂的函数。激活函数的种类也非常丰富,从最早的sigmoid、tanh,到后来的ReLU、LeakyReLU、ELU等,再到最近的GELU、SE-ReLU、SiLU等,每种激活函数都有其独特的优点和适用场景。

  在本篇博客中,我们将对神经网络中常见的激活函数进行总结和介绍,同时也会介绍一些新兴的激活函数,帮助读者了解它们的特点和使用方法,以便在实际应用中能够选择合适的激活函数来提升神经网络的性能。

概述

  神经网络中的激活函数是非常重要的组成部分,它的作用是将神经元的输入信号转换为输出信号,从而实现神经网络的非线性映射。激活函数的意义在于它能够引入非线性特性,使得神经网络可以拟合非常复杂的函数,从而提高了神经网络的表达能力和预测性能。

  具体来说,激活函数的作用有以下几个方面:

  1. 引入非线性特性:激活函数能够将神经元的输入信号转换为输出信号,从而引入非线性特性,使得神经网络可以拟合非常复杂的函数。
  2. 压缩输出范围:激活函数能够将神经元的输出范围压缩到一定的范围内,这有助于防止神经元输出的值过大或过小,从而提高了神经网络的稳定性和泛化性能。
  3. 增加网络深度:激活函数能够增加神经网络的深度,从而提高了神经网络的表达能力和预测性能。
  4. 改善梯度消失问题:激活函数能够改善神经网络中的梯度消失问题,从而提高了神经网络的训练效率和收敛速度。

特性

  1. sigmoid函数

  sigmoid函数是神经网络中最早也是最常用的激活函数之一,它的特点是将输入值映射到0到1之间的连续范围内,输出值具有良好的可解释性,但是它在梯度消失和输出饱和等问题上表现不佳。

python

复制代码

def sigmoid(x):
    return 1. / (1. + np.exp(-x))

image.png

  1. ReLU函数

  ReLU函数是当前最常用的激活函数之一,它的特点是简单、快速,并且在许多情况下表现出色。ReLU函数将负数输入映射到0,将正数输入保留不变,因此在训练过程中可以避免梯度消失的问题。但是ReLU函数在输入为负数时输出为0,这可能导致神经元死亡,因此后续的改进版本LeakyReLU得到了广泛的应用。

python

复制代码

def ReLU(x):
    return np.maximum(0, x)

image.png

  1. LeakyReLU函数

  LeakyReLU函数是ReLU函数的改进版本,它在输入为负数时输出一个小的负数,从而避免了ReLU函数可能导致神经元死亡的问题。LeakyReLU函数的优点是简单、快速,并且在许多情况下表现出色,但是其超参数需要手动调整,因此在实际应用中需要进行一定的调试。

python

复制代码

def LeakyReLU(x, alpha=0.1):
    return np.maximum(alpha*x, x)

image.png

  1. Tanh函数

  Tanh函数是一种具有S形状的激活函数,其特点是将输入值映射到-1到1之间的连续范围内,输出值也具有良好的可解释性。Tanh函数在某些情况下可以表现出色,但是它也存在梯度消失和输出饱和等问题,因此在深度神经网络中使用并不广泛。

python

复制代码

def Tanh(x):
    return np.tanh(x)

image.png

  1. Softmax函数

  Softmax函数是一种常用于多分类问题的激活函数,它将输入值映射到0到1之间的概率分布,可以将神经网络的输出转换为各个类别的概率值。Softmax函数的优点是简单、易于理解,并且在多分类问题中表现出色,但是它也存在梯度消失和输出饱和等问题。

ini

复制代码

def Softmax(x):
    exp_x = np.exp(x)
    return exp_x / np.sum(exp_x, axis=0, keepdims=True)

image.png

  1. GELU函数

  GELU函数是一种近年来提出的激活函数,它的特点是在ReLU函数的基础上引入了高斯误差线性单元,从而在某些情况下能够表现出色。GELU函数具有平滑的非线性特性,可以避免ReLU函数可能导致的神经元死亡问题。

arduino

复制代码

def GELU(x):
    cdf = 0.5 * (1.0 + np.tanh((np.sqrt(2 / np.pi) * (x + 0.044715 * np.power(x, 3)))))
    return x * cdf

image.png

  1. SE_ReLU函数

  SE_ReLU函数是一种近年来提出的激活函数,它的特点是在ReLU函数的基础上引入了Sigmoid函数和Exponential函数,从而能够增加神经元的表达能力。SE_ReLU函数具有非常好的平滑性和可解释性。

scss

复制代码

def SE_ReLU(x, alpha=0.1, beta=10):
    return np.where(x > 0, x + alpha * x * np.exp(-beta * x), x)

image.png

  1. SiLU函数

  SiLU函数是一种近年来提出的激活函数,它的特点是在sigmoid函数的基础上引入了自身的输入,从而能够表现出更好的非线性特性。SiLU函数具有非常好的平滑性和可解释性。

scss

复制代码

def SE_ReLU(x, alpha=0.1, beta=10):
    return np.where(x > 0, x + alpha * x * np.exp(-beta * x), x)

image.png

9.  DynamicShiftMax & DynamicReLU_A & DynamicReLU_B函数 DynamicShiftMax函数是一种近年来提出的激活函数,它的特点是在ReLU函数的基础上引入了动态偏移量,从而能够增加神经元的表达能力。

ini

复制代码

def DynamicShiftMax(x, alpha=0.1):
    return np.maximum(x, x + alpha * np.max(x, axis=0, keepdims=True))
def DynamicReLU_A(x, alpha=0.1):
    return np.maximum(x, x + alpha * np.mean(x, axis=0, keepdims=True))
def DynamicReLU_B(x, alpha=0.1):
    return np.maximum(x, x + alpha * np.std(x, axis=0, keepdims=True))

image.png

性能测试

  我们采用控制变量法进行激活函数的推理速度测试,x为输入,范围为-1到1之间的十万个数据,运行次数为100计算激活函数的计算耗时

ini

复制代码

if __name__ == "__main__":
    x = np.linspace(-1, 1, 100000)
    t1 = time.time()
    for i in range(100):
        y = sigmoid(x)
    t2 = time.time()
    print(float(t2 - t1))
激活函数 耗时
sigmoid 0.09099984169006348
ReLU 0.017026901245117188
LeakyReLU 0.016999244689941406
Tanh 0.0420374870300293
Softmax 0.045000314712524414
GELU 0.26389026641845703
SE_ReLU 0.12003183364868164
SiLU 0.09399843215942383
DynamicShiftMax 0.026140928268432617
DynamicReLU_A 0.01399993896484375
DynamicReLU_B 0.08199810981750488



相关文章
用MASM32按Time Protocol(RFC868)协议编写网络对时程序中的一些有用的函数代码
用MASM32按Time Protocol(RFC868)协议编写网络对时程序中的一些有用的函数代码
|
28天前
|
机器学习/深度学习 编解码
深度学习笔记(三):神经网络之九种激活函数Sigmoid、tanh、ReLU、ReLU6、Leaky Relu、ELU、Swish、Mish、Softmax详解
本文介绍了九种常用的神经网络激活函数:Sigmoid、tanh、ReLU、ReLU6、Leaky ReLU、ELU、Swish、Mish和Softmax,包括它们的定义、图像、优缺点以及在深度学习中的应用和代码实现。
107 0
深度学习笔记(三):神经网络之九种激活函数Sigmoid、tanh、ReLU、ReLU6、Leaky Relu、ELU、Swish、Mish、Softmax详解
|
1月前
|
机器学习/深度学习 数据可视化 算法
激活函数与神经网络------带你迅速了解sigmoid,tanh,ReLU等激活函数!!!
激活函数与神经网络------带你迅速了解sigmoid,tanh,ReLU等激活函数!!!
|
3月前
|
机器学习/深度学习 算法
神经网络中激活函数的重要性
【8月更文挑战第23天】
25 0
|
3月前
|
监控
【网络编程】poll函数
【网络编程】poll函数
27 0
|
3月前
|
监控
【网络编程】select函数
【网络编程】select函数
57 0
|
3月前
|
机器学习/深度学习 Shell 计算机视觉
一文搞懂 卷积神经网络 卷积算子应用举例 池化 激活函数
这篇文章通过案例详细解释了卷积神经网络中的卷积算子应用、池化操作和激活函数,包括如何使用卷积算子进行边缘检测和图像模糊,以及ReLU激活函数如何解决梯度消失问题。
|
4月前
|
机器学习/深度学习
神经网络可能不再需要激活函数?Layer Normalization也具有非线性表达!
【7月更文挑战第14天】研究表明,层归一化(LayerNorm)可能具备非线性表达能力,挑战了神经网络对激活函数的依赖。在LN-Net结构中,仅使用线性层与LayerNorm就能实现复杂分类,其VC维度下界证明了非线性表达。尽管如此,是否能完全替代激活函数及如何有效利用这一特性仍需更多研究。[arXiv:2406.01255]
56 5
|
4月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于负相关误差函数的4集成BP神经网络matlab建模与仿真
**算法预览:** 图像显示无水印的2022a版MATLAB运行结果 **软件版本:** MATLAB 2022a **核心代码片段:** 省略展示 **理论概述:** NCL集成BP网络利用负相关提升泛化,结合多个弱模型减少错误关联。通过λ参数控制模型间负相关程度,λ>0增强集成效果,提高预测准确性和系统稳健性。
|
4月前
|
存储 Java Unix
(八)Java网络编程之IO模型篇-内核Select、Poll、Epoll多路复用函数源码深度历险!
select/poll、epoll这些词汇相信诸位都不陌生,因为在Redis/Nginx/Netty等一些高性能技术栈的底层原理中,大家应该都见过它们的身影,接下来重点讲解这块内容。

热门文章

最新文章