神经网络的激活函数

目录

神经网络 

激活函数 

sigmoid 激活函数

tanh 激活函数

backward方法 

relu 激活函数 

softmax 激活函数


神经网络 

人工神经网络( Artificial Neural Network, 简写为ANN)也简称为神经网络(NN),是一种模仿生物神经网络结构和功能的 计算模型。人脑可以看做是一个生物神经网络,由众多的神经元连接而成。各个神经元传递复杂的电信号,树突接收到输入信号,然后对信号进行处理,通过轴突输出信号。

人工神经网络

每一个神经元都是=g(w1x1 + w2x2 + w3x3...) ,即先对输入求和,再对其激活

💎这个流程就像,来源不同树突(树突都会有不同的权重)的信息, 进行的加权计算, 输入到细胞中做加和,再通过激活函数输出细胞值。我们使用多个神经元来构建神经网络,相邻层之间的神经元相互连接,并给每一个连接分配一个强度 w,机器学习的目的就是求这些 w 值

  • 输入层: 即输入 x 的那一层
  • 输出层: 即输出 y 的那一层
  • 隐藏层: 输入层和输出层之间都是隐藏层

激活函数 

💎激活函数用于对每层的输出数据进行变换, 进而为整个网络结构结构注入了非线性因素。此时, 神经网络就可以拟合各种曲线。如果不使用激活函数,整个网络虽然看起来复杂,其本质还相当于一种线性模型。

假设有一个单层的神经网络,其输入为𝑥x,权重为𝑤w,偏置为𝑏b,那么该层的输出𝑦y可以表示为:𝑦=𝑤⋅𝑥+𝑏y=w⋅x+b

对于多层的神经网络,如果每一层都不使用激活函数,那么无论网络有多少层,最终的输出都可以表示为输入𝑥x的一个线性组合 y=wn​⋅(wn−1​⋅(…(w2​⋅(w1​⋅x+b1​)+b2​)…)+bn−1​)+bn​

通过给网络输出增加激活函数, 实现引入非线性因素, 使得网络模型可以逼近任意函数。

激活函数能够向神经网络引入非线性因素,使得网络可以拟合各种曲线。没有激活函数时,无论神经网络有多少层,其输出都是输入的线性组合,这样的网络称为感知机,它只能解决线性可分问题,无法处理非线性问题。 

增加激活函数之后, 对于线性不可分的场景,神经网络的拟合能力更强:

🔎我们可以发现如果只使用线性函数Lnear,则模型永远不会区分两种小球(不管多少次Epochs)

🔎但当我们引入非线性激活函数后,仅仅100次就可以完美区分两种小球。

激活函数主要用来向神经网络中加入非线性因素,以解决线性模型表达能力不足的问题,它对神经网络有着极其重要的作用。我们的网络参数在更新时,使用的反向传播算法(BP),这就要求我们的激活函数必须可微。

sigmoid 激活函数

f(x) = 1 / (1 + e^(-x))

Sigmoid函数,也称为逻辑斯蒂激活函数,是早期神经网络中最常用的激活函数之一。它的特点是能够将任何实数值映射到介于0和1之间的值,这使得它在二分类问题中尤其有用,可以将输出解释为概率或者激活程度。

这个函数的图形呈现出一个S形曲线,它在中心点(x=0)增长缓慢,而在两端则增长迅速接近水平。这种特性使得Sigmoid函数在早期的神经网络中非常受欢迎,因为它可以帮助网络学习非线性关系。然而,它也存在梯度消失的问题,这意味着在训练过程中,当输入值非常大或非常小的时候,梯度几乎为零,这会导致权重更新变得非常缓慢,从而影响网络的学习效率。 

一般来说, sigmoid 网络在 5 层之内就会产生梯度消失现象。而且,该激活函数并不是以 0 为中心的,所以在实践中这种激活函数使用的很少。sigmoid函数一般只用于二分类的输出层。

 📀绘制Sigmoid函数图像

import torch
import matplotlib.pyplot as plt
import torch.nn.functional as Fdef test():_, axes = plt.subplots(1, 2)x = torch.linspace(-20, 20, 1000)y = F.tanh(x)axes[0].plot(x, y)axes[0].grid()axes[0].set_title('Sigmoid 函数图像')x = torch.linspace(-20, 20, 1000, requires_grad=True)torch.sigmoid(x).sum().backward()axes[1].plot(x.detach(), x.grad)axes[1].grid()axes[1].set_title('Sigmoid 导数图像')plt.show()if __name__ == '__main__':test()

📀在神经网络中,一个神经元的输出可以通过Sigmoid函数来表示其被激活的概率,接近1的值表示高度激活,而接近0的值则表示低激活。这种特性使得Sigmoid函数特别适合用于二分类问题的输出层,因为它可以表示两个类别的概率分布。

tanh 激活函数

Tanh 的函数图像、导数图像 :

Tanh 函数将输入映射到 (-1, 1) 之间,图像以 0 为中心,在 0 点对称,当输入 大概<-3 或者 >3 时将被映射为 -1 或者 1。与 Sigmoid 相比,它是以 0 为中心的,使得其收敛速度要比 Sigmoid 快,减少迭代次数。然而,从图中可以看出,Tanh 两侧的导数也为 0,同样会造成梯度消失。 

  • 💡由于tanh函数的输出均值是0,这与许多样本数据的分布均值相近,因此在训练过程中,权重和偏差的更新可以更快地接近最优值。
  • 💡tanh函数的导数在0到1之间变化,而Sigmoid函数的导数最大值仅为0.25,这意味着在反向传播过程中,tanh函数能够提供相对较大的梯度,从而减缓梯度消失的问题,有助于网络更快地收敛。 
  • 💡由于tanh函数的对称性和输出范围,它在正向传播时能够更好地处理正负输入值,这有助于在反向传播时进行更有效的权重更新,减少迭代次数。
import torch
import matplotlib.pyplot as plt
import torch.nn.functional as Fdef test():_, axes = plt.subplots(1, 2)# 函数图像x = torch.linspace(-20, 20, 1000)y = F.tanh(x)axes[0].plot(x, y)axes[0].grid()axes[0].set_title('Tanh 函数图像')# 导数图像x = torch.linspace(-20, 20, 1000, requires_grad=True)F.tanh(x).sum().backward()axes[1].plot(x.detach(), x.grad)axes[1].grid()axes[1].set_title('Tanh 导数图像')plt.show()

🔎F.tanh(x)计算了输入张量x的tanh值,然后.sum()将这些tanh值相加得到一个标量值。接下来,.backward()方法会计算这个标量值关于输入张量x的梯度,即tanh函数的导数。这样,我们就可以得到tanh函数在每个输入点上的导数值,从而绘制出tanh导数图像。

backward方法 

  • 通用性backward()方法不限于计算损失函数的梯度,它可以用于任何需要进行梯度计算的张量。例如,如果你在进行一些非神经网络的任务,比如简单的数学运算,你也可以使用backward()来计算梯度。
  • 要使用backward()计算梯度,必须满足几个条件。首先,需要计算梯度的张量必须是叶子节点,即它们不是任何其他张量的计算结果。其次,这些张量必须设置requires_grad=True以表明需要跟踪它们的梯度。最后,所有依赖于这些叶子节点的张量也必须设置requires_grad=True,以确保梯度可以传播到整个计算图中。

relu 激活函数 

ReLU激活函数的公式是 ReLU(x)=max(0, x)

ReLU激活函数(Rectified Linear Unit)在神经网络中用于引入非线性特性,其特点是计算简单且能够加速训练过程。对于正值,它直接输出输入值(即 𝑓(𝑥)=𝑥f(x)=x),对于负值,输出为零(即 𝑓(𝑥)=0f(x)=0)。这种简单的阈值操作避免了复杂的指数或乘法运算,从而显著减少了计算量。

由于ReLU在正值区间内具有不变的梯度(即梯度为1),它有助于维持信号的传播,使得基于梯度的优化算法(如SGD、Adam等)能够更有效地更新网络权重。 

函数图像如下: 

ReLU 能够在x>0时保持梯度不衰减,从而缓解梯度消失问题。随着训练的推进,部分输入会落入小于0区域,导致对应权重无法更新。 

与sigmoid相比,RELU的优势是:

采用sigmoid函数,计算量大(指数运算),反向传播求误差梯度时,求导涉及除法,计算量相对大,而采用Relu激活函数,整个过程的计算量节省很多。 sigmoid函数反向传播时,很容易就会出现梯度消失的情况,从而无法完成深层网络的训练。 Relu会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生。

在神经网络的前向传播过程中,每个隐藏层的神经元都会对其输入执行线性变换(通过权重和偏差),然后应用激活函数。例如,一个神经元的输出y可以通过以下方式计算 y=ReLU(W^Tx+b),其中W是权重矩阵,x是输入向量,b是偏置项。 

在前向传播后,如果输出与实际值存在差距,则使用反向传播算法根据误差来更新网络中的权重和偏差。这个过程中,ReLU函数的梯度(导数)也会被计算出来,用于调整连接权重。

softmax 激活函数

这里,( K ) 是类别的总数,( e ) 是自然对数的底数(约等于2.71828)。 

softmax用于多分类过程中,它是二分类函数sigmoid在多分类上的推广,目的是将多分类的结果以概率的形式展现出来。 SoftMax 函数将每个输入元素 ( z_i ) 映射到 (0,1) 区间内,并且所有输出值的总和为1,这使它成为一个有效的概率分布。

Softmax 直白来说就是将网络输出的 logits 通过 softmax 函数,就映射成为(0,1)的值,而这些值的累和为1(满足概率的性质),那么我们将它理解成概率,选取概率最大(也就是值对应最大的)节点,作为我们的预测目标类别。 

import torch
scores = torch.tensor([0.2, 0.02, 0.15, 0.15, 1.3, 0.5, 0.06, 1.1, 0.05, 3.75])
probabilities = torch.softmax(scores, dim=0)
print(probabilities)# 结果:tensor([0.0212, 0.0177, 0.0202, 0.0202, 0.0638, 0.0287, 0.0185, 0.0522, 0.0183,0.7392])

🍳对于隐藏层:

  1. 优先选择RELU激活函数

  2. 如果ReLu效果不好,那么尝试其他激活,如Leaky ReLu等。

  3. 如果你使用了Relu, 需要注意一下Dead Relu问题, 避免出现大的梯度从而导致过多的神经元死亡。

  4. 不要使用sigmoid激活函数,可以尝试使用tanh激活函数

🍳对于输出层:

  1. 二分类问题选择sigmoid激活函数

  2. 多分类问题选择softmax激活函数

  3. 回归问题选择identity激活函数

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

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

相关文章

Netty 应用与原理

更好的阅读体验 \huge{\color{red}{更好的阅读体验}} 更好的阅读体验 Java IO 模型 本篇示例代码仓库&#xff1a;learn-netty 基础概念 在 I/O 操作中有这么两组概念&#xff0c;其中同步/异步 要和线程中的同步线程/异步线程要区分开&#xff0c;这里指的是同步IO / 异步IO…

ssm智能停车场管理系统

视频演示效果: SSMvue智能停车场 摘 要 本论文主要论述了如何使用JAVA语言开发一个智能停车场管理系统&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述智能停车…

新兴游戏引擎Godot vs. 主流游戏引擎Unity和虚幻引擎,以及版本控制工具Perforce Helix Core如何与其高效集成

游戏行业出现一个新生事物——Godot&#xff0c;一个免费且开源的2D和3D游戏引擎。曾经由Unity和虚幻引擎&#xff08;Unreal Engine&#xff09;等巨头主导的领域如今迎来了竞争对手。随着最近“独特”定价模式的变化&#xff0c;越来越多的独立开发者和小型开发团队倾向于选择…

Vitis HLS 学习笔记--Syn Report解读(1)

目录 1. 介绍 2. 示例一 2.1 HLS 代码 2.2 Report 解读 2.2.1 General Information 2.2.2 Timing Estimate 2.2.3 Performance & Resource Estimates 2.2.4 HW interfaces 2.2.4.1 硬件接口报告 2.2.4.2 导出至 Vivado 中的 IP 2.2.4.3 Port-Level Protocols 端…

图形化编程要怎么做

0. 简介 Scratch其实应该算得上最早做图形化编程的工程了。Scratch 是麻省理工学院的“终身幼儿园团队”在 2007 年 [5]发布的一种图形化编程工具&#xff0c;主要面对全球青少年开放&#xff0c;是图形化编程工具当中最广为人知的一种&#xff0c;所有人都可以在软件中创作自…

排序算法-计数排序

一、计数排序 这种排序算法 是利用数组下标来确定元素的正确位置的。 如果数组中有20个随机整数&#xff0c;取值范围为0~10&#xff0c;要求用最快的速度把这20个整数从小到大进行排序。 很大的情况下&#xff0c;它的性能甚至快过那些时间复杂度为O(nlogn&#xff09;的排序。…

【React】Sigma.js框架网络图-入门篇(2)

通过《【React】Sigma.js框架网络图-入门篇》有了基本认识 由于上一篇直接给出了基本代码示例&#xff0c;可能看着比较复杂也不知道是啥意思&#xff1b; 今天从理论入手重新认识下&#xff01; 一、基本认识 首先&#xff0c;我们先了解下基础术语&#xff1a; 图(Graph)&…

如何实现直播声卡反向给手机充电功能呢?

在数字化时代的浪潮中&#xff0c;声卡作为多媒体系统的核心组件&#xff0c;扮演着声波与数字信号相互转换的关键角色。它不仅能够将来自各类音源的原始声音信号转换为数字信号&#xff0c;进而输出到各类声响设备&#xff0c;更能够通过音乐设备数字接口(MIDI)发出合成乐器的…

Eudic欧路词典for Mac:专业英语学习工具

Eudic欧路词典for Mac&#xff0c;作为专为Mac用户设计的英语学习工具&#xff0c;凭借其简捷高效的特点&#xff0c;成为众多英语学习者不可或缺的助手。 Eudic欧路词典for Mac v4.6.4激活版下载 这款词典整合了多个权威词典资源&#xff0c;如牛津、柯林斯、朗文等&#xff0…

​「Python大数据」词频数据渲染词云图导出HTML

前言 本文主要介绍通过python实现数据聚类、脚本开发、办公自动化。词频数据渲染词云图导出HTML。 一、业务逻辑 读取voc数据采集的数据批处理,使用jieba进行分词,去除停用词词频数据渲染词云图将可视化结果保存到HTML文件中二、具体产出 三、执行脚本 python wordCloud.p…

mysql中日期函数now()和sysdate()的区别

说明&#xff1a; 在mysql数据库中&#xff0c;now()、sysdate() 都是获取系统当前日期时间 区别&#xff1a; 示例脚本&#xff1a; select sleep(2),now(),sysdate() from dual; 输出&#xff1a; 小结&#xff1a; 1、 now()和sysdate()都可以获取系统当前日期时间 2、区别…

将游戏界面与注册/登录界面连接到一起

一、 导包 在注册页面中导入一个import subprocess包 二、 使用代码将其连接到一起 在循环中加入下面这一行代码&#xff0c;用来实现效果 subprocess.run(["python", "game代码.py"]

Faust勒索病毒:了解变种faust,以及如何保护您的数据

导言&#xff1a; 近年来&#xff0c;网络安全问题日益严峻&#xff0c;其中勒索病毒成为了一种日益猖獗的威胁。在众多勒索病毒中&#xff0c;.faust勒索病毒以其高度的隐秘性和破坏性引起了广泛关注。本文91数据恢复将深入剖析.faust勒索病毒的威胁特点&#xff0c;并提出相…

实现SpringMVC底层机制(一)

文章目录 1.环境配置1.创建maven项目2.创建文件目录3.导入jar包 2.开发核心控制器文件目录1.流程图2.编写核心控制器SunDispatcherServlet.java3.类路径下编写spring配置文件sunspringmvc.xml4.配置中央控制器web.xml5.配置tomcat&#xff0c;完成测试1.配置发布方式2.配置热加…

【stomp 实战】Spring websocket使用详解和基本原理

spring框架对websocket有很好的支持&#xff0c;stomp协议作为websocket的子协议&#xff0c;Spring也做了很多封装&#xff0c;让我们在开发中易于使用。 学习使用Spring的Websocket模块&#xff0c;当然最好的办法就是看官网说明了。本篇文章对官网做一些简述和个人的理解。 …

采集 Kubernetes 容器日志最佳实践

前言 指标、日志、链路是可观测的三大支柱&#xff0c;日志主要用于记录代码执行的痕迹&#xff0c;方便定位和排查问题。当前主流的应用都是以容器的方式运行在 Kubernetes 集群&#xff0c;由于容器的动态性&#xff0c;容器可能会频繁地创建和销毁。日志的采集和持久化变得…

用例整体执行及pytest.ini文件

在我们写代码的过程中&#xff0c;一般都是右键或者命令行去执行一个用例 但是当我们写完后&#xff0c;需要整体执行一遍。那应该怎么搞呢&#xff1f; 我们可以在根目录下新建一个main.py或者run.py之类的文件&#xff0c;文件内容如下&#xff1a; if __name__ "__ma…

JAVA实现easyExcel批量导入

注解类型描述ExcelProperty导入指定当前字段对应excel中的那一列。可以根据名字或者Index去匹配。当然也可以不写&#xff0c;默认第一个字段就是index0&#xff0c;以此类推。千万注意&#xff0c;要么全部不写&#xff0c;要么全部用index&#xff0c;要么全部用名字去匹配。…

个人电脑本地部署LLM

普通电脑配置即可本地运行大模型&#xff0c;本地部署LLM最简单的方法 OLLAMA Ollama是一个开源框架&#xff0c;专门设计用于在本地运行大型语言模型&#xff08;LLM&#xff09;。它的主要功能是在Docker容器中部署和管理LLM&#xff0c;使得在本地运行大模型的过程变得非常…

python之List列表

1. 高级数据类型 Python中的数据类型可以分为&#xff1a;数字型&#xff08;基本数据类型&#xff09;和非数字型&#xff08;高级数据类型&#xff09; 数字型包含&#xff1a;整型int、浮点型float、布尔型bool、复数型complex 非数字型包含&#xff1a;字符串str、列表l…