pytorch中的激活函数详解

1 激活函数介绍

1.1 什么是激活函数

激活函数是神经网络中引入的非线性函数,用于捕获数据中的复杂关系。它来自动物界的灵感,动物的神经元会接受来自对它有作用的其他神经元的信号,当然这些信号对该神经元的作用大小不同(即具有不同的权重)。那么该神经元的信号值就是其他神经元信号加权求和后的值。如果该信号值大于指定阈值,则会激活,否则不会激活,抽象的数学模型为:

这里的激活函数就是阶跃函数,但在0处跃变且不可导。

进一步抽象出神经网络模型中神经元模型为:

其中f为激活函数 

1.2 激活函数的作用

没有激活函数,可能简单的二分类问题都不能被优雅解决

现在有一个二分类问题,将三角形和圆点进行正确分类。这是一个线性不可分的问题(在这个平面里,找不到一条直线可以把图中的三角形和圆点完全分开),我们试着用神经网络解决这个问题。

可能的解决思路:

  • 用单层感知机(不带激活函数)

首先我们想到利用最简单的单层感知机来解决,单层感知机可以画出一条直线,把平面分开。 

 

左图是没有激活函数的单层感知机结构,其中w1,w2是权重值,b是偏置值,它的工作原理是:输入一个样本(有两个特征x1,x2),如果y>0说明该样本是正类;如果y<0,说明该样本是负类。我们这里不讨论y=0的特殊情况。根据单层感知机的工作原理,我们画出右边的坐标图。

结论是:不带激活函数的单层感知机是一个线性分类器,不能解决线性不可分的问题。 不能解决二分类问题。

  • 用多个感知机(不带激活函数)

不带激活函数的单层感知机解决不了问题,那我们就会想到用多个感知机进行组合,获得更强的分类能力,看看能不能解决我们的线性不可分问题。

上图中,虽说模型变得复杂,表达能力更强一点,但y还是一个关于x1,x2的线性表达式。

结论是:合并后的多个感知器本质上还是一个线性分类器,还是解决不了非线性的问题。

进一步分析总结:不管是单层感知机还是多个感知器,只要不带激活函数,都只能解决线性可分的问题,解决不了我们的线性不可分问题。

在上面的线性方程的组合过程中,我们其实类似的在做三条直线的线性组合,如图5所示。图5描述了,当我们直接用没有激活函数的分类器时,其实我们还是线性组合,最多也就是更复杂的线性组合罢了。

因此就需要来引入激活函数了。

我们再设计一个神经网络,在所有的隐层和输出层加一个激活函数,这里激活函数我们就用Sigmoid函数,如下图所示,这样y出的就是一个非线性函数了,y的输出更复杂,有了这样的非线性激活函数以后,神经网络的表达能力更加强大了。能不能解决我们一开始提出的线性不可分问题呢?

我们把上图中的带有激活函数的单层感知机扩展到带有激活函数的多个神经元的情况。那么神经网络的表达能力更强,具体如下图所示。


和之前相对应的非线性组合是图8所示的样子。这样看起来,似乎已经能解决我们线性不可分的问题了。最后,我们通过最优化损失函数的做法,通过不断的学习,能够学到正确分类三角形和圆点的曲线。

总结:激活函数是用来加入非线性因素的,提高神经网络对模型的表达能力,解决线性模型所不能解决的问题。要知道大部分问题是非线性问题,因此激活函数是必不可少的。

2 常用的激活函数

2.1 Sigmoid函数

示例代码

import numpy as np
import matplotlib.pyplot as pltsigmoid = lambda x: 1 / (1 + np.exp(-x))
x = np.linspace(-10, 10, 10)
y = np.linspace(-10, 10, 10)
fig = plt.figure()
plt.plot(y, sigmoid(y))
plt.grid(linestyle='--')
plt.xlabel('X Axis')
plt.ylabel('Y Axis')
plt.title('Sogmoid Function')
plt.xticks([-4, -3, -2, -1, 0, 1, 2, 3, 4])
plt.yticks([-2, -1, 0, 1, 2])
plt.xlim(-4,4)
plt.ylim(-2,2)
plt.show()

运行代码显示

Sigmoid函数优点:

  • 能够将函数压缩至区间[0, 1]之间,保证数据稳定,波动幅度小

Sigmoid函数缺点:

  • 函数在两端的饱和区梯度趋近于0,当反向传播时容易出现梯度消失或梯度爆炸(不清楚为什么会梯度爆炸?)
  • 输出不是0均值(zero-centered),这样会导致,如果输入为正,那么导数总为正,反向传播总往正方向更新,如果输入为负,那么导数总为负,反向传播总往负方向更新,收敛速度缓慢
  • 运算量较大

2.2 tanh函数

示例代码:

import numpy as np
import matplotlib.pyplot as pltsigmoid = lambda x: 1 / (1 + np.exp(-x))
tanh = lambda x: 2*sigmoid(2*x)-1
x = np.linspace(-10, 10, 10)
y = np.linspace(-10, 10, 10)
plt.plot(y, tanh(y), 'b', label='linspace(-10, 10, 100)')
plt.grid(linestyle='--')
plt.xlabel('X Axis')
plt.ylabel('Y Axis')
plt.title('Tanh Function')
plt.xticks([-4, -3, -2, -1, 0, 1, 2, 3, 4])
plt.yticks([-4, -3, -2, -1, 0, 1, 2, 3, 4])
plt.xlim(-4,4)
plt.ylim(-4,4)
plt.show()

代码运行结果:

 

tanh 函数优点:

  • 解决了Sigmoid函数非0均值的问题,将函数压缩至区间[-1, 1]之间
    pytorch中tanh函数的使用

tanh 函数缺点:

  • 函数在两端的饱和区梯度趋近于0,当反向传播时容易出现梯度消失或梯度爆炸
  • 运算量大

2.3 Relu函数

示例代码:

import numpy as np
import matplotlib.pyplot as pltrelu = lambda x: np.where(x>=0, x, 0)
x = np.linspace(-10, 10, 10)
y = np.linspace(-10, 10, 1000)
plt.plot(y, relu(y), 'b', label='linspace(-10, 10, 100)')
plt.grid(linestyle='--')
plt.xlabel('X Axis')
plt.ylabel('Y Axis')
plt.title('RuLU')
plt.xticks([-4, -3, -2, -1, 0, 1, 2, 3, 4])
plt.yticks([-4, -3, -2, -1, 0, 1, 2, 3, 4])
plt.xlim(-4,4)
plt.ylim(-4,4)
plt.show()

代码运行结果:

Relu优点:

  • 梯度不饱和,收敛速度快
  • 减轻反向传播时梯度弥散的问题
  • 由于不需要进行指数运算,因此运算速度快、复杂度低

Relu缺点:

  • 输出不是0均值(zero-centered)
  • 对参数初始化和学习率非常敏感,设置不当容易造成神经元坏死现象,也就是有些神经元永远不会被激活(由于负部梯度永远为0造成)

2.4 leaky_relu函数

示例代码:

import numpy as np
import matplotlib.pyplot as pltleakyrelu = lambda x: np.where(x>=0, x, 0.1*x)
x = np.linspace(-10, 10, 10)
y = np.linspace(-10, 10, 1000)
plt.plot(y, leakyrelu(y), 'b', label='linspace(-10, 10, 100)')
plt.grid(linestyle='--')
plt.xlabel('X Axis')
plt.ylabel('Y Axis')
plt.title('Leaky ReLU')
plt.xticks([-4, -3, -2, -1, 0, 1, 2, 3, 4])
plt.yticks([-4, -3, -2, -1, 0, 1, 2, 3, 4])
plt.xlim(-4, 4)
plt.ylim(-4, 4)
plt.show()

代码运行结果:

leaky_relu优点:

  • Leaky Relu函数在输入为负值时,给予输入值一个很小的斜率,缓解了Dead Relu问题;

leaky_relu缺点:

  • 理论上来说,该函数具有比Relu函数更好的效果,但是大量的实践证明,其效果不稳定,故实际中该函数的应用并不多。 

2.5 其它激活函数

  • RReLU:torch.nn.RReLU()
  • PReLU:torch.nn.PReLU()
  • Sofplus:torch.nn.Softplus()
  • ELU:torch.nn.ELU()
  • CELU:torch.nn.CELU()
  • SELU:torch.nn.SELU()
  • GELU:torch.nn.GELU()
  • ReLU6:torch.nn.ReLU6()
  • Softsign:torch.nn.Softsign()
  • Hardtanh:torch.nn.Hardtanh()
  • Threshold:torch.nn.Threshold()
  • Tanhshrink:torch.nn.Tanhshrink()
  • Softshrink:torch.nn.Softshrink()
  • Hardshrink:torch.nn.Hardshrink()
  • LogSigmoid:torch.nn.LogSigmoid()
  • Softmin:torch.nn.Softmin()
  • Softmax:torch.nn.Softmax()
  • LogSoftmax:torch.nn.LogSoftmax()

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

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

相关文章

Jmeter+ant+jenkins实现持续集成看这一篇就搞定了!

jmeterantjenkins持续集成 一、下载并配置jmeter 首先下载jmeter工具&#xff0c;并配置好环境变量&#xff1b;参考&#xff1a;https://www.cnblogs.com/YouJeffrey/p/16029894.html jmeter默认保存的是.jtl格式的文件&#xff0c;要设置一下bin/jmeter.properties,文件内容…

如何提高3D建模技能?

无论是制作影视动画还是视频游戏&#xff0c;提高3D建模技能对于你的工作都至关重要的。那么如何能创建出精美的3D模型呢&#xff1f;本文给大家一些3D建模技能方面的建议。 3D建模通过专门的软件完成&#xff0c;涉及制作三维对象。这项技能在视频游戏开发、建筑、动画和产品…

【Java Web学习笔记】0 - 技术体系的说明

B/S软件开发架构简述 B/S架构 1.B/S框架&#xff0c;意思是前端(Browser浏览器)和服务器端( Server )组成的系统的框架结构。 2. B/S架构也可理解为web架构&#xff0c;包含前端、后端、数据库三大组成部分。 3.示意图 ●前端 前端开发技术工具包括三要素: HTML、CSS和Jav…

1-3、DOSBox环境搭建

语雀原文链接 文章目录 1、安装DOSBox2、Debug进入Debugrdeautq 1、安装DOSBox 官网下载下载地址&#xff1a;https://www.dosbox.com/download.php?main1此处直接下载这个附件&#xff08;内部有8086的DEBUG.EXE环境&#xff09;8086汇编工作环境.rar执行安装DOSBox0.74-wi…

解决CentOS下PHP system命令unoconv转PDF提示“Unable to connect or start own listener“

centos系统下&#xff0c;用php的system命令unoconv把word转pdf时提示Unable to connect or start own listene的解决办法 unoconv -o /foo/bar/public_html/upload/ -f pdf /foo/bar/public_html/upload/test.docx 2>&1 上面这个命令在shell 终端能执行成功&#xff0c…

基于GAN的多尺度门合并多模态MRI图像合成

Multi-Modal MRI Image Synthesis via GAN With Multi-Scale Gate Mergence 基于GAN的多尺度门合并多模态MRI图像合成背景贡献实验方法生成器gate mergence (GM) strategy&#xff08;门控融合策略&#xff09;判别器 损失函数Thinking 基于GAN的多尺度门合并多模态MRI图像合成…

深入了解接口测试:揭秘网络分层和数据处理!

网络分层和数据 上一小节中介绍了接口测试中一些必要重要的定义&#xff0c;这一节我们来讨论一下在学习接口测试过程中我们要关注的最重要的东西&#xff1a;网络分层和数据。 首先&#xff0c;我们来尝试理解一下&#xff0c;为什么网络是要分层的呢&#xff1f; 我们可以…

python文件读取

相对路径 读文件 打印txt文件 fopen(".\data.txt","r",encoding"utf-8") contentf.read() print(content) f.close()with open(".\data.txt","r",encoding"utf-8") as f:contentf.read()print(content)contentf…

Ilya Sutskever:师从Hinton,“驱逐”奥特曼,一个改变AI世界的天才科学

ChatGPT 已经在全球爆火&#xff0c;但大众在两周之前似乎更熟悉Sam Altman&#xff0c;而对另一位创始人 Ilya Sutskever 却了解不多。 直到前几天因为OpenA眼花缭乱的政权争夺大戏&#xff0c;OpenAI 的首席科学家Ilya Sutskever的名字逐渐被世人所知。 Ilya Sutskever在科…

STM32 CUBEIDE Outline is disabled due to scalability mode

项目场景&#xff1a; 问题描述 Outline is disabled due to scalability mode 看不到函数 解决方案&#xff1a;

继承中的析构函数的权限的深入了解

如果一个父类中的析构函数如果设置为 private 权限 &#xff0c;一个子类public继承了这个父类&#xff0c;那么 这个父类可以创建对象吗&#xff1f; 答案是 不可以 看看下面的代码 class A { public:private:~A() {} };class B :public A {A a; // 这个地方编译不报错&…

【CAN通信】CanIf模块详细介绍

目录 1.内容简介 2.CanIf详细设计 2.1 CanIf功能简介 2.2 一些关键概念 2.3依赖的上下层模块 2.4 功能详细设计 2.4.1 Hardware object handles 2.4.2 Static L-PDUs 2.4.3 Dynamic L-PDUs 2.4.4 Dynamic Transmit L-PDUs 2.4.5 Dynamic receive L-PDUs 2.4.6Physi…

PostGIS学习教程八:空间关系

PostGIS学习教程八&#xff1a;空间关系 到目前为止&#xff0c;我们只使用了测量&#xff08;ST_Area、ST_Length&#xff09;、序列化&#xff08;ST_GeomFromText&#xff09;或者反序列化&#xff08;ST_AsGML&#xff09;几何图形&#xff08;geometry&#xff09;的空间…

【MATLAB】异常数据识别

基于分位数的异常点识别 首先&#xff0c;给定了一个原始数据序列x。然后&#xff0c;计算了序列x的上四分位数和下四分位数&#xff0c;并根据这两个值计算了异常点的阈值。上四分位数减去1.5倍的四分位数范围得到异常值下界&#xff0c;下四分位数加上1.5倍的四分位数范围得…

运行新vue3项目

一&#xff0c;下载node并安装 官网&#xff1a;https://nodejs.org/en/ 查看版本&#xff1a; node -v二&#xff0c;cd进入到vue3项目目录 cd D:\Program-space\HBuilderXProject\Vue3project三&#xff0c;npm install npm install四&#xff0c;查看安装 npm list五&a…

解析生效探测方法

linux dig命令 1.最常用的查询命令 dig baidu.com2 . 根据记录类型进行查询&#xff0c;比如MX&#xff0c;CNAME&#xff0c;NS&#xff0c;PTR等&#xff0c;只需将类型加在命令后面即可。 dig a.shifen.com ns3 . 指定域名DNS服务器测试解析是否生效的命令&#xff0c;以…

centos8 下载

下载网址 Download 直接下载地址 https://mirrors.cqu.edu.cn/CentOS/8-stream/isos/x86_64/CentOS-Stream-8-20231127.0-x86_64-dvd1.iso 这个版本安装的时候方便

大数据Doris(二十九):数据导入(Insert Into)

文章目录 数据导入(Insert Into) 一、​​​​​​​创建导入

算法通关村第五关—Hash基础知识(青铜)

Hash基础 一、Hash的概念和基本特征 哈希(Hash)也称为散列&#xff0c;就是把任意长度的输入&#xff0c;通过散列算法&#xff0c;变换成固定长度的输出&#xff0c;这个输出值就是散列值。很多人可能想不明白&#xff0c;这里的映射到底是啥意思&#xff0c;为啥访问的时间…

基于SpringBoot的旅游网站的设计与实现

摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff0c;旅游网站当然也不能排除在外&#xff0c;随着旅游网站的不断成熟&#xff0c;它彻底改变了过去传统的旅游网站方式&#xff0c;不仅使旅游管理…