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

devtools/2025/2/12 15:19:59/

在这篇文章中,我们将探索高斯误差线性单元(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++应用中实现深度学习技术。


http://www.ppmy.cn/devtools/132577.html

相关文章

设计者模式之策略模式

前言 在软件构建过程中&#xff0c;某些对象使用的算法可能多种多样&#xff0c;经常改变&#xff0c;如果将这些算法都写在对象中&#xff0c;将会使对象变得异常复杂&#xff1b;而且有时候支持不频繁使用的算法也是一个性能负担。 如何在运行时根据需要透明地更改对象的算…

nodejs 019: React组件 JSX基础语法规则

注&#xff1a;本文为JSX基础语法规则总结&#xff0c;除一二级标题外的大部分内容由LLM生成JSX&#xff08;JavaScript XML&#xff09;是一种语法扩展&#xff0c;主要用于 React 项目。它让我们可以在 JavaScript 中直接编写类似 HTML 的代码&#xff0c;简化了定义 UI 组件…

OCR 工业视觉的行业前景

一、OCR 工业视觉的行业前景 市场需求持续增长 工业自动化需求推动&#xff1a;随着工业 4.0 的推进&#xff0c;制造业对自动化的需求不断增加。OCR 工业视觉作为自动化生产中的关键技术&#xff0c;能够快速、准确地识别和读取产品或零部件上的字符信息&#xff0c;对于实现…

Oracle 第29章:Oracle数据库未来展望

Oracle数据库未来展望 随着信息技术的快速发展&#xff0c;数据库技术也在不断进步。作为数据库领域的领导者之一&#xff0c;Oracle公司一直在探索新的技术和应用方向&#xff0c;以保持其在市场上的竞争优势。以下是关于Oracle数据库未来发展的几个方面&#xff1a; 技术趋…

Docker实践与应用举例:从入门到进阶

Docker实践与应用举例&#xff1a;从入门到进阶 在云计算和微服务架构日益盛行的今天&#xff0c;Docker作为一种轻量级的容器化技术&#xff0c;凭借其高效、灵活、可移植的特点&#xff0c;迅速成为了开发和运维团队的首选工具。本文将通过深入浅出的方式&#xff0c;探讨Do…

06 P2437 蜜蜂路线

题目&#xff1a; 代码&#xff1a; #include<iostream> using namespace std;int sa[500][500]; int m,n;int main() {cin>>m>>n;int tn-m1;sa[1][1]1;sa[2][1]1;for(int i3;i<t;i){//如果先算再进位&#xff0c;那你用高精度的目的是什么for(int j1;j&l…

LVSM: A LARGE VIEW SYNTHESIS MODEL WITH MINIMAL 3D INDUCTIVE BIAS 论文解读

目录 一、概述 二、相关工作 1、新视角合成 2、优化3D表示 3、可泛化的前馈方法 三、LVSM 1、总体结构 2、encoder-decoder 3、decoder-only 4、Loss 一、概述 该论文提出大视角合成模型LVSM&#xff0c;基于Transformer方法&#xff0c;用于场景中或对象级层次从稀…

《Spring Boot从入门到实战》第六章习题答案

6.6 本章练习 1&#xff09;设计并实现完整的Restful风格的人员管理模块的Web API&#xff0c;版本号为V1&#xff0c;并配置产生Swagger接口文档。 答案&#xff1a; 1. 配置 Swagger 接口文档 创建一个 Swagger 配置类。 package com.example.demo.config;import io.swag…