前馈神经网络FNN、多层感知机MLP和反向传播推导
目录
一、前馈神经网络FNN
激活函数的使用
二、多层感知机MLP
MLP的典型结构
多层感知机MLP的特点
和前馈神经网络FNN的区别
三、传播推导
1、前向传播(Forward propagation)
(1)输入层到隐藏层
(2)隐藏层到输出层
2、反向传播(Backward propagation)
(1)正向传播(Forward Pass)
(2)反向传播(Backward Pass)
① 链式求导法则
② 梯度计算
反向传播算法的作用
具体的推导步骤
总结
三、常见问题
1、如何理解“梯度指向了损失函数增加最快的方向”
2、为何说“最佳参数解的最简单方式就是微分方程等于0找解”
3、学习率跟谁有关?
一、前馈神经网络FNN
给定一组神经元,我们可以将神经元作为节点来构建一个网络。不同的神 经网络模型有着不同网络连接的拓扑结构。一种比较直接的拓扑结构是前馈网络。
前馈神经网络(Feedforward Neural Network,FNN)是最早发明的简单人工神经网络。前馈神经网络也经常称为多层感知器(Multi-Layer Perceptron,MLP)。但多层感知器的叫法并不是十分合理,因为前馈神经网络其实是由多层的 Logistic 回归模型(连续的非线性函数)组成,而不是由多层的感知器(不连续的非线性函数)组成。
在前馈神经网络中,各神经元分别属于不同的层。每一层的神经元可以接收前一层神经元的信号,并产生信号输出到下一层。第0层称为输入层,最后一层称为输出层,其他中间层称为隐藏层。整个网络中无反馈,信号从输入层向输出层单向传播,可用一个有向无环图表示。

激活函数的使用
在FNN中处理二维矩阵输入时,激活函数通常作用于每个元素上。也就是说,对于二维矩阵中的每个元素,都会独立地应用激活函数f。这个过程通常发生在网络的隐藏层,其中每个神经元接收来自前一层的加权输入,然后通过激活函数转换成一个新的矩阵,用作下一层的输入。
在实际的神经网络中,隐藏层的每个神经元通常会接收来自前一层所有神经元的加权和,然后通过激活函数。这意味着,虽然激活函数是逐元素应用的,但在计算每个隐藏层神经元的输出时,会先进行一个线性变换(即 𝑤⋅𝑥+𝑏,其中 𝑤是权重,𝑏是偏置)。
二、多层感知机MLP
多层感知机(Multilayer Perceptron,MLP)是一种特殊的前馈人工神经网络,是前馈神经网络的一个子集。
所有的多层感知机都是前馈神经网络,但并非所有的前馈神经网络都是多层感知机。
MLP是机器学习中常见的模型之一,特别是在处理表格数据时。它们在许多领域都有应用,包括分类、模式识别、预测等。然而,MLP也有其局限性,比如容易过拟合,以及对输入特征的缩放敏感等问题。
MLP的典型结构
- 输入层:接收原始数据。
- 隐藏层:一个或多个层,负责处理输入层的信息并提取特征。
- 输出层:产生最终的预测结果。
多层感知机MLP的特点
- 至少三层:一个输入层、至少一个隐藏层和一个输出层。
- 全连接:除输入层外,每一层的所有神经元都与前一层的所有神经元相连。
- 非线性激活函数:除输入节点外,每个节点都是一个带有非线性激活函数的神经元。每个神经元都使用非线性激活函数,如ReLU、sigmoid或tanh。
和前馈神经网络FNN的区别
- 复杂性:并非所有的前馈神经网络需要有多个隐藏层或非线性激活函数。例如,一个只有输入层和输出层的网络,没有隐藏层,也是一个前馈神经网络,但不是多层感知机。
- 通用逼近能力:MLP因其多层结构和非线性激活函数,通常具有更强的学习和逼近复杂函数的能力。
- 应用范围:MLP由于其结构和学习能力,常用于分类、模式识别和预测任务,而更简单的前馈网络可能用于更特定的任务或作为更复杂网络架构的一部分。
MLP中,每个连接的权重和偏差都通过训练过程进行调整,以最小化输出和目标值之间的差异。这个过程通常涉及大量的计算,因此MLP的实现通常依赖于高效的数学库和硬件加速。
三、传播推导
这是一个MLP的结构,共有n个样本,每个样本对应m个输出值。假设隐藏层只有一层,其中隐藏层有p个hidden node。
其中每个输入的图片维度为d,则样本表达形式为:
其中:d为每个输入样本的维度,x(i)是一个样本,总共有n个(对应于样本个数),m为每个样本对应的输出数量。
1、前向传播(Forward propagation)
(1)输入层到隐藏层
其中右侧是从左侧的图中截取出来的一个运算过程。即输入层到隐藏层的值为sk,k=1,2,…,p,是输入层输入数据的加权线性和。
其中:vik是第i个输入到第k个hidden node的权重。i对应的是输入值的顺序,k对应的是神经元节点的顺序。
在隐藏层中,经过非线性转换(假设激活函数为f1),得到隐藏层的输出为hk,k=1,2,…,p。
(2)隐藏层到输出层
隐藏层到输出层的值为zj,j=1,2,…,m,是隐藏层输出hk,k=1,2,…,p的加权线性和。
其中:wkj是第k个hidden node输出到第j个输出值的权重。
在输出层中,经过非线性转换(假设激活函数为f2),得到输出层的输出为yj,j=1,2,…,m。
2、反向传播(Backward propagation)
反向传播算法是训练多层神经网络,特别是前馈神经网络(如多层感知机)的关键算法。它结合了梯度下降法和链式求导法则,用于计算网络中每个参数的梯度,以便通过迭代调整这些参数来最小化网络的预测误差。反向传播算法包括两个主要的传播过程:
(1)正向传播(Forward Pass)
在这个阶段,输入数据通过网络的多个层次(从输入层到隐藏层,最后到输出层)进行处理。在每个层级,数据会通过一个加权求和(包括一个偏置项)并应用一个非线性激活函数。每一层的输出都是下一层的输入。在每个神经元中,输入信号通过加权求和,然后通过一个非线性激活函数进行转换。
最终,输出层生成一个预测值,这个值与真实值之间的差异用来衡量网络的性能。
(2)反向传播(Backward Pass)
反向传播阶段的目标是找到一种方法来调整网络中的权重,以减少预测误差。这个过程从输出层开始,逆向遍历网络的每一层。
在这个阶段,算法计算输出层的预测值和真实值之间的误差,然后这个误差会通过网络反向传播,直到达到输入层。在反向传播过程中,利用链式求导法则计算每个权重对最终误差的贡献(即梯度),并更新权重以减少误差。
① 链式求导法则
链式求导法则是微积分中的一种计算方法,用于计算复合函数的导数。在神经网络的上下文中,它用于计算损失函数相对于网络中每个权重的导数。这是因为损失函数(如均方误差或交叉熵损失)是通过网络的多个层次复合而成的。
② 梯度计算
梯度是一个向量,其每个元素都是损失函数相对于网络中某个权重的偏导数。换句话说,梯度指向了损失函数增加最快的方向。在反向传播算法中,我们计算损失函数相对于每个权重的偏导数,以确定如何调整权重以减少误差。
反向传播算法的作用
- 梯度计算:为每个权重计算误差梯度,这是权重更新的基础。
- 权重更新:利用梯度下降或其他优化算法来更新网络中的权重和偏置,以减少预测误差。
- 损失函数最小化:通过迭代调整权重,反向传播算法旨在最小化网络的损失函数,即预测值和真实值之间的差异。
- 泛化能力提升:通过优化网络参数,提高模型对未见数据的预测能力,即提升模型的泛化能力。
反向传播的目的是利用最后的目标函数(loss/cost function)来进行参数的更新,一般来说都是使用误差均方和(mean square error)当做目标函数。误差值越大,说明参数学习的不好,还需要继续学习,直到参数或者误差值收敛。
具体的推导步骤
- 计算最终误差:首先计算输出层的预测值和真实值之间的误差,这通常通过损失函数来量化。
- 应用链式求导:然后,利用链式求导法则,从输出层开始,逆向计算每个层的误差相对于该层输入的偏导数。这涉及到对激活函数求导以及对权重求导。
- 计算梯度:通过将这些偏导数与前一层的误差信号相乘,可以得到每个权重的梯度。
- 更新权重:最后,使用这些梯度来更新每个权重,通常通过梯度下降法或其他优化算法来实现。权重更新的目的是减少损失函数的值,从而提高网络的预测准确性。
假设x(i)是第i层的输入值,其输出值为:
其目标的误差为:
所有样本的误差和当作目标函数:
所以要找到最佳参数解(参数只有两个权重wkj和vik),最简单的方式就是微分方程等于0找解:
但是当参数量比较多的时候,就不能直接找到唯一解,所以还是要依赖梯度下降(Gradient Descent)找最佳解。
针对上述的两个参数(wkj和vik)求最佳值:
其中为学习率(learning rate):
输出层到隐藏层(权重为wkj):
链式求导(chain rule):
隐藏层到输入层
隐藏层到输入层(权重为vik):
链式求导(chain rule):
所以:
最后把n个样本所有的梯度(gradient)相加得到参数的更新:
其中需要注意的地方:非线性转换/激活函数(f1/f2)在反向传播的时候都有微分,所以在选择激活函数时必须选择可微分函数。
总结
MLP是利用梯度下降(gradient descent)求最佳参数解:
最后代入到MLP内的前向传播(Forward propagation)即得到最后的预测值。
三、常见问题
1、如何理解“梯度指向了损失函数增加最快的方向”
梯度向量中的每个分量(即偏导数)都表示了在损失函数中,如果沿着该分量对应的维度(也就是权重)增加一个极小的量,损失函数增加的速度。换言之,梯度向量告诉你了损失函数在权重空间中的“最陡峭”的上升方向。
为了深入理解这个概念,可以从以下几个方面考虑:
-
多维空间中的“方向”:在多维空间(比如权重空间)中,方向不再像在二维或三维空间中那样直观。在这里,“方向”可以用一个向量来表示,这个向量的每个分量对应于空间中的一个维度。
-
损失函数的曲面:想象损失函数是权重空间中的一个曲面,我们的目标是找到这个曲面的最小值。在曲面上任意一点,都存在一个方向使得曲面上升最快,这个方向就是损失函数在该点的梯度。
-
梯度下降:在机器学习中,我们通常使用梯度下降算法来优化损失函数。梯度下降的基本思想是沿着梯度的相反方向(即下降方向)移动,因为这样做可以减少损失函数的值。通过不断迭代这个过程,我们希望找到损失函数的局部最小值(或者在某些情况下是全局最小值)。
-
数学表述:梯度 ∇𝐽(𝑤) 是损失函数 𝐽(𝑤)关于权重 𝑤的向量导数。如果我们有一个权重向量 𝑤,损失函数 𝐽(𝑤)的梯度可以写作:
其中,是损 失函数相对于第 𝑖i个权重的偏导数。
直观理解:如果将损失函数想象成一座山,那么梯度向量就指向了这座山“最陡”的地方,也就是上升最快的方向。梯度下降算法就是通过沿着与这个最陡方向相反的方向走,来试图找到山的底部,即损失函数的最小值。
2、为何说“最佳参数解的最简单方式就是微分方程等于0找解”
当提到“微分方程等于0找解”时,通常是在谈论如何找到损失函数相对于每个权重的偏导数的零点。这个过程是梯度下降算法的一部分,目的是找到损失函数的最小值。
-
微分方程:在机器学习中,通常不会使用传统意义上的微分方程,而是使用偏导数的概念。当说“微分方程”时,我们实际上是在谈论损失函数相对于权重的偏导数。
-
偏导数:损失函数 𝐽相对于权重 𝑤𝑘𝑗或 𝑣𝑖𝑘的偏导数表示了当权重 𝑤𝑘𝑗或 𝑣𝑖𝑘增加一个极小量时,损失函数 𝐽的变化率。
-
等于0:当将损失函数相对于某个权重的偏导数设置为0时,是在寻找损失函数相对于该权重的局部最小值。在理论上,如果偏导数为0,那么在该点附近,损失函数不会随着权重的增加而增加,这通常意味着找到了一个局部最小点。
-
求解:在实际操作中,通常不会直接求解偏导数等于0的解析解,因为这样的解可能很难找到,或者根本不存在。相反,我们使用数值优化方法,如梯度下降,来迭代地调整权重,直到找到损失函数的最小值。
3、学习率跟谁有关?
学习率(learning rate)是一个超参数,它决定了在每次迭代中权重更新的步长。选择合适的学习率对模型的训练过程和最终性能至关重要。学习率的选择通常基于以下几个方面:
-
经验:在实践中,数据科学家和机器学习工程师会根据经验来设置学习率。一些常见的初始学习率值在不同的应用领域和问题中被广泛使用。
-
文献推荐:对于某些特定的问题或模型,研究文献可能会推荐特定的学习率范围。
-
网格搜索:可以通过网格搜索(grid search)等超参数调优技术来寻找最佳的学习率。这涉及在一组预定义的学习率值中进行训练,并选择产生最佳性能的学习率。
-
自适应学习率优化器:一些优化算法,如Adam(Adaptive Moment Estimation)、RMSprop(Root Mean Square Propagation)或AdaGrad(Adaptive Gradient),能够自动调整学习率,使得训练过程更加高效。
-
学习率衰减(Learning Rate Decay):在训练过程中逐渐减小学习率是一种常见的做法。这可以通过多种方式实现,例如,随着时间的增加线性或指数衰减学习率。
-
实验:最终,确定最佳学习率通常需要实验。可以通过多次训练实验,每次使用不同的学习率,然后选择在验证集上表现最好的学习率。
-
自动化超参数优化工具:使用如Hyperopt、Optuna或Ray Tune等工具可以自动化超参数搜索过程,包括学习率的优化。
-
问题规模:问题的规模有时也会影响学习率的选择。对于大规模问题,可能需要较小的学习率以避免训练过程中的不稳定。
-
损失函数的性质:损失函数的平滑性和曲率也会影响学习率的选择。如果损失函数非常崎岖,可能需要较小的学习率以避免错过最小值。
在实际操作中,学习率的选择是一个迭代的过程,可能需要根据模型的训练动态和验证性能进行多次调整。正确选择学习率对于确保模型能够快速收敛到最小损失函数值,同时避免过拟合和欠拟合,是非常重要的。
相关文章:

前馈神经网络FNN、多层感知机MLP和反向传播推导
目录 一、前馈神经网络FNN 激活函数的使用 二、多层感知机MLP MLP的典型结构 多层感知机MLP的特点 和前馈神经网络FNN的区别 三、传播推导 1、前向传播(Forward propagation) (1)输入层到隐藏层 (2)隐藏层到输出层 2、…...

QML笔记八
QML与C交互 QML中调用C功能、使用QML或者Quick中的C接口、使用C实现自定义的QML对象 注: 只有QObject的派生类才能与QML交互 QML引擎集成Qt元对象系统,QObject的派生子类的属性、方法、信号都可以在QML中访问 C类可以被注册为一个QML实例 C类可以被注册为…...

运维别卷系列 - 云原生监控平台 之 00.prometheus 监控汇总
以下是 运维别卷系列 - 云原生监控平台 相关的详细文章链接,相应的内容,也只是用来做入门使用的 运维别卷系列 - 云原生监控平台 之 01.prometheus 入门和部署运维别卷系列 - 云原生监控平台 之 02.prometheus exporter 实践运维别卷系列 - 云原生监控平…...

信息系统安全与对抗-网络侦查技术与网络扫描技术(期末复习简答题)
1、网络拓扑结构在网络攻击中的作用 查明目标网络的拓扑结构,有利于找到目标网络的关键节点,从而提高攻击效率,达到最大攻击效果。 2、网络侦查在网络攻击中的作用 识别潜在目标系统,确认目标系统适合哪种类型的攻击。 3、百度…...

【python量化交易】—— Alpha选股策略 - Qteasy自定义交易策略【附源码】
使用qteasy创建并回测Alpha选股交易策略 使用qteasy创建并回测Alpha选股交易策略策略思想第一种自定义策略设置方法,使用持仓数据和选股数据直接生成比例交易信号PS信号:第二种自定义策略设置方法,使用PT交易信号设置持仓目标:第三…...

简单记录下:Navicat 导出表结构至 Excel
首先我们需要通过sql语句查询出相关的表结构的结构 SELECT COLUMN_NAME AS 字段名称,COLUMN_TYPE AS 字段类型,IF(IS_NULLABLENO,否,是) AS 是否必填,COLUMN_COMMENT AS 注释FROM INFORMATION_SCHEMA.COLUMNSWHERE table_schema bs-gdsAND table_name sys_menu;查询的结构如下…...

黑马基于Web-socket的java聊天室基本解析
要是用Web-socket协议,我们要前端upgrade升级成web-socket协议 首先我们要引入springboot的websocket起步依赖,这样子方便使用,自己指定版本注意 <dependency><groupId>org.springframework.boot</groupId><artifactId&…...

【操作系统期末速成】内存管理|内存的装入模块在装入内存的方式|分配管理方式|页面置换算法|页面置换
🎥 个人主页:深鱼~🔥收录专栏:操作系统🌄欢迎 👍点赞✍评论⭐收藏 推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到…...

图和网络笔记
文章目录 1. A X 0 AX0 AX02. A T Y 0 A^TY0 ATY03. A X 0 AX0 AX0和 A T Y 0 A^TY0 ATY0的关系 1. A X 0 AX0 AX0 一个图可以由节点和边组成,假设我们有一个节点notes :n4,边edges:m5的有向图,表示如下 通过以上电路…...

请求外部系统报错
报错信息: nested exception is com.google.common.util.concurrent.ExecutionError: java.lang.NoSuchMethodError: com.google.common.net.HostAndPort.getHostText()Ljava/lang/String; 在网上看了好几篇文章,和我的都不符合。 后面自己发现是我的系…...

电路板维修【四】
【开关电源输出电压偏低不稳,用示波器立马锁定故障范围】:https://www.bilibili.com/video/BV1pf421D73K?vd_source3cc3c07b09206097d0d8b0aefdf07958 可以用示波器查看MOS的输出波形来查看其是否损坏: 电源芯片的供电电压来回跳变…...

(程序设计语言)传值、传引用
1、传值(传递值): 在传值的情况下,函数接收到的是参数的一个副本,而不是参数本身。这意味着函数内部对参数的修改不会影响到原始值。传值通常用于基本数据类型(如整数、浮点数、布尔值等)的传递…...

一次基类类型对象无法被传递问题的分析
看下面一段代码: // proj2.cpp #include <iostream> using namespace std; class CharShape { public:CharShape(char ch) : _ch(ch) {};virtual void Show() 0; protected:char _ch; // 组成图形的字符 }; class Triangle : public CharShape { public:Tr…...

windows设置Redis服务后台自启动
问题 在日常开发过程中,redis是我们常用的缓存工具,但是由于redis对于Linux系统进行开发的,在Linux系统里可以通过修改redis.conf从而从而实现后台启动。 daemonize no 改成 daemonize yes 但是在window上如何也进行后台运行呢,…...

掌握Linux常用命令,扫平面试需求障碍
cd 切换目录。 > cd ../ #切换到父级目录 > cd /tmp # 切换到/tmp目录 > cd ~ # 切换到当前用户的家目录 ls命令 查看文件与目录的命令,list 的缩写。 > ls -l #列出长数据串,包含文件的属性与权限数据等 > ls -a #列出隐藏…...

c语言之文件打开模式
在c语言中,文件打开模式如下 r读模式: 允许对文件读取信息。若文件不存在,则会报错 w写模式: 允许向文件写入信息,若文件不存在,则创建一个文件 #include<stdio.h>int main() {FILE *fp;int i;char ay;fpfo…...

与禹老师学前端vue3学习汇总
24.5.15: 创建Vue3工程 1.确定自己电脑有没有nodejs环境,在cmd中输入node,如果出现Node.js的版本号说明已经有这个环境了,否则搜索Node.js安装 2.先在D盘创建一个文件夹Vue3_Study,然后在这个空文件夹中右键选择终端…...

Linux网络编程——HTTP协议的理解与运用
目录 前言 一、认识URL 二、认识HTTP样例 三、HTTP的报头内容 1.url 2. Content-Type 3.Method 方法 1.GET方法 2.POST方法 4、状态码 5.cookie和session 前言 我们知道,协议就是一种约定,客户端与服务端统一的用这种约定进行传输数据。我们…...

RestTemplate接口请求发送json、form数据格式以及处理接口错误状态码400 null
在使用RestTemplate发送HTTP请求时,你可以通过不同的方式发送JSON或表单数据(application/x-www-form-urlencoded)。同时,处理接口错误状态码(如400)和返回null的情况也是很重要的。以下是一些示例代码&…...

《Python编程从入门到实践》day29
# 昨日知识点回顾 修改折线图文字和线条粗细 矫正图形 使用内置格式 # 今日知识点学习 15.2.4 使用scatter()绘制散点图并设置样式 import matplotlib.pyplot as plt import matplotlib matplotlib.use(TkAgg)plt.style.use(seaborn-v0_8) # 使用内置格式 fig, ax plt.subpl…...

UIKit之图片浏览器
功能需求 实现一个图片浏览器,点击左右按钮可以切换背景图,且更新背景图对应的索引页和图片描述内容。 分析: 实现一个UIView的子类即可,该子类包含多个按钮。 实现步骤: 使用OC语言,故创建cocoa Touch类…...

如何查看SNMP设备的OID
什么是OID和MIB OID OID 代表对象标识符。 OID 唯一地标识 MIB 层次结构中的托管对象。 这可以被描述为一棵树,其级别由不同的组织分配。MIB MIB(管理信息基)提供数字化OID到可读文本的映射。 使用MIB Browser扫描OID 我的设备是一台UPS SN…...

什么?你设计接口什么都不考虑?
如果让你设计一个接口,你会考虑哪些问题? 1.接口参数校验 接口的入参和返回值都需要进行校验。 入参是否不能为空,入参的长度限制是多少,入参的格式限制,如邮箱格式限制 返回值是否为空,如果为空的时候是…...

2024年3月 青少年等级考试机器人理论真题二级
202403 青少年等级考试机器人理论真题二级 第 1 题 一个机器小车,用左右两个电机分别控制左右车轮,左侧电机转速是100rpm,右侧电机转速是50rpm,则此机器小车?( ) A:原地右转 B&am…...

C语言学习【printf函数和scanf函数】
C语言学习【printf函数和scanf函数】 printf()函数和scanf()函数可以让用户与程序交流,是输入/输出函数 printf()函数 请求printf()函数打印数据的指令要与待打印数据的类型相匹配。例如,打印整数时使用%d,打印字符时使用%c。这些符号被称…...

shell正则表达式
sort命令 以行为单位对文件内容进行排序,也可以根据不同的数据类型来排序 比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。 sort 对行内容进行升序排序 XXX | sort 选项 sort 选项 文件 常用选项&#x…...

react组件渲染性能优化之函数组件-useCallback使用
useCallback主要就是对函数进行缓存,useCallBack这个Hooks主要是解决React.memo不能缓存事件的问题 useCallBack(fn, dependencies) :fn想要缓存的函数,dependencies有关是否更新 fn 的所有响应式值的一个列表 比如:UseCallBackOptimize组件…...

【C++】:string类的基本使用
目录 引言一,string类对象的常见构造二,string类对象的容量操作三,string类对象的访问及遍历操作四,string类对象的修改操作五,string类非成员函数六,整形与字符串的转换 引言 string 就是我们常说的"…...

多线程的代码案例
目录 单例模式 饿汉模式 懒汉模式 阻塞队列 生产者消费者模型意义: 阻塞队列使用方法 实现阻塞队列 阻塞队列实现生产者消费者模型 定时器 实现简单的定时器 工厂模式 线程池 为啥呢? 从池子里面取 比 创建线程 效率更高 线程池的创建 怎么填坑 ThreadPoolExec…...

什么是Java中的设计模式?请列举几种常见的设计模式
一、引言 在软件开发中,设计模式是解决特定设计问题的最佳实践或通用解决方案。Java作为一种广泛使用的编程语言,其设计模式在软件设计和架构中起着至关重要的作用。设计模式不仅提高了代码的可读性和可维护性,还使得代码更加灵活和可扩展。…...