注:以下内容参照 [日]斋藤康毅 所著《深度学习入门-基于Python的理论与实现》
感知机是什么
感知机(perceptron)是神经网络(深度学习)的起源算法。感知机接受多个信号,输出一个信号。
下图中
x
1
、
x
2
x_1、x_2
x1、x2是输入信号,
w
1
、
w
2
w_1、w_2
w1、w2是权重,○表示“节点”或者“神经元”。
输入信号被送往神经元时,会被分别乘以固定的权重(
w
1
x
1
、
w
2
x
2
w_1x_1、w_2x_2
w1x1、w2x2),神经元会计算传送过来的信号的总和,只有当这个总和超出了某个界限,才会输出1,这也被称为“神经元被激活”。这个界限被称为阈值,用
θ
\theta
θ表示:
图1:单层感知机模型
用数学表达式表示为:
f
(
x
)
=
{
0
(
w
1
x
1
+
w
2
x
2
≤
θ
)
1
(
w
1
x
1
+
w
2
x
2
>
θ
)
公
式
(
1
)
f(x)=\left\{ \begin{aligned} 0 & \ \ \ \ \ (w_1x_1+w_2x_2≤ \theta ) \\ 1 & \ \ \ \ \ (w_1x_1+w_2x_2> \theta ) \\ \end{aligned} \right. 公式(1)
f(x)={01 (w1x1+w2x2≤θ) (w1x1+w2x2>θ)公式(1)
感知机能做什么
以逻辑电路举例。逻辑电路中的与门(ANDD gate),是两个输入和一个输出的门电路,对应如下真值表,只有两个输入均为1时输出1:
表1:与门真值表
x 1 x_1 x1 | x 2 x_2 x2 | y y y |
---|---|---|
0 | 0 | 0 |
1 | 0 | 0 |
0 | 1 | 0 |
1 | 1 | 1 |
考虑用感知机表示这个与门,需要我们选取合适的
w
1
、
w
2
、
θ
w_1、w_2、\theta
w1、w2、θ,实际上,有无数种取法,例如:(
w
1
,
w
2
,
θ
w_1,w_2,\theta
w1,w2,θ)=(0.5,0.5,0.7):
f
(
x
)
=
{
0
(
0.5
∗
x
1
+
0.5
∗
x
2
≤
0.7
)
1
(
0.5
∗
x
1
+
0.5
∗
x
2
>
0.7
)
(
公
式
2
)
f(x)=\left\{ \begin{aligned} 0 & \ \ \ \ \ (0.5*x_1+0.5*x_2 ≤ 0.7 ) \\ 1 & \ \ \ \ \ (0.5*x_1+0.5*x_2 > 0.7 ) \\ \end{aligned} \right. (公式2)
f(x)={01 (0.5∗x1+0.5∗x2≤0.7) (0.5∗x1+0.5∗x2>0.7)(公式2)
感知机python简单实现
简单实现
以下代码实现(公式2):
def AND(x1,x2):
w1,w2,theta=0.5,0.5,0.7
temp=x1*w1+x2*w2
return 0 if temp<=theta else 1
print(AND(0,0)) # 输出0
print(AND(1,0)) # 输出0
print(AND(0,1)) # 输出0
print(AND(1,1)) # 输出1
引入权重和偏置
为方便理解和计算,我们将(公式1)转化为以下形式:
f
(
x
)
=
{
0
(
b
+
w
1
x
1
+
w
2
x
2
≤
0
)
1
(
b
+
w
1
x
1
+
w
2
x
2
>
0
)
公
式
(
3
)
f(x)=\left\{ \begin{aligned} 0 & \ \ \ \ \ (b+w_1x_1+w_2x_2≤ 0 ) \\ 1 & \ \ \ \ \ (b+w_1x_1+w_2x_2> 0 ) \\ \end{aligned} \right. 公式(3)
f(x)={01 (b+w1x1+w2x2≤0) (b+w1x1+w2x2>0)公式(3)
以上公式中,
b
b
b称为偏置,
w
1
、
w
2
w_1、w_2
w1、w2称为权重。
权重
w
1
、
w
2
w_1、w_2
w1、w2控制参数的重要性,权重越大,参数越重要。
偏置
b
b
b控制神经元被激活的难易程度
引入偏置和权重概念,使用numpy计算的感知机python代码如下:
def AND(x1,x2):
x=np.array([x1,x2])
w=np.array([0.5,0.5])
b=-0.7
temp=np.sum(w*x)+b
return 0 if temp<=0 else 1
print(AND(0,0)) # 输出0
print(AND(1,0)) # 输出0
print(AND(0,1)) # 输出0
print(AND(1,1)) # 输出1
感知机的局限
尝试用感知机实现如下的“逻辑异或”(XOR)电路:
表2:异或门真值表
x 1 x_1 x1 | x 2 x_2 x2 | y y y |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 0 |
我们发现,用目前图1所表达的单层感知机模型,是无法表达表2的真值表的。那么为什么表1“与门”可以,表2异或门不可以呢?
对于表1对应的公式2,我们会生成如下图形:
图2:线性可分
一条直线
−
0.7
+
0.5
∗
x
1
+
0.5
∗
x
2
=
0
-0.7+0.5*x_1+0.5*x_2=0
−0.7+0.5∗x1+0.5∗x2=0将0(图中●表示)和1(图中△)表示,分为两部分,而对于表2异或门,我们无论如何无法用一条直线将0和1其分开:
图2:线性不可分
能用直线分割而成的空间称为线性空间,如图2,反之称为非线性空间,如图3。因此单层感知机无法解决线性不可分问题。
多层感知机
感知机的绝妙之处在于,它是可以叠加的。例如异或门问题,可以用如下两层感知机解决:
图3:2层感知机实现异或门
NAND表示非门(
x
1
和
x
2
x_1和x_2
x1和x2只要有一个为0即输出1,否则为0)
OR表示或门(
x
1
和
x
2
x_1和x_2
x1和x2只要有一个为1即输出1,否则为0)
计算过程如下:
表3:2层感知机实现异或门的计算过程
异或门2层感知机,如图,第一列称为第0层:
叠加了多层的感知机,也被称为多层感知机,能进行非线性的表示。理论上将,2层感知机就能构建计算机的所有计算!