原文链接:DL都是从感知机开始的
感知机:接受多个输入信号,输出一个信号
上图
x
1
x_1
x1,
x
2
x_2
x2是输入信号,
w
1
w_1
w1,
w
2
w_2
w2是权重,
y
y
y是输出信号。感知机的多个输入有各自的权重,权重越大,重要性越高。
y
=
{
0
,
(
w
1
x
1
+
w
2
x
2
+
b
≤
0
)
1
,
(
w
1
x
1
+
w
2
x
2
+
b
>
0
)
y = \left\{ \begin{aligned} 0, &(w_1x_1+w_2x_2 +b\leq0) \\ 1, &(w_1x_1+w_2x_2 +b>0) \end{aligned} \right.
y={0,1,(w1x1+w2x2+b≤0)(w1x1+w2x2+b>0)
我们可以画一个
x
1
−
x
2
x_1-x_2
x1−x2坐标,通过对
(
x
1
,
x
2
)
(x_1,x_2)
(x1,x2)的 4 种结合形式,即
(
0
,
0
)
,
(
0
,
1
)
,
(
1
,
0
)
,
(
1
,
1
)
(0,0), (0,1), (1,0), (1, 1)
(0,0),(0,1),(1,0),(1,1),将这4点标记出来。
令
w
1
=
w
2
=
0.5
w_1=w_2=0.5
w1=w2=0.5, 带入不等式,粗略可得下图,
AND门(输入均为1,则输出为1,否则为0):
用圆圈代表输出1,三角形代表输出0,则通过坐标图知,
AND门通过一条线分为两个空间,左下部分输出0,右上部分输出1.
NAND门(AND门取反):
用圆圈代表输出1,三角形代表输出0,则通过坐标图知,
NAND门通过一条线分为两个空间,左下部分输出1,右上部分输出0.
OR门(只要有一个输入信号为1,那么输出就为1):
用圆圈代表输出1,三角形代表输出0,则通过坐标图知,
OR门通过一条线分为两个空间,左下部分输出0,右上部分输出1.
通过上面3个图可以知道,不管是与门、非门还是或门,都可以通过一条直线将一个整体分为两部分,一部分输出0,另一部分输出1.
XOR门(当且仅当只有一个输入信号为1时,才输出为1):
通过上图可知,已经无法再通过一条直线将一个整体划为两部分,若强行将它分为两部分,那么就只能是曲线,所划空间也成为非线性空间。
结合逻辑电路所学知识,若想实现XOR(异或门),只有通过将与门、非门、或门进行组合来实现。
写出
(
x
1
,
x
2
)
(x_1,x_2)
(x1,x2) 的4种组合,分别写出该组合的非门与或门,再将非门、或门的输出信号作为与门的输入信号,最终得到XOR门(异或门)。
x1 | x2 | NAND | OR | AND | XOR |
---|---|---|---|---|---|
0 | 0 | 1 | 0 | 0 | 0 |
0 | 1 | 1 | 1 | 1 | 1 |
1 | 0 | 1 | 1 | 1 | 1 |
1 | 1 | 0 | 1 | 0 | 0 |
使用NumPy实现XOR门:
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:
print(0)
return 0
else:
print(1)
return 1
print('----以上与门-------')
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:
print(0)
return 0
else:
print(1)
return 1
print('----以上非门-------')
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:
print(0)
return 0
else:
print(1)
return 1
print('-----以上或门------')
def XOR(x1,x2):
s1=NAND(x1,x2)
s2=OR(x1,x2)
m=AND(s1,s2)
return m
XOR(0,0)
以上输出(1, 0, 0), 因为首先得到非门s1 = 1, 或门s2 = 0,再将非门与或门的输出信号作为与门的输入信号,得到XOR=0.