C++builder中的人工智能(7)如何在C++中开发特别的AI激活函数?

news2024/11/14 2:00:54

在当今的AI开发中,人工智能模型正迅速增加。这些模型使用数学函数来执行和学习,以便在传播时优化最佳结果,或在反向传播时选择最佳解决方案。其中之一就是激活函数。也称为转移函数阈值函数,它决定了神经元的激活值作为输出,这个值是通过输入的加权值之和计算得出的。在这篇文章中,我们将描述当今最常用的激活函数,并展示如何在C++中使用它们。

目录

  • 什么是AI激活函数?
  • 我们如何在AI中开发特别的激活函数?
    • 恒等函数(y=x)
    • 二进制步函数(Heaviside步函数)
    • 逻辑函数(Logistic曲线)和Sigmoid函数
    • 双曲正切函数(tanh)
    • 指数线性单元(ELU)
    • 缩放指数线性单元(SELU)
    • 修正线性单元(ReLU)
    • 高斯误差线性单元(GELU)
    • SoftPlus激活函数
    • 自我规则非单调(Mish)激活函数
    • Softmax函数

什么是AI激活函数?

激活函数(phi())也称为转移函数阈值函数。它从净输入函数的给定值(sum)中确定激活值(a = phi(sum))。在净输入函数中,sum是它们权重中的信号之和。激活函数是这个和的新值,具有给定的函数或条件。激活函数是一种将所有加权信号的和转换为该信号的新激活值的方法。有不同的激活函数,一些常见的有线性(恒等)、双极性和逻辑(sigmoid)。

在C++中,你可以创建自己的AI激活函数。注意,“sum”是净输入函数的结果,它计算所有加权信号的和。我们将使用sum作为输入函数的结果。在这里,人工神经元(输出值)的激活值可以通过激活函数如下所示写出:

通过使用这个sum净输入函数值和phi()激活函数,我们可以计算输出。

我们如何在AI中开发特别的激活函数?

在AI开发中,有不同类型的激活函数用于不同的目的。我们可以使用它们,或者我们可以开发一个特别的激活函数。现在让我们看看AI开发中的激活函数类型。

1. 恒等函数(y=x)

恒等函数,也称为恒等关系恒等映射恒等变换,是数学中的一个函数,它总是返回用作其参数的相同值。我们可以简单地说它是y=x函数或f(x)=x函数。这个函数也可以作为一些AI应用中的激活函数。

这是一个非常简单的激活函数,也是恒等函数:

float phi(float sum) {
    return sum; // 恒等函数,线性转移函数 f(sum)=sum
}

这个函数的返回值应该是浮点数(float, double, long double),因为权重通常在0和1.0之间。

详细了解清参考:C++builder中的人工智能(8)什么是神经网络中的恒等激活函数?-CSDN博客 

2. 二进制步函数(Heaviside步函数)

二进制步函数,或Heaviside步函数,或单位步函数,是一个步函数,以奥利弗·海维赛德(1850-1925)命名,其值对于负参数为零,对于正参数为一。这意味着它作为布尔值结果为0或1。这个函数是步函数的一般类别的例子,所有这些都可以表示为这种函数的平移的线性组合。

因此,我们的二进制步函数应该如下所示。

bool phi(float sum) {
    return (sum > 0); // 二进制步函数,Heaviside步函数,单位步函数
}

这个激活函数如果sum>0则返回1(true),否则返回0(false)。

C++builder中的人工智能(9)如何在C++中创建AI二进制/Heaviside步进函数-CSDN博客

3. 逻辑函数(Logistic曲线)和Sigmoid函数

逻辑函数Logistic曲线是一个常见的S形曲线(sigmoid曲线),其方程如下。

在这里,

L是曲线的最大值,

x0是曲线中点的值,

k是逻辑增长率或曲线的陡峭程度

最常用的逻辑函数是标准逻辑函数,也称为Sigmoid函数,其中L和k为1,x0=0。因此,我们的函数可以写成以下任一术语,

在C++中,Sigmoid激活函数可以写成如下:

double phi(double sum) {
    return (1/(1+std::exp(-1*sum))); // 标准逻辑函数,Sigmoid函数
}

注意,这里的除法比乘法消耗更多的CPU,因为在上面给出的函数中,我们可以使用带有tanh()的版本,如下:

double phi(double sum) {
    return (0.5*(1+std::tanh(0.5*sum))); // 标准逻辑函数,Sigmoid函数
}

如你所见,我们这里只有乘法和加法以及tanh()函数。如果网络的sum值在范围内,例如在(0-10)之间,为了获得更快的近似结果,可以使用数组结果。可能有一个包含10000个成员的y数组,例如y[1001]可以持有phi(1.0001)的预计算值。这将使你的神经网络更快,但也可能引起更多错误或难以达到期望的迭代次数。它应该与上面的一个标准sigmoid函数版本一起测试。

C++builder中的人工智能(10)神经网络中的Sigmoid函数-CSDN博客

4. 双曲正切函数(tanh)

双曲正切是一个三角函数tanh(),如下,

这个函数有唯一的解到微分方程f' = 1 - f^2, with f(0) = 0。

一个激活函数可以作为双曲正切函数使用,如下,

double phi(double sum) {
    return (std::tanh(sum)); // 双曲正切函数
}

C++builder中的人工智能(11):双曲正切激活函数(ANN函数)?-CSDN博客 

5. 指数线性单元(ELU)

**指数线性单元(ELU)**是另一种激活函数,由Djork-Arne Clevert, Thomas Unterthiner & Sepp Hochreiter开发并发表,标题为“FAST AND ACCURATE DEEP NETWORK LEARNING BY EXPONENTIAL LINEAR UNITS (ELUS)”。你可以通过点击这里找到论文的文本。

根据他们的研究,他们引入了“指数线性单元”(ELU),它加快了深度神经网络中的学习速度,并导致了更高的分类准确率。ELU激活函数通过对于正值的身份缓解了消失梯度问题,如修正线性单元(ReLUs),泄漏ReLUs(LReLUs)和参数化ReLUs(PReLUs)。他们还证明了与其他激活函数的单元相比,ELUs具有改进的学习特性。与ReLUs相比

指数线性单元(ELU)可以写成如下。

这个函数的导数可以写成:

在C和C++编程语言中,简单的指数线性单元函数可以写成如下

double alpha = 0.1; // 范围从0到1.0
double phi(double sum) {
    return (sum > 0 ? sum : alpha*(std::exp(sum) - 1)); // ELU函数
}

C++builder中的人工智能(12):了解ELU(Exponential Linear Unit)——人工神经网络中的激活函数-CSDN博客 

6. 缩放指数线性单元(SELU)

缩放指数线性单元是另一种激活函数,它是通过使用λ参数的ELU的缩放版本。缩放指数线性单元由Günter Klambauer, Thomas Unterthiner,

Andreas Mayr在2017年开发并发布,他们介绍了自归一化神经网络(SNNs),以实现高级抽象表示。SNNs的神经元激活自动收敛到零均值和单位方差,而批量归一化需要显式归一化。

SELU是ELU激活函数的缩放版本,通过乘以λ参数,所以我们可以简单地说这个,

SELU激活函数可以写成如下,

他们为α和λ求解并得到解α01 ≈ 1.6733和λ01 ≈ 1.0507,其中下标01表示这些是固定点(0, 1)的参数。根据这个解释,每个节点可能有不同的α和λ参数。所以我们可以定义神经元结构中的alfa和lambda参数,我们可以计算SELU如下。

double phi(double sum) {
    return (sum > 0 ? lambda * sum : lambda * alpha * (std::exp(sum) - 1)); // SELU函数
}

C++builder中的人工智能(13):SELU激活函数在C++应用中的工作原理-CSDN博客 

7. 修正线性单元(ReLU)

在人工神经网络中,修正线性单元函数ReLU激活函数定义为其参数的正部分。可以写成f(x) = max(0, x),其中x是输入信号的加权和。ReLU函数也称为Ramp函数,类似于电气工程中的半波整流

这个函数称为参数化ReLU函数。如果Beta是0.01,它被称为Leaky ReLU函数

这是max-out ReLU函数,

如果Beta是0,那么f(x) = max(x, 0)。这个函数将总是返回正数。让我们用C编程语言编写maxout ReLU函数,

这里是一个例子,

double phi(double sum) {
    return (std::max(0, sum)); // ReLU函数
}

C++builder中的人工智能(14):修正线性单元(ReLU)激活函数-CSDN博客 

8. 高斯误差线性单元(GELU)

高斯误差线性单元是ReLU、ELU函数的替代品,由Dan Hendrycks和Kevin Gimpel在2016年定义和发布。它用于平滑ReLU和ELU激活(全文可以在这里找到)

高斯误差线性单元(GELU)是一种高性能的神经网络激活函数。GELU激活函数是xΦ(x),其中Φ(x)是标准高斯累积分布函数。GELU非线性通过它们的值加权输入,而不是像ReLUs(x>0)那样通过它们的符号门控输入。对GELU非线性与ReLU和ELU激活的实证评估已应用于所有考虑的计算机视觉、自然语言处理和语音任务,并有性能提升。

GELU函数可以写成

我们可以用以下方式近似GELU,

或者如果更大的前馈速度值得牺牲精确性,我们可以使用以下近似,

我们可以使用不同的CDFs,即我们可以使用逻辑函数,累积分布函数CDF σ(x)来获得激活值,这称为Sigmoid Linear Unit(SiLU) xσ(x)。

根据第二个公式,我们可以用GELU编写我们的phi()激活函数如下,

double sqrt_2divPI = std::sqrt(2.0/M_PI);
double phi(double sum) {
    return (0.5 * sum * (1 + std::tanh(sqrt_2divPI * (sum + 0.044715 * std::pow(sum, 3))))); // GeLU函数
}

C++builder中的人工智能(15):C++高斯误差线性单元(GELU)-CSDN博客 

9. SoftPlus激活函数

SoftPlus激活函数由Dugas等人在2001年开发和发布。全文可以在这里找到。简单来说,Softplus函数可以写成如下,

f(x) = log(1+exp(x));

根据他们的论文;他们提出的函数类别的基本思想是,他们用Softplus或sigmoid函数替换了求和的sigmoid,每个维度上都有一个(使用Softplus在凸维度上,sigmoid在其他维度上)。他们引入了类似于多层神经网络的新函数类别具有这些属性的概念。

另一项由Xavier Glorot、Antoine Bordes、Yoshua Bengio发表的研究,全文标题为“Deep Sparse Rectifier Neural Networks”,可以在这里找到。根据这项研究,在人工神经网络中,虽然逻辑sigmoid神经元比双曲正切神经元更符合生物学,但后者在训练多层神经网络时效果更好。

SoftPlus激活函数在C++中可以写成如下:

double phi(double sum) {
    return (std::log(1 + exp(sum))); // SoftPlus函数
}

C++builder中的人工智能(16):神经网络中的SoftPlus激活函数-CSDN博客 

10. 自我规则非单调(Mish)激活函数

自我规则非单调(Mish)激活函数受到Swish激活函数的启发。它是一个平滑、连续、自我规则、非单调的激活函数。这个函数由Diganta Misra在2019年发表的“Mish: A Self Regularized Non-Monotonic Activation Function”中发布。

根据这项研究,“Mish使用自门控属性,其中非调制输入与输入的非线性函数的输出相乘。由于保留了少量的负信息,Mish通过设计消除了Dying ReLU现象所需的先决条件。这种属性有助于更好的表达性和信息流动。由于Mish无界,它避免了饱和,这通常会因为梯度接近零而导致训练速度减慢。在下方有界也是有利的,因为它会产生强烈的规则效应。与ReLU不同,Mish是连续可微的,这是一个可取的属性,因为它避免了奇异性,因此,在执行基于梯度的优化时避免了不希望的副作用。”

我们之前解释了softplus()激活函数。Mish激活函数可以使用softplus()定义如下,

因此,Mish激活函数可以数学定义如下,

作者比较了Mish、ReLU、SoftPlus和Swish激活函数的输出,并比较了Mish和Swish的第一和第二导数。

Mish函数可以在C++中编码如下,

double phi(double sum) {
    return (sum * std::tanh(std::log(1 + std::exp(sum)))); // Mish函数
}

C++builder中的人工智能(17):神经网络中的自我规则非单调(Mish)激活函数-CSDN博客 

11. Softmax函数

在神经网络中,SoftMax函数通常用于基于神经网络的分类器的最后一层。这些网络通常在对数损失或交叉熵方法下进行训练,这些方法是多项式逻辑回归的非线性变体。Softmax函数用于软化输出在0和1之间,它也可以用作激活函数。

对于一个有n个成员的x向量(或数组),每个成员的Softmax可以写成如下,

这个函数可能会因为无限结果而溢出。为了避免这个,我们可以通过减去最大值m来调制x值。

C++builder中的人工智能(18):神经网络中的SoftMax函数-CSDN博客

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

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

相关文章

ReactPress数据库表结构设计全面分析

ReactPress Github项目地址:https://github.com/fecommunity/reactpress 欢迎Star。 ReactPress是一个基于React框架开发的开源发布平台和内容管理系统(CMS)。它不仅支持用户在支持React和MySQL数据库的服务器上搭建自己的博客和网站&#…

小菜家教平台(四):基于SpringBoot+Vue打造一站式学习管理系统

前言 昨天配置完了过滤器,权限检验,基本的SpringSecurity功能已经配置的差不多了,今天继续开发,明天可能会暂停一天整理一下需求,然后就进行CRUD了。 今日进度 补充SpringSecurity异常处理和全局异常处理器 详细操作…

零基础Java第十五期:抽象类接口(一)

目录 一、抽象类 1.1. 抽象的概念 1.2. 抽象类语法 1.3. 抽象类的特性 1.4. 图形类例子 二、 接口 2.1. 接口的概念 2.2. 语法规则 2.3. 接口的特性 2.4. 接口的使用 2.5. 实现多个接口 2.6. 工作当中常用的接口 一、抽象类 1.1. 抽象的概念 如果 一个类中没…

13.UE5流星火雨,引导施法技能制作

2-15 流星火雨,引导施法技能制作、随机数_哔哩哔哩_bilibili 目录 1.为流星火雨添加按键映射 2.创建流星火雨的动画蒙太奇 3.实现播放动画蒙太奇的逻辑 ​编辑 4.定义发射一波流星火雨的发射物 5.使用动画通知释放流星火雨 1.为流星火雨添加按键映射 创建名为流…

让redis一直开启服务/自动启动

文章目录 你的redis是怎么打开的黑窗不能关?必须要自动启动吗?再说说mysql 本文的所有指令都建议在管理员权限下打开cmd控制台 推荐的以管理员身份打开控制台的方式 Win R 打开运行 输入cmdShift Ctrl Enter 你的redis是怎么打开的 安装过redis的朋友都知道, redis的安…

【安装配置教程】二、VMware安装并配置ubuntu22.04

一、准备: 虚拟机安装ubuntu,首先要先找到一个镜像,可以去ubuntu官方下载一个,地址:下载Ubuntu桌面系统 | Ubuntu,下载好iso的镜像文件后保存好,接下来打开VMware。 二、安装&#xff…

Latex中给公式加边框

1、这里使用的不是 amsmath 的 \boxed 命令, 而是 empheq 的 empheq 环境以及 xcolor 的 \fcolorbox 命令, 下面是代码, 可以分别阅读这两个手册来获取更多的信息 \documentclass{article} \usepackage{xcolor} \usepackage{empheq} \usepackage{amsmath} \begin{document}\be…

Android Parcelable和Serializable的区别与联系

在Android开发中,Parcelable和Serializable是两种用来在组件之间传递数据的序列化机制。它们有不同的使用场景和性能特点。 以下是它们之间的关系和区别: 1. 什么是 Parcelable Parcelable 是 Android 特有的接口,用于高效地在进程间传递数…

Android 实现柱形图

在 Android 中实现柱状图,可以使用流行的图表库 MPAndroidChart,它支持多种类型的图表,包括柱状图、折线图、饼图等。下面是一个基本的柱状图实现步骤,具体分为以下几个部分: 1. 添加依赖 首先,你需要在 …

通过交互式网页学习相机成像原理

​ 入门摄影这门艺术,你是否有以下这些问题? 焦距、光圈、CMOS是什么?为什么光圈越大,背景虚化效果越好?什么是过曝?… 今天我将分享一个简单的、可交互的相机成像模型,可供大家以可视化的方式…

web——sqliabs靶场——第一关

今天开始搞这个靶场,从小白开始一点点学习,加油!!!! 1.搭建靶场 注意点:1.php的版本问题,要用老版本 2.小p要先改数据库的密码,否则一直显示链接不上数据库 2.第一道题&#xff0…

自监督学习:机器学习的未来新方向

引言 自监督学习(Self-Supervised Learning, SSL)是近年来机器学习领域的一个重要发展方向,迅速成为许多研究和应用的热点。与传统的监督学习不同,自监督学习利用未标注数据,通过设计自我生成标签的任务,帮…

探索 HTML 和 CSS 实现的 3D 开关按钮

效果演示 这段代码是一个HTML和CSS的组合&#xff0c;用于创建一个3D风格的开关按钮&#xff08;通常用于控制某些设置的开启或关闭&#xff09; HTML <label class"switch"><input type"checkbox" checked"checked"><div cl…

车载诊断架构---NRC 78和NRC 21那些你不知道的事情!

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

【计算机基础——数据结构——红黑树】

1. 红黑树&#xff08;RBTree&#xff09; 为什么HashMap不直接使用AVL树&#xff0c;而是选择了红黑树呢&#xff1f; 由于AVL树必须保证左右子树平衡&#xff0c;Max(最大树高-最小树高) < 1&#xff0c;所以在插入的时候很容易出现不平衡的情况&#xff0c;一旦这样&…

linux物理内存管理:node,zone,page

一、总览 对于物理内存内存&#xff0c;linux对内存的组织逻辑从上到下依次是&#xff1a;node&#xff0c;zone&#xff0c;page&#xff0c;这些page是根据buddy分配算法组织的&#xff0c;看下面两张图&#xff1a; 上面的概念做下简单的介绍&#xff1a; Node&#xff1a…

CKA认证 | 使用kubeadm部署K8s集群(v1.26)

一、前置知识点 1.1 生产环境可部署Kubernetes集群的两种方式 目前生产部署Kubernetes集群主要有两种方式&#xff1a; ① kubeadm Kubeadm是一个K8s部署工具&#xff0c;提供kubeadm init和kubeadm join&#xff0c;用于快速部署Kubernetes集群。 ② 二进制包 从github下…

如何安装和配置JDK17

教程目录 零、引言1、新特性概览2、性能优化3、安全性增强4、其他改进5、总结 一、下载安装二、环境配置三、测试验证 零、引言 JDK 17&#xff08;Java Development Kit 17&#xff09;是Java平台的一个重要版本&#xff0c;它带来了许多新特性和改进&#xff0c;进一步提升了…

第2章2.3立项【硬件产品立项的核心内容】

硬件产品立项的核心内容 2.3 硬件产品立项的核心内容2.3.1 第一步&#xff1a;市场趋势判断2.3.2 第二步&#xff1a;竞争对手分析1.竞争对手识别2.根据竞争对手分析制定策略 2.3.3 第三步&#xff1a;客户分析2.3.4 第四步&#xff1a;产品定义2.3.5 第五步&#xff1a;开发执…

一款革命性的视频剪辑工具,AI剪辑新纪元:Clapper

如果说AI视频剪辑工具哪家强&#xff1f;还真想不出有什么让人眼前一亮的AI视频剪辑应用。 毕竟随着AI技术的发展越来越快&#xff0c;各种AI应用如雨后春笋般涌现&#xff0c;然而&#xff0c;真正能够在视频剪辑领域脱颖而出的工具却寥寥无几。 今天我要介绍的 Clapper 就是…