简单介绍一下感知机

1.1 感知机的概念

1.1.1 什么是感知机?

**感知机(Perceptron)**是Frank Rosenblatt在1957年提出的一种人工神经网络模型,是最简单的前馈神经网络,也是二元线性分类器的基础。它被视为单层神经网络的雏形,为后续更复杂的模型(如多层感知机、支持向量机等)奠定了基础。

1.1.2 特点

优点:

  • 它能够接受多个信号,输出一个信号。
  • 简单、计算高效。
  • 可处理线性可分问题(如与门、非与门、或门)。

局限性:

  • 无法解决非线性可分问题(如异或门),这一缺陷导致了神经网络的第一次低谷,直到多层感知机(MLP)和非线性激活函数的引入。
  • 对噪声和异常值敏感。

1.1.3 基本原理

感知机模拟生物神经元的工作方式:

  • 输入:接收多个特征信号((x_1, x_2, …, x_n))。
  • 加权求和:对输入信号赋予权重((w_1, w_2, …, w_n)),计算加权和 (z = \sum_{i=1}^n w_i x_i + b)((b)为偏置项)。

两个输入的感知机

节点计算传送过来的信号的总和,只有当这个总和超过某个阈值时才会输出1。
权重越大,对应该权重的信号的重要性越高。

公式
[
y = f\left(\sum_{i=1}^n w_i x_i + b\right), \quad f(z) \text{为激活函数}.
]
几何解释:在特征空间中,感知机用一个超平面(如二维中的直线)将数据分为两类。

1.2 感知机的实现

1.2.1 简单实现

通过感知机,我们可以表示与门(AND)、与非门(NAND)、或门(OR)的逻辑电路。

1
2
3
4
5
6
7
def AND(x1,x2)
w1,w2,theta=0.5,0.5,0.7
temp = x1*w1+x2*w2
if tmp <= theta:
return 0
elif tmp > theta:
return 1

我们可以通过仿照上例,导入我们的权重和偏置

1
2
3
4
5
6
7
import numpy as np
x = np.array([0,1])
w = np.array([0.4,0.8])
b = -0.6
print(w*x) # [0, 0.8]
print(np.sum(w*x)) # 0.8
print(np.sum(w*x)+b) # 0.20000000000000007

最后整合一下

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
import numpy as np
def AND(x1,x2):
x = np.array([x1,x2])
w = np.array([0.5,0.5])
b = -0.6

tmp = np.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1

def NAND(x1,x2):
x = np.array([x1,x2])
w = np.array([-0.5, -0.5])
b = 0.6
tmp = np.sum(w * x) + b
if tmp <= 0:
return 0
else:
return 1

def OR(x1,x2):
x = np.array([x1,x2])
w = np.array([0.5,0.5])
b = -0.2
tmp = np.sum(x*w) + b
if tmp <= 0:
return 0
else:
return 1

1.2.2 局限性

异或门(XOR)的定义:异或门的输入输出关系如下((A) 和 (B) 为二进制输入,(Y) 为输出):

(A) (B) (Y = A \oplus B)
0 0 0
0 1 1
1 0 1
1 1 0

异或门的输出要求:

  • 当 (A) 和 (B) 相同时输出 (0);
  • 当 (A) 和 (B) 不同时输出 (1)。

单层感知机(Single-Layer Perceptron)无法表示异或门(XOR),这是由其线性可分性的局限性决定的。
单层感知机是一个线性分类器,其决策边界是输入空间中的一个超平面(在二维情况下是一条直线)。
要能用一条直线正确分类异或门的输出,需要满足:

  • 输出为 (1) 的点(((0,1)) 和 ((1,0)))在直线的一侧;
  • 输出为 (0) 的点(((0,0)) 和 ((1,1)))在直线的另一侧。

但通过几何观察可以发现:

  • 无论怎么画一条直线,都无法将 ((0,1)) 和 ((1,0)) 与 ((0,0)) 和 ((1,1)) 分开。

几何直观
(图中红色×代表输出 (1),蓝色○代表输出 (0),无法用一条直线分开两类点。)

数学证明
假设存在权重 (w_1, w_2) 和偏置 (b),使得感知机能正确分类异或门,需满足以下不等式:
[
\begin{cases}
w_1 \cdot 0 + w_2 \cdot 0 + b \leq 0 \quad (Y=0), \
w_1 \cdot 0 + w_2 \cdot 1 + b > 0 \quad (Y=1), \
w_1 \cdot 1 + w_2 \cdot 0 + b > 0 \quad (Y=1), \
w_1 \cdot 1 + w_2 \cdot 1 + b \leq 0 \quad (Y=0).
\end{cases}
]
化简后得到:
[
\begin{cases}
b \leq 0, \
w_2 + b > 0, \
w_1 + b > 0, \
w_1 + w_2 + b \leq 0.
\end{cases}
]
将前两个不等式相加:
[
w_1 + w_2 + 2b > 0,
]
但根据第四个不等式:
[
w_1 + w_2 + b \leq 0,
]
结合 (b \leq 0),可得:
[
w_1 + w_2 + 2b \leq w_1 + w_2 + b \leq 0,
]
这与 (w_1 + w_2 + 2b > 0) 矛盾。因此不存在满足条件的 (w_1, w_2, b)

1.2.3 根本原因:线性可分性

  • 单层感知机只能解决线性可分问题(即存在一条直线/超平面能完美分开两类数据)。
  • 异或门的输入输出关系是非线性可分的(需要曲线或更复杂的边界)。

1.2.4 如何解决?

要解决异或问题,必须引入非线性
多层感知机(MLP)

  • 增加一个隐藏层(如用两个隐藏神经元分别表示AND和NAND门),再通过组合它们的输出实现异或。
  • 例如:
    (
    A \oplus B = (A \land \neg B) \lor (\neg A \land B).
    )

1.2.5 代码实现

1
2
3
4
5
def XOR(x1,x2):
s1 = NAND(x1,x2)
s2 = OR(x1,x2)
y = AND(s1,s2)
return y