感知机
- 该笔记基于《深度学习入门》而写,所以在python实践部分不会使用神经网络框架
- 这篇笔记的编写目的主要为便于回忆基础知识,并非教程
- python实践部分的会用docsify整理到个人github上
感知机概述
接受多个输入信号,输出一个信号
大前提:所有输入只有1和0,即取值只有1和0
有两个输入的感知机

是一个接收两个输入信号的感知机的例子。x1、x2是输入信号,y是输出信号,$\omega_1,\omega_2$是权重(w是weight的首字母)。图中的○称为“神经元”或者“节点”。输入信号被送往神经元时,会被分别乘以固定的权重($\omega_1x_1,\omega_2x_2$)。神经元会计算传送过来的信号的总和,只有当这个总和超过了某个界限值时,才会输出1。这也称为“神经元被激活”。这里将这个界限值称为阈值,用符号θ表示。
数学表达式为
感知机的多个输入信号都有各自固有的权重,这些权重发挥着控制各个信号的重要性的作用。也就是说,权重越大,对应该权重的信号的重要性就越高。
可以类比电阻对电流的影响
简单逻辑电路
- 目录
- 与门
- 与非门和或门
思考
用感知机去考虑我们的权重应怎样设计可以达到与门,与非门和或门
与门的真值表

当只有一方输入为1时置0,全1为1,那么闸门一定要大于任意一方的权重而小于两方权重的总和
假设我们参数设置为($\omega_1,\omega_2,\theta$) = (0.5, 0.5, 0.7) 时,就可以达到效果,或者设置成(1,1,1)
- 与非门的真值表

既然与非门感知机的输如与与门的相同,结果相反,我们可以把参数设置成与门参数的相反值如($\omega_1,\omega_2,\theta$) = (-0.5, -0.5, -0.7)
- 或门的真值表

或门顾名思义只有有一方1结果就是1
那么只要全体参数都大于闸门就行
参数可以(0.5,0.5,0.2)
导入权重和偏置
将不等式条件格式修改成以下类型
虽然有一个符号不同,但表达的内容是完全相同的。此处,b称为偏置,$\omega_1$和$\omega_2$称为权重。如式(2.2)所示,感知机会计算输入信号和权重的乘积,然后加上偏置,如果这个值大于0则输出1,否则输出0。
- 偏置的值决定了神经元被激活的容易程度
- 有时也会将$b,\omega_1,\omega_2$这些参数统一称为权重
python代码实现(非Numpy版)
与门
1
2
3
4
5
6
7
8
9
10def AND1(x1,x2):
w1,w2,theta=0.5,0.5,0.7
if w1*x1+w2*x2<=theta:
return 0
if w1*x2+w2*x2>theta:
return 1
print('输入为1和0时为',AND1(1,0))
print('输入为0和1时为',AND1(0,1))
print('输入为1和1时为',AND1(1,1))
print('输入为0和0时为',AND1(0,0))用类写完简单逻辑电路感知机
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
32
33
34
35
36
37class fn:
def __init__(self,w1,w2,theta):
self.w1=w1
self.w2=w2
self.theta=theta
def output(self,x1,x2):
result=0
if self.w1*x1+self.w2*x2<=self.theta:
result=0
if self.w1*x1+self.w2*x2>self.theta:
result=1
print(f'输入为{x1}和{x2}时为',result)
return result
# 与门
print('与门')
AND1=fn(0.5,0.5,0.7)
AND1.output(0,1)
AND1.output(1,0)
AND1.output(1,1)
AND1.output(0,0)
print('-'*20)
# 与非门
print('与非门')
NAND1=fn(-0.5,-0.5,-0.7)
NAND1.output(0,1)
NAND1.output(1,0)
NAND1.output(1,1)
NAND1.output(0,0)
print('-'*20)
# 或门
print('或门')
OR1=fn(0.5,0.5,0.2)
OR1.output(0,1)
OR1.output(1,0)
OR1.output(1,1)
OR1.output(0,0)
python代码实现(Numpy版)
- 提示书中的代码也可以用矩阵乘法去做,
- 如果按线性代数的知识去拆方程
- [$\omega_1,\omega_2$]*[$x_1;x_2$]+b=$b+\omega_1x_1+\omega_2x_2$
- numpy中有专门的numpy.dot( )去做矩阵乘法
1 | import numpy as np |
单层感知机的局限性
- 概念:
- 简单来说,由曲线分割而成的空间称为非线性空间,由直线分割而成的空间称为线性空间。
单层的感知机的局限性就在于它只能表示由一条直线分割的空间。
单层的感知机无法实现异或门,异或门是由非线性空间构成
“异或”是拒绝其他的意思
- 异或门的真值表

再看看我们的神经元输出条件
我们的判断条件临界线为b+$\omega_1x_1+\omega_2x_2$=0
假定参数为(-0.5,0.5,1)

或门在(x1, x2) = (0, 0)时输出0,在(x1, x2)为(0, 1)、(1, 0)、(1, 1)时输出1。图2-6中,○表示0,△表示1。如果想制作或门,需要用直线将图2-6中的○和△分开。实际上,刚才的那条直线就将这4个点正确地分开了。那么,换成异或门的话会如何呢?能否像或门那样,用一条直线作出分割图2-7中的○和△的空间呢?

显然不能
但我们跳出用直线分割就可以实现,我们可以用曲线去分割

多层感知机
在上面的例子中我们看到单一的感知机是无法实现异或门,但我们可以通过叠加已实现的感知机去获取异或门感知机
可以通过叠加层去实现异或门

我们可以采取两边夹的方式推出异或门的组合
通过组合,我们可以发现当中间层为[0,1,1,1]和[1,1,1,0],并在用与门就可以得到异或门
前面由 或门和与非门 组成

这样,异或门的实现就完成了。下面我们试着用感知机的表示方法(明确地显示神经元)来表示这个异或门,结果如图2-13所示。如图2-13所示,异或门是一种多层结构的神经网络。这里,将最左边的一列称为第0层,中间的一列称为第1层,最右边的一列称为第2层。图2-13所示的感知机与前面介绍的与门、或门的感知机(图2-1)形状不同。实际上,与门、或门是单层感知机,而异或门是2层感知机。叠加了多层的感知机也称为多层感知机(multi-layered perceptron)。






