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

在这篇文章中,我们将探索高斯误差线性单元(GELU:Gaussian Error Linear Unit)是什么,它是如何在人工神经网络(ANN)中工作的,以及GELU可以应用于哪些AI技术。通过学习C++中的高斯误差线性单元,你将能够使用C++ IDE构建C++应用程序。

什么是激活函数?

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

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

什么是高斯误差线性单元(GELU)?

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

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

GELU函数可以写成

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

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

我们可以使用不同的CDFs,即我们可以使用逻辑函数(Logistic Function),累积分布函数(Cumulative Distribution Function )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 Function
}

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

double sigmoid(double x) {
    return(1/(1+std::exp(-1*x)));
}
double phi2(double sum) {
    return(sum*sigmoid(1.702*sum)); // GeLU Function
}

这些公式都可以在以下示例中进行测试,

#include <iostream>
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 Function
}
double sigmoid(double x) {
    return(1/(1+std::exp(-1*x)));
}
double phi2(double sum) {
    return(sum*sigmoid(1.702*sum)); // GeLU Function
}
int main() {
    std::cout << phi(0.5) << '\n';
    std::cout << phi2(0.5) << '\n';
    getchar();
    return 0;
}

有没有一个简单的C++ ANN示例,使用GELU激活函数?

#include <iostream>
#define NN 2   // 神经元数量
double sqrt_2divPI = std::sqrt(2.0/M_PI);
class Tneuron { // 神经元类
public:
    double a;       // 每个神经元的活动值
    double w[NN+1]; // 神经元之间连接的权重
    Tneuron() {
        a = 0;
        for (int i = 0; i <= NN; i++) w[i] = -1;  // 如果权重是负数,则表示没有连接
    }
    // 定义输出神经元的激活函数(或阈值)
    double activation_function(double sum) {
        return(0.5*sum*(1+std::tanh(sqrt_2divPI*(sum+0.044715*pow(sum,3)))); // GeLU Function
    }
};
Tneuron ne[NN+1]; // 神经元对象
void fire(int nn) {
    double sum = 0;
    for (int j = 0; j <= NN; j++) {
        if (ne[j].w[nn] >= 0) sum += ne[j].a * ne[j].w[nn];
    }
    ne[nn].a = ne[nn].activation_function(sum);
}
int main() {
    // 定义两个输入神经元(a0, a1)和一个输出神经元(a2)的活动值
    ne[0].a = 0.0;
    ne[1].a = 1.0;
    ne[2].a = 0;
    // 定义来自两个输入神经元到输出神经元(0到2和1到2)的信号权重
    ne[0].w[2] = 0.3;
    ne[1].w[2] = 0.2;
    // 激发我们的人工神经元活动,输出将是
    fire(2);
    printf("%10.6f\n", ne[2].a);
    getchar();
    return 0;
}

这个示例展示了如何在C++中使用GELU激活函数来模拟一个简单的人工神经网络。通过这种方式,你可以构建更复杂的神经网络模型,并在C++应用中实现深度学习技术。

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

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

相关文章

Android 下内联汇编,Android Studio 汇编开发

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ 内联汇编 Android 内联汇编非常适用于 ARM 架构的性能优化和底层操作&#xff0c;通常用于加密、解密、特定指令优化等领域。 1. 基础语法 内联汇编在 C/C …

【go从零单排】泛型(Generics)、链表

&#x1f308;Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 &#x1f4d7;概念 在Go语言中&#xff0c;泛型&#xff08;Generics&#xff09;允许你编写可以处理…

vue项目删除无用的依赖

1.安装依赖检查工具 npm i depcheck2.查看无用的依赖 depcheck3.手动删除pageage.json中的无用的依赖&#xff08;如果有sass和sass-loader不要删&#xff0c;会引起项目报错&#xff09; 4.全部删除完成之后&#xff0c;删除package-lock.json文件&#xff0c;删除node_mod…

「Qt Widget中文示例指南」如何创建一个窗口标志?(一)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 窗口标志要么是类型…

移植 AWTK 到 纯血鸿蒙 (HarmonyOS NEXT) 系统 (9) - 编译现有的AWTK应用程序

AWTK 应用程序开发完成后&#xff0c;在配置文件中添加 harmonyos 的选项&#xff0c;通过create_project.py脚本即可生成 DevEco Studio的工程。 安装开发环境 DevEco Studio HarmonyOS 的开发工具。 Python 运行环境。 git 源码管理工具。 下载 awtk 和 awtk-harmonyos…

C++ 参数传递 笔记

目录 1、输入参数的传递方式-选择传值还是传引用&#xff1f; 处理用户信息 处理坐标 处理配置 处理ID 2、对于需要修改的参数,使用非const引用传递 有趣的例外&#xff1a;警惕表象的迷惑 需要警惕的陷阱 “糟糕”的update方法&#xff1a; “完美”的set_name与set…

【Eclipse系列】eclipse安装与常规配置(含插件)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 一、下载与安装 二、常规设置 1.1.设置工作空间(workspace) 1.2.设置字体和字体大小 ​编辑 1.3.设置编码 1.4.去除验证(validation) 1.5.去除单词验证(spelli…

内网对抗-信息收集篇SPN扫描DC定位角色区域定性服务探针安全防护凭据获取

知识点&#xff1a; 1、信息收集篇-网络架构-出网&角色&服务&成员 2、信息收集篇-安全防护-杀毒&防火墙&流量监控 3、信息收集篇-密码凭据-系统&工具&网站&网络域渗透的信息收集&#xff1a; 在攻防演练中&#xff0c;当完成边界突破后进入内…

C语言 | Leetcode C语言题解之第540题有序数组中的单一元素

题目&#xff1a; 题解&#xff1a; int singleNonDuplicate(int* nums, int numsSize) {int low 0, high numsSize - 1;while (low < high) {int mid (high - low) / 2 low;mid - mid & 1;if (nums[mid] nums[mid 1]) {low mid 2;} else {high mid;}}return …

【开发】关于Java中String与Integer的小小知识点(使用等号对比引用对象)

一个很简单的小知识点 我们都知道&#xff0c;如果使用对比包装类型或对象&#xff0c;那么比较的都是两者之间的地址&#xff08;指针或句柄&#xff09;&#xff0c;而非对象本身&#xff0c;那么且看下方的代码。 public class A {public static void main(String[] args)…

纯前端实现在线预览excel文件(插件: LuckyExcel、Luckysheet)

概述 在实际开发中&#xff0c;遇到需要在线预览各种文件的需求&#xff0c;最近遇到在线预览excel文件的需求&#xff0c;在此记录一下&#xff01;本文主要功能实现&#xff0c;用于插件 LuckyExcel &#xff0c;Luckysheet&#xff01;废话不多说&#xff0c;上代码&#xf…

洛谷每日一题——B2143 进制转换、P1003 [NOIP2011 提高组] 铺地毯

B2143 进制转换 题目描述 进制转换 - 洛谷 运行代码 #include<stdio.h> int main(){int a,b,i0,j,num[20];char k[]{0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F};scanf("%d",&a);scanf("%d",&b);do{i;num[i]a%b;aa/b;}while(a!0);printf("&qu…

Elasticsearch的自定义查询方法到底是啥?

Elasticsearch主要的目的就是查询&#xff0c;默认提供的查询方法是查询全部&#xff0c;不满足我们的需求&#xff0c;可以定义查询方法 自定义查询方法 单条件查询 我们查询的需求&#xff1a;从title中查询所有包含"鼠标"这个分词的商品数据 SELECT * FROM it…

环境配置与搭建

安装pytorch 官网连链接&#xff1a;https://pytorch.org/ 特殊包名 cv2 pip install opencv-python sklearn pip install scikit-learnPIL pip install Pillow使用jupyter notebook pip install jupyter安装显卡驱动 Windows Linux 视频教程&#xff1a; 【ubuntu2…

jmeter常用配置元件介绍总结之函数助手

系列文章目录 1.windows、linux安装jmeter及设置中文显示 2.jmeter常用配置元件介绍总结之安装插件 3.jmeter常用配置元件介绍总结之取样器 jmeter常用配置元件介绍总结之函数助手 1.进入函数助手对话框2.常用函数的使用介绍2.1.RandomFromMultipleVars函数2.2.Random函数2.3.R…

【excel基本操作-sumif绝对引用和相对引用

低量级数据的存储 复杂且无法优化的数据报表 怎么学excel? 一、输入与输出 二、计算与处理 三、可视化 四、连接匹配与自动化 excel操作笔记 打开表格第一步筛选 所以筛选的快捷键&#xff1a;shiftctrll 排序&#xff1a;多列排序 开始-排序与筛选-自定义排序-设置关键字添…

【项目计划文档】软件项目计划书,项目总体计划(word原件)

项目开发计划包括项目描述、项目组织、成本预算、人力资源估算、设备资源计划、沟通计划、采购计划、风险计划、项目过程定义及项目的进度安排和里程碑、质量计划、数据管理计划、度量和分析计划、监控计划和培训计划等。 软件全套精华资料包清单部分文件列表&#xff1a; 工作…

音视频入门基础:FLV专题(23)——FFmpeg源码中,获取FLV文件音频信息的实现(下)

音视频入门基础&#xff1a;FLV专题系列文章&#xff1a; 音视频入门基础&#xff1a;FLV专题&#xff08;1&#xff09;——FLV官方文档下载 音视频入门基础&#xff1a;FLV专题&#xff08;2&#xff09;——使用FFmpeg命令生成flv文件 音视频入门基础&#xff1a;FLV专题…

模型 阿玛拉定律(炒作周期)

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。短期乐观&#xff0c;长期低估。 1 阿玛拉定律的应用 1.1 全球定位系统&#xff08;GPS&#xff09;的发展 全球定位系统&#xff08;GPS&#xff09;的发展是阿玛拉定律的一个典型应用案例&#xf…

Kubernetes的概述与架构

Kubernetes 的概述 Kubernetes 是一个可移植、可扩展的开源平台&#xff0c;用于管理容器化的工作负载和服务&#xff0c;方便进行声明式配置和自动化。Kubernetes 拥有一个庞大且快速增长的生态系统&#xff0c;其服务、支持和工具的使用范围广泛。 Kubernetes 这个名字源于…