一文速学-让神经网络不再神秘,一天速学神经网络基础-前向传播(三)


前言

思索了很久到底要不要出深度学习内容,毕竟在数学建模专栏里边的机器学习内容还有一大半算法没有更新,很多坑都没有填满,而且现在深度学习的文章和学习课程都十分的多,我考虑了很久决定还是得出神经网络系列文章,不然如果以后数学建模竞赛或者是其他更优化模型如果用上了神经网络(比如利用LSTM进行时间序列模型预测),那么就更好向大家解释并且阐述原理了。但是深度学习的内容不是那么好掌握的,包含大量的数学理论知识以及大量的计算公式原理需要推理。且如果不进行实际操作很难够理解我们写的代码究极在神经网络计算框架中代表什么作用。不过我会尽可能将知识简化,转换为我们比较熟悉的内容,我将尽力让大家了解并熟悉神经网络框架,保证能够理解通畅以及推演顺利的条件之下,尽量不使用过多的数学公式和专业理论知识。以一篇文章快速了解并实现该算法,以效率最高的方式熟练这些知识。

现在很多竞赛虽然没有限定使用算法框架,但是更多获奖的队伍都使用到了深度学习算法,传统机器学习算法日渐式微。比如2022美国大学生数学建模C题,参数队伍使用到了深度学习网络的队伍,获奖比例都非常高,现在人工智能比赛和数据挖掘比赛都相继增多,对神经网络知识需求也日渐增多,因此十分有必要掌握各类神经网络算法。

博主专注建模四年,参与过大大小小数十来次数学建模,理解各类模型原理以及每种模型的建模流程和各类题目分析方法。此专栏的目的就是为了让零基础快速使用各类数学模型、机器学习和深度学习以及代码,每一篇文章都包含实战项目以及可运行代码。博主紧跟各类数模比赛,每场数模竞赛博主都会将最新的思路和代码写进此专栏以及详细思路和完全代码。希望有需求的小伙伴不要错过笔者精心打造的专栏。
 


前向传播

上两篇文章讲述了神经网络的基本架构和各类常用的激活函数,那么我们知道,在神经网络中每个神经元都与其前后层的每个神经元相互连接,那么神经网络要怎么通过输入的数据又是经过何种计算到输出层的呢?我们现在就来看看它的工作原理。

神经网络的传递过程可以描述为四个关键的步骤:

从输入到隐藏层

神经网络从输入层到隐藏层的计算方式涉及权重和偏置的线性组合,然后将结果传递给激活函数。

  1. 输入信号: 输入层接收外部输入的数据,这些数据可以是图像、文本、数字等。每个输入都对应着网络中的一个输入神经元。假设输入层有n^{(0)}个神经元,分别为a_1^{(0)}, a_2^{(0)}, ..., a_{n^{(0)}}^{(0)},它们分别表示第1个到第n^{(0)}个输入神经元的输出。
  2. 权重和偏置: 隐藏层包含多个神经元,每个神经元与输入层的每个神经元都有一个连接,连接上有一个权重w_{ji}^{(1)}。其中,$j$ 表示隐藏层中的神经元索引,i表示输入层中的神经元索引。每个隐藏层神经元还有一个偏置 b_j^{(1)}
  3. 线性组合: 对于隐藏层中的第j个神经元,其输入信号将与权重相乘并加上偏置,得到线性组合的值z_j^{(1)}

  4. 激活函数: 对于线性组合的值z_j^{(1)},将其输入激活函数 $f$ 中,得到隐藏层神经元的输出a_j^{(1)},常见的激活函数包括 sigmoid、ReLU、tanh 等,它们引入非线性性质,使得神经网络能够学习更复杂的函数。
  5. 逐层传递: 上述步骤在每个隐藏层中的每个神经元都会重复进行。每个隐藏层神经元的输出将成为下一层神经元的输入。

 这个计算过程将重复在每一层的每个神经元中,直到得到隐藏层的输出。这些隐藏层的输出将成为下一层的输入,以此类推,直到达到输出层。通过这种逐层计算的方式,神经网络可以从输入数据中提取并表示更高级别的特征。

 如果理解上述文字描述感觉抽象吃力的话,我们可以根据有一个小例子来具体理解神经网络的前向传递过程:

 如上图所示为一个神经网络基本结构,我们设定两个输入节点X_{1}=0.4,X_{2}=-0.6,Y为实际真值情况Y=0.1,那么我们设定权重:W_{1}=0.3,W_{2}=-0.6,W_{3}=0.9,W_{4}=-0.4,W_{5}=0.4,W_{6}=0.7

对输入层到隐藏层的节点进行加权求和,结果分别如下:

节点1的值为:X_{1}*W_{1}+X_{2}*W_{3}=0.4*0.3+-0.6*0.9=-0.42

节点2的值为:X_{1}*W_{2}+X_{2}*W_{4}=0.4*-0.6+-0.6*-0.4=0

 接着对隐藏层的节点的值执行Sigmoid激活,sigmoid函数在我上篇文章有详细讲述,直接进行计算即可:

\frac{1}{1+e^{-0.42}}=0.4,\frac{1}{1+e^{0}}=0.5

然后对隐藏层的输出到输出节点进行加权求和:

-0.42*0.4+0.5*0.7=0.18

最后我们发现0.18和真值0.1还是有差距的,若是权重设定不合适会导致更差的结果,这个时候就需要使用到反向传播来使预测值更加接近真实值。当然如果是输入层较多,隐藏层比较复杂,我们一般是使用矩阵来进行,例如:

我们可以使用矩阵运算来表达:

\begin{pmatrix} w11&w21 \\ w12&w22 \end{pmatrix}*\begin{pmatrix} x1\\x2 \end{pmatrix}=\begin{pmatrix} w11*x1+w21*x2\\ w12*x1+w22*x2 \end{pmatrix}

现在假设输入数据源是[0.9,0.1,0.8],我们再进行一次计算:

import numpy as np
def _sigmoid(in_data):return 1/(1+np.exp(-in_data))
#输入层
x = np.array([0.9,0.1,0.8])
#隐藏层:需要计算输入层到中间隐藏层每个节点的组合,中间隐藏层的每个节点都与输入层相连,所以w1是一个3*3的矩阵
#因此每个节点都会得到输入信号的部分信息
#第一个输入节点与中间隐藏层第一个节点之间的权重w11=0.9,输入的第二个节点与隐藏层之间的连接的权重为w22=0.8
w1 = np.array([[0.9,0.3,0.4],[0.2,0.8,0.2],[0.1,0.5,0.6]])
#因为输出层包含了3个节点,所以w2也是一个3x3的矩阵
w2 = np.array([[0.3,0.7,0.5],[0.6,0.5,0.2],[0.8,0.1,0.9]
])Xhidden = _sigmoid(w1.dot(x))
print(Xhidden)
Xoutput = w2.dot(Xhidden)
print(Xoutput)  #最终输出结果

 

 下面再来看一个更加复杂的例子:

 这个案例我们增加一层隐藏层再来看看如何运算:

def _sigmoid(in_data):return 1/(1+np.exp(-in_data))def init_network():network={}network['w1']=np.array([[0.1,0.3,0.5],[0.2,0.4,0.6]])network['b1']=np.array([0.1,0.2,0.3])network['w2']=np.array([[0.1,0.4],[0.2,0.5],[0.3,0.6]])network['b2']=np.array([0.1,0.2])network['w3']=np.array([[0.1,0.3],[0.2,0.4]])network['b3']=np.array([0.1,0.2])return networkdef forward(network,x):w1,w2,w3 = network['w1'],network['w2'],network['w3']b1,b2,b3 = network['b1'],network['b2'],network['b3']a1 = x.dot(w1) + b1z1 = _sigmoid(a1)a2 = z1.dot(w2) + b2z2 = _sigmoid(a2)a3 = z2.dot(w3)+b3y=a3return ynetwork = init_network()
x = np.array([1.0,0.5])
y = forward(network,x)
print(y)

 

那么前向传播到这里就全部讲完了,没有很复杂的内容,线性计算就可以,下一章我们将着重讲述一下输出层的计算和功能。


 

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

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

相关文章

构建个人博客_Obsidian_github.io_hexo

1 初衷 很早就开始分享文档,以技术类的为主,一开始是 MSN,博客,随着平台的更替,后来又用了 CSDN,知乎,简书…… 再后来是 Obsidian,飞书,Notion,常常有以下困…

vue页面转pdf后分页时文字被横向割裂

效果 预期效果 //避免分页被截断async outPutPdfFn (id, title) {const _t this;const A4_WIDTH 592.28;const A4_HEIGHT 841.89;// dom的id。let target document.getElementById(pdf);let pageHeight target.scrollWidth / A4_WIDTH * A4_HEIGHT;// 获取分割dom&#xf…

Windows版本Docker安装详细步骤

文章目录 下载地址安装异常处理docker desktop requires a newer wsl 下载地址 https://desktop.docker.com/win/stable/Docker%20Desktop%20Installer.exe 安装 双击下载的文件Docker Desktop Installer.exe进行安装 点击OK 开始安装 安装完成点击Close and restart&…

如何在vscode导入下载的插件安装包

点击vscode插件 --> 点击3个点 --> 选择从VSIX安装 点击更新报 Cannot update while running on a read-only volume. The application is on a read-only volume. Please move the application and try again. If you’re on macOS Sierra or later, you’ll need to m…

【Linux】【驱动】注册字符设备号

【Linux】【驱动】注册字符设备号 1. 绪论1 、静态分配设备号2、动态分配设备号3、注销设备号 2 实现的代码3 加载驱动程序 1. 绪论 在之前杂项设备的时候,设备号是固定的,字符设备就需要自己去申请设备号了, 申请设备号有两个方式&#xff…

linux 设置与命令基础(二)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、系统基本操作 二、命令类型 三、命令语法 四、命令补齐 五、命令帮助 六、系统基本操作命令 总结 前言 这是本人学习Linux的第二天,今天主…

dockerfile 例子(二)

Dockerfile由一行一行的命令语句组成,#开头的为注释行。Dockerfile文件内容分为四个部分:基础镜像信息、维护者信息、镜像操作指令以及容器启动执行指令。 接下来给大家列出Dockerfile中主要命令的说明。 FROM,指定所创建镜像的基础镜像。 …

关于单例模式

单例模式的目的: 单例模式的目的和其他的设计模式的目的都是一样的,都是为了降低对象之间的耦合性,增加代码的可复用性,可维护性和可扩展性。 单例模式: 单例模式是一种常用的设计模式,用简单的言语说&am…

RabbitMQ的镜像队列

镜像队列 如果 RabbitMQ 集群中只有一个 Broker 节点,那么该节点的失效将导致整体服务的临时性不可用,并且也可能会导致消息的丢失。可以将所有消息都设置为持久化,并且对应队列的durable 属性也设置为 true ,但是这样仍然无法…

文件上传漏洞之条件竞争

这里拿upload-labs的第18关做演示 首先先看代码 $is_upload false; $msg null;if(isset($_POST[submit])){$ext_arr array(jpg,png,gif);$file_name $_FILES[upload_file][name];$temp_file $_FILES[upload_file][tmp_name];$file_ext substr($file_name,strrpos($file_…

[Android AIDL] --- AIDL工程搭建

0 AIDL概念 AIDL(Android Interface Definition Language)是一种 IDL 语言,用于生成可以在 Android 设备上两个进程之间进行进程间通信(IPC)的代码。 通过 AIDL,可以在一个进程中获取另一个进程的数据和调…

切换Debian的crontab的nano编辑器

Debian的crontab默认的编辑器是nano,用起来很不习惯,怎么才能转回vim呢? 用以下命令便可: #update-alternatives --config editor 出现以下所示的界面: 而后选择8使用/usr/bin/vim就能够了。 PS:若是你发现你的定时没有生效&…

【WSN无线传感器网络恶意节点】使用 MATLAB 进行无线传感器网络部署研究

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

爬虫异常处理之如何处理连接丢失和数据存储异常

在爬虫开发过程中,我们可能会遇到各种异常情况,如连接丢失、数据存储异常等。本文将介绍如何处理这些异常,并提供具体的解决代码。我们将以Python语言为例,使用requests库进行网络请求和sqlite3库进行数据存储。 1. 处理连接丢失 …

pycharm添加虚拟环境以及虚拟环境安装pytorch

file、settings、interpreter、add interpreter、add local interpreter 记住不要勾选inherit,不然会把主环境的东西继承到虚拟环境。 创建前可以先点existing看看有没有已经建好的虚拟环境 有的时候pycharm有问题,创建了虚拟环境没有显示。找一个.py文…

【MyBatis】自定义resultMap三种映射关系

目录 一、一对一映射(One-to-One) 1.1 表关系 1.2 resultMap设置自定义映射 二、一对多映射(One-to-Many) 2.1 创建实体 2.2 级联方式处理映射关系 2.3 定义SQL 2.4 OrderMapper接口 2.5 编写业务逻辑层 2.6 Junit测试…

SpringBoot异步方法支持注解@Async应用

SpringBoot异步方法支持注解Async应用 1.为什么需要异步方法? 合理使用异步方法可以有效的提高执行效率 同步执行(同在一个线程中): 异步执行(开启额外线程来执行): 2.SpringBoot中的异步方法支持 在SpringBoot中并不需要我们自己去创建维护线程或者线程池来…

权限提升-数据库提权-MSF-UDF提权

权限提升基础信息 1、具体有哪些权限需要我们了解掌握的? 后台权限,网站权限,数据库权限,接口权限,系统权限,域控权限等 2、以上常见权限获取方法简要归类说明? 后台权限:SQL注入,数…

Linux 查看当前文件夹下的文件大小

1.直接查看: ll 或者 ls -la #查看文件大小,以kb为单位 ll#查看文件大小,包含隐藏的文件,以kb为单位 ls -la2.以 M 或者 G 为单位查看,根据文件实际大小进行合适的单位展示 du -sh *

5V升压充电8.4V管理IC

在我们小家电设计当中USB口的5V输入升压到8.4V输出,使用一颗SOP8的升压充电芯片,直接升压到8.4V.电流在1A左右。2,USB输入,5V升压8.4V,充电1A,内含专门的双节锂电池充电管理逻辑和LED指示灯,我们…