从0构建神经网络(1)从感知机到神经网络

news2024/11/20 23:38:18

一、前言

深度学习中有许多框架,包括Tensorflow、PyTorch、Keras等,框架中实现了各种网络,并且可以自动求导,因此构建一个完整的网络只需要十几行代码。因为框架高度封装,因此我们无法知道底层的原理。为了更好地理解神经网络,本文使用numpy构建一个完整的神经网络,并实现反向传播和梯度下降算法,使用自己实现的神经网络训练一个分类模型。

二、感知机

在开始构建神经网络之前,需要了解一下神经网络的一些理论。本文要实现的是全连接神经网络,而全连接神经网络则是由一个叫感知机的模型演变而来的,下面我们来看看感知机。

2.1 感知机

2.1.1 感知机原理

感知机是一个二分类模型,其目的就是使用一个直线或超平面将两类数据分开。为了简单,这里讨论二维的情况。二维空间中的直线可以用下面的函数来表示:
h = w 1 x 1 + w 2 x 2 + b h = w_1x_1+w_2x_2+b h=w1x1+w2x2+b
其中 x 1 、 x 2 x_1、x_2 x1x2为数据, w 1 、 w 2 、 b w_1、w_2、b w1w2b为参数,是三个常数。此时可以用 X = [ x 1 , x 2 ] T X=[x_1, x_2]^T X=[x1,x2]T来表示输入。如果输入一个 X 1 X_1 X1,得到的 h 1 h_1 h1大于0,说明数据 X 1 X_1 X1在直线上方,即 X 1 X_1 X1属于类别1。如果得到 h 1 h_1 h1小于0,说明数据 X 1 X_1 X1在直线下方,即 X 1 X_1 X1数据类别0。
上面的文字描述可以用一个阶跃函数来代替,即:
y = { 1 , w 1 x 1 + w 2 x 2 + b ≥ 0 0 , w 1 x 1 + w 2 x 2 + b < 0 y = \begin{cases} 1, & w_1x_1+w_2x_2+b \geq 0\\ 0,& w_1x_1+w_2x_2+b < 0 \\ \end{cases} y={1,0,w1x1+w2x2+b0w1x1+w2x2+b<0
现在只需要确定 w 1 、 w 2 、 b w_1、w_2、b w1w2b,就可以用上述函数进行分类了。

2.1.2 逻辑电路

现在知道了感知机的函数,接下来可以用感知机来实现一些功能了。比如与电路,与电路有两个输入,分别对应 x 1 、 x 2 x_1、x_2 x1x2,有一个输出对应y。与电路的特点是当两个输入都为1时才输出1,否则输出0,与电路的真值表如下所示:

x1x2y
000
010
100
111
通过一些手段,我们知道当 w 1 = 0.5 、 w 2 = 0.5 、 b = 0.8 w_1=0.5、w_2=0.5、b=0.8 w1=0.5w2=0.5b=0.8时,感知机可以实现与电路的功能。现在,只需要修改 w 1 、 w 2 、 b w_1、w_2、b w1w2b的取值,我们还可以实现或、与非电路。下面是与电路的一个Python代码:
import numpy as np

def AND(X):
    # w1、w2
    W = np.array([[0.5], [0.5])
    b = 0.8
    h = np.dot(X, W)
    if h >= b:
        return 1
    else:
        return 0

而或、非电路的实现就是把W、b修改一下。

2.2 感知机的局限

在前面我们用感知机实现了与电路,或、与非电路也可以和与电路一样简单实现。那么感知机什么电路都能实现吗?答案是否定的,感知机是一个线性模型(用直线划分),它只能解决线性可分的问题,而异或电路则是非线性的,异或当输入相同时输出0,输入不同输出1。因此异或的输入和输出的关系可以用下图表示:
在这里插入图片描述
其中圆表示类别0,三角表示类别1。而感知机要做的是用一条直线把两类数据分开,实际上这是做不到的。
虽然用一条直线无法将两类数据分开,但是如果能用两条直线的话,就可以将两类点分开,从而就引出了多层感知机的概念。

2.3 多层感知机

虽然现在的计算机相当复杂,但是本质上还是有与、或、与非电路实现的。通过各种电路的拼接,实现复杂的计算机。按照这一思路,我们可以将多个感知机进行拼接,得到一个更复杂的电路。现在假如我们已经实现了与门(AND)、或门(OR)、与非门(NAND),这三个门用下面三个图来表示:
在这里插入图片描述
那么应该怎么组合从而实现异或门呢?

各个门的特点如下:
与门:输入都为1,输出1,否则输出0
或门:输入一个为1,输出1,否则输出0
与非门:与与门相反

我们可以按照如下所示来拼接感知机(电路),从而实现异或门:
在这里插入图片描述
下面用真值表来验证一下,将 x 1 、 x 2 x_1、x_2 x1x2代入上面的多层感知机可以得到下表结果:

x1x2s1s2y
00010
01111
10111
11010

而异或门用代码实现也非常简单,具体代码如下:

def XOR(x1, x2):
    s1 = NAND(x1, x2)
    s2 = OR(x1, x2)
    return AND(s1, s2)  

三、神经网络

现在我们对多层感知机有了一些了解,那么神经网络和多层感知机有什么联系呢?这里就要关注一下前面的阶跃函数了。

3.1 激活函数

在前面感知机的输出会经过阶跃函数,将任意的值映射为0-1。但是阶跃函数不方便求导,因此就想到用一个连续函数来替代阶跃函数,其中比较常用的一个就是sigmoid函数,其函数如下:
σ ( x ) = 1 1 + e − x \sigma(x) = \frac{1}{1+e^{-x}} σ(x)=1+ex1
其函数图像如下:
在这里插入图片描述
图像处处可导。sigmoid在神经网络发展早期非常受欢迎,但是现在在大多数场景中都被ReLU函数取代。ReLU函数更简单,求导的复杂度也更低,而且能缓解梯度消失的问题,因此更常用。ReLU的表达式如下:
r e l u ( x ) = m a x ( x , 0 ) relu(x) = max(x, 0) relu(x)=max(x,0)
当输入小于0时,则返回0,当输入大于0时则返回原值。其函数图像如下:
在这里插入图片描述
像前面提到的阶跃函数、sigmoid函数、ReLU函数都叫激活函数。

3.2 从多层感知机到神经网络

现在把感知机的激活函数从阶跃函数修改为ReLU函数,这样就完成了多层感知机到神经网络的蜕变。下面我们从另一个角度来理解多层感知机。这里以异或门为例,异或门中有三个逻辑门电路,不管是与门、或门还是与非门,其实都是同一个函数换了不同的参数。因此可以把异或门用下面的图表示:
在这里插入图片描述
我们把输入用向量 X = [ x 1 , x 2 ] T X=[x_1, x_2]^T X=[x1,x2]T表示,而中间的输出用 S = [ s 1 , s 2 ] T S=[s_1, s_2]^T S=[s1,s2]T,权重用 W = [ w 1 , w 2 ] W=[w_1, w_2] W=[w1,w2]表示。那么 s 1 = W X + b 、 s 2 = W x + b s_1 = WX+b、s_2 = Wx+b s1=WX+bs2=Wx+b。但是需要注意,s1原本是与非门的结果,而s2是或门的结果,因此s1对应的W与s2对应的W是不同的。由此得到 s 1 = W 1 X + b 、 s 2 = W 2 x + b s_1 = W_1X+b、s_2 = W_2x+b s1=W1X+bs2=W2x+b,其中 W 1 = [ w 11 , w 12 ] 、 W 2 = [ w 21 , w 22 ] W_1=[w_{11}, w_{12}]、W_2=[w_{21}, w_{22}] W1=[w11,w12]W2=[w21,w22]
进一步把向量 W 1 、 W 2 W_1、W_2 W1W2组成一个矩阵,得到 W ( 1 ) = ( w 11 w 12 w 21 w 22 ) W^{(1)}=\begin{pmatrix} w_{11} & w_{12}\\ w_{21} & w_{22} \end{pmatrix} W(1)=(w11w21w12w22)
那么:
S = W ( 1 ) X + b S=W^{(1)}X+b S=W(1)X+b
这样就用一个矩阵乘法表示出了S的计算,同样y的计算也可以用一个矩阵乘法计算:
y = W ( 2 ) S + b y=W^{(2)}S+b y=W(2)S+b
但是上面的表达式其实没有激活函数,如果加入激活函数则可以用下面的表达式计算:
y = σ ( W ( 2 ) r e l u ( W ( 1 ) X + b ) + b ) y = \sigma(W^{(2)}relu(W^{(1)}X+b)+b) y=σ(W(2)relu(W(1)X+b)+b)
而上面的表达式就是神经网络了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/540948.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【PCIE体系结构十一】部分物理层发送接收逻辑细节

&#x1f449;个人主页&#xff1a;highman110 &#x1f449;作者简介&#xff1a;一名硬件工程师&#xff0c;持续学习&#xff0c;不断记录&#xff0c;保持思考&#xff0c;输出干货内容 参考书籍&#xff1a;《PCI.EXPRESS系统体系结构标准教材 Mindshare》 目录 物理层…

我麻了,那些年,为了进阿里背过的面试题......

前言 入职阿里相信是很多软件测试人的梦想&#xff0c;我一个阿里的朋友跟我聊天时说&#xff0c;他为了入职阿里背了好多面试题。我开始还不以为然&#xff0c;当他发给我看了之后&#xff0c;我麻了&#xff01; 不废话&#xff0c;分享给你们&#xff0c;希望对你们有帮助&…

中小型局域网

配置思路&#xff1a; 1、LSW1-LSW2做链路聚合并放通所有vlan,并做VRRP实现冗余备份 #链路聚合 [Huawei]sys LSW1 [LSW1]VLAN batch 20 30 40 60 70 80 [LSW1]DHCP enable [LSW1]ospf router-id 1.1.1.1 [LSW1-ospf-1]area 0 [LSW1]int Eth-Trunk 1 …

第3章 处理机调度与死锁

3.1 作业管理 3.1.1 作业的概念及分类 1&#xff0e;作业的概念 作业是用户在一 次事务处理过程中要求计算机系统所做工作的集合。 从系统的角度讲&#xff0c;作业是一个比较广泛的概念&#xff0c;它由程序、数据和作业说明书组成。 2&#xff0e;作业的分类 依据计…

redis集群+哨兵配置实操宝典

本地安装redis 配置集群和哨兵 1、下载安装redis #wget http://download.redis.io/releases/redis-5.0.12.tar.gz #下载安装包 #yum -y install gcc #安装依赖包 #tar -zxvf redis-5.0.12.tar.gz #cd redis-5.0.12 #make 2、主备配置 我们采用一主两备的结构 主机 192.168.3.…

AITM - 多任务模型之顺序依赖性建模(美团)

文章目录 1、动机与挑战&#xff08;信用卡业务广告&#xff09;2、信用卡用户整体架构&#xff1a;3、模型结构3.1、核心部分 Modeling the Sequential Dependence among Audience Multi-step Conversions with Multi-task Learning in Targeted Display Advertising 论文发表…

【Linux的基本指令】

目录 01.ls指令02.pwd指令03.cd指令04.touch指令05.mkdir指令06.rmdir指令 && rm 指令07.*通配符08.man指令09.cp指令10.mv指令11.cat指令13.more指令14.less指令15.head指令16.tail指令17.date指令18.Cal指令19.find指令20.grep指令21.zip/unzip指令22.tar指令23.bc指…

OpenCL编程指南-5.1工作项函数-整数函数-公共函数

工作项函数 应用程序使用clEnqueueNDRangeKernel和 clEnqueueTask API将OpenCL中的数据并行和任务并行内核排队。对于一个数据并行内核&#xff08;使用clEnqueueNDRangeKernel排队等待执行)&#xff0c;应用程序会指定全局工作大小&#xff0c;即可以并行执行这个内核的工作项…

PSP - AlphaFold2 中单链 MSA 特征的源码简读

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/130752004 AlphaFold2 是基于深度学习的方法,可以根据氨基酸序列,预测蛋白质的三维结构。在 2020 年的 CASP14 竞赛中,展示了惊人的准确性,达到了原子级别…

python读取linux系统的cpu以及内存占用

直接贴代码 import subprocessdef get_system_stats():# 通过 shell 命令获取 CPU 使用率和内存使用率cpu_command "top -bn1 | grep %Cpu(s) | awk {print $2}"memory_command "free | grep Mem | awk {print $3/$2 * 100.0}"# 执行命令并获取输出结果…

鸿蒙Hi3861学习十六-Huawei LiteOS-M(Socket服务端)

一、简介 具体概念可以参考上一章内容&#xff1a;鸿蒙Hi3861学习十五-Huawei LiteOS-M&#xff08;Socket客户端&#xff09;_t_guest的博客-CSDN博客 WIFI学习一&#xff08;socket介绍&#xff09;_wifi socket_t_guest的博客-CSDN博客 二、API介绍 bind 函数功能&#xff1…

pdf怎么转换成jpg图片?转换方式说明

将PDF转换为JPG图片是一种常见的文件格式转换操作&#xff0c;通常用于在不同设备上查看和共享PDF文档。但是&#xff0c;大多数情况下&#xff0c;将PDF转换为JPG图片可能并不总是可行或有效的。在本文中&#xff0c;我们将讨论为什么不能将PDF转换为JPG图片&#xff0c;以及如…

了解设备健康报表的关键指标与分析方法

在现代工业领域中&#xff0c;设备健康报表是一项关键工具&#xff0c;通过收集和分析设备的运行数据&#xff0c;它提供了关于设备状态和性能的重要指标。设备健康报表对于企业的设备管理和维护决策至关重要。本文将介绍设备健康报表的关键指标&#xff0c;并提供解读和分析方…

苹果手机、电脑如何进行屏幕录制?苹果录屏功能在哪?

随着人们生活水平的提高&#xff0c;不少小伙伴都会选择苹果手机、苹果电脑作为主要的设备。因为使用苹果电脑进行办公&#xff0c;不仅仅能够提升效率&#xff0c;对于文件的安全性也是有一些保障的。那么&#xff0c;在使用苹果电脑的时候&#xff0c;如果需要有录屏的需求该…

【JAVA】this关键字和static关键字

目录 1.this关键字 2.static关键字 容易混淆的问题 1.this关键字 一个对象一个this。this是一个变量&#xff0c;是一个关键字&#xff0c;是一个引用。this保存当前对象的内存地址&#xff0c;指向自身。所以&#xff0c;严格意义上来说&#xff0c;this代表的就是“当前对象…

Avada学习之-如何加入谷歌地图

如何正确设置谷歌地图 在给Wordpress网站配置谷歌地图时&#xff0c;常常会出现谷歌地图无法显示的问题。具体提示为Oops! something went wrong&#xff0c;如下图。出现这种问题有如下原因。 内容 隐藏 一、地址不正确 二、API 没填 三、插件冲突 一、地址不正确 很多…

iOS正确获取图片参数深入探究及CGImageRef的使用

一 图片参数的正确获取 先拿一张图片作为测试使用 图片参数如下&#xff1a; 图片的尺寸为&#xff1a; -宽1236个像素点 -高748个像素点 -色彩空间为RGB -描述文件为彩色LCD -带有Alpha通道 请记住这几个参数&#xff0c;待会儿我们演示如何正确获取。 将这张图片分别放在…

光纤衰减器作用及使用说明

在光纤通信中&#xff0c;光信号的强度过大或过小都会对信号的传输和接收产生不良的影响&#xff0c;因此光衰减器在光通信系统中起到了重要的作用。那什么是光衰减器呢&#xff1f;它又有什么作用呢&#xff1f;下面跟着小易一起来了解一下吧&#xff01; 一、什么是光纤衰减…

APP自动化测试工具的作用和特点

随着移动应用的迅速发展&#xff0c;APP的自动化测试工具变得越来越重要。APP自动化测试工具可以帮助开发者在应用程序的不同平台上执行测试&#xff0c;从而检测和确保应用程序的完整性、稳定性和可靠性。下面将介绍APP自动化测试工具的作用和特点。 一、作用 提高测试效率&am…

Android自定义控件——控件的测量和绘制

控件的测量和绘制 控件架构setContentView()MeasureSpecViewView的测量View的绘制 ViewGroupViewGroup的测量ViewGroup的绘制 自定义View对现有控件进行扩展案例一&#xff1a;添加背景案例二&#xff1a;文字闪动 创建复合控件重写View实现全新控件案例一&#xff1a;弧线展示…