神经网络初步学习——感知机

一、前言

神经网络,顾名思义,它与我们大脑生物学里面讲到的神经元有关联。前辈们在研究早期人工智能的时候,就开始过我们的"交叉融合",他们思考能不能把我们的人工智能的学习模式改造成我们人脑中神经元之间的学习方式------于是乎,神经网络就诞生了

而我们的感知机就是我们神经网络中的基本单位,最早由弗兰克·罗森布拉特(Frank Rosenblatt)提出,但是很不幸的是,在当时那个年代,感知机没能获得较大成功,这里不过多介绍,但是感知机的出现,开创了神经网络的先河
弗兰克·罗森布拉特(Frank Rosenblatt)博士在"感知机"上工作, 还是个帅哥哦

那么我们将开始我们的神经网络学习之旅,一同揭开它神秘的面纱



二、什么是感知机

(1)类比

我们回想一下我们的神经元工作:当我们的刺激信号达到一定阈值过后,我们才能进行信号的传输(高中生物学),用图来表示即如下:
单输入的感知机

其中:

我们可以设定一个阈值,当我们的y大于这个阈值的时候,那么输出为1,反之则为0


(2)多输入情况

但是正常情况下,我们的神经网络不可能只有一个输入,感知机可以接收多个输入信号,输出一个信号,下面是两个输入的情况:
两输入的感知机

这个时候y的表达式为:

我们的阈值判断标准还是没变,可以用如下公式来说明:


(3)感知机的简单运用------与门

在数字电路的学习中,我们知道与门的工作原理,只有两个输入都为1时,我们的输出才为1,这时候我们的与门其实相当于一个感知机,两个输入,一个输出,那么我们可不可以来实现它呢?

Sure,我们只要设置合适的参数即可,这里我们用python代码来给大家展示一下:

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中的功能,使得更加直观:

python 复制代码
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叫做偏置。

那么就有同学要问了:为什么要改成这个样子啊?

------这样做有几个原因,最重要的是它使得我们的式子更加数学化(比如上面是不是与我们直线方程相对应?或者说与我们的线性代数是不是有关联?),在后面的研究中更加方便

这样我们上面的与门代码可以写成这个样子:

python 复制代码
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可以很好地实现我们的矩阵之间的运算,例如我们之前写的代码中:

python 复制代码
    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的理论与实现》(斋藤康毅)

相关推荐
小鸡吃米…4 小时前
机器学习 - K - 中心聚类
人工智能·机器学习·聚类
好奇龙猫4 小时前
【AI学习-comfyUI学习-第三十节-第三十一节-FLUX-SD放大工作流+FLUX图生图工作流-各个部分学习】
人工智能·学习
沈浩(种子思维作者)4 小时前
真的能精准医疗吗?癌症能提前发现吗?
人工智能·python·网络安全·健康医疗·量子计算
saoys4 小时前
Opencv 学习笔记:图像掩膜操作(精准提取指定区域像素)
笔记·opencv·学习
minhuan4 小时前
大模型应用:大模型越大越好?模型参数量与效果的边际效益分析.51
人工智能·大模型参数评估·边际效益分析·大模型参数选择
Cherry的跨界思维4 小时前
28、AI测试环境搭建与全栈工具实战:从本地到云平台的完整指南
java·人工智能·vue3·ai测试·ai全栈·测试全栈·ai测试全栈
MM_MS4 小时前
Halcon变量控制类型、数据类型转换、字符串格式化、元组操作
开发语言·人工智能·深度学习·算法·目标检测·计算机视觉·视觉检测
ASF1231415sd5 小时前
【基于YOLOv10n-CSP-PTB的大豆花朵检测与识别系统详解】
人工智能·yolo·目标跟踪
水如烟5 小时前
孤能子视角:“意识“的阶段性回顾,“感质“假说
人工智能
电子小白1235 小时前
第13期PCB layout工程师初级培训-1-EDA软件的通用设置
笔记·嵌入式硬件·学习·pcb·layout