Python深度学习笔记第二周——感知机

Python深度学习笔记第二周——感知机

  • 感知机
    • 基本概述
    • 简单的逻辑电路
    • 感知机的实现
      • 简单实现
      • 引入权重与偏置的概念
      • 根据上述方式(权重与偏置)设计成逻辑门
    • 感知机的局限性
    • 多层感知机
      • 总结:
    • 从与非门到计算机

感知机

基本概述

感知机是一种非常简单的算法,但是却是学习神经网络的基础,因此对于其知识点务必要掌握。
和我们学过的数字电路的知识相同,感知机可以接收多个输入信号并且输出一个信号。并且,信号有0/1两种形式。
举个小栗子来体现感知机的运行原理:
Python深度学习笔记第二周——感知机_第1张图片
x1,x2为输入的两个信号,y1为输出的信号,w1和w2分别是两个输入信号所占的权重,我们定义一个阈值(界限),观察x1w1+x2w2的值与阈值(θ)的关系:
x1w1+x2w2≤θ---->输出0
x1w1+x2w2>θ---->输出1
阈值这里和图像处理里面的二值化很相似。同时,我们将输出为1称作神经元被激活
PS:感知机的多个输入信号都有各自固有的权重,这些权重发挥着控制各个信号的重要性的作用。也就是说,权重越大,对应该权重的信号的重要性就越高。通俗来讲,越重要的信号,对于结果的影响就越大。

简单的逻辑电路

与门:原理为全1出1,注意输入信号只有0/1,因此设计的权重和阈值只要符合预期结果就可以,比如当 (w1, w2, θ)为(0.5,0.5,0.7)(10.5+10.5=1>0.7,结果为1)就可以实现预期效果
与非门:原理为全1出0(先与后非),比如当 (w1, w2, θ)=(-0.5,-0.5,-0.7)(如果1*(-0.5)+1*(-0.5)=(-1)<(-0.7),结果为0,如果只有一个输入为1或全为0则结果必为1)
或门:有1出1,没1出0,比如当(w1, w2, θ)=(1,1,0.7)
总结:感知机的原理相同,都是计算权重后与阈值进行比较,大于阈值则出1,否则出0。而调整权重或阈值则可以使得同一个构造的感知机获得不同的功能。

感知机的实现

简单实现

以实现一个与门为例:AND表示与门的函数(AND gate)

def AND(x1, x2):
    w1, w2, theta = 0.5, 0.5, 0.7  # 设置权重和阈值:实现与门——全1出1
    tmp = x1 * w1 + x2 * w2
    if tmp <= theta:
        return 0
    elif tmp > theta:
        return 1


print(AND(0, 0))
print(AND(0, 1))
print(AND(1, 0))
print(AND(1, 1))

结果如下:

0
0
0
1

引入权重与偏置的概念

令θ=-b,则有:
在这里插入图片描述
此时的b称为偏置,现在可以理解为计算上述式子所得的值大于0则输出1,否则输出0。
现在使用NumPy来实现这个感知机:

import numpy as np

x = np.array([0, 1])    # 输入(x1,x2)
w = np.array([0.5, 0.5])    # 权重(w1,w2)
b = -0.7    # 偏置(b=-θ)
print(w * x)    # 进行点对点的运算(w1*x1,w2*x2)
print(np.sum(w * x))    # 进行加和运算(w1*x1+w2*x2)
print(np.sum(w * x) + b)    # 输出的最终结果:w1*x1+w2*x2+b

得到运行结果如下:

[0.  0.5]
0.5
-0.19999999999999996

根据上述方式(权重与偏置)设计成逻辑门

我们就拿与门来举例:

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
    if tmp <= 0:
        return 0
    else:
        return 1

数据其实和刚才都是一样的,只不过使用了NumPy,并且将θ换成了-b。
含义上,我们可以进行更形象细致的描述:w1和w2是控制输入信号的重要性的参数,而偏置是调整神经元被激活的容易程度(输出信号为1的程度)的参数,偏置的绝对值越大,激活会越困难,反之,则会越容易。
接下来实现与非门和或门,刚才理论中说过,三种门的感知机实际上的构造相同,因此只需要对于上述程序中的权重和偏置这些参数进行改变就可以获得所需功能的门,这里就不再浪费时间啦。

感知机的局限性

我们先考虑或门,当权重参数为(b, w1, w2) = (−0.5, 1.0, 1.0)时,有如下式子:
在这里插入图片描述
画出相关于x1与x2的平面直角坐标系的线性规划可知,函数下半部分应输出0,上半部分输出1,具体涉及到的点如下图所示:
Python深度学习笔记第二周——感知机_第2张图片
实际上想制作或门,需要用直线将图2-6中的○和△分开,满足我们要求的直线涉及到的函数实际上都可以成为一个或门的权重参数,图中刚才的那条直线就将这4个点正确地分开了。
换成异或门的话会如何呢?
Python深度学习笔记第二周——感知机_第3张图片
显然不可以找到一条直线,这里就要引出非线性的概念啦!如下图,也就是我们所说的用曲线进行分割。
Python深度学习笔记第二周——感知机_第4张图片

多层感知机

我们在数字电路中学过,实际上或非门是可以通过与门、或门、与非门进行组合而构建的,因此,可以通过以下的组合实现与非门的逻辑:
与门、与非门、或门的图示依次如下:
在这里插入图片描述
Python深度学习笔记第二周——感知机_第5张图片
先利用前文的代码进行函数的调用,也就是说,通过函数来体现各种简单门之间的组合:

def XOR(x1, x2):
	s1 = NANDg(x1, x2)     # 调用一次与非门,得到s1的结果
 	s2 = OR(x1, x2)	    # 调用一次或门,得到s2的结果
 	y = AND(s1, s2)      # 调用一次与门,得到最终需要输出的y的结果
 	return y
print(XOR(0, 0))
print(XOR(1, 0))
print(XOR(0, 1))
print(XOR(1, 1))

结果如下:

0
1
1
0

现在,我们把它通过感知机的形式进行体现:
Python深度学习笔记第二周——感知机_第6张图片
我们发现异或门多了一层,我们把这个叫做多层结构的神经网络。最左边为第0层,中间为第1层,最右边为第2层。可以与之前的简单感知机进行对比,我们将与门、或门等称作单层感知机,将异或门这种称作2层感知机,如果叠加了更多层的感知机就叫做多层感知机
接下来,简单描述一下感知机的工作顺序:先在第0层接收信号,进行输出,将输出的信号传送到第1层,由第1层根据权重参数进行处理后将结果输出,由第3层接收数据后根据自身的权重参数进行计算,得到最终结果后输出。

总结:

通过上述知识我们可以理解到,从刚才的问题出发,单层感知机只能表示线性空间,而多层感知机可以表示非线性空间。对于单层感知机无法表达的东西,我们可以通过叠加层的方式来表达。也就是说,通过叠加层(加深
层),感知机能进行更加灵活的表示

从与非门到计算机

感知机通过叠加层能够进行非线性的表示,理论上还可以表示计算机进行的处理(了解就好)。

你可能感兴趣的:(Python深度学习入门,python,神经网络,机器学习)