SELU(Scaled Exponential Linear Unit)激活函数是一种在人工神经网络(ANN)中使用的高级激活函数。它是由Günter Klambauer, Thomas Unterthiner, Andreas Mayr在2017年提出的,旨在创建自归一化的神经网络(Self-Normalizing Neural Networks, SNNs)。这种网络能够自动将神经元激活值收敛到零均值和单位方差,而不需要显式的批量归一化处理。现在,让我们深入了解SELU激活函数,并探讨如何在C++应用中实现它。
激活函数在AI中的作用是什么?
激活函数(phi()),也称为转移函数或阈值函数,它决定了从给定值(sum)中得到的激活值(a = phi(sum))。这里的“sum”是输入信号的加权和,而激活函数则是根据这个和以及给定的条件或函数来计算一个新的激活值。换句话说,激活函数将所有加权信号的和转换为该信号的新激活值。常用的激活函数包括线性(恒等)、双极性和逻辑(sigmoid)函数等。
在C++中,你可以自定义激活函数。注意,这里的“sum”是净输入函数的结果,它计算所有加权信号的和。我们将使用这个结果作为输入函数的输出。人工神经元(输出值)的激活值可以通过激活函数如下表示:
目录
- 什么是SELU激活函数?
- 什么是缩放指数线性单元(SELU)?
- 一个简单的使用SELU的ANN示例
什么是SELU激活函数?
SELU激活函数是一种在人工神经网络中使用的激活函数。它是一种缩放版本的ELU,通过使用λ参数来实现。SELU是由Günter Klambauer, Thomas Unterthiner, Andreas Mayr在2017年提出的,他们在“Self-Normalizing Neural Networks”论文中介绍了自归一化神经网络(SNNs),这种网络能够自动将神经元激活值收敛到零均值和单位方差,而不需要显式的批量归一化。
SELU是ELU(Exponential Linear Unit)的扩展,通过引入λ参数来实现。SELU激活函数可以表示为:
根据研究,α和λ的值分别约为1.6733和1.0507。这些值使得SELU在处理输入时能够自动实现归一化,从而减少对显式归一化技术的依赖。
什么是缩放指数线性单元(SELU)?
SELU是ELU激活函数的缩放版本,通过乘以λ参数来实现。根据论文中的研究,他们解决了α和λ的值,并得到了α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函数
}
一个简单的使用SELU的ANN示例
我们可以在Tneuron
类中使用给定的SELU函数,如下所示:
#include <iostream>
#define NN 2 // 神经元数量
class Tneuron { // 神经元类
public:double a; // 每个神经元的活动double w[NN+1]; // 神经元之间连接的权重double alpha = 1.6733;double lambda = 1.0507;Tneuron() {a = 0;for (int i = 0; i <= NN; i++) w[i] = -1; // 如果权重是负数,则表示没有连接}// 定义输出神经元的激活函数(或阈值)double phi(double sum) {return (sum > 0 ? lambda * sum : lambda * alpha * (std::exp(sum) - 1)); // SELU函数}
};Tneuron ne[NN+1]; // 神经元对象void fire(int nn) {float 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].phi(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.6;ne[1].w[2] = 0.4;// 激发我们的人工神经元活动,输出将是fire(2);printf("%10.6f\n", ne[2].a);getchar();return 0;
}
这段代码展示了如何在C++中使用SELU激活函数来模拟一个简单的人工神经网络。通过这种方式,你可以构建更复杂的神经网络模型,并在C++应用中实现深度学习技术。