第一章感知机

第一章感知机,第1张

目录
  • 感知机
    • 1.1 感知机的定义
    • 1.2 简单的逻辑电路
      • 1.2.1 与门
      • 1.2.2 与非门和或门
    • 1.3 感知机的实现
      • 1.3.1 简单实现
      • 1.3.2 导入权重和偏置
      • 1.3.3 使用权重和偏置实现感知机
    • 1.4 感知机的局限性
    • 1.5 多层感知机
      • 1.5.1已有门电路的组合
      • 1.5.2 异或门的实现
    • 1.6 从与非门到计算机
    • 总结

感知机

在学习深度学习(神经网络)之前, 我们首先需要知道什么是感知机,感知机是一种最简单的神经元,他可以对输入的数据按照一定策略进行运算,并对结果进行判断,从而确定是否激活该神经元(输出0或1),同时通过叠加层可是实现更复杂的功能,下面我们开始正式定义感知机。

1.1 感知机的定义

感知机是将输入乘各自的权值并将结果相加再判断是否超过激活阀值进行激活的机器,这么说很难理解但是看公式就很好理解了:

y = { 0 ( w 1 x 1 + w 2 x 2 ≤ θ ) 1 ( w 1 x 1 + w 2 x 2 > θ ) y= \left\{ \begin{array}{c} 0 & (w_1x_1+w_2x_2\le\theta) \\ 1 & (w_1x_1+w_2x_2\gt\theta) \\ \end{array} \right. y={01(w1x1+w2x2θ)(w1x1+w2x2>θ)

公式中 θ \theta θ表示阀值, w w w表示权重, x x x表示输入(可以有多个输入),1表示激活感知机0表示不激活(感知机的输出只有一个)

1.2 简单的逻辑电路 1.2.1 与门

在了解了感知机的定义以后,我们可以用感知机实现一些逻辑电路,比如逻辑电路中的与门,他的真值表如下:

输入 x 1 x_1 x1输入 x 2 x_2 x2输出 y y y
000
010
100
111

根据真值表我们可以设置感知机参数 ( w 1 , w 2 , θ ) = ( 0.5 , 0.5 , 0.7 ) (w_1,w_2,\theta)=(0.5,0.5,0.7) (w1,w2,θ)=(0.5,0.5,0.7)来实现与门,但这组数字并不唯一,我们同样还可以设计参数 ( w 1 , w 2 , θ ) = ( 0.3 , 0.3 , 0.4 ) (w_1,w_2,\theta)=(0.3,0.3,0.4) (w1,w2,θ)=(0.3,0.3,0.4)等来实现该功能,其参数组不唯一。

1.2.2 与非门和或门

同与门类似根据与非门和或门的真值表:

输入 x 1 x_1 x1输入 x 2 x_2 x2输出 y y y
001
011
101
110
输入 x 1 x_1 x1输入 x 2 x_2 x2输出 y y y
000
011
101
111

我们可以分别选择感知机参数组 ( w 1 , w 2 , θ ) = ( − 0.5 , − 0.5 , − 0.7 ) (w_1,w_2,\theta)=(-0.5,-0.5,-0.7) (w1,w2,θ)=(0.5,0.5,0.7) ( w 1 , w 2 , θ ) = ( 0.3 , 0.3 , 0.3 ) (w_1,w_2,\theta)=(0.3,0.3,0.3) (w1,w2,θ)=(0.3,0.3,0.3)来实现对应的与非门感知机和或门感知机,且参数组不唯一。

实际上与非门是对与门的取反运算,所以与非门感知机参数组完全可以选用与门感知机参数组的相反数。

以上提到的所有感知机参数都是我们人为想到的,但是实际 *** 作中,并不需要我们自己去想这些参数,而是通过机器学习将思考参数的工作交给计算机去完成,人需要做的就是思考感知机的构造(模型),并把训练数据交给计算机即可。

前面我们使用不同的参数构造了三种功能的感知机,但是需要强调的是,他们虽功能不同,但是他们的构造是一样的他们是同一种感知机 ,只需要通过调整适当的参数,他们就可以实现不同的功能。

1.3 感知机的实现 1.3.1 简单实现

这里我们用Python实现刚刚提到的与门:

def AND(x1, x2):
    w1, w2, theta = 0.5, 0.5, 0.7
    tmp = x1 * w1 + x2 * w2
    if tmp <= theta:
        return 0
    elif tmp > theta:
        return 1

print(AND(0, 0)) #结果为0
print(AND(0, 1)) #结果为0
print(AND(1, 0)) #结果为0
print(AND(1, 1)) #结果为1
1.3.2 导入权重和偏置

我们把前面提到的阀值 θ \theta θ换成 − b -b b,这样我们就得到了一个以零为界限判断是否激活感知机的新数学关系:
y = { 0 ( b + w 1 x 1 + w 2 x 2 ≤ 0 ) 1 ( b + w 1 x 1 + w 2 x 2 > 0 ) y= \left\{ \begin{array}{c} 0 & (b+w_1x_1+w_2x_2\le0) \\ 1 & (b+w_1x_1+w_2x_2\gt0) \\ \end{array} \right. y={01(b+w1x1+w2x20)(b+w1x1+w2x2>0)

聪明的你可以发现,这和最早提到的公式其实是一个内涵,不过换了个形式,这里的b称为偏置,反映了激活感知机的难度,他是阀值的相反数,权重w是控制输入信号重要性的参数。

1.3.3 使用权重和偏置实现感知机

使用权重和偏执实现与门不过再实现之前需要导入Numpy:

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  #大约是0.2,由浮点小数运算造成误差
    if tmp <= 0:
        return 0
    elif tmp > 0:
        return 1

同理我们可以实现与非门和或门:

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  #大约是0.2,由浮点小数运算造成误差
    if tmp <= 0:
        return 0
    elif tmp > 0:
        return 1
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  #大约是0.2,由浮点小数运算造成误差
    if tmp <= 0:
        return 0
    elif tmp > 0:
        return 1
1.4 感知机的局限性

通过两输入的单层感知机我们可以实现与门,与非门和或门但是请思考看看是否可以实现异或门,下面给出异或门真值表:

输入 x 1 x_1 x1输入 x 2 x_2 x2输出 y y y
000
011
101
110

经过思考发现这是不可能的,因为我们先拿或门使用参数组 ( b , w 1 , w 2 ) = ( − 0.5 , 1 , 1 ) (b,w_1,w_2)=(-0.5,1,1) (b,w1,w2)=(0.5,1,1)为例进行分析,他的表达式和示意图如下:
y = { 0 ( − 0.5 + w 1 x 1 + w 2 x 2 ≤ 0 ) 1 ( − 0.5 + w 1 x 1 + w 2 x 2 > 0 ) y= \left\{ \begin{array}{c} 0 & (-0.5+w_1x_1+w_2x_2\le0) \\ 1 & (-0.5+w_1x_1+w_2x_2\gt0) \\ \end{array} \right. y={01(0.5+w1x1+w2x20)(0.5+w1x1+w2x2>0)

图中三角表示激活或门,圈表示不激活。

可见我们是可以找到一条线型函数途中的点分成两部分的,但是我们的异或门是这样的一个情况:

这这是一个不可用直线分割的非线性空间,所以使用简单的感知机是无法实现异或功能的,即单层感知机无法分离线性空间

1.5 多层感知机

前面已经提到了单层感知机具有局限性,它无法解决非线性空间中的问题,这时我们可以使用叠加层的方法来解决,这也是卷积神经网络的思想基础。

1.5.1已有门电路的组合

前面已经学习过三个门电路的感知机了,可以通过一下两次的感知机实现异或门:

下面是该电路的真值表,请查看是否与异或门的真值表相同:

通过叠加层,在更高维度解决当前维度无法解决的问题这也是神经网络的工作原理。

1.5.2 异或门的实现
def XOR(x1, x2):
    s1 = NAND(x1, x2)
    s2 = OR(x1, x2)
    y = AND(s1, s2)
    return y

print(XOR(0, 0)) #输出0
print(XOR(0, 1)) #输出1
print(XOR(1, 0)) #输出1
print(XOR(1, 1)) #输出0

这种叠加了多层感知机的感知机结构就是多层感知机

1.6 从与非门到计算机

从上面的讲解可以看出,通过感知机合多层感知机我们是可以构成多种门电路的,我们的计算机就是由门电路构成的,如果我们用多层感知机一个个的构成我们电脑的CPU,内存和I/O电路,实际上我们是可以用感知机构成一台虚拟电脑的。

总结

本节的学习到此就结束了,本章学习的目的不是在于用感知机构成电路,本章的重心在于通过感知机能够理解神经网络解决问题的一种思想和方式,即通过叠加层,或者说是提高维度来解决低纬度的问题,这是本章学习的核心。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/729814.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-27
下一篇 2022-04-27

发表评论

登录后才能评论

评论列表(0条)

保存