接触深度学习的第一个概念就是感知机,感知机是与门、或门的逻辑电路,是一种判别模型。常见的感知机分为与门、或门、非与门。
通过感知机,相当于是用一条直线将空间进行了划分。
我们都知道,与门只有在输入的 x1 和 x2 都是1的情况下才会输出1,即:
(0, 0) -> 0
(1, 0) -> 0
(0, 1) -> 0
(1, 1) -> 1
与门的代码实现如下:
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
这样,就相当于用一条直线将上述四个点分开了:
或门只有在输入的 x1 和 x2 都是0的情况下才会输出0,即:
(0, 0) -> 0
(1, 0) -> 1
(0, 1) -> 1
(1, 1) -> 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
同样,相当于用一条直线将上述四个点分开了:
3. 非与门(not_and_gate)原理类似:
(0, 0) -> 1
(1, 0) -> 0
(0, 1) -> 0
(1, 1) -> 0
非与门的代码实现如下:
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
划分曲线和与门相同。
三、感知机叠加上面说的3种逻辑都可以通过一条直线将区域划分,但是对于处理异或门的时候,情况就变的 有些复杂。
1. 异或门异或门输入与输出的关系如下:
(0, 0) -> 1
(1, 0) -> 0
(0, 1) -> 0
(1, 1) -> 1
这时就很难用一条直线将区域进行划分。除了可以使用曲线之外,还可以通过将感知机进行叠加,实现功能。
运算过程如下:
输入 | NAND | OR | AND |
---|---|---|---|
(0,0) | 1 | 0 | 0 |
(0,1) | 1 | 1 | 1 |
(1,0) | 1 | 1 | 1 |
(1,1) | 0 | 1 | 0 |
代码实现如下:
def XOR(x1, x2):
s1 = NAND(x1, x2)
s2 = OR(x1, x2)
y = AND(s1, s2)
return y
这样就成功将数据分成了2组,其实这里就实现了一个简单的神经网络。
神经网络就是这样一个过程,当无法直接获取输出结果的时候,就通过一系列的运算,将最后的结果输出。
理解了感知机,对后面深度学习的理解就迈出了第一步。