一、前言
神经网络,顾名思义,它与我们大脑生物学里面讲到的神经元有关联。前辈们在研究早期人工智能的时候,就开始过我们的“交叉融合”,他们思考能不能把我们的人工智能的学习模式改造成我们人脑中神经元之间的学习方式——于是乎,神经网络就诞生了
而我们的感知机就是我们神经网络中的基本单位,最早由弗兰克·罗森布拉特(Frank Rosenblatt)提出,但是很不幸的是,在当时那个年代,感知机没能获得较大成功,这里不过多介绍,但是感知机的出现,开创了神经网络的先河

那么我们将开始我们的神经网络学习之旅,一同揭开它神秘的面纱
二、什么是感知机
(1)类比
我们回想一下我们的神经元工作:当我们的刺激信号达到一定阈值过后,我们才能进行信号的传输(高中生物学),用图来表示即如下:

其中:
我们可以设定一个阈值,当我们的y大于这个阈值的时候,那么输出为1,反之则为0
(2)多输入情况
但是正常情况下,我们的神经网络不可能只有一个输入,感知机可以接收多个输入信号,输出一个信号,下面是两个输入的情况:

这个时候y的表达式为:
我们的阈值判断标准还是没变,可以用如下公式来说明:
(3)感知机的简单运用——与门
在数字电路的学习中,我们知道与门的工作原理,只有两个输入都为1时,我们的输出才为1,这时候我们的与门其实相当于一个感知机,两个输入,一个输出,那么我们可不可以来实现它呢?
Sure,我们只要设置合适的参数即可,这里我们用python代码来给大家展示一下:
def AND(x1, x2):
w1, w2, theta = 0.5, 0.5, 0.7 #theta即我们设定的阈值
tem = x1*w1 + x2*w2
if(tem <= theta):
return 0
elif(tem > theta):
return 1
if __name__ == "__main__":
a = AND(0,1)
print(a)
b = AND(1,1)
print(b)
我们的输出结果如下:
结果是符合我们的预期的
此外,我们还可以将我们的代码写出如下形式,即利用我们的numpy中的功能,使得更加直观:
import numpy as np
def AND(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
y = np.sum(x*w)
if(y < 1):
return 0
else:
return 1
if __name__ == "__main__":
b = AND(1,1)
print(b)
之后我们的代码也会写成这样,请注意
三、权重与偏置的引入
在上面的介绍中,我们有以下公式:
这里我们没有说明w是什么,在这里我们一般把w叫做权重
而我们在前面提到的,我们这里将其改写一下:
=
,那么我们的y可以写成这个样子:
我们把b叫做偏置。
那么就有同学要问了:为什么要改成这个样子啊?
——这样做有几个原因,最重要的是它使得我们的式子更加数学化(比如上面是不是与我们直线方程相对应?或者说与我们的线性代数是不是有关联?),在后面的研究中更加方便
这样我们上面的与门代码可以写成这个样子:
import numpy as np
def AND(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
b = -1
y = np.sum(x*w) + b
if(y < 0):
return 0
else:
return 1
if __name__ == "__main__":
c = AND(1,1)
print(c)
四、感知机的图解与局限
除了与门之外,我们的感知机还可以模拟我们的或门,与非门,这里不做展示,大家可以自己下来写一下代码
(1)图解:
那么我们再来看看我们这个式子:
我们主要看我们括号里面的东西,如果我们将x1、x2当作我们的x、y,那么这一个式子在数学上的含义表示的是一个直角坐标系(二维平面)的一个区间划分:

我们想一想我们的与门,总共我们可以输入4个不同的输入,对应的其实就是坐标系中的4个点:(0,0)(1,0)(0,1)(1,1),而我们的输出就只有0和1,那么由我们的权重还有偏置所设置的直线方程就将我们所有输出为1的点和所有为0的点分割开来了,如下图所示:
核心:一条线划分0和1
(2)局限
于是就会小伙伴想:那么异或门(XOR gate)可不可以呢?,即对于下面这张图,能不能用一条直线将我们的1与0分隔来:
聪明的你们有了答案:没有欸!——说明对于异或门来说,我们没法用我们的感知机来表示(单层感知机没法表示哦)
如果我们想要分隔开来,那么我们只能是用曲线的方式(非线性):
那么我们的感知机(单层)的缺陷就显示出来了:就在于它只能表示由一条直线分割的空间,没办法将我们的非线性空间表示出来。
五、多层感知机
(1)引入
存在缺陷,那么我们就要去改进或者更改
在数字电路的学习当中,我们知道我们的异或门可以写成如下形式:
或者是:
我们先来看看我们的第二种表达形式,与非门我们可以用之前的感知机表示出来,或门也同理,那么其实我们的异或门形式可以写成如下样子:
那么此时我们就发现,现在我们的感知机的层数变为了2层(也有的说是3层)这里,将最左边的 一列称为第0层,中间的一列称为第1层,最右边的一列称为第2层
(2)比较
对于单层感知机无法表示出来的东西,我们用多层感知机便可以很好地解决,通过加深层数,感知机能进行更加灵活的表示
补充:python相关知识
编者也是python初步,所以这一个板块主要对上面代码出现的一些知识点进行简单的讲解,读者可以忽略本部分:
(1)引入numpy的好处
相比于我们不用这个方法来创建我们的矩阵(一维或者多维),我们借助这个numpy可以很好地实现我们的矩阵之间的运算,例如我们之前写的代码中:
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
b = -1
y = np.sum(x*w) + b
np.sum(x*w),这个方法就可以实现两个一维矩阵之间对应元素相乘
部分内容转载自:《深度学习入门:基于Python的理论与实现》(斋藤康毅)