激活函数在神经网络中的应用与选择

目录

​编辑

Sigmoid函数

代码示例与分析

Tanh函数

代码示例与分析

ReLU函数

代码示例与分析

Leaky ReLU函数

代码示例与分析

PReLU函数

代码示例与分析

ELU函数

代码示例与分析

SELU函数

代码示例与分析

Softmax函数

代码示例与分析

结论


在深度学习领域,激活函数是构建神经网络不可或缺的一部分。它们的主要作用是引入非线性,使得神经网络能够学习和模拟复杂的函数映射。本文将探讨几种常见的激活函数,分析它们的特点和适用场景,以帮助读者在构建神经网络时做出合适的选择。

Sigmoid函数

Sigmoid函数是一种将输入压缩到0和1之间的函数,其数学表达式为:

import numpy as npdef sigmoid(x):return 1 / (1 + np.exp(-x))

Sigmoid函数的输出范围是(0, 1),这使得它在处理二分类问题时非常有用,因为可以将其输出解释为概率。然而,Sigmoid函数存在梯度消失的问题,即当输入值非常大或非常小的时候,函数的梯度接近于0,这会导致网络在训练过程中权重更新非常缓慢,影响训练效率。此外,Sigmoid函数的输出不是零中心化的,这意味着它可能会增加学习算法的收敛时间。

代码示例与分析

以下是使用Sigmoid函数的一个简单示例,我们将创建一个包含随机值的NumPy数组,并应用Sigmoid函数:

import numpy as np
import matplotlib.pyplot as plt# 创建一个随机数组
x = np.linspace(-10, 10, 1000)# 应用Sigmoid函数
y = sigmoid(x)# 绘制Sigmoid函数的图形
plt.plot(x, y)
plt.title('Sigmoid Function')
plt.xlabel('Input')
plt.ylabel('Output')
plt.grid(True)
plt.show()

在上述代码中,我们首先导入了NumPy库来处理数值计算,以及Matplotlib库来绘制函数图形。我们创建了一个从-10到10的线性空间数组,这个数组包含了1000个点,这样可以细致地展示Sigmoid函数的曲线。然后,我们将Sigmoid函数应用于这个数组,并使用Matplotlib绘制了函数的图形。从图形中可以看出,Sigmoid函数在输入值接近正负无穷大时,输出值接近0和1,而在0附近,函数的斜率最大。这种S形曲线是Sigmoid函数的典型特征,它在机器学习中的二分类问题中非常有用,尤其是在输出层,因为其输出可以直接解释为概率值。

Tanh函数

Tanh函数是Sigmoid函数的变种,其输出范围在-1和1之间,数学表达式为:

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

与Sigmoid函数相比,Tanh函数的输出是零中心化的,这有助于数据的处理和网络的训练。但同样存在梯度消失的问题。Tanh函数在隐藏层中比Sigmoid函数更受欢迎,因为它的输出范围是对称的,这有助于权重的初始化和梯度的传播。

代码示例与分析

以下是使用Tanh函数的一个简单示例,我们将创建一个包含随机值的NumPy数组,并应用Tanh函数:

import numpy as np
import matplotlib.pyplot as plt# 创建一个随机数组
x = np.linspace(-10, 10, 1000)# 应用Tanh函数
y = tanh(x)# 绘制Tanh函数的图形
plt.plot(x, y)
plt.title('Tanh Function')
plt.xlabel('Input')
plt.ylabel('Output')
plt.grid(True)
plt.show()

在上述代码中,我们同样使用了NumPy库和Matplotlib库。我们创建了一个从-10到10的线性空间数组,并应用了Tanh函数。绘制的图形显示了Tanh函数的形状,它在输入值接近正负无穷大时,输出值接近-1和1,而在0附近,函数的斜率最大。这种双曲正切形状是Tanh函数的典型特征,它在机器学习中的隐藏层中非常有用,因为它的零中心化输出有助于减少学习算法的偏差。

ReLU函数

ReLU(Rectified Linear Unit)函数以其简单性和高效性在现代神经网络中占据主导地位,其数学表达式为:

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

ReLU函数解决了Sigmoid和Tanh函数的梯度消失问题,因为它在输入大于0时梯度恒为1。然而,ReLU函数存在“死亡ReLU”的问题,即当输入小于等于0时,梯度为0,导致部分神经元不再更新。

代码示例与分析

以下是使用ReLU函数的一个简单示例,我们将创建一个包含随机值的NumPy数组,并应用ReLU函数:

import numpy as np
import matplotlib.pyplot as plt# 创建一个随机数组
x = np.linspace(-10, 10, 1000)# 应用ReLU函数
y = relu(x)# 绘制ReLU函数的图形
plt.plot(x, y)
plt.title('ReLU Function')
plt.xlabel('Input')
plt.ylabel('Output')
plt.grid(True)
plt.show()

在上述代码中,我们使用了NumPy库来处理数值计算,并使用Matplotlib库来绘制ReLU函数的图形。我们创建了一个从-10到10的线性空间数组,并应用了ReLU函数。绘制的图形显示了ReLU函数的形状,它在输入值小于0时,输出为0;在输入值大于0时,输出等于输入值。这种线性整流形状是ReLU函数的典型特征,它在机器学习中的隐藏层中非常有用,因为它的计算效率高,并且在正区间内梯度恒定,有助于加快学习过程。

Leaky ReLU函数

Leaky ReLU函数是对ReLU函数的改进,其数学表达式为:

def leaky_relu(x, alpha=0.01):return np.where(x > 0, x, x * alpha)

其中 ( \alpha ) 是一个很小的正数。Leaky ReLU函数允许负输入有一个非零的梯度,从而解决了“死亡ReLU”的问题,使得所有神经元都能在训练过程中更新。

代码示例与分析

以下是使用Leaky ReLU函数的一个简单示例,我们将创建一个包含随机值的NumPy数组,并应用Leaky ReLU函数:

import numpy as np
import matplotlib.pyplot as plt# 创建一个随机数组
x = np.linspace(-10, 10, 1000)# 应用Leaky ReLU函数
y = leaky_relu(x)# 绘制Leaky ReLU函数的图形
plt.plot(x, y)
plt.title('Leaky ReLU Function')
plt.xlabel('Input')
plt.ylabel('Output')
plt.grid(True)
plt.show()

在上述代码中,我们使用了NumPy库来处理数值计算,并使用Matplotlib库来绘制Leaky ReLU函数的图形。我们创建了一个从-10到10的线性空间数组,并应用了Leaky ReLU函数。绘制的图形显示了Leaky ReLU函数的形状,它在输入值大于0时,输出等于输入值;在输入值小于0时,输出为输入值乘以一个很小的正数 ( \alpha )。这种函数的形状有助于神经网络在负区间内也能进行学习,从而避免了“死亡ReLU”的问题,并且由于其在负区间内的梯度不为零,有助于模型的快速收敛。

PReLU函数

PReLU(Parametric ReLU)函数是Leaky ReLU函数的泛化,其数学表达式为:

def prelu(x, alpha):return np.where(x > 0, x, x * alpha)

其中 (\alpha ) 是一个可学习的参数。PReLU函数允许每个神经元学习一个不同的 ( \alpha_i),这增加了模型的灵活性。

代码示例与分析

以下是使用PReLU函数的一个简单示例,我们将创建一个包含随机值的NumPy数组,并应用PReLU函数:

import numpy as np
import matplotlib.pyplot as plt# 创建一个随机数组
x = np.linspace(-10, 10, 1000)# 假设alpha是一个可学习的参数,这里我们用一个随机值来模拟
alpha = np.random.rand(1000) * 0.01# 应用PReLU函数
y = np.where(x > 0, x, x * alpha)# 绘制PReLU函数的图形
plt.plot(x, y)
plt.title('PReLU Function')
plt.xlabel('Input')
plt.ylabel('Output')
plt.grid(True)
plt.show()

在上述代码中,我们使用了NumPy库来处理数值计算,并使用Matplotlib库来绘制PReLU函数的图形。我们创建了一个从-10到10的线性空间数组,并为每个点随机生成了一个 (\alpha ) 值来模拟PReLU函数。绘制的图形显示了PReLU函数的形状,它在输入值大于0时,输出等于输入值;在输入值小于0时,输出为输入值乘以对应的 ( \alpha ) 值。这种函数的形状允许每个神经元学习一个不同的 ( \alpha ) 值,从而增加了模型的灵活性。PReLU函数特别适合于那些需要对负输入值有不同处理方式的场景,因为它允许模型自适应地调整负输入值的处理方式。

ELU函数

ELU(Exponential Linear Unit)函数的数学表达式为:

def elu(x, alpha=0.01):return np.where(x > 0, x, alpha * (np.exp(x) - 1))

ELU函数不仅解决了“死亡ReLU”的问题,而且在负输入时有一个非零的梯度,这有助于模型更快地收敛。

代码示例与分析

以下是使用ELU函数的一个简单示例,我们将创建一个包含随机值的NumPy数组,并应用ELU函数:

import numpy as np
import matplotlib.pyplot as plt# 创建一个随机数组
x = np.linspace(-10, 10, 1000)# 应用ELU函数
y = elu(x)# 绘制ELU函数的图形
plt.plot(x, y)
plt.title('ELU Function')
plt.xlabel('Input')
plt.ylabel('Output')
plt.grid(True)
plt.show()

在上述代码中,我们使用了NumPy库来处理数值计算,并使用Matplotlib库来绘制ELU函数的图形。我们创建了一个从-10到10的线性空间数组,并应用了ELU函数。绘制的图形显示了ELU函数的形状,它在输入值大于0时,输出等于输入值;在输入值小于0时,输出为 ( \alpha ) 乘以 ( e^x - 1 )。这种函数的形状有助于神经网络在负区间内也能进行学习,从而避免了“死亡ReLU”的问题,并且由于其在负区间内的梯度不为零,有助于模型的快速收敛。ELU函数特别适合于那些需要对负输入值有不同处理方式的场景,因为它允许模型自适应地调整负输入值的处理方式,并且有助于减少神经元的死亡问题。

SELU函数

SELU(Scaled Exponential Linear Unit)函数是一种自归一化的激活函数,其数学表达式为:

def selu(x, alpha=1.6732632423543772, scale=1.0507009873554805):return scale * np.where(x > 0, x, alpha * (np.exp(x) - 1))

SELU函数旨在解决深度网络中的训练困难,通过保持输入的均值和方差在一定的范围内,从而简化了网络的训练过程。

代码示例与分析

以下是使用SELU函数的一个简单示例,我们将创建一个包含随机值的NumPy数组,并应用SELU函数:

import numpy as np
import matplotlib.pyplot as plt# 创建一个随机数组
x = np.linspace(-10, 10, 1000)# 应用SELU函数
y = selu(x)# 绘制SELU函数的图形
plt.plot(x, y)
plt.title('SELU Function')
plt.xlabel('Input')
plt.ylabel('Output')
plt.grid(True)
plt.show()

在上述代码中,我们使用了NumPy库来处理数值计算,并使用Matplotlib库来绘制SELU函数的图形。我们创建了一个从-10到10的线性空间数组,并应用了SELU函数。绘制的图形显示了SELU函数的形状,它在输入值大于0时,输出等于输入值乘以一个缩放因子;在输入值小于0时,输出为 ( \alpha ) 乘以 (e^x - 1 ) 再乘以缩放因子。这种函数的形状有助于神经网络在负区间内也能进行学习,并且由于其自归一化的特性,有助于保持网络中间层输出的均值和方差在一定的范围内,从而简化了网络的训练过程。SELU函数特别适合于那些需要自归一化特性的场景,因为它可以帮助模型在训练过程中保持稳定的激活分布,减少调参的需求。

Softmax函数

Softmax函数常用于神经网络的输出层,尤其是在处理多分类问题时。其数学表达式为:

def softmax(x):e_x = np.exp(x - np.max(x))return e_x / e_x.sum(axis=0)

Softmax函数的输出范围在0和1之间,并且所有输出的和为1,这使得它非常适合于表示概率分布。

代码示例与分析

以下是使用Softmax函数的一个简单示例,我们将创建一个包含随机值的NumPy数组,并应用Softmax函数:

import numpy as np
import matplotlib.pyplot as plt# 创建一个随机数组
x = np.random.randn(10, 5)  # 假设有10个样本,每个样本有5个特征# 应用Softmax函数
y = softmax(x)# 绘制Softmax函数的图形
plt.figure(figsize=(10, 6))
for i in range(y.shape[1]):plt.plot(y[:, i], label=f'Class {i}')
plt.title('Softmax Function Output')
plt.xlabel('Sample Index')
plt.ylabel('Probability')
plt.legend()
plt.grid(True)
plt.show()

在上述代码中,我们使用了NumPy库来处理数值计算,并使用Matplotlib库来绘制Softmax函数的图形。我们创建了一个包含随机值的二维NumPy数组,模拟了10个样本,每个样本有5个特征。然后,我们将Softmax函数应用于这个数组。绘制的图形显示了Softmax函数的输出,它将每个样本的特征值转换为概率分布,其中每个样本的输出概率之和为1。这种函数的形状有助于神经网络在多分类问题中输出概率预测。Softmax函数特别适合于那些需要输出概率分布的场景,因为它可以确保输出的值在0和1之间,并且所有类别的输出概率之和为1,这使得它非常适合于分类问题中的输出层。

结论

选择合适的激活函数对于构建高效的神经网络至关重要。ReLU及其变体因其简单和高效而被广泛使用,但在某些特定场景下,如需要输出概率分布的多分类问题,Softmax函数则是更好的选择。了解不同激活函数的特点和适用场景,可以帮助我们更好地设计和优化神经网络模型。通过深入理解每种激活函数的特性,我们可以更好地选择适合特定任务的激活函数,从而提高模型的性能和效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/34641.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

如何在.NET 8.0 上安装 FastReport 并创建简单报告(下)

FastReport 是一款灵活而强大的报告工具。它允许用户以各种格式访问数据源并以可视化方式呈现它们。使用 FastReport 创建的报告可以在用户界面中使用拖放逻辑轻松设计,并转换为不同的格式(PDF、Excel、Word 等)。>> 如何在.NET 8.0 上…

SpringBoot期末知识点大全

一、学什么 IoC AOP:面向切面编程。 事物处理 整合MyBatis Spring框架思想! 二、核心概念 问题:类之间互相调用/实现,导致代码耦合度高。 解决:使用对象时,程序中不主动new对象,转换为由外部提…

vscode CMakeLists中对opencv eigen的引用方法

CMakeLists.txt 项目模式(只有一个main函数入口) cmake_minimum_required(VERSION 3.5)project(vsin01 VERSION 0.1 LANGUAGES CXX)set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON)set(OpenCV_DIR G:/MinGW_Opencv/opencv4.10/opencv…

11.15【JAVA】【网络编程】【DEBUG】

代码以开源至cqujk/CquJavaEE 的myExp-socketCode分支,欢迎拷打 参考REPO Java 11: Standardized HTTP Client API 没反应 这是因为这应当是两个线程,当server创建好套接字后,进入accept时,就不会继续向下运行,客户端自然也就无法发送请求 首先要保证server进入accept(这个…

华为HCIE-Datacom认证笔试+实验考试介绍

华为HCIE数通认证考试是面向那些希望成为数通网络领域专家的人员,考试通常两部分:笔试和实验考试。 考试科目: HCIE-Datacom笔试考试内容: HCIE-Datacom V1.0考试覆盖数据通信领域路由交换高阶技术、企业网络架构全景、园区网络…

Android环境搭建

Android环境搭建 第一步:安装 Homebrew 执行以下命令来安装 Homebrew: /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"检测是否安装成功: brew --version第二步:安装 No…

WLAN漫游

定义 WLAN漫游 是指STA在不同AP覆盖范围之间移动且保持用户业务不中断的行为 实现WLAN漫游的两个AP必须使用相同的SSID和安全模板(安全模板名称可以不同,但是安全模板下的配置必须相同),认证模板的认证方式和认证参数也要配置相…

排序2(万字详细版)

一 快速排序 快速排序是Hoare于1962年提出的⼀种⼆叉树结构的交换排序⽅法,其基本思想为:任取待排序元素 序列中的某元素作为基准值,按照该排序码将待排序集合分割成两⼦序列,左⼦序列中所有元素均⼩ 于基准值,右⼦序列…

[ACTF2020 新生赛]Include

感觉毫无头绪e一下,发现要使用伪协议 伪协议:是PHP自己支持的一种协议与封装协议,简单说就是PHP定义的一种特殊访问资源的方法。 2.什么时候用PHP伪协议? 可能遇到的文件包含函数: 1、include 2、require 3、include_once 4、r…

链表【Lecode_HOT100】

1.相交链表No.160 public ListNode getIntersectionNode(ListNode headA, ListNode headB) {if(headAnull||headBnull) return null;ListNode pAheadA;ListNode pBheadB;while(pA!pB){pA(pAnull)?headB:pA.next;pB(pBnull)?headA:pB.next;}return pA; }2.反转链表No.206 pu…

时频转换 | Matlab格拉姆角和场Gramian angular summation field一维数据转二维图像方法

目录 基本介绍程序设计参考资料获取方式 基本介绍 时频转换 | Matlab格拉姆角和场Gramian angular summation field一维数据转二维图像方法 程序设计 clear clc % close all load x.mat % 导入数据 x x(1:5120); % 本数据只选择5120个点进行分析 fs 6400 ; % 数据采样频…

试题转excel;pdf转excel;试卷转Excel,word试题转excel

一、问题描述 一名教师朋友,偶尔会需要整理一些高质量的题目到excel中 以往都是手动复制搬运,几百道题几乎需要一个下午的时间 关键这些事,枯燥无聊费眼睛,实在是看起来就很蠢的工作 就想着做一个工具,可以自动处理…

借助vector实现进制转换详解

进制转换,没什么可说的,大一级别的水平,不过在某些考研题目中可能会涉及到顺序栈的实现,本贴不使用顺序栈,用STL里面的vector模拟一下:关键在于想清楚【除留取余】的逻辑,至于用什么结构存放中间…

快速构建NLP理论知识体系

NLP理论知识体系 一句话解释NLPNLP模型及原理简述1、Rag 一句话解释NLP 如果我们要实现机器翻译、情感分析、问答系统、文本摘要、聊天机器人、构造智能化的辅助文件填写模板,NLP可以通过现成的模型对输入的语音、文字、图片进行处理(分词、标词性、去停…

iptables防火墙(DNAT、SNAT)小实验

这篇是iptables服务器当中DNAT、SNAT的部分 网络拓扑图: 实验要求: 实现内外网web互访问将内web的网关指向iptables服务器ens33的IPiptables服务器添加两块网卡,外web服务器要跟iptables的ens36同一块网卡内部web:192.168.180.1…

Oracle ASM特性介绍和增删盘操作

1. 介绍 1.1. 在没有ASM之前ORACLE数据库靠什么去解决存储问题: 裸设备:裸设备就是没有被文件系统格式化的分区或者是直接挂载到操作系统上的磁盘。ORACLE可以直接将数据写入到裸设备中,读写能非常优异。像ORACLE的数据文件、控制文件、REDO日志在过去…

UiPath API接口说明

Swagger网址 私有云网址(企业版) https://企业/swagger/index.html 公有云网址(社区版) https://cloud.uipath.com/linan/LinanZhang/orchestrator_/swagger/index.html#/ 常见问题 Swagger页面测试请求时报错“You are not a…

【机械加工】数字化软件打造,如何实现3D交互可视化?

机械加工是制造业的重要领域之一,随着制造技术和工艺的不断发展,机械加工的精度和效率要求越来越高。HOOPS作为一款专业的3D图形引擎,可以为机械加工行业提供高效、灵活的3D建模、可视化和交互工具。下面将从以下几个方面介绍HOOPS技术在机械…

CAMAv2: A Vision-Centric Approach for Static Map Element Annotation

CAMAv2: 摘要简介相关工作A. 视觉为中心的地图构建(Vision-centric HD Map Construction)B. 地图元素数据集(Map Element Datasets)1. nuScenes 数据集2. Argoverse2 数据集3. 车道线数据集 CAMAv2A. 场景重建(Scene R…

大数据新视界 -- 大数据大厂之 Hive 临时表与视图:灵活数据处理的技巧(上)(29 / 30)

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…