人工神经元基本模型

一、数学原理

人工神经元是一个多输入、单输出的非线性组件,是人工神经网络的基本单元,其简化结构如图:

img

其输入与输出关系可具体描述为如下形式:

$$
y=f(I)
$$

$$
I=\sum_{i=1}^{n}{\omega_{i}x_{i}-\theta}
$$

式中,$x{i}(i=1,2,…,n)$ 是输入信号,从其他神经元传入或从外部输入;$w{i}$ 表示从神经元 $i$ 到本神经元的连接权重(加权系数);$\theta$ 为神经元内部阈值,设置用于正确分类样本;$f()$ 为激活函数,决定神经元输出。以下为几种常见的激活函数:

1.阈值型函数

其输出只有两种情况,一种可用阶跃型函数表示,另一种可用符号函数表示,两种函数公式如下:

$$
f(x)=\left{
\begin{aligned}
1, x≥0 \
0, x<0
\end{aligned}
\right.
$$

$$
f(x)=\left{
\begin{aligned}
1, x≥0 \
-1, x<0
\end{aligned}
\right.
$$

其函数图像如下:

2.饱和型函数

其输出在某一区间呈线性变换。函数公式如下:

$$
f(x)=\left{
\begin{aligned}
1, x≥\frac {1}{k} \
kx, -\frac {1}{k}≤x<\frac {1}{k} \
-1, x<-\frac {1}{k}
\end{aligned}
\right.
$$

其函数图像如下:

3.双曲正切函数

其与饱和型函数图形相似,但更接近实际情况。函数公式如下:

$$
f(x)=\tanh(x)=\frac {e^{x}-e^{-x}}{e^{x}+e^{-x}}
$$

其函数图像如下:

4.S型函数

其在 $(0,1)$ 内连续取值且单调可微,被称为 Sigmoid 函数,简称 S 型函数,用于 BP 网络。函数公式如下:

$$
f(x)=\frac{1}{1+\exp{(1-\beta x)}}
$$

其函数图像如下:

5.高斯函数

用于 RBF 网络。函数公式如下:

$$
f(x)=e^{-\frac{x^2}{\delta^2}}
$$

其函数图像如下:

6.ReLU函数

其使得神经网络的神经元具有稀疏激活性。函数公式如下:

$$
f(x)=\left{
\begin{aligned}
x, x≥0 \
0, x<0
\end{aligned}
\right.
$$

其函数图像如下:

二、代码复现

假设我们想要创建一个神经元,它有两个输入,权重分别为 0.5 和 -0.3,偏置为 0.6,并使用使用 S 型激活函数,其超参数 beta 设置为 1。实现代码如下:

import numpy as np


# 定义神经元类
class Neuron:
    def __init__(self, weights, bias):
        self.weights = np.array(weights)  # 权重数组
        self.bias = bias  # 偏置项

    # 阈值型函数
    def threshold(self, x):
        return np.where(x >= 0, 1, 0)

    # 饱和型函数
    def saturated(self, x, k):
        dk = 1 / k
        return np.where(x >= dk, 1, np.where(-dk <= x, k * x, 0))

    # 双曲正切函数
    def hyperbolic_tangent(self, x):
        return (np.exp(x) - np.exp(-x)) / (np.exp(x) + np.exp(-x))

    # S型函数
    def sigmoid(self, x, beta):
        return 1 / (1 + np.exp(-beta * x))

    # 高斯函数
    def guass(self, x, delta):
        return np.exp(-x ** 2 / delta)

    def ReLU(self, x):
        return np.where(x >= 0, x, 0)

    # 激活函数选择及输出
    def activation_function(self, x, c, p):
        if c == 1:
            return self.threshold(x)
        elif c == 2:
            return self.saturated(x, p)
        elif c == 3:
            return self.hyperbolic_tangent(x)
        elif c == 4:
            return self.sigmoid(x, p)
        elif c == 5:
            return self.guass(x, p)
        elif c == 6:
            return self.ReLU(x)
        else:
            raise ValueError('激活函数不存在')

    # 输出结果,设置默认激活函数为S型函数,超参数设置为1
    def forward(self, inputs, c=4, p=1):
        # 计算输入的加权和加上偏置
        z = np.dot(inputs, self.weights) + self.bias
        # 应用激活函数
        return self.activation_function(z, c, p)


if __name__ == "__main__":
    # 示例使用
    # 假设我们有一个神经元,有两个输入,权重为[0.5, -0.3],偏置为0.6
    weights = [0.5, -0.3]
    bias = 0.6

    # 创建神经元实例
    neuron = Neuron(weights, bias)

    # 假设输入为[0.1, -0.2]
    inputs = np.array([0.1, -0.2])

    # 进行前向传播计算输出
    output = neuron.forward(inputs)
    print("神经元输出:", output)

在上述代码中,Neuron 类先通过 forward 函数计算神经元模型数学公式中的 $I$,然后通过 activation_function 实现对激活函数的选择及输出。案例实现结果如下:

神经元输出: 0.6704011598088686

参考文献

[1] 毕晓君. 2020. 计算智能 [M]. 人民邮电出版社, 北京. 17-19.

文章作者: JAM
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 星河的博客
计算智能 代码 神经网络 复现 数学 算法 数学
喜欢就支持一下吧