简单的人工神经元模型
你想从头开始开发自己的人工智能应用吗?想学习如何在C++中实现一个简单的人工神经元模型吗?在这篇文章中,我们将通过一个非常简单的人工神经元示例来解释。
一个最小人工神经元包含一个激活值(记为a)、一个激活函数(记为phi())以及加权的(w)输入网络连接。因此,它有一个激活值、一个激活函数,以及一个或多个权重,这取决于它的输入网络数量。
激活值(a)是激活函数的结果,也称为转移函数或阈值。
激活函数(phi())也称为转移函数或阈值函数,它根据给定的值(sum)确定激活值(a = phi(sum))。这里的sum是它们权重中的信号之和。换句话说,激活函数是一种将所有加权信号的总和转换为该信号的新激活值的方法。有多种激活函数,通常使用的是线性(恒等)、双极性和逻辑(sigmoid)函数。
权重是输入信号对该神经元的权重。每个网络连接都有一个影响其他神经元总和的连接。
它类似于生物神经元的轴突,其值通过突触传播到下一层的输入。在人工智能理论中,模拟所有神经活动的主要和核心公式用一个信号公式描述。激活函数(转移函数)将总输入转换为激活值,如下所示:
在一些老点的文章中,sum显示为转移函数或转移函数的结果,现在大多数文章使用激活函数作为转移函数,两者相同。它将给定的总和转换为激活值。因此,sum可以是sum()函数的结果,但不是转移函数的结果,它将用于转移函数(激活函数)中定义激活输出。这个公式计算了人工神经元的当前激活值,激活函数对应于它们权重中的激活总和。在这个公式中,
从这个非常简短的理论中,我们可以创建如下所示的简单神经元模型,用于简单的ANN示例,
非常简单的人工神经网络示例
下面我们准备了一个非常简单的人工神经网络示例,其中给出了激活函数,
在这个ANN示例中,我们有2个输入神经元和一个输出神经元。神经元0和神经元1连接到神经元2。每个神经元都有自己的激活值(a),并且神经元之间的每个连接都有权重。因此,输出神经元将是两个输入神经元激活值乘以其权重的总和的激活结果。
神经元的输出可能在这个当前状态下有一个值。我们应该通过激活函数phi()计算它的新激活值。让我们定义一个简单的线性激活函数:
float phi(float sum) { return sum; // 线性转移函数 f(sum) = sum<br } |
这里我们假设我们的网络已经训练过,这意味着网络连接的权重是已知的。让我们定义并初始化所有的神经激活和权重值,
float a0=0.0, a1=1.0, a2=0; float w02=0.3, w12=0.2; |
请注意,神经网络连接的数量与神经元的数量不同。这意味着,连接和权重可以在另一个数组中处理。我们之前定义了a2并将其设置为0,这在网络中是不正确的,我们的ANN应该是稳定的,对吧!所以我们需要用这些输入计算输出的激活值。我们应该使用我们的激活函数和传入信号的权重之和。
a2=phi(a0*w02+a1*w12); |
如你所见,这个简单的方程表明,人工神经元的激活值取决于输入神经元的激活值和输入连接的权重。
我们认为,上述示例是互联网上最简单的人工神经元和ANN示例。它有助于理解简单的神经元模拟是如何工作的。让我们将所有内容汇总到下面的完整示例中,
#include <iostream>
// let's define a transfer function for the output neuron
float phi(float sum)
{
return sum ; // linear transfer function f(sum)=sum
}
int main()
{
//let's define activity of two input neurons (a0, a1) and one output neuron (a2)
float a0 = 0.0, a1 = 1.0, a2 = 0;
//let's define weights of signals comes from two input neurons to output neuron (0 to 2 and 1 to 2)
float w02 = 0.3, w12 = 0.2;
// Let's fire our artificial neuron to obtain activity by the transfer function, output will be
std::cout << "Firing Output Neuon ...\n" ;
a2 = phi(a0*w02 + a1*w12);
std::cout << "Output Neuron Activation Value:" << a2 << '\n';
getchar();
return 0;
}