1. 深度学习笔记--神经网络中常见的激活函数

1. 介绍

每个激活函数的输入都是一个数字,然后对其进行某种固定的数学操作。激活函数给神经元引入了非线性因素,如果不用激活函数的话,无论神经网络有多少层,输出都是输入的线性组合。激活函数的意义在于它能够引入非线性特性,使得神经网络可以拟合非常复杂的函数,从而提高了神经网络的表达能力和预测性能。

激活函数的发展经历了Sigmoid -> Tanh -> ReLU -> Leaky ReLU -> Maxout这样的过程,还有一个特殊的激活函数Softmax,因为它只会被用在网络中的最后一层,用来进行最后的分类和归一化。

具体来说,激活函数的作用有以下几个方面:

  • 引入非线性特性:激活函数能够将神经元的输入信号转换为输出信号,从而引入非线性特性,使得神经网络可以拟合非常复杂的函数。

  • 压缩输出范围:激活函数能够将神经元的输出范围压缩到一定的范围内,这有助于防止神经元输出的值过大或过小,从而提高了神经网络的稳定性和泛化性能。

  • 增加网络深度:激活函数能够增加神经网络的深度,从而提高了神经网络的表达能力和预测性能。

  • 改善梯度消失问题:激活函数能够改善神经网络中的梯度消失问题,从而提高了神经网络的训练效率和收敛速度。

2. 特性

sigmoid函数

import numpy as npdef sigmiod(x):return 1. / (1. + np.exp(-x))

在这里插入图片描述

sigmoid函数是神经网络中最早也是最常用的激活函数之一,它的特点是将输入值映射到0到1之间的连续范围内,输出值具有良好的可解释性,但是它在梯度消失和输出饱和等问题上表现不佳。

Tanh

import numpy as npdef tanh(x):return np.tanh(x)

Tanh(双曲正切)函数是一种常用的激活函数,其数学定义为 f ( x ) = e x − e − x e x + e − x f(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} f(x)=ex+exexex f ( x ) = ( e x p ( x ) − e x p ( − x ) ) / ( e x p ( x ) + e x p ( − x ) ) f(x) = (exp(x) - exp(-x)) / (exp(x) + exp(-x)) f(x)=(exp(x)exp(x))/(exp(x)+exp(x)))。它的输出范围是 (-1, 1),在输入接近正无穷时趋于1,在接近负无穷时趋于-1,在接近0时趋于0。在神经网络中,Tanh函数通常用于隐藏层的激活函数。

Tanh函数是一种具有S形状的激活函数,其特点是将输入值映射到-1到1之间的连续范围内,输出值也具有良好的可解释性。Tanh解决了Sigmoid的输出是不是零中心的问题,Tanh函数在某些情况下可以表现出色,但是它也存在梯度消失和输出饱和等问题,因此在深度神经网络中使用并不广泛。
在这里插入图片描述

ReLU函数

import numpy as npdef ReLU(x):return np.maxinum(0, x)

ReLU函数是当前最常用的激活函数之一,它的特点是简单、快速,并且在许多情况下表现出色。ReLU函数将负数输入映射到0,将正数输入保留不变,因此在训练过程中可以避免梯度消失的问题。

但是ReLU函数在输入为负数时输出为0,这可能导致神经元死亡,ReLU单元比较脆弱并且可能“死掉”,而且是不可逆的,因此导致了数据多样化的丢失。通过合理设置学习率,会降低神经元“死掉”的概率。因此后续的改进版本LeakyReLU得到了广泛的应用。

在这里插入图片描述

LeakyReLU函数

def LeakyReLU(x, alpha=0.1):return np.maxinum(alpha*x, x)def LeakyReLU(x, alpha=0.01):return x if x > 0 else alpha * x

LeakyReLU函数是ReLU函数的改进版本,它在输入为负数时输出一个小的负数,从而避免了ReLU函数可能导致神经元死亡的问题。LeakyReLU函数的优点是简单、快速,并且在许多情况下表现出色,但是其超参数需要手动调整,因此在实际应用中需要进行一定的调试。

在这里插入图片描述

Maxout

import numpy as npdef maxout(x, weights, biases):output1 = np.dot(x, weights[0] + biases[0])output2 = np.dot(x, weights[1]+ biases[1])return np.maximum(output1, output2)
x = np.array([1.0, 2.0, 3.0]) 
weights = [np.array([0.5, 0.3, 0.2]), np.array([0.4, 0.5, 0.6])]
biases = [0.1, 0.2]
print(maxout(x, weights, biases))

在这里插入图片描述
在这里插入图片描述

每个神经元的参数double,这就导致整体参数的数量激增。

Softmax函数

import numpy as npdef Softmax(x):exp_x = np.exp(x)return exp_x / np.sum(exp_x, axis=0, keepdims=True)# 测试
x = np.array([1.0, 2.0, 3.0])
print(Softmax(x))  # 输出 [0.09003057 0.24472847 0.66524096]
import torchdef Softmax(x):exp_x = torch.exp(x)return exp_x / torch.sum(exp_x, dim=0, keepdim=True)# 测试
x = torch.tensor([1.0, 2.0, 3.0])
print(Softmax(x))  # 输出 [0.09003057 0.24472847 0.66524096]

在这里插入图片描述

Softmax函数是一种常用于多分类问题的激活函数,它将输入值映射到0到1之间的概率分布,可以将神经网络的输出转换为各个类别的概率值。Softmax函数的优点是简单、易于理解,并且在多分类问题中表现出色,但是它也存在梯度消失和输出饱和等问题。

在这里插入图片描述

GELU函数

def GELU(x):cdf = 0.5 * (1.0 + np.tanh(np.sqrt(2 / np.pi)) * (x + 0.044715 * np.power(x, 3)))return x * cdfprint(GELU(0))    # 输出 0.0
print(GELU(1))    # 输出 0.8413447460685429
print(GELU(-1))   # 输出 -0.15865525393145707

GELU函数是一种近年来提出的激活函数,它的特点是在ReLU函数的基础上引入了高斯误差线性单元,从而在某些情况下能够表现出色。GELU函数具有平滑的非线性特性,可以避免ReLU函数可能导致的神经元死亡问题。
在这里插入图片描述

在这里插入图片描述

GELU函数是一种近年来提出的激活函数,它的特点是在ReLU函数的基础上引入了高斯误差线性单元,从而在某些情况下能够表现出色。GELU函数具有平滑的非线性特性,可以避免ReLU函数可能导致的神经元死亡问题。

性能测试

我们采用控制变量法进行激活函数的推理速度测试,x为输入,范围为-1到1之间的十万个数据,运行次数为100计算激活函数的计算耗时。
在这里插入图片描述

参考:
https://zhuanlan.zhihu.com/p/32610035
https://mp.weixin.qq.com/s/8pZ1IH_WoFG-QCjOztdc5Q

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

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

相关文章

【ZZULIOJ】1091: 童年生活二三事(多实例测试)(Java)

目录 题目描述 输入 输出 样例输入 Copy 样例输出 Copy code 题目描述 Redraiment小时候走路喜欢蹦蹦跳跳,他最喜欢在楼梯上跳来跳去。 但年幼的他一次只能走上一阶或者一下子蹦上两阶。 现在一共有N阶台阶,请你计算一下Redraiment从第0阶到第N阶…

代谢组数据分析七:从质谱样本制备到MaxQuant搜库

前言 LC-MS/MS Liquid Chromatography-Mass Spectrometry(LC-MS/MS ,液相色谱-质谱串联)可用于残留化合物检测、有机小分子检测、鉴定和定量污染物以及在医药和食品领域添加剂检测和生物小分子等检测。 LC-MS/MS一般包含五个步骤&#xff…

为什么叫“机器学习”Machine Learning 而不是叫“计算机学习”?

有一门学科“机器学习”火了起来,它是计算机科学与数学结合的产物,它的目的是使计算机“聪明”起来,实现人工智能。可是,令人困惑的是它明明就是计算机学习,为什么不叫“计算机学习”而叫“机器学习”呢?这…

PCB概念(进程控制块)—— 操作系统(形象解释版)

在操作系统里,PCB就像是每个进程的小秘密日记。它记录了进程的所有私事,比如身份信息、运行状态、内存地址啦,CPU信息等,还有进程优先级之类的东西。 简单来说,操作系统用它来把握和控制所有进程的行踪,确…

剧情游戏如何制作?

制作剧情游戏是一个令人兴奋且富有挑战性的过程!首先,你需要有一个扎实的故事框架,这个框架可以是一个详细的剧本或者是一个简要的大纲。在设计故事时,考虑到玩家的选择和互动是非常重要的,因为这些选择会影响到游戏的…

50. 【Android教程】xml 数据解析

xml 是一种标记扩展语言(Extension Mark-up Language),学到这里大家对 xml 语言一定不陌生,但是它在 Android 中的运用其实只是冰山一角。抛开 Android,XML 也被广泛运用于各种数据结构中。在运用 xml 编写 Android 布…

HashMap的底层存储介绍

HashMap底层实现采用了哈希表,这是一种非常重要的数据结构。对于我们一行理解很多技术都非常有帮助。 数据结构中由数组和链表来实现对数据的存储,他们各有特点。 (1)数组:占用空间连续。寻址容易,查询速…

openlayer 使用ol-ext插件实现凸显区域

使用ol-ext插件实现凸显多变形 效果如图 1、创建openlayer var map; var view; var tileLayer, source, vector;function init() {tileLayer new ol.layer.Tile({source: new ol.source.TileArcGISRest({url: "http://map.geoq.cn/arcgis/rest/services/ChinaOnlineStr…

Windows 10 使用 Vagrant 快速创建虚拟机

一、下载 VirtualBox 官网地址:Oracle VM VirtualBox 阿里云盘:阿里云盘分享 二、安装 VirtualBox 安装软件前请先确认 CPU 是否开启了虚拟化,要求开启 2.1、双击运行可执行文件后点击下一步 2.2、选择安装路径,为了避免中文乱码…

Rust Web开发实战:构建高效稳定的服务端应用

如果你厌倦了缓慢、占用大量资源且不稳定的模板化Web开发工具,Rust就是你的解决方案。Rust服务提供了稳定的安全保证、非凡的开发经验,以及能够自动防止常见错误的编译器。 《Rust Web开发》教你使用Rust以及重要的Rust库(如异步运行时的Tokio、用于Web…

OpenFeign修改HttpClient为Apache HttpClient 5

OpenFeign中http client 如果不做特殊配置,OpenFeign默认使用JDK自带的HttpURLConnection发送HTTP请求, 由于默认HttpURLConnection没有连接池、性能和效率比较低。所以修改为Apache HttpClient 5。 总结为两步: 加依赖改yml 具体操作请往…

GORM数据库连接池对接Prometheus

一、背景与介绍 Golang的database/sql包定了关于操作数据库的相关接口,但是没有去做对应数据库的实现。这些实现是预留给开发者或者对应厂商进行实现的。 其中让我比较关注的是Golang的sql包有没有实现连接池pool的机制呢? 毕竟Golang是静态语言,类似J…

P6242 【模板】线段树 3(区间最值操作、区间历史最值)

【模板】线段树 3&#xff08;区间最值操作、区间历史最值&#xff09; - 洛谷 #define _CRT_SECURE_NO_WARNINGS #include<bits/stdc.h> using namespace std; #define ll long long #define endl "\n" #define PII pair<int,int> #define int long lon…

platformd device、driver注册过程

本文以smsc911x驱动为例 platform_device注册过程 该设备被定义在dts里面了 参考文章设备树节点转换为设备节点device_node、和平台设备资源platform_device_设备树节点转换成平台设备-CSDN博客 dts里面的节点会被转换为device_node和platform_device(并不是所有节点都会被转…

vi编辑器使用

说明&#xff1a;本文介绍vi编辑器使用&#xff1b; 介绍&基础使用 vi编辑器是linux操作系统中最常用的编辑器&#xff0c;使用vi或vim命令启动。vim是vi编辑器的增强版&#xff0c;大多数情况使用vi命令也会打开vim编辑器&#xff0c;为了方便介绍&#xff0c;以下均称v…

【数组】Leetcode 80. 删除有序数组中的重复项 II【中等】

删除有序数组中的重复项 II 其他算法导航栏 给你一个有序数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次 &#xff0c;返回删除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在 原地 修改输入数组 并在…

C#实战:图像清晰度增强介绍和案例实践

目录 一、图像清晰度增强介绍 二、开发流程 三、请求参数说明 四、输出参数说明

【Web】2024XYCTF题解(全)

目录 ezhttp ezmd5 warm up ezMake ez?Make εZ?мKε? 我是一个复读机 牢牢记住&#xff0c;逝者为大 ezRCE ezPOP ezSerialize ezClass pharme 连连看到底是连连什么看 ezLFI login give me flag baby_unserialize ezhttp 访问./robots.txt 继…

从阿里云崩溃看IT系统非功能能力验证

昨天下午6点左右学员群里有人说阿里云又出问题了&#xff0c;并且还挺长时间没有恢复了。 我也登录了一下&#xff0c;结果登录直接不停地302。如下所示&#xff1a; 做为阿里云重要的基础设施&#xff0c;这一故障影响了。如官方通告的处理时间线&#xff1a; 17:44起&#…

【JavaEE初阶系列】——理解tomcat 带你实现最简单的Servlet的hello world程序(七大步骤)

目录 &#x1f6a9;认识Tomcat &#x1f6a9;运用Tomcat &#x1f6a9;Servlet &#x1f393;完成简单的Servlet的hello world程序 &#x1f388;创建项目Maven &#x1f388;引入依赖 &#x1f388;创建目录 &#x1f388;编写代码 &#x1f388;打包程序 &#x1…