【深度学习基础】——机器的神经元:感知机

感知机模型的原理之前已经讲过(【感知机模型 - CSDN App】https://blog.csdn.net/2401_88885149/article/details/145563837?sharetype=blog&shareId=145563837&sharerefer=APP&sharesource=2401_88885149&sharefrom=link)但主要是从数学和机器学习算法的角度浅尝辄止,实际上,如果将感知机看做神经网络的某一部分,感知机也可以看做神经元,是一种仿生学算法,亦是深度学习的基础。

感知机是什么

感知机是一种模仿生物神经元的简单机器学习模型,用于二分类任务。它由输入层、权重、求和单元和激活函数组成。输入特征通过权重加权后求和,再经激活函数(如阶跃函数)判断输出类别。感知机通过学习调整权重,当输出与目标不符时,根据规则更新权重,以更好地分类数据。它只能解决线性可分问题,但为后续复杂神经网络的发展奠定了基础。

感知机公式理解

现在,我先给大家分享一个简易的二维感知机模型:
在这里插入图片描述
在这个式子中,w可以看做是一种对于神经冲动的阻碍,而神经元在收到总电信号到达一定阈值之后,神经就会被激活,通过突触信号传递给其他神经元(多层神经网络)
在这里插入图片描述

从仿生学来考虑公式

一般我们说的朴素感知机也就是一层的感知机,朴素感知机模型主要有四个部分组成

  1. 输入:接收多个特征(如图像像素值),每个特征对应一个输入节点。
  2. 权重:每个特征乘以其权重(表示重要性),如 (w_i \times x_i)。
  3. 加权求和:计算所有加权输入的总和 (\sum w_i x_i)。
  4. 激活函数(如阶跃函数):
    • 若总和 ≥ 阈值 (\theta),输出 1(如判定为“猫”);
    • 否则输出 0(如判定为“狗”)。

核心逻辑:通过调整权重,感知机学习如何用特征的加权组合做二分类决策。

从逻辑门来考虑公式

大部分教程在提到感知机搭建神经网络的过程总是会与高中通用技术的电路相联系,因为与门非门或门经过考证可以实现所有电脑的逻辑,而感知机却又能够这三种电子门电路,因此,我们才认为足够复杂的感知机模型也就是多层感知机有足够好的前景来实现各种逻辑输出,这也是深度学习爆火的底层原因。
现在,我们只谈单个感知机模型:
如果我们希望利用单个感知机来模仿或门
在这里插入图片描述
很显然,这就是我们最终确定的感知机模型图像,(至于怎么确定直线的参数可以查看上面的链接,主要原理就是利用直线来切割各点,这里参数的求解很快又回到我们熟悉的svm了,顺带一提,机器学习就是机器确定合适参数的过程)

更复杂的感知机模型

很显然,单层的感知机还是难以求解非线性的问题,因此,我们需要通过叠加层来实现
在这里插入图片描述
这种实现方式的模型也称之为多层感知机
在这里插入图片描述

逻辑门实现举例

这里仅举一例异或门实现:
异或门的定义
异或门(XOR)的功能是:当两个输入不同时,输出为1;当两个输入相同时,输出为0。其真值表如下:

输入 ( x_1 ) 输入 ( x_2 ) 输出 ( y )
0 0 0
0 1 1
1 0 1
1 1 0

逻辑门组合实现异或门
异或门无法通过单个感知机直接实现,因为它是非线性可分的。但是,可以通过组合多个逻辑门(如与门、或门、与非门)来实现。

1.与非门(NAND)

与非门的输出是与门的反向输出。其真值表如下:

输入 ( x_1 ) 输入 ( x_2 ) 输出 ( y )
0 0 1
0 1 1
1 0 1
1 1 0

在代码中,与非门的实现如下:

def mlp_nand(x1, x2):
    x = np.array([x1, x2]).astype(np.float32)
    weight = np.array([-0.5, -0.5]).astype(np.float32)
    bias = 0.7
    y = np.dot(weight, x) + bias
    if y <= 0:
        return 0
    else:
        return 1

• 权重为([-0.5,-0.5]),偏置为(0.7)。

• 当(x_1)和(x_2)都为1时,加权求和为(-0.5\times 1-0.5\times 1+0.7=-0.3),小于0,输出为0。

• 其他情况下,加权求和大于0,输出为1。

2.或门(OR)

或门的输出是两个输入中任意一个为1时输出1。其真值表如下:

输入 ( x_1 ) 输入 ( x_2 ) 输出 ( y )
0 0 0
0 1 1
1 0 1
1 1 1

在代码中,或门的实现如下:

def mlp_or(x1, x2):
    x = np.array([x1, x2]).astype(np.float32)
    weight = np.array([0.5, 0.5]).astype(np.float32)
    bias = -0.2
    y = np.dot(weight, x) + bias
    if y <= 0:
        return 0
    else:
        return 1

• 权重为([0.5,0.5]),偏置为(-0.2)。

• 当(x_1)和(x_2)都为0时,加权求和为(0.5\times 0+0.5\times 0-0.2=-0.2),小于0,输出为0。

• 其他情况下,加权求和大于0,输出为1。

3.与门(AND)

与门的输出是两个输入都为1时输出1。其真值表如下:

输入 ( x_1 ) 输入 ( x_2 ) 输出 ( y )
0 0 0
0 1 0
1 0 0
1 1 1

在代码中,与门的实现如下:

def mlp_and(x1, x2):
    x = np.array([x1, x2]).astype(np.float32)
    weight = np.array([0.5, 0.5]).astype(np.float32)
    bias = -0.7
    y = np.dot(weight, x) + bias
    if y <= 0:
        return 0
    else:
        return 1

• 权重为([0.5,0.5]),偏置为(-0.7)。

• 当(x_1)和(x_2)都为1时,加权求和为(0.5\times 1+0.5\times 1-0.7=0.3),大于0,输出为1。

• 其他情况下,加权求和小于0,输出为0。

4.异或门(XOR)的实现

异或门可以通过以下逻辑门组合实现:
[\text{XOR}(x_1,x_2)=\text{AND}(\text{NAND}(x_1,x_2),\text{OR}(x_1,x_2))]

具体步骤如下:

  1. 计算与非门的输出(\text{NAND}(x_1,x_2)):

• 当(x_1)和(x_2)都为1时,输出为0。

• 其他情况下,输出为1。

  1. 计算或门的输出(\text{OR}(x_1,x_2)):

• 当(x_1)和(x_2)都为0时,输出为0。

• 其他情况下,输出为1。

  1. 将与非门和或门的输出作为与门的输入:

• 当(x_1)和(x_2)都为0时,与非门输出为1,或门输出为0,与门输出为0。

• 当(x_1)和(x_2)不同时,与非门输出为1,或门输出为1,与门输出为1。

• 当(x_1)和(x_2)都为1时,与非门输出为0,或门输出为1,与门输出为0。

在代码中,异或门的实现如下:

def mlp_xor(x1, x2):
    s1 = mlp_nand(x1, x2)  # 计算与非门的输出
    s2 = mlp_or(x1, x2)    # 计算或门的输出
    y = mlp_and(s1, s2)    # 将与非门和或门的输出作为与门的输入
    return y

测试
通过输入所有可能的组合(0, 0)(0, 1)(1, 0)(1, 1),验证异或门的输出是否正确:

print(mlp_xor(0, 0))  # 输出 0
print(mlp_xor(0, 1))  # 输出 1
print(mlp_xor(1, 0))  # 输出 1
print(mlp_xor(1, 1))  # 输出 0

通过逻辑门组合实现异或门的逻辑推理过程如下:

  1. 使用与非门(NAND)和或门(OR)的组合。

  2. 将与非门和或门的输出作为与门(AND)的输入。

  3. 最终得到异或门的输出。

在这里插入图片描述