深度学习基本部件-激活函数详解

news2024/11/26 0:23:55
  • 激活函数概述
    • 前言
    • 激活函数定义
    • 激活函数性质
  • Sigmoid 型函数
    • Sigmoid 函数
    • Tanh 函数
  • ReLU 函数及其变体
    • ReLU 函数
    • Leaky ReLU/PReLU/ELU/Softplus 函数
  • Swish 函数
  • 激活函数总结
  • 参考资料

本文分析了激活函数对于神经网络的必要性,同时讲解了几种常见的激活函数的原理,并给出相关公式、代码和示例图。

激活函数概述

前言

人工神经元(Artificial Neuron),简称神经元(Neuron),是构成神经网络的基本单元,其主要是模拟生物神经元的结构和特性,接收一组输入信号并产生输出。生物神经元与人工神经元的对比图如下所示。

neuron

从机器学习的角度来看,神经网络其实就是一个非线性模型,其基本组成单元为具有非线性激活函数的神经元,通过大量神经元之间的连接,使得多层神经网络成为一种高度非线性的模型。神经元之间的连接权重就是需要学习的参数,其可以在机器学习的框架下通过梯度下降方法来进行学习。

激活函数定义

激活函数(也称“非线性映射函数”),是深度卷积神经网络模型中必不可少的网络层。

假设一个神经元接收 D D D 个输入 x 1 , x 2 , ⋯ , x D x_1, x_2,⋯, x_D x1,x2,,xD,令向量 x = [ x 1 ; x 2 ; ⋯ ; x 𝐷 ] x = [x_1;x_2;⋯;x_𝐷] x=[x1;x2;;xD] 来表示这组输入,并用净输入(Net Input) z ∈ R z \in \mathbb{R} zR 表示一个神经元所获得的输入信号 x x x 的加权和:

z = ∑ d = 1 D w d x d + b = w ⊤ x + b z = \sum_{d=1}^{D} w_{d}x_{d} + b = w^\top x + b z=d=1Dwdxd+b=wx+b

其中 w = [ w 1 ; w 2 ; ⋯ ; w 𝐷 ] ∈ R D w = [w_1;w_2;⋯;w_𝐷]\in \mathbb{R}^D w=[w1;w2;;wD]RD D D D 维的权重矩阵, b ∈ R b \in \mathbb{R} bR 是偏置向量。

以上公式其实就是带有偏置项的线性变换(类似于放射变换),本质上还是属于线形模型。为了转换成非线性模型,我们在净输入 z z z 后添加一个非线性函数 f f f(即激活函数)。

a = f ( z ) a = f(z) a=f(z)

由此,典型的神经元结构如下所示:
典型的神经元架构

激活函数性质

为了增强网络的表示能力和学习能力,激活函数需要具备以下几点性质:

  1. 连续并可导(允许少数点上不可导)的非线性函数。可导的激活函数 可以直接利用数值优化的方法来学习网络参数。
  2. 激活函数及其导函数要尽可能的简单,有利于提高网络计算效率。
  3. 激活函数的导函数的值域要在一个合适的区间内,不能太大也不能太小,否则会影响训练的效率和稳定性.

Sigmoid 型函数

Sigmoid 型函数是指一类 S 型曲线函数,为两端饱和函数。常用的 Sigmoid 型函数有 Logistic 函数和 Tanh 函数。

相关数学知识: 对于函数 f ( x ) f(x) f(x),若 x → − ∞ x \to −\infty x 时,其导数 f ′ → 0 {f}'\to 0 f0,则称其为左饱和。若 x → + ∞ x \to +\infty x+ 时,其导数 f ′ → 0 {f}'\to 0 f0,则称其为右饱和。当同时满足左、右饱和时,就称为两端饱和。

Sigmoid 函数

对于一个定义域在 R \mathbb{R} R 中的输入,sigmoid 函数将输入变换为区间 (0, 1) 上的输出(sigmoid 函数常记作 σ ( x ) \sigma(x) σ(x)):

σ ( x ) = 1 1 + e x p ( − x ) \sigma(x) = \frac{1}{1 + exp(-x)} σ(x)=1+exp(x)1

sigmoid 函数的导数公式如下所示:

d d x sigmoid ( x ) = e x p ( − x ) ( 1 + e x p ( − x ) ) 2 = sigmoid ( x ) ( 1 − sigmoid ( x ) ) \frac{\mathrm{d} }{\mathrm{d} x}\text{sigmoid}(x) = \frac{exp(-x)}{(1+exp(-x))^2} = \text{sigmoid}(x)(1 - \text{sigmoid}(x)) dxdsigmoid(x)=(1+exp(x))2exp(x)=sigmoid(x)(1sigmoid(x))

sigmoid 函数及其导数图像如下所示:

sigmoid 函数及其导数图像

注意,当输入为 0 时,sigmoid 函数的导数达到最大值 0.25; 而输入在任一方向上越远离 0 点时,导数越接近 0

sigmoid 函数在隐藏层中已经较少使用,其被更简单、更容易训练的 ReLU 激活函数所替代。

当我们想要输出二分类或多分类、多标签问题的概率时,sigmoid 可用作模型最后一层的激活函数。下表总结了常见问题类型的最后一层激活和损失函数。

问题类型最后一层激活损失函数
二分类问题(binary)sigmoidsigmoid + nn.BCELoss(): 模型最后一层需要经过 torch.sigmoid 函数
多分类、单标签问题(Multiclass)softmaxnn.CrossEntropyLoss(): 无需手动做 softmax
多分类、多标签问题(Multilabel)sigmoidsigmoid + nn.BCELoss(): 模型最后一层需要经过 sigmoid 函数

nn.BCEWithLogitsLoss() 函数等效于 sigmoid + nn.BCELoss

Tanh 函数

Tanh(双曲正切)函数也是一种 Sigmoid 型函数,可以看作放大并平移 Sigmoid 函数,其能将其输入压缩转换到区间 (-1, 1) 上。公式如下所示:

tanh ( x ) = 2 σ ( 2 x ) − 1 \text{tanh}(x) = 2\sigma(2x) - 1 tanh(x)=2σ(2x)1

Sigmoid 函数和 Tanh 函数曲线如下图所示:

Logistic函数和Tanh函数

两种激活函数实现和可视化代码如下所示:

# example plot for the sigmoid activation function
from math import exp
from matplotlib import pyplot
import matplotlib.pyplot as plt

# sigmoid activation function
def sigmoid(x):
    """1.0 / (1.0 + exp(-x))
    """
    return 1.0 / (1.0 + exp(-x))

def tanh(x):
    """2 * sigmoid(2*x) - 1
    (e^x – e^-x) / (e^x + e^-x)
    """
    # return (exp(x) - exp(-x)) / (exp(x) + exp(-x))
    return 2 * sigmoid(2*x) - 1

def relu(x):
    return max(0, x)

def gradient_relu(x):
    if x < 0:
        return 0
    else:
        return 1

def gradient_sigmoid(x):
    """sigmoid(x)(1−sigmoid(x))
    """
    a = sigmoid(x)
    b = 1 - a
    return a*b

# 1, define input data
inputs = [x for x in range(-10, 11)]

# 2, calculate outputs
outputs = [sigmoid(x) for x in inputs]
outputs2 = [tanh(x) for x in inputs]

# 3, plot sigmoid and tanh function curve
plt.figure(dpi=90) # dpi 设置
plt.style.use('ggplot') # 主题设置

plt.subplot(1, 2, 1) # 绘制子图
plt.plot(inputs, outputs, label='sigmoid')
plt.plot(inputs, outputs2, label='tanh')


plt.xlabel("x") # 设置 x 轴标签
plt.ylabel("y")
plt.title('sigmoid and tanh') # 折线图标题
plt.legend()
plt.show()

另外一种 Logistic 函数和 Tanh 函数的形状对比图:

Logistic 函数和 Tanh 函数的形状

来源: 《神经网络与深度学习》图4.2。

Logistic 函数和 Tanh 函数都是 Sigmoid 型函数,具有饱和性,但是计算开销较大。因为这两个函数都是在中间(0 附近)近似线性,两端饱和。因此,这两个函数可以通过分段函数来近似。

ReLU 函数及其变体

ReLU 函数

ReLU(Rectified Linear Unit,修正线性单元),是目前深度神经网络中最经常使用的激活函数。公式如下所示:

R e L U ( x ) = m a x { 0 , x } = { x x ⩾ 0 0 x < 0 ReLU(x) = max\{0,x\} = \left\{\begin{matrix} x & x\geqslant 0 \\ 0 & x< 0 \end{matrix}\right. ReLU(x)=max{0,x}={x0x0x<0

以上公式通俗理解就是,ReLU 函数仅保留正元素并丢弃所有负元素。

1,优点:

  • ReLU 激活函数计算简单
  • 具有很好的稀疏性,大约 50% 的神经元会处于激活状态。
  • 函数在 x > 0 x > 0 x>0 时导数为 1 的性质(左饱和函数),在一定程度上缓解了神经网络的梯度消失问题,加速梯度下降的收敛速度。

相关生物知识: 人脑中在同一时刻大概只有 1% ∼ 4% 的神经元处于活跃 状态。

2,缺点:

  • ReLU 函数的输出是非零中心化的,给后一层的神经网络引入偏置偏移,会影响梯度下降的效率
  • ReLU 神经元在训练时比较容易“死亡”。如果神经元参数值在一次不恰当的更新后,其值小于 0,那么这个神经元自身参数的梯度永远都会是 0,在以后的训练过程中永远不能被激活,这种现象被称作“死区”。

ReLU 激活函数的代码定义如下:

# pytorch 框架对应函数: nn.ReLU(inplace=True)
def relu(x):
    return max(0, x)

ReLU 激活函数及其函数梯度图如下所示:

relu_and_gradient_curve

Leaky ReLU/PReLU/ELU/Softplus 函数

1,Leaky ReLU 函数: 为了缓解“死区”现象,研究者将 ReLU 函数中 x < 0 x < 0 x<0 的部分调整为 γ ⋅ x \gamma \cdot x γx, 其中 γ \gamma γ 常设置为 0.01 或 0.001 数量级的较小正数。这种新型的激活函数被称作带泄露的 ReLU(Leaky ReLU)。

Leaky ReLU ( x ) = m a x ( 0 , 𝑥 ) + γ   m i n ( 0 , x ) = { x x ⩾ 0 γ ⋅ x x < 0 \text{Leaky ReLU}(x) = max(0, 𝑥) + \gamma\ min(0, x) = \left\{\begin{matrix} x & x\geqslant 0 \\ \gamma \cdot x & x< 0 \end{matrix}\right. Leaky ReLU(x)=max(0,x)+γ min(0,x)={xγxx0x<0

2,PReLU 函数: 为了解决 Leaky ReLU 中超参数 γ \gamma γ 不易设定的问题,有研究者提出了参数化 ReLU(Parametric ReLU,PReLU)。参数化 ReLU 直接将 γ \gamma γ 也作为一个网络中可学习的变量融入模型的整体训练过程。对于第 i i i 个神经元,PReLU 的 定义为:

Leaky ReLU ( x ) = m a x ( 0 , 𝑥 ) + γ i   m i n ( 0 , x ) = { x x ⩾ 0 γ i ⋅ x x < 0 \text{Leaky ReLU}(x) = max(0, 𝑥) + \gamma_{i}\ min(0, x) = \left\{\begin{matrix} x & x\geqslant 0 \\ \gamma_{i} \cdot x & x< 0 \end{matrix}\right. Leaky ReLU(x)=max(0,x)+γi min(0,x)={xγixx0x<0

3,ELU 函数: 2016 年,Clevert 等人提出了 ELU(Exponential Linear Unit,指数线性单元),它是一个近似的零中心化的非线性函数。ELU 具备 ReLU 函数的优点,同时也解决了 ReLU 函数的“死区”问题,但是,其指数操作也增加了计算量。 γ ≥ 0 \gamma ≥ 0 γ0 是一个超参数,决定 x ≤ 0 x ≤ 0 x0 时的饱和曲线,并调整输出均值在 0 附近。ELU 定义为:

Leaky ReLU ( x ) = m a x ( 0 , 𝑥 ) + m i n ( 0 , γ ( e x p ( x ) − 1 ) = { x x ⩾ 0 γ ( e x p ( x ) − 1 ) x < 0 \text{Leaky ReLU}(x) = max(0, 𝑥) + min(0, \gamma(exp(x) - 1) = \left\{\begin{matrix} x & x\geqslant 0 \\ \gamma(exp(x) - 1) & x< 0 \end{matrix}\right. Leaky ReLU(x)=max(0,x)+min(0,γ(exp(x)1)={xγ(exp(x)1)x0x<0

4,Softplus 函数: Softplus 函数其导数刚好是 Logistic 函数.Softplus 函数虽然也具有单侧抑制、宽 兴奋边界的特性,却没有稀疏激活性。Softplus 定义为:

Softplus ( x ) = l o g ( 1 + e x p ( x ) ) \text{Softplus}(x) = log(1 + exp(x)) Softplus(x)=log(1+exp(x))

注意: ReLU 函数变体有很多,但是实际模型当中使用最多的还是 ReLU 函数本身

ReLU、Leaky ReLU、ELU 以及 Softplus 函数示意图如下图所示:

relu_more

Swish 函数

Swish 函数[Ramachandran et al., 2017] 是一种自门控(Self-Gated)激活 函数,定义为

swish ( x ) = x σ ( β x ) \text{swish}(x) = x\sigma(\beta x) swish(x)=xσ(βx)

其中 σ ( ⋅ ) \sigma(\cdot) σ() 为 Logistic 函数, β \beta β 为可学习的参数或一个固定超参数。 σ ( ⋅ ) ∈ ( 0 , 1 ) \sigma(\cdot) \in (0, 1) σ()(0,1) 可以看作一种软性的门控机制。当 σ ( β x ) \sigma(\beta x) σ(βx) 接近于 1 时,门处于“开”状态,激活函数的输出近似于 x x x 本身;当 σ ( β x ) \sigma(\beta x) σ(βx) 接近于 0 时,门的状态为“关”,激活函数的输出近似于 0

Swish 函数代码定义如下,结合前面的画曲线代码,可得 Swish 函数的示例图。

def swish(x, beta = 0):
    """beta 是需要手动设置的参数"""
    return x * sigmoid(beta*x)

Swish 函数

Swish 函数可以看作线性函数和 ReLU 函数之间的非线性插值函数,其程度由参数 β \beta β 控制

激活函数总结

常用的激活函数包括 ReLU 函数、sigmoid 函数和 tanh 函数。下表汇总比较了几个激活函数的属性:

activation_function

参考资料

  1. Pytorch分类问题中的交叉熵损失函数使用
  2. 《解析卷积神经网络-第8章》
  3. How to Choose an Activation Function for Deep Learning

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

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

相关文章

纸牌游戏红心大战拱猪设计(C语言)

纸牌游戏红心大战设计 ( C语言 ) 红心大战是Windows的经典游戏&#xff0c;中国式的红心是拱猪游戏&#xff0c;加入了方块J羊和梅花10 变压器&#xff08;即俗称加倍&#xff09;。加大了游戏难度和趣味性。 试制此游戏是准备编制网络版拱猪或红心大战的基础框架&#xff0c…

Linux下时间处理相关函数

Linux下时间处理相关函数 1 .系统时间和 RTC 时间 Linux 系统下包含两个时间&#xff1a; 系统时间和 RTC 时间。   系统时间&#xff1a; 是由主芯片的定时器进行维护的时间&#xff0c; 一般情况下都会选择芯片上最高精度的定时器作为系统时间的定时基准&#xff0c; 以避…

深度聚类方法之对比聚类(Contrastive Clustering,CC)

1.参考文献 《Contrastive Clustering》 2.深度聚类方法 深度聚类方法大致分为以下几类&#xff1a; ①分阶段&#xff1a;使用深度网络进行对比学习or自动编码器完成表征学习(目的&#xff1a;把同类样本集中到一起&#xff0c;拉开不同类样本的聚类)&#xff0c;然后使用聚…

【6】SCI易中期刊推荐——人工智能神经科学机器人学(中科院3区)

🚀🚀🚀NEW!!!SCI易中期刊推荐栏目来啦 ~ 📚🍀 SCI即《科学引文索引》(Science Citation Index, SCI),是1961年由美国科学信息研究所(Institute for Scientific Information, ISI)创办的文献检索工具,创始人是美国著名情报专家尤金加菲尔德(Eugene Garfield…

头条某星图 登录协议解析2023/1/9

文章目录 文章目录 文章目录前言网址加密字段请求逻辑生成s_v_web_id账号密码的加密方式fp滑块登录成功前言 可以关注我哟,一起学习,主页有更多练习例子 如果哪个练习我没有写清楚,可以留言我会补充 如果有加密的网站可以留言发给我,一起学习共享学习路程 如侵权,联系我删…

【JavaGuide面试总结】Java高级特性基础篇·下

【JavaGuide面试总结】Java高级特性基础篇下1.什么是序列化?什么是反序列化?2.序列化协议对应于 TCP/IP 4 层模型的哪一层&#xff1f;3.常见序列化协议有哪些&#xff1f;4.为什么不推荐使用 JDK 自带的序列化&#xff1f;5.如果有些字段不想进行序列化怎么办&#xff1f;6.…

梦幻西游H5私服服务端超详细图文架设教程

想体验经典Q版西游霸服高兴吗&#xff1f;想体验满级VIP的尊贵吗&#xff1f;想体验一招秒杀的痛快吗&#xff1f;各种极品配备、翅膀、宠物统统给你&#xff0c;就在梦幻西游&#xff01;本文解说梦幻西游H5游戏的架设教程&#xff0c;想钻研H5游戏如何实现&#xff0c;体验游…

基于Python实现的车辆检测计数+车牌定位+车牌识别的融合技术,使用pytorch深度学习框架

车辆检测计数车牌检测与车牌识别 介绍 基于pytorch深度学习框架&#xff0c;实用开源模型yolov4实现模板检测与yolov5实现车牌检测与LPRNet实现车牌检测 完整代码下载地址&#xff1a;基于Python实现的车辆检测计数车牌定位车牌识别的融合技术 基于win10系统&#xff0c;实用…

JSP SSM加班管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 JSP SSM加班管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和 数据库&#xff0c;系统主要采用B/…

python数据分析及可视化(十九)Power BI中M函数的使用、数据建模、度量值、DAX

M函数 用鼠标操作的步骤背后的逻辑都是M函数&#xff0c;在编辑器里都会有体现出来&#xff0c;选中左侧的表名称&#xff0c;点击右键&#xff0c;选择高级编辑器&#xff0c;就会进入到高级编辑器界面&#xff0c;里面会显示每一步的操作步骤。 M函数基本规范 M函数对大小写…

常用JavaScript库

1、前端工具类库 jQuery是一个快速、小型且功能丰富的 JavaScript 库&#xff0c;它使HTML文档遍历和操作、事件处理、动画和 AJAX 之类的事情变得更加简单。当时jQuery库不但简化了代码&#xff0c;而且提供出色的跨浏览器支持&#xff0c;其极大的提高了 Web 开发人员的工作效…

sqlserver连接时报错 [IM002] [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序

电脑重新安装系统了&#xff0c;当我再次链接数据库时 &#xff0c;发现报错 [IM002] [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序很明显是少了驱动&#xff0c;只要安装了Microsoft ODBC Driver 11 for SQL Server这个驱动就可以了。 没安装驱动…

实时性升至秒级!飞桨PaddleSpeech赋能金融双录业务走向智能化

听说IT圈十个人里有九个是男性开发者&#xff0c;女生并不多&#xff0c;陈雪儿可以算是这个群体中独特的存在。 作为杭州谐云科技有限公司&#xff08;简称谐云&#xff09;智能边缘团队的AI技术专家&#xff0c;陈雪儿带领团队历经一年半研发的“金融双录智能质检系统”&…

功率放大器怎么选择型号的(功率放大器选购技巧)

很多电子工程师虽然频繁使用功率放大器&#xff0c;但是对于功率放大器的选择和选购技巧还是不清楚&#xff0c;下面就来为大家介绍一下如何挑选合适的功率放大器型号。 一般情况下&#xff0c;功率放大器购买决策的主要考虑因素是输出功率、线性度、频率范围和VSWR失配容限。放…

网络和VPC简单介绍

网络和VPC 传统网络 传统网络从一开始就是一个分布式的网络&#xff0c;没有中心的控制节点&#xff0c;网路中的各个设备之间通过口口相传的方式学习网络的可达信息&#xff0c;由每台设备自己决定要如何转发&#xff0c;这直接导致了没有整体观念&#xff0c;不能从整个网络…

免费PDF转换器软件有哪些?不妨试试这几款

在工作中和学习中很多小伙伴都有转换文件的需求&#xff0c;例如将PDF文件转换为word、excel、PPT、图片等类型的文件&#xff0c;这时候我们就需要一款专业且高效率的PDF转换器来帮助我们处理文件&#xff0c;那么转换器的性价比也是我们需要考虑的&#xff0c;那么免费PDF转换…

内存管理系统

文章目录前言前置知识makefile位图内存池规划实验操作实验一实验二实验三实验四实验五前言 博客记录《操作系统真象还原》第八章实验的操作~ 实验环境&#xff1a;ubuntu18.04VMware &#xff0c; Bochs下载安装 实验内容&#xff1a; 实现 assert 断言。实现字符串操作函数…

合并表记录 C语言实现

合并表记录 描述 数据表记录包含表索引index和数值value&#xff08;int范围的正整数&#xff09;&#xff0c;请对表索引相同的记录进行合并&#xff0c;即将相同索引的数值进行求和运算&#xff0c;输出按照index值升序进行输出。 提示: 0 < index < 11111111 1 <…

产品经理的技术脑:产品是如何工作的?

产品在web中的工作流程如图&#xff1a; 浏览器工作流程&#xff08;客户端&#xff09;&#xff1a; 用户访问网站时输入的URL&#xff0c;浏览器是无法根据输入的URL找到web服务器的&#xff0c;需要通过IP地址找到web服务器&#xff0c;因此&#xff0c;浏览器对用户URL的处…

6.5 工具-ElasticSearch

目录 6.5.1 ElasticSearch概述 6.5.1.1 什么是ElasticSearch 6.5.1.2 Lucene 6.5.1.3 Elastic Stack 6.5.1.4 Solr与ES 6.5.1.4.1 背景 6.5.1.4.2 区别 6.5.1.5 正向索引与倒排索引 6.5.1.5.1 正向索引 6.5.1.5.2 倒排索引 6.5.2 Elasticsearch安装 6.5.3 Elastics…