感知机

  1. 该笔记基于《深度学习入门》而写,所以在python实践部分不会使用神经网络框架
  2. 这篇笔记的编写目的主要为便于回忆基础知识,并非教程
  3. 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
    10
    def 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
    37
    class 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
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
37
38
39
40
41
42
43
44
45
46
import numpy as np
class fn:
'''
输出方法为outputf()
'''
def __init__(self,w1,w2,theta):
self.w=np.array([w1,w2])
self.theta=theta
def output(self,x1,x2):
c=0
if x1!=0 and x1!=1:
raise Exception('输入有问题')
if x2!=0 and x2!=1:
raise Exception('输入有问题')

x=np.array([x1,x2])
result=np.sum(self.w*x)+self.theta
if result<=0:
c=0
if result>0:
c=1
print(f'输入为{x1}{x2}时为',c)
return c
# 与门
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)

单层感知机的局限性

  • 概念:
    • 简单来说,由曲线分割而成的空间称为非线性空间,由直线分割而成的空间称为线性空间。

单层的感知机的局限性就在于它只能表示由一条直线分割的空间。

单层的感知机无法实现异或门,异或门是由非线性空间构成

“异或”是拒绝其他的意思

  • 异或门的真值表

  • 再看看我们的神经元输出条件

    我们的判断条件临界线为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)。