这篇文章将解释在人工神经网络(ANN)中修正线性函数( Rectified Linear Function)是什么,以及如何使用ReLU激活函数。让我们回顾一下激活函数的概念,并定义这些术语。学习修正线性函数对于使用C++软件编写程序非常有用。
人工神经网络(ANN)中的激活函数是什么?
激活函数(phi()),也称为转移函数或阈值函数,它根据净输入函数的给定值(sum)确定激活值(a = phi(sum))。在这里,sum是它们权重中的信号之和,激活函数是这个和的新值,具有给定的函数或条件。换句话说,激活函数是将所有加权信号的和转换为该信号的新激活值的方法。有不同类型的激活函数,通常使用的是线性(恒等)、双极性和逻辑(sigmoid)函数。
在C++(以及大多数编程语言)中,你可以创建自己的激活函数。注意,sum是净输入函数的结果,它计算所有加权信号的和。我们将使用这些作为输入函数的结果。在这里,人工神经元(输出值)的激活值可以通过激活函数如下所示,
通过使用这个sum净输入函数值和phi()激活函数,让我们看看C++中的一些激活函数;现在让我们看看如何使用二进制步进函数作为这个示例公式,
什么是修正线性单元(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(sum, 0)); // ReLU函数
}
有没有一个简单的ANN示例,使用修正线性单元激活函数在C++中?
以下是如何在C++中使用ReLU激活函数的简单ANN示例:
#include <iostream>
#define NN 2 // 神经元数量
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 (std::max(sum, 0)); // ReLU函数
}
};
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++中使用ReLU激活函数来模拟一个简单的人工神经网络。通过这种方式,你可以构建更复杂的神经网络模型,并在C++应用中实现深度学习技术。