一文速学-让神经网络不再神秘,一天速学神经网络基础-激活函数(二)


前言

思索了很久到底要不要出深度学习内容,毕竟在数学建模专栏里边的机器学习内容还有一大半算法没有更新,很多坑都没有填满,而且现在深度学习的文章和学习课程都十分的多,我考虑了很久决定还是得出神经网络系列文章,不然如果以后数学建模竞赛或者是其他更优化模型如果用上了神经网络(比如利用LSTM进行时间序列模型预测),那么就更好向大家解释并且阐述原理了。但是深度学习的内容不是那么好掌握的,包含大量的数学理论知识以及大量的计算公式原理需要推理。且如果不进行实际操作很难够理解我们写的代码究极在神经网络计算框架中代表什么作用。不过我会尽可能将知识简化,转换为我们比较熟悉的内容,我将尽力让大家了解并熟悉神经网络框架,保证能够理解通畅以及推演顺利的条件之下,尽量不使用过多的数学公式和专业理论知识。以一篇文章快速了解并实现该算法,以效率最高的方式熟练这些知识。

现在很多竞赛虽然没有限定使用算法框架,但是更多获奖的队伍都使用到了深度学习算法,传统机器学习算法日渐式微。比如2022美国大学生数学建模C题,参数队伍使用到了深度学习网络的队伍,获奖比例都非常高,现在人工智能比赛和数据挖掘比赛都相继增多,对神经网络知识需求也日渐增多,因此十分有必要掌握各类神经网络算法。

博主专注建模四年,参与过大大小小数十来次数学建模,理解各类模型原理以及每种模型的建模流程和各类题目分析方法。此专栏的目的就是为了让零基础快速使用各类数学模型、机器学习和深度学习以及代码,每一篇文章都包含实战项目以及可运行代码。博主紧跟各类数模比赛,每场数模竞赛博主都会将最新的思路和代码写进此专栏以及详细思路和完全代码。希望有需求的小伙伴不要错过笔者精心打造的专栏。


前一篇文章我们具体讲述了神经网络神经元的基本构造,以及引入了神经网络一些概念性质,有了这些基础我们就能更好的理解每一层神经网络究竟要做什么,如何工作的。

激活函数定义与功能

举个例子,我们可以将激活函数比作人类的情绪,比如愉快、中立和生气。如果一个神经元的情绪是愉快的,那么它在收到信息后可能更容易激活,即传递信息。相反,如果它的情绪是生气的,那么即使收到的信息很强烈,它也可能不会激活,即不传递信息。

想象一下神经元是大脑中的小工人,他们负责接受信息并决定是否传递这些信息给下一个神经元。但是这些神经元并不是简单地将信息原封不动地传递,它们还会加上一些个人的“情绪”来影响信息的传递。

这种“情绪”就好比神经网络中的激活函数。激活函数就像神经元的情绪开关,当神经元收到信息时,它会根据这些信息的强弱和自己的“情绪”来决定是否激活(传递信息)。

总的来说,激活函数的作用就是在神经网络中引入非线性性质,使得神经网络可以学习更加复杂和抽象的模式。它们帮助神经元决定是否传递信息,从而让整个神经网络能够更好地适应和学习输入数据的特征。就像人类情绪决定了我们如何对待收到的信息一样,激活函数也决定了神经元如何处理输入信息。

 我们来更直观的感受一下激活函数的作用:在现实中,存在非常复杂的线性不可分的情况。

激活函数的设计灵感来自于生物神经元。生物神经元不仅仅是线性的输入输出关系,它们在达到一定电位阈值后会激活,产生脉冲。激活函数模拟了这种生物神经元的激活过程,使得神经网络更贴近生物神经系统的工作方式。

 激活函数的作用是为神经网络引入非线性性,提高网络的表达能力,模拟生物神经元的工作方式,解决优化问题,以便网络可以更好地学习和表示各种数据的复杂模式和特征。

激活函数分类

每个激活函数都有自己的优点和适用场景。在选择激活函数时,需要根据具体任务、网络结构和训练效果进行选择。激活函数可以分为以下几类:

 

  1. 线性激活函数: 线性激活函数是最简单的激活函数,其输出与输入成正比。然而,由于线性函数的叠加仍然是线性的,所以线性激活函数的叠加多层无法表达复杂的非线性模式,因此在深度神经网络中很少使用。

  2. 非线性激活函数: 非线性激活函数是神经网络中常用的激活函数,它们引入了非线性变换,使得网络能够学习复杂的数据模式和特征。常见的非线性激活函数包括 ReLU、Leaky ReLU、PReLU、Tanh 和 Sigmoid 等。

  3. 输出激活函数: 输出激活函数位于神经网络的输出层,通常用于处理不同类型的任务,如分类、回归、生成等。常见的输出激活函数有 Sigmoid(二元分类问题)、Softmax(多类别分类问题)、线性激活函数(回归问题)等。

  4. 归一化激活函数: 归一化激活函数在一定范围内对输入进行缩放和平移,以便使输出位于特定的范围内。例如,Sigmoid 函数和 Tanh 函数就是归一化激活函数。

  5. 带参数的激活函数: 有些激活函数具有可调节的参数,允许网络自适应地学习激活函数的形状。例如,Leaky ReLU 和 PReLU 就是带参数的激活函数,其中参数可以在训练中进行调整。

  6. 自适应激活函数: 这些激活函数根据输入数据的性质自动调整激活函数的形状。例如,自适应的激活函数可以根据数据分布动态地选择合适的非线性变换。

 常用的激活函数

 

1.Sigmoid函数

关于Sigmoid函数,与人工智能算法有过接触的小伙伴估计都有使用到过这个函数,无论是作为启发函数还是作为数据处理的归一化函数,该函数的功能都十分好用。Sigmoid非线性激活函数的数学表达式为 :

 其中e是纳皮尔常数,其值为2.7182...

优点

  1. 输出范围有界: Sigmoid 函数的输出范围在 0 到 1 之间,这使得它在表示概率或概率分布时很有用。在二元分类问题中,Sigmoid 函数的输出可以被解释为样本属于某一类别的概率。

  2. 可导性: Sigmoid 函数在其定义范围内是连续可导的,这对于使用梯度下降等优化算法进行模型训练是有帮助的。导数的计算也相对简单。

  3. 阈值控制: Sigmoid 函数在接近原点时,输出变化比较敏感。这意味着它可以帮助网络学习对输入的微小变化做出较大的响应,有助于模型进行精细的调整。

 缺点

  1. 梯度消失问题: 当输入值很大或很小时,Sigmoid 函数的导数接近于零,这会导致梯度消失的问题。在深度神经网络中,这可能导致训练过程变得困难,甚至无法进行有效的训练。

  2. 不以零为中心: Sigmoid 函数的输出不以零为中心,这可能导致神经网络在训练过程中的权重更新存在偏移,影响学习的效果。

  3. 计算成本较高: 在计算 Sigmoid 函数时,需要进行指数运算,这在某些情况下会增加计算成本,尤其是当神经元数量很多时。

Python代码

import numpy as np
import matplotlib.pyplot as plt

# 定义 Sigmoid 激活函数
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

# 生成一组输入值
x = np.linspace(-10, 10, 100)

# 计算对应的 Sigmoid 输出
y = sigmoid(x)

# 绘制输入和输出曲线
plt.figure(figsize=(8, 6))
plt.plot(x, y, label='Sigmoid Function')
plt.title('Sigmoid Activation Function')
plt.xlabel('Input')
plt.ylabel('Output')
plt.legend()
plt.grid(True)
plt.show()

2. ReLU 函数

ReLU(Rectified Linear Activation)函数是深度学习中常用的非线性激活函数之一。它在神经网络中广泛应用,因为它简单有效,能够解决梯度消失问题,并且在实际应用中取得了良好的结果。

ReLU 函数的定义很简单:对于任何输入值 x,输出等于输入 x(如果 x 大于等于零),或者输出为零(如果 x 小于零)。数学表达式如下:

 优点

  1. 非线性性质: ReLU 函数引入了非线性变换,使得神经网络可以学习更加复杂的数据模式和特征,从而提升网络的表达能力。

  2. 避免梯度消失问题: 在反向传播过程中,ReLU 的导数在正区间是常数 1,这意味着梯度不会随着层数增加而消失。相比于一些 Sigmoid 和 Tanh 等函数,在深度网络中使用 ReLU 函数更不容易出现梯度消失的情况。

  3. 计算高效: ReLU 函数的计算非常简单,只需要判断输入是否大于零,不涉及复杂的数学运算。

缺点

  1. 神经元死亡问题: 当输入为负值时,ReLU 函数的导数为零,这可能导致一些神经元在训练过程中“死亡”,即永远不会被激活。这通常发生在学习率过大时。

  2. 不以零为中心: ReLU 函数在输入为负时输出为零,这使得神经网络中的某些权重在训练过程中可能出现偏移,影响网络的学习。

为了克服 ReLU 函数的缺点,也有一些改进版本,如 Leaky ReLU、Parametric ReLU(PReLU)等,它们在一定程度上解决了神经元死亡问题并且可以学习不同的斜率。

Python代码

import numpy as np
import matplotlib.pyplot as plt

# 定义 ReLU 激活函数
def relu(x):
    return np.maximum(0, x)

# 生成一组输入值
x = np.linspace(-10, 10, 100)

# 计算对应的 ReLU 输出
y = relu(x)

# 绘制输入和输出曲线
plt.figure(figsize=(8, 6))
plt.plot(x, y, label='ReLU Function')
plt.title('ReLU Activation Function')
plt.xlabel('Input')
plt.ylabel('Output')
plt.legend()
plt.grid(True)
plt.show()

 3.Tanh 函数

Tanh 函数(双曲正切函数)是一种常用的激活函数,它在神经网络中用于引入非线性性,并可以将输入映射到一个在 -1 到 1 之间的输出范围。Tanh 函数类似于 Sigmoid 函数,但在输出值的范围上更广泛,因此在某些情况下更有用。

Tanh 函数的数学表达式如下:

 Tanh 函数的图像呈现出 S 形曲线,类似于 Sigmoid 函数,但 Tanh 函数的输出范围在 -1 到 1 之间。当输入接近正无穷时,Tanh 函数的输出趋近于 1,而当输入接近负无穷时,输出趋近于 -1。当输入接近零时,输出在 0 附近。

优点

  1. 非线性性质: Tanh 函数引入了非线性变换,使得神经网络可以学习更加复杂的数据模式和特征,提高网络的表达能力。

  2. 输出范围有界: Tanh 函数的输出范围在 -1 到 1 之间,这使得它在一些情况下适用于数据标准化和缩放。

  3. 以零为中心: Tanh 函数的输出在零点附近有对称性,这使得神经网络中的权重更新相对均衡,避免偏移。

缺点

  1. 梯度消失问题: 当输入接近正无穷或负无穷时,Tanh 函数的导数接近于零,这可能导致梯度消失的问题,特别是在深度神经网络中。

  2. 计算成本较高: 计算 Tanh 函数需要进行指数运算,这在某些情况下可能会增加计算成本。

Python代码

import numpy as np
import matplotlib.pyplot as plt

# 定义 Tanh 激活函数
def tanh(x):
    return np.tanh(x)

# 生成一组输入值
x = np.linspace(-10, 10, 100)

# 计算对应的 Tanh 输出
y = tanh(x)

# 绘制输入和输出曲线
plt.figure(figsize=(8, 6))
plt.plot(x, y, label='Tanh Function')
plt.title('Tanh Activation Function')
plt.xlabel('Input')
plt.ylabel('Output')
plt.legend()
plt.grid(True)
plt.show()

 4.Softmax函数

Softmax特别适用于多类别分类问题。它将一组实数作为输入,将其转换为表示概率分布的输出,使得所有输出的和为 1。Softmax 函数广泛应用于神经网络中的分类问题,例如图像分类、自然语言处理中的文本分类等。

Softmax 函数的数学表达式如下,假设有一个包含 n 个元素的输入向量 x

 

其中,x_{i}是输入向量中的第 i 个元素,而分母部分是所有输入元素的指数和。这样,Softmax 函数将每个输入值映射到一个 [0, 1] 范围内的概率值,并保证所有概率值的和为 1。

在多类别分类问题中,假设有 k 个类别,Softmax 函数的输出可以解释为输入属于每个类别的概率。输出向量的第 i 个元素就是输入属于第 i 个类别的概率。

 优点

  1. 概率分布: Softmax 函数生成一个概率分布,使得网络的输出可以解释为属于每个类别的概率,有助于对分类问题进行解释和分析。

  2. 多类别分类: Softmax 函数适用于多类别分类问题,能够同时处理多个类别的输出。

  3. 可导性: Softmax 函数是可导的,这对于使用梯度下降等优化算法进行模型训练是有帮助的。

缺点

  1. 数值稳定性: 当输入值较大或较小时,Softmax 函数中的指数运算可能导致数值溢出或下溢。为了解决这个问题,通常会在计算 Softmax 时进行数值稳定性处理,例如通过减去输入向量中的最大值。

  2. 标签不平衡问题: 如果某个类别的训练样本数量远大于其他类别,Softmax 函数可能会倾向于预测数量更多的类别。

Python代码

import numpy as np

# 定义 Softmax 函数
def softmax(x):
    e_x = np.exp(x - np.max(x))  # 为了数值稳定性,减去最大值
    return e_x / e_x.sum()

# 生成一组输入向量
x = np.array([2.0, 1.0, 0.1])

# 计算 Softmax 输出
softmax_output = softmax(x)

print("Input vector:", x)
print("Softmax output:", softmax_output)
print("Sum of probabilities:", np.sum(softmax_output))

 生成一个输入向量 x,并使用 Softmax 函数计算对应的输出向量 y。为了保证数值稳定性,我们在计算时减去了输入向量中的最大值。运行代码后,你将看到输入向量经过 Softmax 函数转换后得到的概率分布,所有输出值都在 [0, 1] 范围内,且和为 1。

总结

大家使用激活函数的时候如果有条件的话,尽量都选择用一遍,选择效果最好的函数再进行微调。如果拿不定主意的话就先选ReLU 或其变种。避免使用 Sigmoid 和 Tanh,尽管 Sigmoid 和 Tanh 激活函数在一些情况下仍然有用,但它们容易引发梯度消失问题,并且在深度网络中不如 ReLU 及其变种效果好。

对于二元分类问题,常用 Sigmoid 激活函数;对于多类别分类问题,常用 Softmax 激活函数。对于回归问题,通常不需要使用激活函数。某些情况下,激活函数可能导致梯度爆炸。如果你遇到梯度爆炸问题,可以考虑使用梯度裁剪等方法来控制梯度大小。所以说每个问题和数据集都可能有不同的特点,因此最好通过实验验证不同激活函数的效果,找到最适合的激活函数。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

实验二 tftp 服务器环境搭建

tftp 服务器环境搭建 tftp(Trivial File Transfer Protocol)即简单文件传输协议是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。端口号为69 【实验目的】 掌握 tftp 环境搭…

【目标检测】“复制-粘贴 copy-paste” 数据增强实现

文章目录 前言1. 效果展示代码说明3. 参考文档4. 不合适点 前言 本文来源论文《Simple Copy-Paste is a Strong Data Augmentation Method for Instance Segmentation》(CVPR2020),对其数据增强方式进行实现。 论文地址:https:/…

MediaPlayer音频与视频的播放介绍

作者:向阳逐梦 Android多媒体中的——MediaPlayer,我们可以通过这个API来播放音频和视频该类是Androd多媒体框架中的一个重要组件,通过该类,我们可以以最小的步骤来获取,解码和播放音视频。 它支持三种不同的媒体来源…

Talk | 上海交通大学官同坤:识别任意文本,隐式注意力与字符间蒸馏在文本识别中的应用

本期为TechBeat人工智能社区第525期线上Talk! 北京时间8月23日(周三)20:00,上海交通大学博士生—官同坤的Talk已准时在TechBeat人工智能社区开播! 他与大家分享的主题是: “隐式注意力与字符间蒸馏在文本识别中的应用”,分享了识别…

使用docker-maven-plugin插件构建镜像并推送至私服Harbor

前言 如下所示,建议使用 Dockerfile Maven 插件,但该插件也停止维护更新了。因此先暂时使用docker-maven-plugin插件。 一、开启Docker服务器的远程访问 1.1 开启2375远程访问 默认的dokcer是不支持远程访问的,需要加点配置,开…

bh002- Blazor hybrid / Maui 保存设置快速教程

1. 建立工程 bh002_ORM 源码 2. 添加 nuget 包 <PackageReference Include"BootstrapBlazor.WebAPI" Version"7.*" /> <PackageReference Include"FreeSql" Version"*" /> <PackageReference Include"FreeSql.…

MyBatis分页插件PageHelper的使用及特殊字符的处理

目录 一、PageHelper简介 1.什么是分页 2.PageHelper是什么 3.使用PageHelper的优点 二、PageHelper插件的使用 原生limit查询 1. 导入pom依赖 2. Mybatis.cfg.xml 配置拦截器 3. 使用PageHelper进行分页 三、特殊字符的处理 1.SQL注入&#xff1a; 2.XML转义&#…

【Linux】【驱动】第一个相对完整的驱动编写

【Linux】【驱动】第一个相对完整的驱动编写 续1.驱动部分的代码2 app 代码3 操作相关的代码 续 这个章节会讲述去直接控制一个GPIO&#xff0c;高低电平。 因为linux不允许直接去操作寄存器&#xff0c;所以在操作寄存器的时候就需要使用到函数&#xff1a;ioremap 和iounma…

线性代数的学习和整理10:各种特殊类型的矩阵(草稿-----未完成 建设ing)

目录 1 图形化分类 1.1对称矩阵 1.2 梯形矩阵 1.3 三角矩阵 1.3.1 上三角矩阵 1.4 对角线矩阵 2 按各自功能分 2.1 等价矩阵 2.2 增广矩阵 2.3 伴随矩阵 2.4 正交矩阵 2.5 正交矩阵 2.6 相似矩阵 1 图形化分类 1.1对称矩阵 1.2 梯形矩阵 1.3 三角矩阵 1.3.1 上…

【ARM-Linux】项目,语音刷抖音项目

文章目录 所需器材装备操作SU-03T语音模块配置代码&#xff08;没有用wiring库&#xff0c;自己实现串口通信&#xff09;结束 所需器材 可以百度了解以下器材 orangepi-zero2全志开发板 su-03T语音识别模块 USB-TTL模块 一个安卓手机 一根可以传输的数据线 装备操作 安…

windows Etcd的安装与使用

一、简介 etcd是一个分布式一致性键值存储&#xff0c;其主要用于分布式系统的共享配置和服务发现。 etcd由Go语言编写 二、下载并安装 1.下载地址&#xff1a; https://github.com/coreos/etcd/releases 解压后的目录如下&#xff1a;其中etcd.exe是服务端&#xff0c;e…

C语言弯道超车必做好题锦集(编程题)

目录 前言&#xff1a; 1.计算日期到天数转换 2.尼科彻斯定理 3.密码检查 4.图片整理 5.寻找数组的中心下标 6.字符个数统计 7.多数元素 前言&#xff1a; 编程想要学的好&#xff0c;刷题少不了&#xff0c;我们不仅要多刷题&#xff0c;还要刷好题&#xff01;为此我…

C# .aspx网页获取RFID读卡器HTTP协议提交的访问文件Request获得卡号、机号,Response回应驱动读卡器显示响声

本示例使用的设备&#xff1a;RFID网络WIFI无线TCP/UDP/HTTP可编程二次开发读卡器POE供电语音-淘宝网 (taobao.com) 服务端代码&#xff1a; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.…

iptables的使用规则

环境中为了安全要限制swagger的访问&#xff0c;最简单的方式是通过iptables防火墙设置规则限制。 在测试服务器中设置访问swagger-ui.html显示如下&#xff0c;区分大小写&#xff1a; iptables设置限制访问9783端口的swagger字段的请求&#xff1a; iptables -A INPUT -p t…

Python可视化工具库实战

Matplotlib Matplotlib 是 Python 的可视化基础库&#xff0c;作图风格和 MATLAB 类似&#xff0c;所以称为 Matplotlib。一般学习 Python 数据可视化&#xff0c;都会从 Matplotlib 入手&#xff0c;然后再学习其他的 Python 可视化库。 Seaborn Seaborn 是一个基于 Matplo…

Vue 中 diff 算法原理

一、Diff 概念 Vue 基于虚拟 DOM 做更新。diff 算法的核心就是比较两个虚拟节点的差异&#xff0c;返回一个 patch 对象&#xff0c;这个对象的作用就是存储两个节点不同的地方&#xff0c;最后用 patch 里记录的信息进行更新真实DOM。 diff 算法的在很多场景下都有应用&#…

计算机竞赛 地铁大数据客流分析系统 设计与实现

文章目录 1 前言1.1 实现目的 2 数据集2.2 数据集概况2.3 数据字段 3 实现效果3.1 地铁数据整体概况3.2 平均指标3.3 地铁2018年9月开通运营的线路3.4 客流量相关统计3.4.1 线路客流量排行3.4.2 站点客流量排行3.4.3 入站客流排行3.4.4 整体客流随时间变化趋势3.4.5 不同线路客…

6.oracle中listagg函数使用

1. 作用 可以实现行转列&#xff0c;将多列数据聚合为一列&#xff0c;实现数据的压缩 2. 语法 listagg(measure_expr&#xff0c;delimiter) within group ( order by order_by_clause); 解释&#xff1a; measure_expr可以是基于任何列的表达式 delimiter分隔符&#xff0c…

创建harbor仓库并进行一些操作

文章目录 前言一、使用mysql:5.6和 owncloud 镜像&#xff0c;构建一个个人网盘。二、安装搭建私有仓库 Harbor1、安装docker-compse2、安装harbor 3、修改配置文件4、运行脚本5 登入harbor仓库总结 前言 本篇文章需要完成的以下几个操作&#xff1a; 使用mysql:5.6和 ownclo…

爬虫逆向实战(二十)--某99网站登录

一、数据接口分析 主页地址&#xff1a;某99网站 1、抓包 通过抓包可以发现登录接口是AC_userlogin 2、判断是否有加密参数 请求参数是否加密&#xff1f; 通过查看“载荷”可以发现txtPassword和aws是加密参数 请求头是否加密&#xff1f; 无响应是否加密&#xff1f; 无…