人工神经元基本模型

一、数学原理

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

img

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

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

1.阈值型函数

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

    其函数图像如下:

2.饱和型函数

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

    其函数图像如下:

3.双曲正切函数

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

    其函数图像如下:

4.S型函数

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

    其函数图像如下:

5.高斯函数

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

    其函数图像如下:

6.ReLU函数

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

    其函数图像如下:

二、代码复现

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
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.