【DL经典回顾】激活函数大汇总(五)(Hard Sigmoid Hard Tanh附代码和详细公式)

激活函数大汇总(五)(Hard Sigmoid & Hard Tanh附代码和详细公式)

更多激活函数见激活函数大汇总列表

一、引言

欢迎来到我们深入探索神经网络核心组成部分——激活函数的系列博客。在人工智能的世界里,激活函数扮演着不可或缺的角色,它们决定着神经元的输出,并且影响着网络的学习能力与表现力。鉴于激活函数的重要性和多样性,我们将通过几篇文章的形式,本篇详细介绍两种激活函数,旨在帮助读者深入了解各种激活函数的特点、应用场景及其对模型性能的影响。

在接下来的文章中,我们将逐一探讨各种激活函数,从经典到最新的研究成果。

限于笔者水平,对于本博客存在的纰漏和错误,欢迎大家留言指正,我将不断更新。

二、Hard Sigmoid

Hard Sigmoid激活函数是Sigmoid激活函数的一个简化版本,旨在提供一个计算上更高效的非线性函数。通过近似Sigmoid函数的形状,Hard Sigmoid在保持一定非线性的同时,简化了计算过程,特别适用于计算资源受限的环境。

1. 数学定义

Hard Sigmoid函数通常定义为:

HardSigmoid ⁡ ( x ) = max ⁡ ( 0 , min ⁡ ( 1 , x a + 1 2 ) ) \operatorname{HardSigmoid}(x)=\max \left(0, \min \left(1, \frac{x}{a}+\frac{1}{2}\right)\right) HardSigmoid(x)=max(0,min(1,ax+21))
其中, x x x是函数的输入, a a a是一个控制函数斜率的正常数(在很多实现中, a a a常取值为5)。这个定义确保了Hard Sigmoid的输出值被限制在0和1之间。
在这里插入图片描述

2. 函数特性

  • 计算简单:与传统的Sigmoid函数相比,Hard Sigmoid通过线性函数和限制操作简化了计算,减少了计算资源的消耗。
  • 输出限制:Hard Sigmoid的输出被限制在[0, 1]范围内,与Sigmoid函数相似,但是通过一个分段线性函数实现。
  • 近似非线性:尽管Hard Sigmoid是通过分段线性函数实现的,它仍然提供了一种非线性的近似,适用于需要非线性激活但又对计算效率有要求的场景。

3. 导数

Hard Sigmoid函数的导数在其线性部分为常数,具体表达式为:

HardSigmoid ⁡ ′ ( x ) = { 0  if  x ≤ − a 2  or  x ≥ a 2 1 a  if  − a 2 < x < a 2 \operatorname{HardSigmoid}^{\prime}(x)= \begin{cases}0 & \text { if } x \leq-\frac{a}{2} \text { or } x \geq \frac{a}{2} \\ \frac{1}{a} & \text { if }-\frac{a}{2}<x<\frac{a}{2}\end{cases} HardSigmoid(x)={0a1 if x2a or x2a if 2a<x<2a
这表明Hard Sigmoid在输入值绝对值较大时梯度为0,在输入值处于中间区域时梯度为一个固定常数 ( 1 a ) \left(\frac{1}{a}\right) (a1)

4. 使用场景与局限性

使用场景

  • 嵌入式系统和移动设备:在计算资源受限的环境中,如嵌入式系统和移动设备,Hard Sigmoid因其计算效率而被广泛使用。
  • 大规模深度学习训练:在需要快速原型或大规模训练时,Hard Sigmoid可以作为一种计算成本较低的激活函数选项。

局限性

  • 非线性近似:作为Sigmoid函数的近似,Hard Sigmoid不能完全捕捉到Sigmoid的平滑非线性特性,这可能在某些任务中影响模型的性能。
  • 梯度消失:尽管Hard Sigmoid在其线性部分有固定的非零梯度,但在输入值较大或较小时梯度仍然为0,这可能导致梯度消失问题。

Hard Sigmoid激活函数提供了一种在计算资源受限情况下实现快速、有效计算的方法,尽管它牺牲了一些非线性的精确表达。在实际应用中,选择使用Hard Sigmoid还是其他激活函数需根据具体任务的需求和计算资源的可用性来决定。

5.代码实现

import numpy as np

def hard_sigmoid(x):
    """计算Hard Sigmoid激活函数的值。
    
    参数:
    x -- 输入值,可以是一个数值、NumPy数组或者多维数组。
    
    返回:
    Hard Sigmoid激活后的结果。
    """
    return np.clip((x / 5.0) + 0.5, 0, 1)
解读
  • 函数实现:这个hard_sigmoid函数首先将输入x除以5(即(a=5)),然后加上0.5,最后使用np.clip函数将结果限制在0和1之间。这种实现直接对应于Hard Sigmoid函数的数学定义。
  • np.clip的使用np.clip函数用于将数组中的元素限制在给定的一个范围内。在这里,它被用来确保Hard Sigmoid函数的输出值在0和1之间,这符合函数的期望输出范围。
  • 向量化操作:通过使用NumPy,这个实现自然地支持向量化操作,这意味着hard_sigmoid函数可以直接作用于整个NumPy数组,而不需要显式的循环。这在处理大量数据时非常有用,可以显著提高计算效率。
示例使用

下面展示了如何使用hard_sigmoid函数来计算一组输入值的Hard Sigmoid激活:

x = np.array([-5, -2.5, 0, 2.5, 5])
hard_sigmoid_values = hard_sigmoid(x)

print("Hard Sigmoid Values:", hard_sigmoid_values)

这段代码首先定义了一个包含正负值的NumPy数组x,然后使用hard_sigmoid函数计算每个元素的Hard Sigmoid激活值。

三、Hard Tanh

Hard Tanh(Hard Hyperbolic Tangent)激活函数是双曲正切(Tanh)激活函数的一个简化版本,设计为在计算效率和实现简便性方面对原始Tanh函数进行优化。通过对Tanh函数的输出进行近似,Hard Tanh提供了一种在深度学习模型中实现快速非线性激活的方式。

1. 数学定义

Hard Tanh函数通常定义为:

HardTanh ⁡ ( x ) = max ⁡ ( − 1 , min ⁡ ( 1 , x ) ) \operatorname{HardTanh}(x)=\max (-1, \min (1, x)) HardTanh(x)=max(1,min(1,x))
这个定义意味着输入值 x x x被限制在([-1, 1])的范围内。如果 x x x小于-1,函数输出-1;如果(x)大于1,函数输出1;如果 x x x在([-1, 1])内,函数输出 x x x本身。
在这里插入图片描述

2. 函数特性

  • 简单高效:与Tanh相比,Hard Tanh因其计算上的简洁性而在特定应用中更高效,尤其是在硬件资源有限的情况下。
  • 分段线性:Hard Tanh是一个分段线性函数,这使得它在实现上非常直接且易于优化。
  • 饱和性:Hard Tanh在其输入的绝对值超过1时饱和,与Tanh函数类似,这种饱和性能够限制激活函数的输出范围。

3. 导数

Hard Tanh函数的导数为:

HardTanh ⁡ ′ ( x ) = { 0  if  x < − 1  or  x > 1 1  if  − 1 ≤ x ≤ 1 \operatorname{HardTanh}^{\prime}(x)= \begin{cases}0 & \text { if } x<-1 \text { or } x>1 \\ 1 & \text { if }-1 \leq x \leq 1\end{cases} HardTanh(x)={01 if x<1 or x>1 if 1x1
这意味着当输入 x x x的绝对值小于或等于1时,Hard Tanh函数的梯度为1;否则,梯度为0。

4. 使用场景与局限性

使用场景

  • 资源受限的设备:在嵌入式系统或移动设备等计算资源受限的环境中,Hard Tanh可以作为一种有效的非线性激活函数。
  • 快速原型和大规模训练:在需要快速模型原型或处理大量数据的场景中,Hard Tanh由于其简单和高效性,常被选用以加速训练过程。

局限性

  • 非连续梯度:Hard Tanh在输入绝对值为1时的导数不连续,这可能在某些情况下影响模型的学习效率。
  • 激活饱和:和Tanh函数一样,Hard Tanh在输入的绝对值大于1时会出现激活饱和,可能导致梯度消失问题,特别是在深层网络中。

Hard Tanh激活函数因其计算简单和执行高效而在特定场景下非常有用,但选择使用Hard Tanh还是其他激活函数需要根据具体任务的需求和模型的特点来决定。

5.代码实现

import numpy as np

def hard_tanh(x):
    """计算Hard Tanh激活函数的值。
    
    参数:
    x -- 输入值,可以是一个数值、NumPy数组或者多维数组。
    
    返回:
    Hard Tanh激活后的结果。
    """
    return np.clip(x, -1, 1)

解读

  • 使用np.clip:这个实现中,np.clip函数用于将输入值x限制在-11之间。这是Hard Tanh函数的核心,直接对应其数学定义。np.clip函数的第一个参数是输入数组,第二个和第三个参数分别是需要被限制的最小值和最大值。

  • 向量化操作:通过使用NumPy,这个hard_tanh实现自然支持向量化操作。这意味着它可以高效地对单个数值、一维数组或多维数组进行操作,而无需显式循环遍历数组中的每个元素。这对于处理大规模数据集时提高计算效率非常有用。

示例使用

下面是如何使用hard_tanh函数来计算一组输入值的Hard Tanh激活:

x = np.array([-2, -1, 0, 1, 2])
hard_tanh_values = hard_tanh(x)

print("Hard Tanh Values:", hard_tanh_values)

这段代码定义了一个包含正负值的NumPy数组x,然后使用hard_tanh函数计算每个元素的Hard Tanh激活值。

四、参考文献

Hard Tanh

  • Courbariaux, M., Bengio, Y., & David, J.-P. (2015). “BinaryConnect: Training Deep Neural Networks with binary weights during propagations.” In Advances in Neural Information Processing Systems. 这篇论文虽然主要关注二值权重的网络,但在讨论网络激活函数时,Hard Tanh作为一种激活函数选项被提及,特别是在资源受限的环境下。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ISIS多区域实验简述

为支持大型路由网络&#xff0c;IS-IS在路由域内采用两级分层结构。 IS-IS网络中三种级别的路由设备&#xff1a;将Level-1路由设备部署在区域内&#xff0c;Level-2路由设备部署在区域间&#xff0c;Level-1-2路由设备部署在Level-1和Level-2路由设备的中间。 实验拓扑图&…

【MMDetection3D实战4】利用mmdet3d进行训练

文章目录 1. 介绍1.1 训练流程1.2 测试及验证2. 训练过程演示2.1 准备数据集并处理2.2 加载并修改配置文件2.3 启动训练2.4 测试1. 介绍 1.1 训练流程 MMDetection3D(mmdet3d)和OpenMMlab其他代码库是一样的,在训练的时候需要准备好一个配置文件,在配置文件中定义好所使用的…

力扣经典题:化栈为队

整体思路&#xff1a;入栈然后出栈&#xff0c;操作就和队列相同了 大佬的代码 typedef struct Node {int val;struct Node* next; }Node; Node* newNode(int Val) {Node* n(Node*)malloc(sizeof(Node));n->valVal;n->nextNULL;return n; } void push(Node* Head,int Va…

电脑远程桌面选项变成灰色没办法勾选怎么办?

有些人在使用Windows系统自带的远程桌面工具时&#xff0c;会发现系统属性远程桌面选项卡中勾选启用“允许远程连接到此计算机”。 导致此问题出现的原因主要是由于组策略或者注册表设置错误造成的。 修复远程桌面选项变灰的两种方法&#xff01; 方法一&#xff1a;设置本地组…

第四百零一回

文章目录 知识回顾示例代码经验总结 我们在上一章回中介绍了MethodChannel的使用方法&#xff0c;本章回中将介绍EventChannel的使用方法.闲话休提&#xff0c;让我们一起Talk Flutter吧。 知识回顾 我们在前面章回中介绍了通道的概念和作用&#xff0c;并且提到了通道有不同的…

JS向指定位置添加元素

内容参考来源 splice方法 splice() 方法向/从数组中添加/删除项目&#xff0c;然后返回被删除的项目。 //在数组指定位置插入 var fruits ["Banana", "Orange", "Apple", "Mango"]; fruits.splice(2, 0, "Lemon", "…

[抽象]工厂模式([Abstract] Factory)——创建型模式

[抽象]工厂模式——创建型模式 什么是抽象工厂&#xff1f; 抽象工厂模式是一种创建型设计模式&#xff0c;让你能够保证在客户端程序中创建一系列有依赖的对象组时&#xff0c;无需关心这些对象的类型。 具体来说&#xff1a; 对象的创建与使用分离&#xff1a; 抽象工厂模…

Node.js 学习笔记 fs、path、http模块;模块化;包;npm

Node.js学习 Node.js一、定义1.前端工程化2.Node.js 为何能执行 JS&#xff1f;3.安装nodejs、删除之前的nodejs4.使用 Node.js 二、fs模块 \- 读写文件三、path 模块案例 - 压缩前端html四、HTTP相关URL中的端口号常见的服务程序http 模块-创建 Web 服务案例&#xff1a;浏览时…

Docker 搭建 PaddleOCR

转自PaddleOCR docker模式 - 简书 目的: 公司要放弃第三方的ocr工具(日语),需要自己搭建训练一套,这篇是搭建 图片要标出文字的选取框 因为是日文所以ocr有专门的工具,只需要文字坐标就好如图 日文的账票需要加密一下 我得环境是 Ubuntu 22.04.1 LTS 1,下载代码 cd /hom…

第 7 场 小白入门赛

第5题 &#xff1a;兽之泪【算法赛】 AC_Code:C #include <iostream> #include <cstring> #include <algorithm> #include <vector> #include <queue> #include<stack> #include<cmath> #include <unordered_set> #include &…

介绍Oracle的SQL调化健康检查脚本(SQLHC)

概述 Oracle提供了一个SQL调优健康检查脚本&#xff08;SQLHC&#xff09;&#xff0c;用于检查需要优化的SQL的运行环境&#xff0c;生成报告以便帮助DBA找到SQL性能不佳的原因。SQLHC是SQLT的一个子集&#xff08;我后续的文章会介绍SQLT&#xff09;&#xff0c;但SQLHC与S…

【string一些函数用法的补充】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 string类对象的修改操作 我们来看 c_str 返回c格式的字符串的操作&#xff1a; 我们来看 rfind 和 substr 的操作&#xff1a; string类非成员函数 我们来看 r…

安全访问服务边缘解决方案

随着云计算、大数据和物联网技术的快速发展&#xff0c;企业对于业务数据的访问需求日益增多&#xff0c;而安全访问服务边缘&#xff08;Secure Access Service Edge&#xff0c;SASE&#xff09;作为一种新兴的网络架构&#xff0c;正逐渐成为企业保障数据安全、优化网络性能…

Python引入其他文件作为包

1.首先当我们写的代码&#xff0c;可能要被其他文件引用&#xff0c;那么在建文件夹的时候&#xff0c;记得选包 不是文件夹&#xff01;&#xff08;选第4个&#xff0c;不是第3个&#xff09; 因为文件夹默认没有init 方法&#xff0c;不能导包... 如果已经是文件夹了&#…

Claude3、Gemini、Sora与GPT-4:谁将成为AI领域的明日之星?

【最新增加Claude3、Gemini、Sora、GPTs讲解及AI领域中的集中大模型的最新技术】 2023年随着OpenAI开发者大会的召开&#xff0c;最重磅更新当属GPTs&#xff0c;多模态API&#xff0c;未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚…

ECCV2022 | BEVFormer原文翻译

BEVFormer: Learning Bird’s-Eye-View Representation from Multi-Camera Images via Spatiotemporal Transformers BEVFormer: 通过时空变换器从多摄像头图像中学习鸟瞰图表征 Figure 1: We propose BEVFormer, a paradigm for autonomous driving that applies both Trans…

【Java探索之旅】运算符解析 算术运算符,关系运算符

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; Java编程秘籍 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一、什么是运算符二、算术运算符2.1 基本四则运算&#xff08;-*/%&#xff09;2.2 增…

2049.不容易系列之(4)——考新郎

2048的升级 当nm时则全排错&#xff0c;与上题一样 当n>m时&#xff0c;则有n-m个是排对的&#xff0c;剩下m个全错 import java.util.*;public class Main {public static void main(String[] args) {Scanner scannernew Scanner(System.in);int num scanner.nextInt()…

LeetCode2.07链表相交

2.07链表相交 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c;函数返回结…

洛谷 P5018 对称二叉树

题目背景 NOIP2018 普及组 T4 题目描述 一棵有点权的有根树如果满足以下条件&#xff0c;则被轩轩称为对称二叉树&#xff1a; 二叉树&#xff1b;将这棵树所有节点的左右子树交换&#xff0c;新树和原树对应位置的结构相同且点权相等。 下图中节点内的数字为权值&#xf…