机器学习-激活函数的直观理解

news2024/9/23 15:27:26

机器学习-激活函数的直观理解

在机器学习中,激活函数(Activation Function)是用于引入非线性特性的一种函数,它在神经网络的每个神经元上被应用。

如果不使用任何的激活函数,那么神经元的响应就是wx+b,相当于线性的。由此,任意数量的线性激活的神经元叠加,其功能和单个线性激活的神经元一致(线性叠加后仍然是线性的)。

1、几种常用的激活函数

线性激活函数:也相当于没有激活函数,其作用相当于线性叠加:
在这里插入图片描述


Sigmoid函数:Sigmoid函数是一个典型的逻辑函数,它会将任何实数映射到0到1之间。然而,它在输入值非常大或非常小的时候,会出现梯度消失的问题。f(x) = 1 / (1 + e^(-x))
在这里插入图片描述


Tanh函数:Tanh函数与Sigmoid函数非常相似,它会将任何实数映射到-1到1之间。和Sigmoid函数一样,它也存在梯度消失的问题。Tanh函数相对于原点对称,在处理某些具有对称性的问题时,Tanh可能会比Sigmoid更有优势。f(x) = (e^x - e^(-x)) / (e^x + e^(-x))
在这里插入图片描述


ReLU函数:ReLU(Rectified Linear Unit)是一种常用的激活函数,它对负数输出0,对正数则直接输出该数值。由于其简单性和在多层神经网络中的表现,ReLU在很多深度学习模型中得到了应用。但是它可能会在训练过程中出现神经元“死亡”的情况。f(x) = max(0, x)

死亡:当神经网络的权重更新导致神经元的输入变为负值,由于ReLU函数的特性,其输出将会为0,并且在后续的训练中,该神经元的输出将一直保持为0,因此某些神经元会不起作用。
在这里插入图片描述


Leaky ReLU:为了解决ReLU的“死亡”神经元问题,人们提出了Leaky ReLU激活函数。Leaky ReLU允许负数的小斜率,这样即使输入是负数,神经元也不会完全失效。在x小于0时有一个极小的负斜率。
在这里插入图片描述


Softmax函数:Softmax函数常用于多分类神经网络的输出层,因为它可以给出输入数据属于每个类别的概率。


Swish函数:Swish是一种自门控激活函数,它在深度学习模型中表现出了优于ReLU的性能。Swish函数的形状介于ReLU和Sigmoid之间。f(x) = x * sigmoid(βx)
在这里插入图片描述

2、激活函数的直观理解

让我们来拟合一个函数,其目标如下所示:
在这里插入图片描述
使用两层网络进行建模,其中第一层包含两个神经元(激活函数如下待定),第二层包含一个线性激活的神经元。

线性激活函数:首先使用线性激活函数作为第一层两个神经元的激活函数,训练得出的最终结果如下所示,由此可见多个线性激活神经元等效于一个神经元,因为最终得到的还是线性函数:
在这里插入图片描述


ReLU函数:其次使用ReLU函数作为第一层两个神经元的激活函数,在理想的情况下会得到如下的拟合结果,相当于是两个ReLU函数的组合,一个是直接向左平移,一个是翻转后平移:
在这里插入图片描述
在这里插入图片描述
但是ReLU在训练时可能会出现神经元死亡现象(上面解释过了),此时继续迭代也不会给性能带来提升(相当于陷入局部最优了),如:
在这里插入图片描述
由此可见,激活函数就是拟合的最小单元。


Leaky ReLU:使用Leaky ReLU可以避免ReLU在训练时导致的死亡现象,每次训练都能得到满意的结果:
在这里插入图片描述

Sigmoid函数:Sigmoid函数在此处实际上更有优势,因为其实际上就是一个连续的曲线(Tanh同理):
在这里插入图片描述

总结:激活函数就是拟合最终结果的最小单元,最终结果就是激活函数的平移反转或多次计算。上面的例子第二层是线性激活,因此最终结果相当于是第一层结果的线性叠加

3、代码

# 引入相关的包
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
from keras.models import Sequential
from keras.layers import Dense
import warnings
warnings.simplefilter(action='ignore', category=UserWarning)
# 创建要拟合的函数
X = np.linspace(0,2*np.pi, 100)
y = np.cos(X)+1
X=X.reshape(-1,1)
# 画图(可选)
fig,ax = plt.subplots(1,1, figsize=(4,3))
ax.plot(X,y)
plt.show()
# 构建模型
model = Sequential(
    [
        # Dense(2, activation="linear", name = 'l1'),
         Dense(2, activation="sigmoid", name = 'l1'),
        # Dense(2, activation="tanh", name='l1'),
        # Dense(2, activation="relu", name='l1'),
        # Dense(2, activation="leaky_relu", name='l1'),
        # Dense(2, activation="swish", name='l1'),
        Dense(1, activation="linear", name = 'l2')
    ]
)
model.compile(
    loss=tf.keras.losses.MeanSquaredError(),
    optimizer=tf.keras.optimizers.Adam(0.04),
)
model.fit(
    X,y,
    epochs=300
)
# 进行模型预测
yhat = model.predict(X)
fig,ax = plt.subplots(1,1, figsize=(4,4))
ax.plot(X,y)
ax.plot(X,yhat)
plt.show()
# 进行模型预测
l1 = model.get_layer('l1')
l2 = model.get_layer('l2')
l1.get_weights()
l2.get_weights()

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

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

相关文章

数据结构-树-二叉树-堆的实现

1.树概念及结构 树是一种 非线性 的数据结构,它是由 n ( n>0 )个有限结点组成一个具有层次关系的集合。 把它叫做树是因 为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的 。 有一个特殊的结点&#xff…

5.1 Windows驱动开发:判断驱动加载状态

在驱动开发中我们有时需要得到驱动自身是否被加载成功的状态,这个功能看似没啥用实际上在某些特殊场景中还是需要的,如下代码实现了判断当前驱动是否加载成功,如果加载成功, 则输出该驱动的详细路径信息。 该功能实现的核心函数是NtQuerySys…

【matlab版本的ggplot2】

gramm (complete data visualization toolbox, ggplot2/R-like) 来源:Morel, Pierre. “Gramm: Grammar of Graphics Plotting in Matlab.” The Journal of Open Source Software, vol. 3, no. 23, The Open Journal, Mar. 2018, p. 568, doi:10.21105/joss.00568…

五种多目标优化算法(NSDBO、NSGA3、MOGWO、NSWOA、MOPSO)求解微电网多目标优化调度(MATLAB代码)

一、多目标优化算法简介 (1)非支配排序的蜣螂优化算法NSDBO 多目标应用:基于非支配排序的蜣螂优化算法NSDBO求解微电网多目标优化调度(MATLAB)-CSDN博客 (2)NSGA3 NSGA-III求解微电网多目标…

医院预约管理系统开发 代码展示 九价疫苗接种预约功能(含小程序源代码)

基于微信小程序的疫苗预约系统让疫苗信息,疫苗预约信息等相关信息集中在后台让管理员管理,让用户在小程序端预约疫苗,查看疫苗预约信息,该系统让信息管理变得高效,也让用户预约疫苗,查看疫苗预约等信息变得…

力扣刷题篇之排序算法

系列文章目录 前言 本系列是个人力扣刷题汇总,本文是排序算法。刷题顺序按照[力扣刷题攻略] Re:从零开始的力扣刷题生活 - 力扣(LeetCode) 这个之前写的左神的课程笔记里也有: 左程云算法与数据结构代码汇总之排序&am…

网络安全工程师就业前景怎么样?

网络安全工程师的就业前景整体来看是不错的,近些年的岗位需求总体呈现上升的趋势,可以说只要有互联网的存在,就会有网络安全工程师的一席之地。不过现在企业更缺乏资深技术人才,如果只学会了皮毛,可能不会很好就业。 网…

推荐几款优秀的Chrome插件,值得收藏!

文章目录 1、Tampermonkey2、WeTab3、Chrono下载管理器4、AdBlock5、Cookie-Editor 1、Tampermonkey 使用用户脚本自由地改变网络,提升您的浏览体验,使用篡改猴!🌐🚀 篡改猴是一款功能强大的浏览器扩展功能&#xff0c…

python与C++与TensorRT的绑定

绑定的起因 Jetpack中的TensorRT不能直接在python3.8环境中使用,所以我们需要对TensorRT利用pybind11对python相进性绑定。 绑定的官方链接如下:点击这里 这个是8.2版本的,你可以使用其他版本也是可以的。 整个过程可以在虚拟环境中完成,主要是想最后的whl文件 在Jetson…

【快速解决】使用IDEA快速搭建SpringBoot项目(超详细)

前言 Spring Boot是Spring Framework的一款脚手架式框架,可以帮助开发者快速构建基于Spring的企业级应用程序。本篇博客将介绍如何使用IntelliJ IDEA(以下简称IDEA)来快速搭建一个Spring Boot项目。 目录 ​编辑 前言 使用IDEA快速搭建Spri…

react的开发中关于图片的知识

React是一个流行的JavaScript库,用于构建用户界面。在React开发中,图片是一个非常重要的元素,可以用于美化界面和展示内容。本篇博客将详细讲解React中关于图片的知识。 1. React中使用图片 在React中使用图片非常简单,只需要使…

链表经典面试题

1 回文链表 1.1 判断方法 第一种(笔试): 链表从中间分开,把后半部分的节点放到栈中从链表的头结点开始,依次和弹出的节点比较 第二种(面试): 反转链表的后半部分,中间节…

用户隐私与游戏体验如何平衡?第二周 Web3 开发者集结精华回顾

由 TinTinLand 联合 Dataverse 、Web3Go 、Subquery 、Cregis 、Litentry、Aspecta、SpaceID、ANOME、VARA&Gear、Moonbeam、Mantle、Obelisk 等 10 余家 Web3 项目共同举办的 Web3 开发者赢积分活动已举办至第三周。精彩线上主题活动分享、近距离交流体验互动,…

PostgreSQL Patroni 3.0 新功能规划 2023年 纽约PG 大会 (音译)

开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, Oceanbase, Sql Server等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,(…

AlDente Pro v1.22.2(mac电池最大充电限制工具)

AlDente Pro是一款适用于Mac操作系统的小工具,可以帮助您限制电池充电量以延长电池寿命。通常情况下,电池在充满的状态下会继续接受电源充电,这可能会导致电池寿命缩短。使用AlDente Pro,您可以设置电池只充到特定的充电水平&…

TYPE-C、PD原理

一、Type-C简介以及历史 自1998年以来,USB发布至今,USB已经走过20个年头有余了。在这20年间,USB-IF组织发布N种接口状态,包括A口、B口、MINI-A、MINI-B、Micro-A、Micro-B等等接口形态,由于各家产品的喜好不同&#x…

Azkaban极简使用文档

登录 地址: http://服务器ip:8081/, 用户名密码默认都是azkaban 构建项目流程 添加Project 编写工作流文件 在本机新建文件夹如test, 创建一个flow20.project 文件, 内容 azkaban-flow-version: 2.0(固定步骤)编写flow文件, 例如一个最基础的实例 test1.flow nodes:- name…

C语言剔除相关数(ZZULIOJ1204:剔除相关数)

题目描述 一个数与另一个数如果含有相同数字和个数的字符&#xff0c;则称两数相关。现有一堆乱七八糟的整数&#xff0c;里面可能充满了彼此相关的数&#xff0c;请你用一下手段&#xff0c;自动地将其剔除。 输入&#xff1a;多实例测试。每组数据包含一个n(n<1000)&#…

Pbootcms商城插件,支持购物车、订单、支付管理等

pbootcms商城插件上线&#xff0c;可以实现简单的商品管理、商品购买、加入购物车、购物车批量购买、以及后台的订单管理&#xff0c;发货管理、改价功能&#xff0c;支付信息管理等功能&#xff0c;满足商城基本功能后台效果截图&#xff1a; 前端效果截图&#xff1a; 演示网…

【Golang】解决使用interface{}解析json数字会变成科学计数法的问题

在使用解析json结构体的时候&#xff0c;使用interface{}接数字会发现变成了科学计数法格式的数字&#xff0c;不符合实际场景的使用要求。 举例代码如下&#xff1a; type JsonUnmStruct struct {Id interface{} json:"id"Name string json:"name"…