前言:简述单层感知机特征及三种表示方式,并用单层感知机描述门电路,借由单层感知机无法处理非线性空间的问题,引出多层感知机。
单层感知机
感知机(preceptron)接收多个输入信号,输出一个信号。
如下图所示为有两个输入的感知机。其中,
x
1
x_1
x1 和
x
2
x_2
x2 为输入信号,
y
y
y 为输出信号,
w
1
、
w
2
w_1、w_2
w1、w2 为权重,输入信号分别乘上各自权重,若两者总和超过某一阈值
θ
\theta
θ,则输出1,类似于神经元被激活。
数学表示:
y
=
{
0
,
w
1
x
1
+
w
2
x
2
⩽
θ
1
,
w
1
x
1
+
w
2
x
2
>
θ
y= \begin{cases}0 , w_1 x_1+w_2 x_2 \leqslant \theta \\ 1 , w_1 x_1+w_2 x_2>\theta\end{cases}
y={0,w1x1+w2x2⩽θ1,w1x1+w2x2>θ
权重
w
w
w 表示信号的重要程度;阈值
θ
\theta
θ 表示神经元被激活的难易程度,若
θ
\theta
θ 为 -50,则神经元被激活难度大,反之难度小。
另一种数学表示:
y
=
{
0
,
w
1
x
1
+
w
2
x
2
+
b
⩽
0
1
,
w
1
x
1
+
w
2
x
2
+
b
>
0
y= \begin{cases}0 , w_1 x_1+w_2 x_2+b \leqslant 0 \\ 1 , w_1 x_1+w_2 x_2+b>0\end{cases}
y={0,w1x1+w2x2+b⩽01,w1x1+w2x2+b>0
较上式,令
b
=
−
θ
b=-\theta
b=−θ,称为偏执。这种表示方法便于编程时借助矩阵运算。
几何表示:表示空间中的一条直线,无法表示曲线。由直线划分的空间称为线性空间,由曲线划分的空间表示非线性空间。
感知机 与 门电路
感知机能够表示与门、或门、非门。
与门
与门(AND gate)是有两个输入和一个输出的门电路,与门特点是全1则1,其余为0。下表为与门真值表,即输入和输出信号的对应表。
x 1 x_1 x1 | x 2 x_2 x2 | y y y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
数学表示:
y
=
{
0
,
0.5
x
1
+
0.5
x
2
⩽
0.7
1
,
0.5
x
1
+
0.5
x
2
>
0.7
y= \begin{cases}0 ,0.5x_1+0.5x_2 \leqslant 0.7 \\ 1 , 0.5x_1+0.5x_2>0.7 \end{cases}
y={0,0.5x1+0.5x2⩽0.71,0.5x1+0.5x2>0.7
几何表示:
Python 实现:
#数学表示1
def AND_gate(x1, x2):
w1, w2, theta = 0.5, 0.5, 0.7
tmp = w1*x1 + w2*x2
if tmp <= theta:
return 0
elif tmp > theta:
return 1
# ===========================
# 数学表示2
import numpy as np
def AND_gate_1(x1, x2):
x = np.array([x1, x2, 1])
w = np.array([0.5, 0.5, -0.7])
tmp = np.sum(w*x)
if tmp <= 0:
return 0
elif tmp > 0:
return 1
与非门
和「与门」的输出相反。
y
=
{
0
,
−
0.5
x
1
−
0.5
x
2
⩽
−
0.7
1
,
−
0.5
x
1
−
0.5
x
2
>
−
0.7
y= \begin{cases}0 ,-0.5x_1-0.5x_2 \leqslant -0.7 \\ 1 , -0.5x_1-0.5x_2>-0.7 \end{cases}
y={0,−0.5x1−0.5x2⩽−0.71,−0.5x1−0.5x2>−0.7
Python实现:
import numpy as np
def NAND_gate(x1, x2):
x = np.array([x1, x2, 1])
w = np.array([-0.5, -0.5, 0.7])
tmp = np.sum(w*x)
if tmp <= 0:
return 0
elif tmp > 0:
return 1
或门
有1则1,全0则0。
y
=
{
0
,
0.5
x
1
+
0.5
x
2
⩽
0.2
1
,
0.5
x
1
+
0.5
x
2
>
0.2
y= \begin{cases}0 ,0.5x_1+0.5x_2 \leqslant 0.2 \\ 1 , 0.5x_1+0.5x_2>0.2 \end{cases}
y={0,0.5x1+0.5x2⩽0.21,0.5x1+0.5x2>0.2
Python 实现:
import numpy as np
def OR_gate(x1, x2):
x = np.array([x1, x2, 1])
w = np.array([0.5, 0.5, -0.2])
tmp = np.sum(w*x)
if tmp <= 0:
return 0
elif tmp > 0:
return 1
异或门
仅当 x 1 、 x 2 x_1、x_2 x1、x2 中一方为1时,才会输出 1。
x 1 x_1 x1 | x 2 x_2 x2 | y y y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
无法用一条直线划分两种标记,因为感知机不能表示空间曲线。
多层感知机
单层感知机无法表示非线性空间,但多层感知机(multi-layered perceptron)可以表示。
通过叠加与、非与、或门实现异或门,Python 实现如下:
def XOR(x1, x2):
s1 = NAND_gate(x1, x2)
s2 = OR_gate(x1, x2)
y = AND_gate(s1, s2)
return y
如下图所示为2层感知机,感知机总共由 3 层构成,但是因为拥有权重的层实质上只有 2 层(第 0 层和第 1 层之间,第 1 层和第 2 层之间),所以称为「2层感知机」。不过,若从 3 层结构来看,也可称为「3层感知机」。
参考书籍:
深度学习入门:基于Python的理论与实现 (斋藤康毅)