感知机

感知机是神经网络(深度学习)的起源算法,学习感知机的构造是理解神经网络和深度学习的第一步。

感知机是什么?

感知机接收多个输入信号,输出一个输出信号。信号只有“流/不流”(1/0)两种取值。

  • **$x_1, x_2$**:输入信号
  • **$y$**:输出信号
  • **$w_1, w_2$**:权重($w$ 为 weight 的首字母)
  • **$\theta$**:阈值

神经元计算传送过来的信号的总和,当这个总和超过某个界限值时,才会输出“1”,这也称为“神经元被激活”。这个界限值称为阈值,用符号 $\theta$ 表示。

上述概念可以用数学公式表示:

$$ y = \begin{cases} 0 & (w_1x_1 + w_2x_2 \le \theta) \ 1 & (w_1x_1 + w_2x_2 > \theta) \end{cases} $$

导入权重和偏置

为了简化表达,我们将阈值 $\theta$ 移到左边,并用 $b$(bias)表示偏置。

$$ y = \begin{cases} 0 & (b + w_1x_1 + w_2x_2 \le 0) \ 1 & (b + w_1x_1 + w_2x_2 > 0) \end{cases} $$

其中,$b = -\theta$。

这里的 $b$ 称为偏置,$w_1, w_2$ 称为权重。感知机会计算输入信号和权重的乘积,然后加上偏置,如果这个值大于 0,则输出 1,否则输出 0。

简单逻辑电路

接下来,我们使用感知机来实现几个简单的逻辑电路。

与门(AND Gate)

与门是有两个输入和一个输出的门电路。当两个输入都为 1 时,输出为 1,否则输出为 0。

$x_1$ $x_2$ $y$
0 0 0
1 0 0
0 1 0
1 1 1

我们可以通过设置权重和偏置来实现与门。例如,当 $(w_1, w_2, b) = (0.5, 0.5, -0.7)$ 时,可以满足上表的条件。

与非门(NAND Gate)

与非门就是与门的输出取反。当两个输入都为 1 时,输出为 0,否则输出为 1。

$x_1$ $x_2$ $y$
0 0 1
1 0 1
0 1 1
1 1 0

要实现与非门,只需将与门的权重和偏置取反即可,例如 $(w_1, w_2, b) = (-0.5, -0.5, 0.7)$。

或门(OR Gate)

或门是当两个输入中至少有一个为 1 时,输出为 1 的门电路。

$x_1$ $x_2$ $y$
0 0 0
1 0 1
0 1 1
1 1 1

或门可以通过设置权重和偏置来实现,例如 $(w_1, w_2, b) = (0.5, 0.5, -0.2)$。

实现

现在,我们用 Python 来实现这些逻辑电路。

简单实现

1
2
3
4
5
6
7
def AND(x1, x2):
w1, w2, theta = 0.5, 0.5, 0.7
tmp = x1 * w1 + x2 * w2
if tmp <= theta:
return 0
elif tmp > theta:
return 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
import numpy as np

def AND(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
b = -0.7
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.7
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(w * x) + b
if tmp <= 0:
return 0
else:
return 1

感知机的局限性

单层感知机只能表示线性空间,无法表示非线性空间。例如,它无法实现异或门(XOR Gate)。

异或门(XOR Gate)

异或门仅当两个输入中只有一个为 1 时,输出才为 1。

$x_1$ $x_2$ $y$
0 0 0
1 0 1
0 1 1
1 1 0

我们无法找到一组权重 $(w_1, w_2, b)$ 来满足上表的条件。这是因为单层感知机在二维平面上只能画出一条直线来分割两个区域,而异或门的四个点无法被一条直线分开。

多层感知机

单层感知机无法解决异或门问题,但我们可以通过组合多个感知机来解决。这被称为多层感知机(Multi-Layer Perceptron)。

构建异或门

我们可以通过组合与门、与非门和或门来实现异或门。

$$ y = (x_1 \text{ AND } (\text{NOT } x_2)) \text{ OR } ((\text{NOT } x_1) \text{ AND } x_2) $$

用我们已经实现的门电路来表示:

$$ s_1 = \text{NAND}(x_1, x_2) $$
$$ s_2 = \text{OR}(x_1, x_2) $$
$$ y = \text{AND}(s_1, s_2) $$

Python 实现

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

通过这种方式,我们利用多层感知机成功实现了异或门。多层感知机可以表示更复杂的非线性空间,这也是神经网络的基础。