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

news2024/11/23 22:29:24

1. 介绍

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

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

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

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

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

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

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

2. 特性

sigmoid函数

import numpy as np

def sigmiod(x):
	return 1. / (1. + np.exp(-x))

在这里插入图片描述

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

Tanh

import numpy as np

def 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 np

def 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 np

def 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 np

def 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 torch

def 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 * cdf

print(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.coloradmin.cn/o/1639039.html

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

相关文章

魔方阵(C语言)

一、魔方阵规律; 8 1 6 3 5 7 4 9 2 魔方阵中各数的排列规律如下: (1)将1放在第1行中间一列。 (2)从2开始直到nn止,各数依次按此规则存放:每一个数存放的行比前一个数的行数减1,列数加1(例如上…

Go 语言基础(二)【数组、切片、指针、map、struct】

1、数组 特别需要注意的是:在 Go 语言中,数组长度也是数组类型的一部分!所以尽管元素类型相同但是长度不同的两个数组,它们的类型并不相同。 1.1、数组的初始化 1.1.1、通过初始化列表{}来设置值 var arr [3]int // int类型的数…

HSDB使用教程

HSDB:Hostspot Debugger,JVM内置的工具,用于深入分析JVM运行时的内部状态 启动HSDB java -cp D:/tools/jdk-1.8/lib/sa-jdi.jar sun.jvm.hotspot.HSDB 获取进程id jps 连接到指定进程 查找类 通过查询查找对象 输入查询语句 select d from …

Linux 学习 --- 编辑 vi 命令

1、vi 基本概念(了解) 基本上 vi 可以分为三种状态,分别是命令模式 (command mode)、插入模式 (Insert mode) 和底行模式 (last line mode),各模式的功能区分如下: 命令行模式 command mode)  控制屏幕光标的移动&a…

「笔试刷题」:字母收集

一、题目 描述 有一个 𝑛∗𝑚 的矩形方阵,每个格子上面写了一个小写字母。 小红站在矩形的左上角,她每次可以向右或者向下走,走到某个格子上就可以收集这个格子的字母。 小红非常喜欢 "love" 这四个字母。…

kubernetes中使用ELK进行日志收集

目录 一、需要收集哪些日志 1、kubernetes集群的系统组件日志 2、应用日志 二、日志收集方案ELK 1、收集日志:Logstash 2、存储日志:Elasticsearch 3、展示日志:Kibana 三、安装elk 1、下载安装包 2、创建用户并切换到新用户 3、上…

【Web】CTFSHOW 中期测评刷题记录(1)

目录 web486 web487 web488 web489 web490 web491 web492 web493 web494 web495 web496 web497 web498 web499 web500 web501 web502 web503 web505 web506 web507 web508 web509 web510 web486 扫目录 初始界面尝试文件包含index.php&am…

ubuntu与redhat的不同之处

华子目录 什么是ubuntu概述 ubuntu版本简介桌面版服务器版 安装部署部署后的设置设置root密码关闭防火墙启用允许root进行ssh登录更改apt源安装所需软件 网络配置Netplan概述配置详解配置文件DHCP静态IP设置设置 软件安装方法apt安装软件作用常用命令配置apt源 deb软件包安装概…

基于React实现B站评论区

今天继续来学习一下React,使用React实现B站评论区,如下图: 在使用React开发类似B站评论区的功能时,我们需要考虑以下几个关键点来构建一个基本的评论系统: 1. 设计组件结构 首先,设计组件结构是关键。至少…

【数据结构】:链表的带环问题

🎁个人主页:我们的五年 🔍系列专栏:数据结构 🌷追光的人,终会万丈光芒 前言: 链表的带环问题在链表中是一类比较难的问题,它对我们的思维有一个比较高的要求,但是这一类…

ThreeJS:Mesh网格与三维变换

Mesh网格 ThreeJS中,Mesh表示基于以三角形为多边形网格(polygon mesh)的物体的类,同时也作为其它类的基类。 通过Mesh网格,我们可以组合Geometry几何体与Material材质属性,在3D世界中,定义一个物体。例如:之…

Unity ParticleSystem 入门

概述 在项目的制作过程成,一定少不了粒子系统的使用吧,如果你想在项目粒子效果,那这部分的内容一定不要错过喔!我添加了理解和注释更好理解一点! 这次的内容比较多,右侧有目录,可以帮助快速导…

高中数学:三角函数公式汇总及推导

一、定义 常用三角函数值 参考: 三角函数定义 二、基本三角函数及相互关系 sinx cosx tanx cscx secx cotx 函数间相互关系 参考: cosx、sinx、tanx的函数图像与性质 secx、cscx、cotx函数图像及相关关系 三、诱导公式 口诀:奇变…

通信接口——时钟和信号

前言 所有接口只要抓住三个核心点就能分清:时钟同步和异步,时钟的来源,信号的传输方向。 一、时钟同步和异步 接口之间的交互方式存在多种形式,如果按照是否有公共时钟CLK的参与,可以分为同步传输和异步传输。 同步&…

C语言——队列的实现

队列按照先进先出(FIFO,First In First Out)的原则管理数据。这意味着最先进入队列的元素会被最先移出,类似于排队等候服务的情况。队列通常有两个主要操作:入队(enqueue),将元素添加…

DRF返回值源码分析

DRF返回值源码分析 1 返回值 在视图中定义finalize_response方法(也可以用来判断是否异常) 自定义异常 配置文件 # settings.py REST_FRAMEWORK {"EXCEPTION_HANDLER": utils.handlers.exception_handler # 自定义的exceptional_handler路…

Sarcasm detection论文解析 |利用对话语境进行讽刺分析

论文地址: 论文地址:Sarcasm Analysis Using Conversation Context | Computational Linguistics | MIT Press github地址:https://github.com/debanjanghosh/sarcasm_context Alex-Fabbri/deep_learning_nlp_sarcasm: code for deep learnin…

基于springboot实现公司日常考勤系统项目【项目源码+论文说明】

基于springboot实现公司日常考勤系统演示 摘要 目前社会当中主要特征就是对于信息的传播比较快和信息内容的安全问题,原本进行办公的类型都耗费了很多的资源、传播的速度也是相对较慢、准确性不高等许多的不足。这个系统就是运用计算机软件来完成对于企业当中出勤率…

debug的基本使用

1.简介   首先看下IDEA中Debug模式下的界面。 如下是在IDEA中启动Debug模式,进入断点后的界面,我这里是Windows,可能和Mac的图标等会有些不一样。就简单说下图中标注的8个地方: ① 以Debug模式启动服务,左边的一个按…

Redis运维篇-快速面试笔记(速成版)

文章目录 1. Redis的持久化1.1 RDB(快照模式)1.2 AOF 模式 2. Redis主从模型(高可用)2.1 Redis的主从复制2.2 Redis拓扑结构 3. Redis集群模式(高并发)3.1 Redis的Slots3.2 集群模式的常用命令3.3 多主多从…