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


前言

思索了很久到底要不要出深度学习内容,毕竟在数学建模专栏里边的机器学习内容还有一大半算法没有更新,很多坑都没有填满,而且现在深度学习的文章和学习课程都十分的多,我考虑了很久决定还是得出神经网络系列文章,不然如果以后数学建模竞赛或者是其他更优化模型如果用上了神经网络(比如利用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 激活函数。对于回归问题,通常不需要使用激活函数。某些情况下,激活函数可能导致梯度爆炸。如果你遇到梯度爆炸问题,可以考虑使用梯度裁剪等方法来控制梯度大小。所以说每个问题和数据集都可能有不同的特点,因此最好通过实验验证不同激活函数的效果,找到最适合的激活函数。

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

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

相关文章

健康安全的新定义,照明舒适达到巅峰,SUKER书客护眼台灯L1震撼发售

深耕照明领域多年的SUKER书客,这一次给大家带来一份大惊喜。在最近正式发布新品——SUKER书客护眼台灯L1,这款护眼台灯承载着在照明领域的前沿技术,能保证照明安全健康和舒适度并带来非常优秀的护眼效果。作为书客在护眼台灯领域的颠覆式新品…

[JavaWeb]【九】web后端开发-SpringBootWeb案例(菜单)

目录 一、准备工作 1.1 需求 1.2 环境搭建 1.2.1 准备数据库&表 1.2.2 创建springboot工程 1.2.3 配置application.properties & 准备对应实体类 1.2.3.1 application.properties 1.2.3.2 实体类 1.2.3.2.1 Emp类 1.2.3.2.2 Dept类 1.2.4 准备对应的Mapper、…

vue项目,如何修改Element-Plus等UI组件库的样式,三种方式搞定!!!

前言 我们在学习和使用组件库构建页面的时候,时常会遇到这样的问题。 即,尽管组件库已经提供了较多的功能,来帮助我们构建自定义的效果,但有时仍不能使我们满意。 这个时候我们就不得不修改UI库的样式,来达到想要的状…

Spring MVC 四:Context层级

这一节我们来回答上篇文章中避而不谈的有关什么是RootApplicationContext的问题。 这就需要引入Spring MVC的有关Context Hierarchy的问题。Context Hierarchy意思就是Context层级,既然说到Context层级,说明在Spring MVC项目中,可能存在不止…

Leetcode---111双周赛

题目列表 2824. 统计和小于目标的下标对数目 2825. 循环增长使字符串子序列等于另一个字符串 2826. 将三个组排序 2827. 范围中美丽整数的数目 一、统计和小于目标的下标对数目 这题直接暴力求解,时间复杂度是O(n^2),代码如下 class Solution { pu…

Mysql001:Mysql概述以及安装

前言:本课程将从头学习Mysql,以我的工作经验来说,sql语句真的太重要的,现在互联网所有的一切都是建立在数据上,因为互联网的兴起,现在的数据日月增多,每年都以翻倍的形式增长,对于数…

java八股文面试[多线程]——线程的生命周期

笔试题:画出线程的生命周期,各个状态的转换。 5.等待队列(本是Object里的方法,但影响了线程) 调用obj的wait(), notify()方法前,必须获得obj锁,也就是必须写在synchronized(obj) 代码段内。与等待队列相关的步骤和图 …

Docker容器学习:搭建ownCloud个人网盘

目录 前提环境 拉取镜像 创建容器 创建mysql容器: 创建OwnCloud容器,并连接到数据库: 创建Nginx容器: 配置nignx 前提环境 基于Centos7.9版本环境安装Docker-ce:24.0.5 拉取镜像 docker pull mysql:5.6 dock…

Leetcode每日一题:1267. 统计参与通信的服务器(2023.8.24 C++)

目录 1267. 统计参与通信的服务器 题目描述: 实现代码与解析: 写法一:两次遍历 hash 原理思路: 写法二:三次遍历 原理思路: 1267. 统计参与通信的服务器 题目描述: 这里有一幅服务器分…

Jetson Xavier NX安装torch环境

设备简介 Jetson Xavier NX是一款具有强大计算能力的AI处理器,它采用了NVIDIA的Turing架构和Volta GPU架构,可以实现高性能的深度学习和推理任务。具体性能如下: CPU:6核心ARM Cortex-A57处理器,最高主频1.5GHz。 GP…

平衡二叉树及其应用详解

平衡二叉树 定义与性质 平衡二叉树(Balanced Binary Tree)是计算机科学中的一种数据结构,它是二叉排序树的一种特殊情况。 平衡二叉树满足以下性质: 左子树和右子树的高度差不超过 1。也就是说,对于任意节点&#…

6. 激活层

6.1 非线性激活 ① inplace为原地替换,若为True,则变量的值被替换。若为False,则会创建一个新变量,将函数处理后的值赋值给新变量,原始变量的值没有修改。 import torch from torch import nn from torch.nn import …

Squaretest 1.8.3 安装激活

1. 插件下载 2. 离线安装 3. 插件激活

Apache Paimon 实时数据湖 Streaming Lakehouse 的存储底座

摘要:本文整理自阿里云开源大数据表存储团队负责人,阿里巴巴高级技术专家李劲松(之信),在 Streaming Lakehouse Meetup 的分享。内容主要分为四个部分: 流计算邂逅数据湖 Paimon CDC 实时入湖 Paimon 不止…

IDEA使用git

文章目录 给所有文件配置git初始化本地仓库创建.gitignore文件添加远程仓库分支操作 给所有文件配置git 初始化本地仓库 创建.gitignore文件 添加远程仓库 分支操作 新建分支 newbranch 切换分支 checkout 推送分支 push 合并分支 merge

MySQL索引、事务与存储引擎

1索引 索引的概念: 数据库索引 是一个排序的列表,存储着索引值和这个值所对应的物理地址,无须对整个表进行扫描,通过物理地址就可以找到所需数据,是表中一列或者若千列值排序的方法,需要额外的磁盘空间 …

2023年05月 C/C++(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题:怪盗基德的滑翔翼 怪盗基德是一个充满传奇色彩的怪盗,专门以珠宝为目标的超级盗窃犯。而他最为突出的地方,就是他每次都能逃脱中村警部的重重围堵,而这也很大程度上是多亏了他随身携带的便于操作的滑翔翼。 有一天&#xff…

计算机毕设 基于机器视觉的二维码识别检测 - opencv 二维码 识别检测 机器视觉

文章目录 0 简介1 二维码检测2 算法实现流程3 特征提取4 特征分类5 后处理6 代码实现5 最后 0 简介 今天学长向大家介绍一个机器视觉的毕设项目,二维码 / 条形码检测与识别 基于机器学习的二维码识别检测 - opencv 二维码 识别检测 机器视觉 1 二维码检测 物体检…

一文便知 GO 中mongodb 的安装与使用

MONGDB 安装与使用 咱们来回顾一下上次分享的内容: 如何使用log 包log 包原理和具体实现自定义日志 要是对 GO 的日志包还有点兴趣的话,可以查看文章 GO的日志怎么玩 ? 今天咱们来玩个简单的 mongodb 的安装和使用 MONGODB介绍 MongoDB 是一个基于…

Prometheus关于微服务的监控

在微服务架构下随着服务越来越多,定位问题也变得越来越复杂,因此监控服务的运行状态以及针对异常状态及时的发出告警也成为微服务治理不可或缺的一环。服务的监控主要有日志监控、调用链路监控、指标监控等几种类型方式,其中指标监控在整个微服务监控中比重最高,也是实际生…