激活函数理解

前言

为什么神经网中非要有各种各样的激活函数?他们有什么用?没有他们会怎样?常见的激活函数有哪些,他们都有什么特点?

如果我们不运用激活函数,神经网络的输出信号将仅仅是一个简单的线性函数。线性方程很容易解决,但是它们的复杂性有限,从数据中学习复杂函数映射的能力较小。

一个没有激活函数的神经网络最终只不过是一个线性回归模型罢了,不能解决现实世界中的大多数非线性问题。

现假设只有两层没有激活函数的全连接网络如下:
在这里插入图片描述第一层的权重和偏置为 w 1 w_1 w1 b 1 b_1 b1,其 输出直接连到第二层的输入,权重和偏置为 w 2 w_2 w2 b 2 b_2 b2,最后输出预测值。公式化简化后仍然是一个线性函数。
y ^ = w 2 ( w 1 ⋅ x + b 1 ) + b 2 = w 2 ⋅ w 1 ⋅ x + w 2 ⋅ b 1 + b 2 = w ⋅ x + b \begin{aligned} \hat{y} & = w_2(w_1 \cdot x + b_1) + b_2 \\ & = w_2\cdot w_1 \cdot x + w_2 \cdot b_1 + b_2 \\ & = w\cdot x + b \end{aligned} y^=w2(w1x+b1)+b2=w2w1x+w2b1+b2=wx+b
如果我们在第一层的输出加上一个激活函数,则不能有上式的化简。只有加入了激活函数,神经网络才具备分层的非线性的学习能力。

y ^ = w 2 ( σ ( y 1 ) ) + b 2 y 1 = w 1 ⋅ x + b 1 σ ( ⋅ ) 为激活函数 \begin{aligned} \hat{y} & = w_2(\sigma(y_1)) + b_2 \\ & y_1 =w_1 \cdot x + b_1 \\ & \sigma(\cdot) 为激活函数 \\ \end{aligned} y^=w2(σ(y1))+b2y1=w1x+b1σ()为激活函数

sigmoid

f ( x ) = 1 1 + e − x \begin{aligned} f(x) = \frac{1}{1+e^{-x}} \nonumber \end{aligned} f(x)=1+ex1

在这里插入图片描述

  • 输出范围在(0,1)之间,常用于二元分类问题的最后一层,将输出映射到概率值。
  • sigmoid函数的输出值均大于0,使得输出不是0的均值,从而发生激活函数的偏移现象
  • 从图像中可以看出sigmoid两端的导数接近0,会导致反向传播的梯度也变得非常小,此时网络参数可能得不到更新,难以有效训练。也称梯度消失。
  • 一般来说sigmoid网络在5层之内就会产生梯度消失现象。

tanh

f ( x ) = e x − e − x e x + e − x \begin{aligned} f(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} \end{aligned} f(x)=ex+exexex
在这里插入图片描述

  • 输出范围在(-1, 1)之间,输出均值为0,使得它的收敛速度要比sigmoid快。
  • 同样会存在梯度消失问题,不过相较于sigmoid稍微缓解了梯度消失的程度。
  • 导数dtanh的值域在(0, 1)。

ReLU(Rectified Linear Units)

f ( x ) = { 0 , i f x < 0 x , i f x ≥ 0 \begin{aligned} & f(x) =\left\{ \begin{aligned} 0 &, &if \ x < 0 \\ x &, &if \ x \geq 0 \end{aligned} \right.\\ \end{aligned} f(x)={0x,,if x<0if x0
在这里插入图片描述

  • 当输入大于0时,输出等于输入;当输入小于等于0时,输出为0,权重无法更新。
  • 简单且计算效率高,有效缓解了梯度消失的问题。
  • 与sigmoid类似,ReLU的输出均值也大于0,偏移现象神经元死亡会共同影响网络的收敛性。

Leaky-ReLU & L-ReLU

f ( x ) = { α x , i f x < 0 x , i f x ≥ 0 \begin{aligned} & f(x) =\left\{ \begin{aligned} \alpha x &, &if \ x < 0 \\ x &, &if \ x \geq 0 \end{aligned} \right.\\ \end{aligned} f(x)={αxx,,if x<0if x0
在这里插入图片描述

  • 在标准ReLU的基础上,对于负半轴的输入赋予了一个小的斜率,从而弥补了ReLU负半轴输出为0导致权重不更新的问题。

softmax

f ( x ) = e i ∑ i = 1 n e i \begin{aligned} f(x) = \frac{e^{i}}{\sum_{i=1}^{n}e^{i}} \end{aligned} f(x)=i=1neiei

在这里插入图片描述

  • 用于多类分类问题的激活函数,值在[0 , 1]范围内,并且向量中元素总和为1。
  • softmax的负半轴的输出接近0,反向传播时该部分的权重几乎不更新。

swish

f ( x ) = x ⋅ s i g m o i d ( β x ) \begin{aligned} f(x) = x\cdot sigmoid(\beta x) \end{aligned} f(x)=xsigmoid(βx)
β \beta β 是常数或者经过学习得到的参数。当 β = 1 \beta = 1 β=1

在这里插入图片描述

  • 与ReLU不同,swish函数全范围内都连续可微。实验表明,Swish作为激活函数经常会获得比ReLU更高的分类精度。但是,与ELU同样,由于需要计算幂函数,其计算代价较高。

numpy实现

import matplotlib.pyplot as plt
import numpy as npdef sigmoid(x):return 1.0 / (1.0 + np.exp(-x))def dsigmoid(x):return sigmoid(x) * (1 - sigmoid(x))def tanh(x):return (np.exp(x) - np.exp(-x)) / (np.exp(x) + np.exp(-x))def dtanh(x):return 1 - tanh(x) ** 2def relu(x):return np.where(x < 0, 0, x)def drelu(x):x = np.where(x < 0, 0, x)x = np.where(x > 0, 1, x)return xdef lrelu(x, alpha=0.2):y = np.piecewise(x, [x >= 0, x < 0], [lambda x: x, lambda x: alpha * x])x = np.where(x >= 0, 1, x)dy = np.where(x < 0, alpha, x)return (y, dy)def softmax(x):return np.exp(x) / np.sum(np.exp(x))def dsoftmax(x):passdef swish(x, beta=1.0):return x * sigmoid(beta * x)def dswish(x, beta=1.0):sig = sigmoid(beta * x)dy = sig * (1 + x * beta * (1 - sig))return dyif __name__ == "__main__":x = np.linspace(-10.0, 10.0, num=10, endpoint=True)# plt.plot(x, sigmoid(x), label="sigmoid")# plt.plot(x, dsigmoid(x), label="dsigmoid")# plt.plot(x, tanh(x), label="tanh")# plt.plot(x, dtanh(x), label="dtanh")# plt.plot(x, relu(x), label="relu")# plt.plot(x, drelu(x), label="drelu")# plt.plot(x, lrelu(x)[0], label="lrelu")# plt.plot(x, lrelu(x)[1], label="dlrelu")# x = np.linspace(-5.0, 5.0, num=100, endpoint=True)# plt.plot(x, softmax(x), label="softmax")beta = 1plt.plot(x, swish(x, beta), label="swish")plt.plot(x, dswish(x, beta), label="dswish")plt.grid()plt.legend()plt.show()

小结

一句话 激活函数就是为了增加模型的非线性表达能力和学习到更复杂的映射关系

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

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

相关文章

Docker 容器化技术:构建高效、可移植的开发环境和部署流程|Docker 网络

为了支持网络协议栈的多个实例&#xff0c;Linux 在网络协议栈中引入了网络命名空间。这些独立的协议栈被隔离到不同的命名空间中&#xff0c;处于不同命名空间中的网络协议栈是完全隔离的&#xff0c;彼此无法通信。通过对网络资源的隔离&#xff0c;就能在一台宿主机上虚拟多…

L1-019 谁先倒(Java)

一、题目描述&#xff1a; 划拳是古老中国酒文化的一个有趣的组成部分。酒桌上两人划拳的方法为&#xff1a;每人口中喊出一个数字&#xff0c;同时用手比划出一个数字。如果谁比划出的数字正好等于两人喊出的数字之和&#xff0c;谁就输了&#xff0c;输家罚一杯酒。两人同赢或…

android 事件分发笔记

这是学习笔记,以我看得明白为主。 分为 view.dispatchTouchEvent,---只有事件的处理逻辑 ----- ViewGroup.dispatchTouchEvent---实现了分发流程的逻辑 事件接收流程 setView#ViewRootImpl.java //接收事件的方法 ------> new WindowInputEventReceiver(inputChann…

FFmepg--视频编码流程--yuv编码为h264

文章目录 基本概念流程api核心代码 基本概念 YUV格式&#xff1a;是一种颜色编码方式&#xff0c;YUV分别为三个分量&#xff1a;‘Y’是明亮度&#xff0c;也就是灰度值&#xff1b;‘U’和‘V’是色度 YUV格式的分类&#xff1a; planar的YUV格式&#xff1a;先存储planar的…

初步了解序列化和反序列化

01什么是序列化和反序列化 序列化是将对象转化为字符串以便存储的一种方式。而反序列化恰好是序列化的逆过程&#xff0c;反序列化会将字符串转化为对象供程序使用。 常见的php系列化和反系列化方式主要有&#xff1a;serialize&#xff0c;unserialize&#xff1b;json_enco…

【运维开发岗面试题1】

目录 mkdir -p 中-p 是干什么的&#xff1f;df -h 和 du -h 命令作用&#xff1f;磁盘管理你都用到过什么命令&#xff1f;cp 和 mv 是干什么的&#xff1f;有什么区别内存大小怎么查看&#xff1f;查看内存的运行情况&#xff1f;怎么查看内存&#xff1f;进程杀不掉怎么办如何…

姿态旋转的哥氏定理以及速度微分的推导

姿态旋转中涉及到坐标系的转换&#xff0c;在有相对旋转的两个坐标系中观察一个向量的变化&#xff0c;用到了哥氏定理。 例如在i系中观察e系下的运动&#xff0c;则 哥氏定理的公式 wie是e相对于i的角运动 注意符号i在前e在后。 wie是e相对于i的角运动 注意符号i在前e在…

各个类型和Json类型的相互转换

ObjectMapper类(com.fasterxml.jackson.databind.ObjectMapper)是Jackson的主要类&#xff0c;它可以帮助我们快速的进行各个类型和Json类型的相互转换。 对应maven&#xff1a; <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId&…

【驱动】编译内核时报错:multiple definition of `yylloc‘

1、问题描述 在Ubuntu22.04中编译Linux kernel4.9源码时报错: /usr/bin/ld: scripts/dtc/dtc-parser.tab.o:(.bss+0x10): multiple definition of `yylloc; scripts/dtc/dtc-lexer.lex.o:(.bss+0x0): first defined here collect2: error: ld returned 1 exit status make[2…

R语言:如何基于地球外辐射(Ra)和相对日照(n/N)计算太阳辐射Rs?

正在编写相关软著&#xff0c;借此机会了解R语言的基本语法和一些处理流程&#xff0c;所以解释稍微繁琐。 Note&#xff1a; 使用的R语言版本是 R version 4.3.2 (2023-10-31 ucrt) 使用的RStudio编辑器版本是&#xff1a; 01 基于随机森林的插值填补缺失值 这是目前处理…

深入探索C与C++的混合编程

实现混合编程的技术细节 混合使用C和C可能由多种原因驱动。一方面&#xff0c;现有的大量优秀C语言库为特定任务提供了高效的解决方案&#xff0c;将这些库直接应用于C项目中可以节省大量的开发时间和成本。另一方面&#xff0c;C的高级特性如类、模板和异常处理等&#xff0c;…

mysql数据库中查询重复数据和去重数据

文章目录 1.查找重复数据2. 查到重复组的唯一数据3.删除重复数据4.注意重复的内容和删除的记录数是否一致 1.查找重复数据 select gene_entrez_id,count(*) a from diag_gene GROUP BY gene_entrez_id HAVING a > 12. 查到重复组的唯一数据 原理 分组后如果组内多个数据…

跨境电商干货|如何在Snapchat上做电商?

Snapchat是一个与用户互动与创意内容为主的平台&#xff0c;也因其广阔的受众群体广受跨境电商卖家的喜爱&#xff0c;成为跨境出海的热门渠道之一。本文将为大家分享&#xff0c;要在Snapchat上进行电子商务&#xff0c;可以遵循以下步骤&#xff1a; 1、创建商业账户 在Snap…

卷积的九大变体算法

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 引言 卷积神经网络&#xff08;CNN&#xff09;的核心在于其多样化的卷积技术&#xff0c;每种技术针对不同的应用和性能需求有着独特的优势。逐…

力扣46. 全排列

Problem: 46. 全排列 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 回溯可以理解为是在对一个多叉树的操作 1.回溯结束条件&#xff1a;当决策路径的长度等于nums数组的长度时&#xff0c;将当前的结果添加到二维结果集res中&#xff1b; 2.每一次决策的选择处…

javaScript链式调用的简单实现

链式调用在JavaScript很常见&#xff0c;比如jQuery、Promise和其它的插件等&#xff0c;都是使用的链式调用。链式调用可以让我们在进行连续操作时&#xff0c;写出更简洁的代码。 链式调用它允许你在单个对象上连续调用多个方法&#xff0c;每个方法的返回值都是调用它的那个…

Qt 图形视图 /基于Qt示例DiagramScene解读图形视图框架

文章目录 概述从帮助文档看示例程序了解程序背景/功能理清程序概要设计 分析图形视图的协同运作机制如何嵌入到普通Widget程序中&#xff1f;形状Item和文本Item的插入和删除&#xff1f;连接线Item与形状Item的如何关联&#xff1f;如何绘制ShapeItem间的箭头线&#xff1f; 下…

Java文件大小转换的两种方式

小伙伴们好&#xff0c;欢迎关注&#xff0c;一起学习&#xff0c;无限进步 在程序开发的过程中&#xff0c;文件的大小在视图呈现和数据库存储的过程不一致怎么转换呢 文件大小的单位&#xff0c;在计算机中&#xff0c;文件大小通常使用字节&#xff08;byte&#xff09;作为…

穿越半个世纪,探索中国数据库的前世今生

引言 在数字化潮流席卷全球的今天&#xff0c;数据库作为 IT 技术领域的“活化石”&#xff0c;已成为数字经济时代不可或缺的基础设施。那么&#xff0c;中国的数据库技术发展经历了怎样的历程&#xff1f;我们是如何在信息技术的洪流中逐步建立起自己的数据管理帝国的呢&…

Hadoop大数据应用:HDFS 集群节点扩容

目录 一、实验 1.环境 2.HDFS 集群节点扩容 二、问题 1.rsync 同步报错 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 主机架构软件版本IP备注hadoop NameNode &#xff08;已部署&#xff09; SecondaryNameNode &#xff08;已部署&#xff09; Resourc…