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

news2024/12/26 17:52:09

目录

​编辑

Sigmoid函数

代码示例与分析

Tanh函数

代码示例与分析

ReLU函数

代码示例与分析

Leaky ReLU函数

代码示例与分析

PReLU函数

代码示例与分析

ELU函数

代码示例与分析

SELU函数

代码示例与分析

Softmax函数

代码示例与分析

结论


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

Sigmoid函数

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

import numpy as np

def 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.coloradmin.cn/o/2254391.html

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

相关文章

使用Tauri创建桌面应用

当前是在 Windows 环境下 1.准备 系统依赖项 Microsoft C 构建工具WebView2 (Windows10 v1803 以上版本不用下载,已经默认安装了) 下载安装 Rust下载安装 Rust 需要重启终端或者系统 重新打开cmd,键入rustc --version,出现 rust 版本号&…

2023年第十四届蓝桥杯Scratch国赛真题—推箱子

推箱子 程序演示及其源码解析,可前往: https://www.hixinao.com/scratch/creation/show-188.html 若需在线编程,在线测评模考,助力赛事可自行前往题库中心,按需查找: https://www.hixinao.com/ 题库涵盖…

[RabbitMQ] RabbitMQ常见应用问题

🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏: 🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection与…

HarmonyOS 5.0应用开发——UIAbility生命周期

【高心星出品】 文章目录 UIAbility组件创建AbilityUIAbility的生命周期Create状态WindowStageCreate状态Foreground和Background状态WindowStageWillDestroy状态Destroy状态 UIAbility组件 UIAbility组件是一种包含UI的应用组件,主要用于和用户交互。 UIAbility组…

Coovally CPU版:用AI模型微调技术革新数据标注方式

文章目录 前言一、为什么选择Coovally CPU版?1.微调模型更懂你的数据2.省时省力的标注流程3.零GPU门槛,适配性强 二、教程:如何用Coovally CPU版完成高效数据标注?第一步:安装Coovally CPU版第二步:加载数据…

Lua元表和元方法的使用

元表是一个普通的 Lua 表,包含一组元方法,这些元方法与 Lua 中的事件相关联。事件发生在 Lua 执行某些操作时,例如加法、字符串连接、比较等。元方法是普通的 Lua 函数,在特定事件发生时被调用。 元表包含了以下元方法&#xff1…

【初阶数据结构与算法】二叉树链式结构的定义与实现万字笔记(附源码)

文章目录 一、二叉树链式结构的定义二、二叉树链式结构功能的基本实现1.链式二叉树的手动创建2.链式二叉树的前中后序遍历前序遍历中序遍历后序遍历 3.链式二叉树节点的个数4.链式二叉树叶子节点的个数5.链式二叉树的高度/深度6.链式二叉树第k层节点的个数7.链式二叉树的查找8.…

前端框架的选择与反思:在简约与复杂之间寻找平衡

在当今互联网时代,前端开发已经成为web应用构建中不可或缺的一环。从最初的静态HTML页面,到如今复杂的单页应用(SPA),前端技术的发展让我们见证了Web应用的蓬勃发展。然而,伴随着技术的进步,一个…

SABO-CNN-BiGRU-Attention减法优化器优化卷积神经网络结合双向门控循环单元时间序列预测,含优化前后对比

SABO-CNN-BiGRU-Attention减法优化器优化卷积神经网络结合双向门控循环单元时间序列预测,含优化前后对比 目录 SABO-CNN-BiGRU-Attention减法优化器优化卷积神经网络结合双向门控循环单元时间序列预测,含优化前后对比预测效果基本介绍模型描述程序设计参…

SpringBoot期末知识点大全

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

撰写技术文档的关键步骤和核心要点

编写项目的技术文档是一个重要且细致的任务,它不仅有助于项目的当前开发团队理解系统的结构和工作原理,还为未来的维护和扩展提供了宝贵的参考资料。以下是撰写技术文档时应遵循的几个关键步骤和组成部分: 1. 概述 项目简介:简要…

【人工智能】Transformers之Pipeline(二十八):视觉问答(visual-question-answering)

​​​​​​​ 目录 一、引言 二、视觉问答(visual-question-answering) 2.1 概述 2.2 dandelin/ViLT 2.3 pipeline参数 2.3.1 pipeline对象实例化参数 2.3.2 pipeline对象使用参数 2.3.3 pipeline对象返回参数 2.4 pipeline实战 2.5 模型…

【Vue3】详解Vue3的ref与reactive:两者的区别与使用场景

文章目录 引言Moss前沿AIVue 3响应式系统概述ref与reactive的基础概念ref与reactive的区别1. 数据类型2. 访问方式3. 响应式追踪机制4. 可变性5. 使用场景表格对比 ref与reactive的使用场景1. 选择ref的场景2. 选择reactive的场景 性能分析与优化建议1. 响应式系统的性能优势2.…

8. 一分钟读懂“代理模式”

8.1 模式介绍 代理模式是一种结构型设计模式,它通过提供一个代理对象来替代对另一个对象(真实对象)的访问。代理对象与真实对象实现相同的接口,并通过代理类对真实对象的访问进行控制,可以在调用前后执行附加操作&…

网络原理(HPPT/HTTPS)

应用层(重点) HTTP协议 HTTP 是⼀个⽂本格式的协议. 可以通过 Chrome 开发者⼯具或者 Fiddler 抓包, 分析 HTTP 请求/响应的细节. Fiddler 抓包 左侧窗⼝显⽰了所有的 HTTP请求/响应, 可以选中某个请求查看详情. • 右侧上⽅显⽰了 HTTP 请求的报⽂内容…

随时随地掌控数据:如何使用手机APP远程访问飞牛云NAS

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

计算机毕业设计Python+Spark医生推荐系统 医生门诊预测系统 医生数据分析 医生可视化 医疗数据分析 医生爬虫 大数据毕业设计 机器学习

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

golang实现单例日志对象

原文地址:golang实现单例日志对象 – 无敌牛 欢迎参观我的个人博客:无敌牛 – 技术/著作/典籍/分享等 介绍 golang有很多日志包,通过设置和修改都能实现日志轮转和自定义日志格式。例如:log、zap、golog、slog、log4go 等等。 …

SpringBoot该怎么使用Neo4j - 优化篇

文章目录 前言实体工具使用 前言 上一篇中,我们的Cypher都用的是字符串,字符串拼接简单,但存在写错的风险,对于一些比较懒的开发者,甚至觉得之间写字符串还更自在快速,也确实,但如果在后期需要…

【Calibre-Web】Calibre-Web服务器安装详细步骤(个人搭建自用的电子书网站,docker-compose安装)

文章目录 一、Calibre-Web和Calibre的区别是什么?使用场景分别是什么?二、服务器安装docker和docker-compose三、服务器安装Calibre-Web步骤1、安装完成后的目录结构2、安装步骤3、初始配置4、启动上传 四、安装Calibre五、docker-compose常用命令 最近想…