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

news2025/1/18 7:02:41

前言

思索了很久到底要不要出深度学习内容,毕竟在数学建模专栏里边的机器学习内容还有一大半算法没有更新,很多坑都没有填满,而且现在深度学习的文章和学习课程都十分的多,我考虑了很久决定还是得出神经网络系列文章,不然如果以后数学建模竞赛或者是其他更优化模型如果用上了神经网络(比如利用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 network
    
def 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) + b1
    z1 = _sigmoid(a1)
    a2 = z1.dot(w2) + b2
    z2 = _sigmoid(a2)
    a3 = z2.dot(w3)+b3
    y=a3
    return y

network = init_network()
x = np.array([1.0,0.5])
y = forward(network,x)
print(y)

 

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


 

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

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

相关文章

C语言这么没用??

今日话题,C语言真的这么不堪吗?最近我兄弟向我倾诉,他在几天前受到老板的责骂,原因是他只懂C语言编程,无法达到老板的期望。其实不是C语言不堪,而是嵌入式领域复杂性多种多样,需要灵活的解决方案…

idea查找maven所有依赖

文章目录 idea自带的依赖结构图idea安装maven helper插件 idea自带的依赖结构图 缺点是只有依赖,没有版本 idea安装maven helper插件 settings–>plugins–>搜索maven helper并安装 安装后打开pom.xml文件会有依赖解析 勾选conflict就是有冲突的依赖选中…

ACE_Proactor

服务端代码&#xff1a; #include "stdafx.h" #include <iostream> #include "ace/Message_Queue.h" #include "ace/Asynch_IO.h" #include "ace/OS.h" #include "ace/Proactor.h" #include "ace/Asynch_Accept…

knife4j 整合 springboot

官方文档&#xff1a;https://doc.xiaominfo.com/knife4j 版本兼容说明&#xff1a;https://doc.xiaominfo.com/docs/quick-start/start-knife4j-version 升级说明&#xff1a;https://doc.xiaominfo.com/docs/upgrading/upgrading-to-v4版本兼容惯关系&#xff1a; springboot…

【微信小程序】小程序隐私保护指引设置

首先了解官方提供demo&#xff1a; demo1: 演示使用 wx.getPrivacySetting 和 <button open-type"agreePrivacyAuthorization"> 在首页处理隐私弹窗逻辑 https://developers.weixin.qq.com/s/gi71sGm67hK0 demo2: 演示使用 wx.onNeedPrivacyAuthorization 和…

Python面试:什么是GIL

1. GIL (Global Interpreter lock)可以避免多个线程同时执行字节码。 import threadinglock threading.Lock()n [0]def foo():with lock:n[0] n[0] 1n[0] n[0] 1threads [] for i in range(5000):t threading.Thread(targetfoo)threads.append(t)for t in threads:t.s…

深入解析文件系统原理(inode,软硬链接区别)

第四阶段提升 时 间&#xff1a;2023年8月29日 参加人&#xff1a;全班人员 内 容&#xff1a; 深入解析文件系统原理 目录 一、Inode and Block概述 &#xff08;一&#xff09;查看文件的inode信息&#xff1a;stat &#xff08;二&#xff09;Atime、Mtime、Ctime详…

高精度 低纹波|12A大电流电源解决方案,网通、视频显示、国产PC行业多领域适用

随着科技的快速发展&#xff0c;各行业产品都在不断迭代和加速升级&#xff0c;TV产品也不例外。TV产品的演变一直朝着大尺寸、高分辨率的方向发展&#xff0c;从2K到4K再升级至8K&#xff0c;每一次的升级都为消费者带来更好的视觉体验。 从技术层面来看&#xff0c;“8K大尺寸…

RocketMQ消息查询

区别于消息消费&#xff1a;先尝后买 尝就是消息查询 买&#xff1a;消息的消费 RocketMQ支持按照下面两种维度("按照Message ld查询消息"、"按照Message Key查询消息")进行消息查询。 1按照Messageld查询消息 Msgld总共16字节&#xff0c;包含消息存储…

[Mac软件]Adobe After Effects 2023 v23.5 中文苹果电脑版(支持M1)

After Effects是动画图形和视觉效果的行业标准。由运动设计师、平面设计师和视频编辑用于创建复杂的动画图形和视觉上吸引人的视频。 创建动画图形 使用预设样式为文本和图形添加动画效果&#xff0c;或逐帧调整它们。编辑、添加深度、制作动画或转换为可编辑的路径&#xff…

冠达管理:美股涨了!“越南特斯拉”市值直追丰田!这一论坛将召开

当地时间8月28日&#xff0c;美股三大股指团体收涨&#xff0c;到收盘&#xff0c;道指报34559.98点&#xff0c;涨0.62%&#xff1b;标普500指数报4433.31点&#xff0c;涨0.63%&#xff1b;纳指报13705.13点&#xff0c;涨0.84%。 高盛上星期五发布的数据显现&#xff0c;在英…

聚焦数据安全,“2023数据安全平台神兽企业”调研正式启动

当下&#xff0c;数字经济正蓬勃发展&#xff0c;数据已成为关键驱动力&#xff0c;而数据安全是保障数据要素价值的前提。数据安全建设也正在从孤立的数据安全产品过渡到数据安全平台&#xff0c;以更大程度促进数据的业务利用率和价值。 为了更好洞察和反映当前数据安全平台…

开发工具——IDE安装 / IDEA子module依赖导入失败编译提示xx找不到符号 / IDEA在Git提交时卡顿

近期换了工作电脑&#xff0c;公司的IT团队不够给力&#xff0c;不能复制电脑系统&#xff0c;所以又到了需要重装IDE配置开发环境的时候了&#xff1b;在安装和导入Java编译器IDEA的时候遇到一些"棘手"问题&#xff0c;这里整理下解决方法以备不时之需&#xff1b; …

bootloader串口更新程序[瑕疵学习板]

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、储备知识二、程序步骤2.程序展示1.bootloader2.然后是主运行函数总结前言 很久没有更新文章了。最近工作太忙,没有学习很多的知识,然后这两天不忙了,就学习了一下bootloader的程序升级…

hive lateral view 实践记录(Array和Map数据类型)

目录 一、Array 1.建表并插入数据 2.lateral view explode 二、Map 1、建表并插入数据 2、lateral view explode() 3、查询数据 一、Array 1.建表并插入数据 正确插入数据&#xff1a; create table tmp.test_lateral_view_movie_230829(movie string,category array&…

基于水基湍流算法优化的BP神经网络(预测应用) - 附代码

基于水基湍流算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于水基湍流算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.水基湍流优化BP神经网络2.1 BP神经网络参数设置2.2 水基湍流算法应用 4.测试结果&#xff1a;5…

搭建自己的ChatGPT智能问答,HelpLook ChatBot 正式上线!

基于已有内容的站点或现成文档 零代码快速导入 即可生成自己专属的ChatGPT智能问答机器人 HelpLook ChatBot&#xff0c;正式发布上线&#xff01; 只需连接您的数据源&#xff0c;HelpLook 就能为您的数据创建一个类似 ChatGPT 的聊天机器人。您可以将它作为小工具以 JS 的…

【计算机网络】TCP 的三次握手和四次挥手

TCP 是面向连接的&#xff0c;面向连接就是数据通讯的时候需要进行三次握手&#xff0c;断开通讯的时候需要进行四次挥手。 1.seq(sequence number)&#xff0c;序列号&#xff0c;随机生成的 2.ack(acknowledgement number)&#xff0c;确认号&#xff0c;ackseq1 3.ACK(ackno…

Could not autowire. No beans of ‘DiscoveryClient‘ type found.

一、导错了包 DiscoveryClient对应有两个包&#xff1a; org.springframework.cloud.client.discovery.DiscoveryClient; com.netflix.discovery.DiscoveryClient; 目前导入的包是&#xff1a; 改成第一个包&#xff0c;发现不再报红了。

数据安全治理方案

数据安全能力建设工作并非从零开始&#xff0c;大部分组织在此前或多或少已有一些安全体系&#xff0c;基本上是围绕 信息系统和网络环境开展安全保护工作&#xff0c;主要聚焦在信息安全和网络安全&#xff1b;而数据安全是以数据为核心&#xff0c; 围绕数据安全生命周期进行…