深度学习 - 激活函数

深度学习 - 激活函数

激活函数(Activation Function)是神经网络中的关键组件,用于引入非线性,使得网络能够学习和表示复杂的模式和关系。以下是几种常见的激活函数及其详细解释:

1. Sigmoid(S型激活函数)

作用过程
Sigmoid 函数将输入映射到 (0, 1) 之间。公式为:
σ ( x ) = 1 1 + e − x \sigma(x) = \frac{1}{1 + e^{-x}} σ(x)=1+ex1
Sigmoid 将大负数映射到接近 0,大正数映射到接近 1,中间值映射到 0.5 附近。

优点

  • 输出在 (0, 1) 之间,有明确的边界,适合处理概率问题。
  • 平滑且连续,易于计算导数。

缺点

  • 梯度消失问题:当输入非常大或非常小时,梯度接近零,导致参数更新缓慢。
  • 输出非零均值:输出范围是正数,导致后续层的输入非零均值,这可能导致训练不稳定。

适用场景

  • 输出需要概率的场景,如二分类问题的输出层。

实际案例
在二分类问题中,例如垃圾邮件分类,Sigmoid 函数常用于输出层,将神经网络的输出映射为概率值。

代码实现

import torch
import torch.nn as nn
import matplotlib.pyplot as pltx = torch.linspace(-10, 10, 100)
sigmoid = nn.Sigmoid()
y = sigmoid(x)plt.plot(x.numpy(), y.detach().numpy())
plt.title("Sigmoid Activation Function")
plt.xlabel("Input")
plt.ylabel("Output")
plt.grid(True)
plt.show()
2. ReLU(Rectified Linear Unit)

作用过程
ReLU 函数将输入中小于零的部分置为零,其余部分保持不变。公式为:
ReLU ( x ) = max ⁡ ( 0 , x ) \text{ReLU}(x) = \max(0, x) ReLU(x)=max(0,x)

优点

  • 计算简单且高效,只需比较和赋值。
  • 缓解梯度消失问题:只要输入为正,梯度恒为 1,确保反向传播时梯度不会消失。

缺点

  • Dying ReLU 问题:如果输入始终为负,神经元将永远不激活,导致部分神经元永远不起作用。

适用场景

  • 隐藏层的首选激活函数,广泛应用于各类神经网络。

实际案例
在图像分类任务中,ReLU 常用于卷积神经网络(CNN)的隐藏层,因其高效的计算特性。

代码实现

relu = nn.ReLU()
y = relu(x)plt.plot(x.numpy(), y.detach().numpy())
plt.title("ReLU Activation Function")
plt.xlabel("Input")
plt.ylabel("Output")
plt.grid(True)
plt.show()
3. Leaky ReLU

作用过程
Leaky ReLU 在 ReLU 的基础上引入了一个小的斜率,使得负输入也有一个小的输出,公式为:
Leaky ReLU ( x ) = max ⁡ ( 0.01 x , x ) \text{Leaky ReLU}(x) = \max(0.01x, x) Leaky ReLU(x)=max(0.01x,x)

优点

  • 解决 Dying ReLU 问题:负输入仍有非零输出,确保神经元不完全死亡。

缺点

  • 引入了额外的参数,计算复杂度稍高于 ReLU。

适用场景

  • 需要避免 Dying ReLU 的场景,尤其是在深度神经网络中。

实际案例
在深度卷积神经网络(如 ResNet)中,Leaky ReLU 可以用于各层之间,以防止神经元失活。

代码实现

leaky_relu = nn.LeakyReLU(0.01)
y = leaky_relu(x)plt.plot(x.numpy(), y.detach().numpy())
plt.title("Leaky ReLU Activation Function")
plt.xlabel("Input")
plt.ylabel("Output")
plt.grid(True)
plt.show()
4. Tanh(双曲正切函数)

作用过程
Tanh 函数将输入映射到 (-1, 1) 之间,公式为:
tanh ⁡ ( x ) = e x − e − x e x + e − x \tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} tanh(x)=ex+exexex

优点

  • 输出零均值:输出在 (-1, 1) 之间,有助于收敛速度的提升。

缺点

  • 梯度消失问题:与 Sigmoid 类似,当输入非常大或非常小时,梯度接近零。

适用场景

  • 希望输出有负值的情况,例如 RNN 的隐藏层。

实际案例
在自然语言处理任务中,Tanh 常用于 RNN 的隐藏层,因为其输出具有零均值特性,有助于序列数据的建模。

代码实现

tanh = nn.Tanh()
y = tanh(x)plt.plot(x.numpy(), y.detach().numpy())
plt.title("Tanh Activation Function")
plt.xlabel("Input")
plt.ylabel("Output")
plt.grid(True)
plt.show()
5. Softmax

作用过程
Softmax 函数将输入转换为概率分布,总和为 1,适用于多分类问题,公式为:
Softmax ( x i ) = e x i ∑ j e x j \text{Softmax}(x_i) = \frac{e^{x_i}}{\sum_{j} e^{x_j}} Softmax(xi)=jexjexi

优点

  • 输出为概率分布,适合多分类任务。
  • 保证输出和为 1,便于概率解释。

缺点

  • 数值不稳定:对于大数值输入,可能导致溢出。

适用场景

  • 多分类问题的输出层,例如图像分类任务中的类别概率预测。

实际案例
在 ImageNet 图像分类任务中,Softmax 常用于最后一层,将网络输出转换为各类别的概率。

代码实现

softmax = nn.Softmax(dim=0)
y = softmax(x)plt.plot(x.numpy(), y.detach().numpy())
plt.title("Softmax Activation Function")
plt.xlabel("Input")
plt.ylabel("Output")
plt.grid(True)
plt.show()

常见问题及解决方案

  1. 梯度消失

    • 问题:当激活函数的梯度趋近于零时,神经网络的训练速度变得极慢。
    • 解决方案:使用 ReLU 或其变体(如 Leaky ReLU)来缓解梯度消失问题。
  2. Dying ReLU

    • 问题:ReLU 中的一些神经元可能会永久性地输出零。
    • 解决方案:使用 Leaky ReLU 或 Parametric ReLU 来避免神经元死亡。
  3. 数值不稳定

    • 问题:在计算 Softmax 或其他激活函数时,可能会出现数值溢出或下溢。
    • 解决方案:在计算 Softmax 时使用数值稳定技巧,例如减去输入中的最大值。
  4. 训练不稳定

    • 问题:某些激活函数可能导致训练过程中的不稳定性。
    • 解决方案:对输入数据进行标准化,或在网络中使用 Batch Normalization。
  5. 慢收敛

    • 问题:激活函数的选择可能导致训练过程收敛缓慢。
    • 解决方案:尝试不同的激活函数,并调整学习率和优化器参数。

激活函数汇总

激活函数汇总表格
激活函数公式优点缺点适用场景
Sigmoid σ ( x ) = 1 1 + e − x \sigma(x) = \frac{1}{1 + e^{-x}} σ(x)=1+ex1输出在 (0, 1) 之间,适合处理概率问题,平滑且连续,易于计算导数梯度消失问题,输出非零均值,导致训练不稳定输出需要概率的场景,如二分类问题的输出层
ReLU ReLU ( x ) = max ⁡ ( 0 , x ) \text{ReLU}(x) = \max(0, x) ReLU(x)=max(0,x)计算简单且高效,缓解梯度消失问题Dying ReLU 问题,如果输入始终为负,神经元将永远不激活隐藏层的首选激活函数,广泛应用于各类神经网络
Leaky ReLU Leaky ReLU ( x ) = max ⁡ ( 0.01 x , x ) \text{Leaky ReLU}(x) = \max(0.01x, x) Leaky ReLU(x)=max(0.01x,x)解决 Dying ReLU 问题,负输入仍有非零输出引入了额外的参数,计算复杂度稍高于 ReLU需要避免 Dying ReLU 的场景,尤其是在深度神经网络中
Tanh tanh ⁡ ( x ) = e x − e − x e x + e − x \tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} tanh(x)=ex+exexex输出零均值,有助于收敛速度的提升梯度消失问题,与 Sigmoid 类似,当输入非常大或非常小时,梯度接近零希望输出有负值的情况,例如 RNN 的隐藏层
Softmax Softmax ( x i ) = e x i ∑ j e x j \text{Softmax}(x_i) = \frac{e^{x_i}}{\sum_{j} e^{x_j}} Softmax(xi)=jexjexi输出为概率分布,适合多分类任务,保证输出和为 1,便于概率解释数值不稳定,对于大数值输入,可能导致溢出多分类问题的输出层,例如图像分类任务中的类别概率预测
具体效果及常见问题总结
激活函数具体效果常见问题及解决方案
Sigmoid训练速度较慢,梯度消失问题显著,适用于输出层概率预测。梯度消失:使用 ReLU 或其他激活函数。训练不稳定:标准化输入数据。慢收敛:调整学习率。
ReLU通常能提供较好的训练效果和模型性能,但可能会遇到 Dying ReLU 问题。Dying ReLU:使用 Leaky ReLU 或 Parametric ReLU。输出不平衡:使用 Batch Normalization。过拟合:应用正则化技术。
Leaky ReLU有效解决 Dying ReLU 问题,训练更稳定,适用于深层网络。斜率选择:通过实验选择合适的负斜率。过拟合:应用正则化。不稳定梯度:使用 Batch Normalization。
Tanh比 Sigmoid 更常用,输出零均值有助于收敛,但深层网络中仍可能遇到梯度消失问题。梯度消失:使用 ReLU 或其他激活函数。训练不稳定:标准化输入数据。慢收敛:调整学习率。
Softmax多分类任务中非常有效,将输出转换为概率分布,但需要注意数值稳定性问题。数值不稳定:使用数值稳定技巧如减去最大值。梯度消失:减少层数或使用其他激活函数。过拟合:应用正则化技术。
激活函数全称
激活函数英文全称中文翻译
SigmoidSigmoid Activation FunctionS型激活函数
ReLURectified Linear Unit修正线性单元
Leaky ReLULeaky Rectified Linear Unit带泄露的修正线性单元
TanhHyperbolic Tangent Function双曲正切函数
SoftmaxSoftmax Activation FunctionSoftmax激活函数

更多问题咨询

CosAI

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

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

相关文章

Playwright框架入门

自从2023年底playwright框架火起来之后,很多小伙伴咨询我们这个框架,甚至问我们什么时候出这个课程. 这步这个课程在我们千呼万唤中出来了.具体的课程大纲和试听可以联系下方二维码获取. 今天给大家分享一下playwright的安装和一些常用API,为后续的学习做好准备工作. Playwrig…

Unit9

Unit9 gene 基因,生产,类型 genetic genius ingenious generate generation degenerate genuine generous generosity gender genre homogeneous time 时间 time timely timer first-timer temporary temporarily tempo contemporary dra 戏剧…

欧智通恒玄BES2600W基于Openharmony v3.0的分布式软总线测试过程记录

恒玄BES2600W SoC 的欧智通的单板基于Openharmony v3.0的底座,其测试的样例代码是基于恒玄公司开发的轻量带屏显示产品样例代码,主要包括图形、软总线等特性产品的开发。 基础介绍: ​ L0的系统基于Liteos-m的m内核,网络使用lwi…

计算机网络--传输层

计算机网络--计算机网络概念 计算机网络--物理层 计算机网络--数据链路层 计算机网络--网络层 计算机网络--传输层 计算机网络--应用层 1. 概述 1.1 传输层的意义 网络层可以把数据从一个主机传送到另一个主机,但是没有和进程建立联系。 传输层就是讲进程和…

【中间件系列】浅析redis是否适合做消息队列

文章目录 一、简单的list消息队列1.命令示例2.伪代码示例3.方案优劣 二、Pub/Sub发布订阅1.消息丢失2.消息堆积 三、相对成熟的Stream1.redis命令介绍2.多消费者组测试3.Stream会持久化吗?4.消息堆积如何解决? 总结 用redis也是比较久了,并且…

Unity3d简单对话系统的实现——使用Dialogue editor完成对话系统

目录 前言 使用方法 1.下载dialogue editor 2.新建空物体 3.对对话内容进行编辑 4.对话画布建立 5.触发对话框代码 结束语 前言 今天是坚持写博客的第21天,很高兴自己可以坚持,也希望能与大家一起进步。我们今天来看unity3d当中的一个可以轻松实…

Feign是如何发送http请求的

1、接口定义 首先,开发者使用Feign提供的注解(如FeignClient)定义接口,并在接口中定义HTTP请求的方法,这些方法将映射到远程服务的具体HTTP请求。 2、动态代理 当应用启动时,Feign会通过动态代理和反射机…

Go select 语句使用场景

1. select介绍 select 是 Go 语言中的一种控制结构,用于在多个通信操作中选择一个可执行的操作。它可以协调多个 channel 的读写操作,使得我们能够在多个 channel 中进行非阻塞的数据传输、同步和控制。 基本语法: select {case communica…

Python中的函数式编程特性深入探讨

Python中的函数式编程特性深入探讨 Python,作为一种多范式编程语言,不仅支持面向对象编程(OOP),同样也对函数式编程(FP)提供了良好的支持。函数式编程是一种编程范式,它将计算机程序看作是一系列函数的求值,并避免使用可变状态和共享状态。本文将深入探讨Python中的函…

数据赋能(112)——体系:监控数据采集——影响因素、直接作用、主要特征

影响因素 影响监控数据采集的主要影响因素如下: 采样率:采样率是指采集数据的频率。采样率决定了监控的实时性与精确度,一般来说,采样率越高,监控的实时性就越高,精确度也越高。但是,过高的采…

2024 cicsn SuperHeap

文章目录 参考沙箱存在protobuf逆向buy_booksee_bookreturn_bookedit_booksearch_book 思路exp 参考 https://hakuya.work/post/7 https://akaieurus.github.io/2024/05/20/2024%E5%9B%BD%E8%B5%9B%E5%88%9D%E8%B5%9Bpwn-wp/#SuperHeap https://blog.csdn.net/m0_63437215/art…

TSINGSEE青犀视频汇聚机房动环智能监控方案,提升机房安全稳定性

一、背景需求 在当今信息化时代,机房作为数据中心的核心设施,承载着重要的网络设备和数据存储设备,其正常运行对于企业的数据安全和业务连续性至关重要。机房内部设备众多,且运行过程中涉及大量的数据交换和传输。一旦发生安全事…

java 类加载器及双亲委派机制

1、 有哪些类加载器 还有自定义类加载器。最上面的为父加载器,加载类的路径是不一样的 2、 什么是双亲委派机制: 1. 加载时,先去找父类,父类无法加载时,在由儿子加载 3、 为什么用双亲委派: 沙箱安全&…

【devops】 Bytebase 一站式开源 数据库DevOps平台

初识 Bytebase 1、安装 安装地址 https://www.bytebase.com/docs/get-started/self-host/#docker 安装指令 docker run --init \--name bytebase \--publish 8080:8080 --pull always \--volume ~/.bytebase/data:/var/opt/bytebase \bytebase/bytebase:2.18.02、登录-dashboa…

OlSoul系统调校程序v2024.06.05

软件介绍 OlSoul是一款能够适配用于Win各个系统的系统调校软件,OlSoul内置有众多调校功能可以直接使用,如有启用无线网络功能、启用打印机功能、系统快速休眠与休眠开关、快捷方式小箭头去除功能等,具体的调校功能多达几十项,可自…

Android SplashActivity runs twice at launch on Android 13 API 33

运行写好的 Android App 到自己手机上(显示Xiaomi 23013RK75C Android 13 API 33), 通过 Logcat 发现第一次安装运行时启动页面的 onCreate 被调用两次,第一次 onCreate 函数中的 savedInstanceState 值为空,第二次不…

【Python】selenium使用find_element时解决【StaleElementReferenceException】问题的方法

StaleElementReferenceException 是 Selenium WebDriver 中的一种异常,通常在元素与当前页面的状态不同步时抛出,比如页面已经刷新或导航到另一个页面,但是尝试操作的元素引用仍然是旧页面上的元素。 以下是一些解决 StaleElementReferenceE…

RT-DETR 详解之 Efficient Hybrid Encoder

在先前的博文中,博主介绍了RT-DETR在官方代码与YOLOv8集成程序中的训练与推理过程,接下来,博主将通过代码调试的方式来梳理RT-DETR的整个过程。 整体结构 RT-DETR的代码调试大家可以参考博主这篇文章: 在梳理整个代码之前&…

几何关系运算处理

1. 判断点在线的左边还是右边 要判断一个坐标点在直线的左侧还是右侧,可以使用向量叉积。具体来说,对于给定的直线和点,我们可以计算点到直线的向量与直线的方向向量的叉积。叉积的符号可以用于判断点的位置关系: 如果叉积为正&…

SpringBoot高手之路-原理篇

文章目录 JDK动态代理 JDK动态代理