非线性激活函数

news2024/11/17 10:30:51

目录

理论介绍

常见的激活函数

A. sigmoid函数

B. tanh

C.ReLu

Leaky Relu 函数

Parametric ReLU (PReLU)

Exponential Linear Unit (ELU)

实验结果及分析


理论介绍

    在神经网络的计算中,无非就是矩阵相乘,输入的是线性,不论输出层有多少,相当于n个矩阵相乘,和一层相乘所获取的信息差距不大,那我们无非是要引入非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中,增加了神经网络模型泛化的特性。

    早期研究神经网络主要采用sigmoid函数或者tanh函数,输出有界,很容易充当下一层的输入。 近些年Relu函数及其改进型(如Leaky-ReLU、P-ReLU、ELU等),由于计算简单、效果好所以在多层神经网络中应用比较多。

常见的激活函数

# 下面内容都要有此片段  
import torch  
import torch.nn.functional as F  
import matplotlib.pyplot as plt  
import numpy as np  
x= torch.linspace(-10,10,60)  

A. sigmoid函数

gif.latex?a%3D%5Cfrac%7B1%7D%7B1+e%5E%7B-z%7D%7D

导数 :gif.latex?a%5E%5Cprime%20%3Da%281%20-%20a%29

在sigmoid函数中我们可以看到,其输出是在(0,1)这个开区间,它能够把输入的连续实值变换为0和1之间的输出,如果是非常大的负数,那么输出就是0;如果是非常大的正数输出就是1,起到了抑制的作用。

ax = plt.gca()  
ax.spines['right'].set_color('none')  
ax.spines['top'].set_color('none')  
ax.xaxis.set_ticks_position('bottom')  
ax.spines['bottom'].set_position(('data', 0))  
ax.yaxis.set_ticks_position('left')  
ax.spines['left'].set_position(('data', 0))  
plt.ylim((0, 1))  
sigmod=torch.sigmoid(x)  
plt.plot(x.numpy(),sigmod.numpy())  
plt.show()  

7 sigmod

但是sigmod由于需要进行指数运算(相比relu这个对于计算机来说是比较慢),再加上函数输出不是以0为中心的(这样会使权重更新效率降低),当输入稍微远离了坐标原点,函数的梯度就变得很小了(几乎为零)。在神经网络反向传播的过程中不利于权重的优化,这个问题叫做梯度饱和,也可以叫梯度弥散。这些不足,所以现在使用到sigmod基本很少了,基本上只有在做二元分类(0,1)时的输出层才会使用。

B. tanh

gif.latex?a%3D%5Cfrac%7Be%5Ez-e%5E%7B-z%7D%7D%7Be%5Ez+e%5E%7B-z%7D%7D

 导数:gif.latex?a%5E%5Cprime%20%3D1%20-%20a%5E2

    tanh是双曲正切函数,输出区间是在(-1,1)之间,而且整个函数是以0为中心的。

ax = plt.gca()  
ax.spines['right'].set_color('none')  
ax.spines['top'].set_color('none') 
ax.xaxis.set_ticks_position('bottom')  
ax.spines['bottom'].set_position(('data', 0))  
ax.yaxis.set_ticks_position('left')  
ax.spines['left'].set_position(('data', 0))  
plt.ylim((-1, 1))  
tanh=torch.tanh(x)  
plt.plot(x.numpy(),tanh.numpy())  
plt.show()  

7 sigmod

与sigmoid函数类似,当输入稍微远离了坐标原点,梯度还是会很小,但是好在tanh是以0为中心点,如果使用tanh作为激活函数,还能起到归一化(均值为0)的效果。

一般二分类问题中,隐藏层用tanh函数,输出层用sigmod函数,但是随着Relu的出现所有的隐藏层基本上都使用relu来作为激活函数了。

C.ReLu

Relu修正线性单元

a= max(0,z)

导数大于0时1,小于0时0。

也就是说: z>0时,梯度始终为1,从而提高神经网络基于梯度算法的运算速度。然而当 z<0时,梯度一直为0。 ReLU函数只有线性关系(只需要判断输入是否大于0)不管是前向传播还是反向传播,都比sigmod和tanh要快很多,当输入是负数的时候,ReLU是完全不被激活的,这就表明一旦输入到了负数,ReLU就会死掉。但是到了反向传播过程中,输入负数,梯度就会完全到0,这个和sigmod函数、tanh函数有一样的问题。 但是实际的运用中,该缺陷的影响不是很大。

ax = plt.gca()  
ax.spines['right'].set_color('none')  
ax.spines['top'].set_color('none')  
ax.xaxis.set_ticks_position('bottom')  
ax.spines['bottom'].set_position(('data', 0))  
ax.yaxis.set_ticks_position('left')  
ax.spines['left'].set_position(('data', 0))  
plt.ylim((-3, 10))  
relu=F.relu(x)  
plt.plot(x.numpy(),relu.numpy())  
plt.show()  

7 Relu

D.ReLU的变种

Leaky Relu 函数

为了解决relu函数z<0时的问题出现了 Leaky ReLU函数,该函数保证在z<0的时候,梯度仍然不为0。 ReLU的前半段设为αz而非0,通常

α=0.01,a=max(αz,z)

ax = plt.gca()  
ax.spines['right'].set_color('none')  
ax.spines['top'].set_color('none')  
ax.xaxis.set_ticks_position('bottom')  
ax.spines['bottom'].set_position(('data', 0))  
ax.yaxis.set_ticks_position('left')  
ax.spines['left'].set_position(('data', 0))  
plt.ylim((-3, 10))  
l_relu=F.leaky_relu(x,0.1) # 这里的0.1是为了方便展示,理论上应为0.01甚至更小的值  
plt.plot(x.numpy(),l_relu.numpy())  
plt.show()  

7 Leaky Relu

Parametric ReLU (PReLU)

PReLU是一种引入可学习参数的ReLU变种,它允许负数区域的斜率成为可学习的参数。这使得神经网络能够根据数据自适应地学习激活函数的形状。公式如下:

f(x) = max(ax, x)

p_relu = F.prelu(x, torch.tensor(0.25)) # 使用PReLU激活函数,参数为0.25  
plt.figure()  
ax = plt.gca()  
ax.spines['right'].set_color('none')  
ax.spines['top'].set_color('none')  
ax.xaxis.set_ticks_position('bottom')  
ax.spines['bottom'].set_position(('data', 0))  
ax.yaxis.set_ticks_position('left')  
ax.spines['left'].set_position(('data', 0))  
plt.ylim((-3, 10))  
plt.plot(x.numpy(), p_relu.numpy(), label='PReLU')  
plt.legend()  
plt.title('PReLU Activation')  
plt.show()  

8 Parametric Relu

Exponential Linear Unit (ELU)

ELU是在负数区域引入一个指数衰减的激活函数,以解决ReLU在负数区域的问题。它提供了一个平滑的曲线,并具有负饱和度,可以减少梯度消失的问题。公式如下:

f(x) = x                         if x > 0

alpha * (exp(x) - 1)        if x <= 0

其中,alpha是一个正数,控制ELU在负数区域的斜率。

9 Exponential Linear Unit

在实践中,ReLU和其变种的使用情况会因任务和数据的不同而有所变化。然而,目前来看,ReLU仍然是最常用的激活函数。

ReLU的主要优势是计算简单且有效,能够在许多深度学习任务中提供良好的性能。它具有线性增长的特性,在正数区域上不会饱和,可以避免梯度消失问题,并且在实践中被广泛使用。

在ReLU的变种中,Leaky ReLU是最常见的选择之一。它通过引入一个小的斜率来解决ReLU在负数区域的问题,提供了更好的负数响应。Leaky ReLU在某些情况下可能比传统的ReLU效果更好。PReLU和ELU等变种相对来说使用较少,但在某些特定任务或特定数据集上可能表现出更好的性能。PReLU通过引入可学习的参数,使激活函数能够自适应地调整形状,因此在一些复杂任务中可能更有优势。ELU通过引入指数衰减的负数响应,提供了平滑的非线性特性,对于一些需要更强鲁棒性和更低误差的任务可能更合适。

实验结果及分析

    当涉及到选择适当的激活函数时,我们有多个选项可供选择。ReLU及其变种、Sigmoid和Tanh是常见的激活函数,各自具有不同的特点和适用情况。以下是对它们的总结:

ReLU及其变种(Leaky ReLU、PReLU、ELU等):

  1. ReLU(Rectified Linear Unit)是最常用的激活函数之一。它在正数区域上表现良好,不会引起梯度消失问题,并且计算简单高效。然而,ReLU在负数区域会完全被抑制,可能导致神经元“死亡”问题。
  2. Leaky ReLU引入了一个小的斜率来解决ReLU的负数区域问题,以提供更好的负数响应。
  3. PReLU通过引入可学习的参数,使激活函数能够自适应地调整形状,适用于一些复杂任务。
  4. ELU在负数区域引入了指数衰减,提供平滑的非线性特性,并具有负饱和度,对于一些需要更强鲁棒性和更低误差的任务可能更合适。

Sigmoid函数:

  1. Sigmoid函数将输入值映射到介于0和1之间的范围,常用于二分类问题的输出层。它的平滑曲线使其在处理概率和概率分布时具有一定优势。
  2. 然而,Sigmoid函数存在梯度饱和的问题,导致在深度神经网络中容易发生梯度消失和梯度爆炸的现象。

Tanh函数:

  1. Tanh函数将输入值映射到介于-1和1之间的范围,是一种常见的激活函数。它相对于Sigmoid函数具有更大的动态范围,并且在零点附近对称,对于处理中心化数据更适用。
  2. 与Sigmoid函数类似,Tanh函数也存在梯度饱和的问题。
  3. 在实际应用中,我们需要根据任务和数据的特点来选择适当的激活函数。一般而言,ReLU及其变种在大多数情况下表现良好,尤其在深度神经网络中。Sigmoid函数和Tanh函数适用于特定的场景,如二分类问题或处理中心化数据。然而,我们也可以尝试不同的激活函数来优化神经网络的性能和收敛速度,因为最佳选择因任务而异。

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

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

相关文章

如何修复ssh漏洞进行版本升级

目录 一、ssh低版本漏洞信息 OpenSSH GSSAPI 处理远端代码执行漏洞 OpenSSH GSSAPI认证终止信息泄露漏洞 OpenSSH X连接会话劫持漏洞 二、升级ssh版本进行修复漏洞 第一步 安装Telnet服务 第二步 重启服务 第三步 安装依赖环境 第四步 备份ssh老版本文件 第五步 导入…

【JavaEE进阶】Spring 创建与使用

Spring 创建与使用 1&#xff0c;Spring项目的创建 使用Maven方式来创建一个Spring项目&#xff0c;创建Spring项目和Servlet类似&#xff0c;总共分为以下3步&#xff1a; 创建一个普通Maven项目添加 Spring 框架⽀持&#xff08;spring-context、spring-beans&#xff09;添…

UE特效案例 —— 魔法翅膀

一&#xff0c;环境配置 创建默认地形Landscape&#xff0c;如给地形上材质需确定比例&#xff1b;添加环境主光源DirectionalLight&#xff0c;设置相应的强度和颜色&#xff1b;PostProcessVolume设置曝光&#xff0c;设置Min/Max Brightness为1&#xff1b; 与关闭Game Sett…

【二分查找】35. 搜索插入位置

35. 搜索插入位置 解题思路 使用二分查找算法当找到元素之后直接返回位置即可当没找到元素&#xff0c;将该元素插入到left位置即可 class Solution {public int searchInsert(int[] nums, int target) {// 二分查找int left 0;int right nums.length - 1;while(left < …

数组扁平化flat方法的多种实现

flat() let arr [[1],[2, 3],[4, 5, 6, [7, 8, [9, 10, [11]]]],12 ];// 参数指要提取嵌套数组的结构深度&#xff0c;默认值为 1。 // Infinity 指递归嵌套的所有层级。 let flattedArr arr.flat(Infinity); console.log(flattedArr);执行效果&#xff1a; toString() 注意…

FreeRTOS ~(六)信号量 ~ (2/3)信号量解决互斥缺陷

前情提要 FreeRTOS ~&#xff08;四&#xff09;同步互斥与通信 ~ &#xff08;2/3&#xff09;互斥的缺陷 FreeRTOS ~&#xff08;五&#xff09;队列的常规使用 ~ &#xff08;2/5&#xff09;队列解决互斥缺陷 举例子说明&#xff1a;利用信号量解决前述的"互斥的缺陷&…

SQL Server数据库 -- 表的高级查询

文章目录 一、子查询 嵌套子查询相关子查询二、查询运算 并运算union交运算intersect差运算except三、函数的使用 if语句while语句case语句四、总结 前言 高级子查询是对查询更灵活的运用&#xff0c;学会了高级查询将对数据库使用有很大的帮助。 一、子查询 1、子查询简介 在…

MATLAB画等深度构造图

clc;clear;close all; data xlsread(J_UNCONFORMITY等深度.xlsx); x data(:,1) xmax max(x); xmin min(x); y data(:,2) ymax max(y); ymin min(y); z data(:,3); N 45…

天天刷题-->LeetCode(两数相加)

个人名片&#xff1a; &#x1f405;作者简介&#xff1a;一名大二在校生&#xff0c;热爱生活&#xff0c;爱好敲码&#xff01; \ &#x1f485;个人主页 &#x1f947;&#xff1a;holy-wangle ➡系列内容&#xff1a; &#x1f5bc;️ tkinter前端窗口界面创建与优化 &…

MachineLearningWu_7+8_LogisticRegression/Classification

x.1 logistic regression 对于诸如分辨细胞是恶性肿瘤细胞与否的类似分类问题&#xff0c;我们使用Linear Regression的模型并不合适&#xff0c;所以引入Logistic Regression的模型&#xff0c;并绘制decision boundary&#xff0c;如下&#xff0c; Classification的最后一层…

mysql多表查询内连接,左外连接,排序,having

多表连接查询 use mydb3; -- 创建部门表 create table if not exists dept3(deptno varchar(20) primary key , -- 部门号name varchar(20) -- 部门名字 );– 创建员工表 create table if not exists emp3(eid varchar(20) primary key , -- 员工编号ename varchar(20), -- 员…

python接口自动化(二十二)--unittest执行顺序隐藏的坑(详解)

简介 大多数的初学者在使用 unittest 框架时候&#xff0c;不清楚用例的执行顺序到底是怎样的。对测试类里面的类和方法分不清楚&#xff0c;不知道什么时候执行&#xff0c;什么时候不执行。虽然或许通过代码实现了&#xff0c;也是稀里糊涂的一知半解&#xff0c;这样还好&am…

基于深度学习的高精度Caltech行人检测系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度Caltech数据集行人检测识别系统可用于日常生活中或野外来检测与定位行人目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的行人目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv…

部署HAproxy + Nginx负载均衡集群

目录 一、常规Web集群调度器 HAproxy概念&#xff08;主要特性&#xff09; HAproxy负载均衡八种策略 二、LVS、Nginx、HAproxy区别 Nginx服务 LVS服务 HAproxy服务 三、部署HAproxy Nginx负载均衡集群 第一步 关闭防火墙和安全机制 第二步 安装依赖环境 第三步 导…

基于paddelOCR的车票识别以及在PCB板上应用

基于paddelOCR的车票识别 任务简介 车牌识别就是从图片或者视频中提取车牌信息 任务难点 尺度差异大&#xff0c;悬挂位置不固定&#xff1b;角度倾斜&#xff0c;图片模糊&#xff0c;光照不足&#xff0c;过曝等问题&#xff1b;边缘和端测场景应用对模型大小有限制&#…

C++之装饰器适配器模式

目录 一、装饰器模式 模式思想 模式简介 模式优点 模式缺点 代码实现 情景模拟 代码实现 运行结果 二、适配器模式 模式简介 介绍 优点 缺点 代码实现 情景模拟 一、装饰器模式 模式思想 模式简介 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向…

前端基础(三十六):读取本地音视频设备并进行播放

效果 navigator.mediaDevices.enumerateDevices 请求媒体输入和输出设备的列表&#xff0c;例如麦克风&#xff0c;摄像机&#xff0c;耳机设备等 navigator.mediaDevices.getUserMedia 会提示用户给予使用媒体输入的许可&#xff0c;媒体输入会产生一个MediaStream&#xff0c…

伺服系统行业发展

伺服系统行业发展 1 介绍1.1 概述1.2 一般应用1.3 分类按系统功率分类按动力来源分类 1.4 工业控制中的伺服系统1.5 数字信号驱动与模拟信号驱动对比1.6 发展历史 2 伺服系统厂家工业机械臂移动AMR 3 关键指标及难点4 三相交流逆变器&#xff08;直流电转换为交流电&#xff09…

创建 Code Interpreter Demo: 一次实践的探索

好消息&#xff0c;好消息&#xff0c;Code Interpreter可以测试使用了&#xff01;&#xff01;&#xff01; 在这篇文章中&#xff0c;我们将探索如何创建一个 Code Interpreter Demo。提交一个2023年1-5月份的融资记录数据&#xff0c;让它来帮我们分析一下这些数据。 执行…