当前位置: 首页 > news >正文

深度学习——神经网络中前向传播、反向传播与梯度计算原理

一、前向传播

1.1 概念

神经网络的前向传播(Forward Propagation)就像是一个数据处理的流水线。从输入层开始,按照网络的层次结构,每一层的神经元接收上一层神经元的输出作为自己的输入,经过线性变换(加权求和)和非线性变换(激活函数)后,将处理后的结果传递给下一层神经元。这个过程一直持续,直到输出层产生最终的输出结果。它是神经网络进行预测的主要步骤,数据按照正向的方向在网络中流动。

主要作用是根据给定的输入和当前神经网络的参数(权重和偏置),生成模型对该输入的预测输出。这个输出可以用于判断模型对输入数据的分类结果(如在分类任务中)或预测的数值(如在回归任务中)。

1.2 计算过程

以一个简单的全连接神经网络为例。

(1)输入层处理:将原始数据输入到神经网络的输入层。假设输入层有 n 个神经元,隐藏层有 m 个神经元,输出层有 p 神经元。输入数据为 x = ( x 1 , x 2 , … , x n ) x= (x_1, x_2, \ldots, x_n) x=(x1,x2,,xn)

(2)隐藏层计算:数据从输入层进入隐藏层后,通过线性组合和激活函数进行处理。对于输入层到隐藏层的连接,设权重矩阵为 W 1 W_1 W1 维度为(m x n),偏置向量为 b 1 b_1 b1 维度为(m x 1)。隐藏层的输入为 z 1 = W 1 x + b 1 z_1=W_1x+b_1 z1=W1x+b1 ,然后通过激活函数 f f f (如 ReLU( f ( z ) = m a x ( 0 , z ) f(z)=max(0,z) f(z)=max(0,z))、Sigmoid ( f ( z ) = 1 1 + e − z f(z)=\frac{1}{1+e^{-z}} f(z)=1+ez1)等)得到隐藏层的输出 a 1 = f ( z 1 ) a_1=f(z_1) a1=f(z1)

(3)输出层生成结果:隐藏层的输出作为输出层的输入,经过类似隐藏层的计算过程得到最终的输出。从隐藏层到输出层,设权重矩阵为 W 2 W_2 W2 维度为(p x m),偏置向量为 b 2 b_2 b2 维度为(p x 1)。输出层的输入为 z 2 = W 2 a 1 + b 2 z_2=W_2a_1+b_2 z2=W2a1+b2 ,再通过激活函数(如果需要)得到最终的输出 y = f ( z 2 ) y=f(z_2) y=f(z2)。例如,在一个多分类任务中,输出层可能使用 Softmax 激活函数将输出转化为各个类别上的概率分布。
在这里插入图片描述

二、反向传播

2.1 概念

反向传播(Backward Propagation)是一种用于计算神经网络中梯度的有效算法。它是基于链式法则,从输出层开始,反向计算损失函数关于网络中每个参数(权重和偏置)的梯度,以便在训练过程中更新参数,使得模型的预测输出与真实标签之间的损失函数值最小化。

主要作用是为神经网络的训练提供梯度信息。在训练过程中,通过使用梯度下降等优化算法,根据反向传播计算得到的梯度来更新网络的参数,使得神经网络能够逐渐学习到输入数据和输出标签之间的复杂关系,从而提高模型的预测准确性。

2.2 计算过程

首先,需要定义一个损失函数 L ,用于衡量模型的预测输出 y ^ \hat{y} y^ 与真实标签 y y y 之间的差异。

常见的损失函数有均方误差(MSE)(用于回归问题)
L = 1 n ∑ i = 1 n ( y ^ i − y i ) 2 L = \frac{1}{n} \sum_{i=1}^{n} (\hat{y}_i - y_i)^2 L=n1i=1n(y^iyi)2
交叉熵损失(Cross Entropy Loss) ( 用于分类问题)
L = − ∑ i = 1 n y i log ⁡ ( y ^ i ) L = -\sum_{i=1}^{n} y_{i} \log (\hat{y}_{i}) L=i=1nyilog(y^i)

交叉熵损失适用于多分类任务,也常结合 Softmax 使用。二元交叉熵损失(Binary Cross Entropy Loss)适用于二分类任务,也常结合 Sigmoid 使用。
L = − [ y log ⁡ ( y ^ ) + ( 1 − y ) log ⁡ ( 1 − y ^ ) ] L = -\left[ y \log(\hat{y}) + (1 - y) \log(1 - \hat{y}) \right] L=[ylog(y^)+(1y)log(1y^)]

在这里假设损失函数选用MSE,激活函数选用线性激活函数( f ( x ) = x f(x)=x f(x)=x)。

(1)以计算损失函数关于权重 W 2 W_2 W2 的梯度为例,根据链式法则 ∂ L ∂ W 2 = ∂ L ∂ z 2 ∂ z 2 ∂ W 2 \frac{\partial L}{\partial {W}_2} = \frac{\partial L}{\partial {z}_2} \frac{\partial {z}_2}{\partial {W}_2} W2L=z2LW2z2

  • 先计算 ∂ L ∂ z 2 \frac{\partial L}{\partial {z}_2} z2L ,它取决于损失函数的形式和激活函数的导数。由于 z 2 z_2 z2经过激活函数 f 得到 y ,即 y = f ( z 2 ) y=f(z_2) y=f(z2) 。所以 ∂ L ∂ z 2 = ∂ L ∂ y ⋅ ∂ y ∂ z 2 \frac{\partial L}{\partial z_2} = \frac{\partial L}{\partial y} \cdot \frac{\partial y}{\partial z_2} z2L=yLz2y

    • 对于 ∂ L ∂ y \frac{\partial L}{\partial y} yL,这取决于损失函数。

      • 对于 MSE 损失函数 L = 1 n ∑ i = 1 n ( y ^ i − y i ) 2 L = \frac{1}{n} \sum_{i=1}^{n} (\hat{y}_i - y_i)^2 L=n1i=1n(y^iyi)2 ,对 y 求偏导, ∂ L ∂ y = 2 n ∑ i = 1 n ( y ^ i − y i ) \frac{\partial L}{\partial y} = \frac{2}{n} \sum_{i=1}^{n} (\hat{y}_i - y_i) yL=n2i=1n(y^iyi)
    • 对于 ∂ y ∂ z 2 \frac{\partial y}{\partial z_2} z2y ,这取决于激活函数 f 的导数。

      • 例如,如果激活函数是线性函数 y = z 2 y=z_2 y=z2 (即( f ( z 2 ) = z 2 f(z_2)=z_2 f(z2)=z2)),那么 ∂ y ∂ z 2 = 1 \frac{\partial y}{\partial z_2}=1 z2y=1
      • 如果激活函数是 Sigmoid 函数 y = 1 1 + e − z 2 y = \frac{1}{1 + e^{-z_2}} y=1+ez21 ,那么 ∂ y ∂ z 2 = y ( 1 − y ) \frac{\partial y}{\partial z_2}=y(1-y) z2y=y(1y)
      • 如果激活函数是 ReLU 函数 y = max ⁡ ( 0 , z 2 ) y = \max(0, z_2) y=max(0,z2) ,当 z 2 > 0 z_2>0 z2>0 时, ∂ y ∂ z 2 = 1 \frac{\partial y}{\partial z_2}=1 z2y=1 ,当 z 2 ≤ 0 z_{2} \leq 0 z20 时, ∂ y ∂ z 2 = 0 \frac{\partial y}{\partial z_2}=0 z2y=0
    • ∂ L ∂ y \frac{\partial L}{\partial y} yL ∂ y ∂ z 2 \frac{\partial y}{\partial z_2} z2y相乘得到 ∂ L ∂ z 2 \frac{\partial L}{\partial {z}_2} z2L

  • 接着计算 ∂ L ∂ W 2 \frac{\partial L}{\partial {W}_2} W2L 。由前向传播得到的 z 2 = W 2 a 1 + b 2 z_2=W_2a_1+b_2 z2=W2a1+b2 ,可知 ∂ z 2 ∂ W 2 = a 1 \frac{\partial \mathbf{z}_2}{\partial {W}_2}=a_1 W2z2=a1 。所以可求出 ∂ L ∂ W 2 \frac{\partial L}{\partial {W}_2} W2L

(2)计算损失函数关于偏置 b 2 b_2 b2 的梯度。根据链式法则 ∂ L ∂ b 2 = ∂ L ∂ z 2 ⋅ ∂ z 2 ∂ b 2 \frac{\partial L}{\partial b_2} = \frac{\partial L}{\partial z_2} \cdot \frac{\partial z_2}{\partial b_2} b2L=z2Lb2z2 ∂ z 2 ∂ b 2 = 1 \frac{\partial z_2}{\partial{b}_2}=1 b2z2=1 ,可求出 ∂ L ∂ b 2 \frac{\partial L}{\partial b_2} b2L

(3)类似地,可以计算出关于其他权重和偏置的梯度,如 ∂ L ∂ W 1 \frac{\partial L}{\partial {W}_1} W1L ∂ L ∂ b 1 \frac{\partial L}{\partial b_1} b1L 等。
在这里插入图片描述

三、梯度下降

3.1 梯度下降

梯度下降(Gradient Descent)是一种常用的优化算法,广泛应用于神经网络以及众多机器学习模型的训练过程中,目的是通过迭代的方式来最小化目标函数(比如神经网络中的损失函数)的值。它的基本思想是沿着目标函数梯度(导数)的反方向更新模型参数,以逐步降低目标函数的值,直到找到一个局部最小值(在非凸函数情况下)或全局最小值(在凸函数情况下)。
在这里插入图片描述

对于一个损失函数(可微函数) L ( θ ) L(\theta) L(θ) (其中 θ \theta θ 表示模型的参数,如神经网络中的权重和偏置),函数在某一点的梯度 ∇ L ( θ ) \nabla L(\theta) L(θ) 表示函数在该点上升最快的方向。那么,梯度下降算法就是朝着与梯度相反的方向,即 − ∇ L ( θ ) -\nabla L(\theta) L(θ) 来更新参数。

具体的更新公式为 θ new = θ old − α ∇ L ( θ old ) \theta_{\text{new}} = \theta_{\text{old}} - \alpha \nabla L(\theta_{\text{old}}) θnew=θoldαL(θold)

其中 α \alpha α 是学习率(Learning Rate),它决定了每次更新参数的步长大小。如果学习率过大,可能会导致算法无法收敛,甚至发散;如果学习率过小,算法收敛速度会非常慢。
在这里插入图片描述
下面介绍一下常用的随机梯度下降(Stochastic Gradient Descent,SGD)。

每次迭代只使用一个随机选择的样本 ( x i , y i ) (x_i,y_i) (xi,yi) 来计算梯度并更新参数。即计算 ∇ L ( f ( x i ; θ ) , y i ) \nabla L(f(x_i; \theta), y_i) L(f(xi;θ),yi) ,然后 θ new = θ old − α ∇ L ( f ( x i ; θ ) , y i ) \theta_{\text{new}} = \theta_{\text{old}} - \alpha \nabla L(f(x_i; \theta), y_i) θnew=θoldαL(f(xi;θ),yi)

优点:计算速度快,因为每次只需要处理一个样本,能够快速地对参数进行更新,在处理大规模数据集时优势明显。

缺点:由于每次使用一个样本,梯度的估计会有很大的噪声,导致更新过程比较不稳定,可能会在最小值附近出现震荡,收敛速度可能会比较慢。

3.2 梯度爆炸

梯度爆炸(Gradient Explosion)是在训练神经网络时可能出现的一种不良现象。简单来说,就是在计算神经网络中参数的梯度时,梯度的值变得异常大,这会导致在使用基于梯度的优化算法(比如常见的随机梯度下降及其变种)去更新网络参数时,参数会以一种极不稳定且不合理的方式进行大幅度变化,进而使得网络难以收敛,甚至无法正常训练下去。

主要产生的原因有:

  • 深层网络的链式求导法则影响:在深度神经网络中,反向传播算法依据链式求导法则来计算梯度。对于一个有很多层的网络,每一层的误差对前面各层参数的梯度是通过层层相乘的方式来传递的。如果每一层的局部梯度都稍大于 1,那么经过多层传递后,梯度就会呈指数级增长,最终导致梯度爆炸。
  • 不合适的初始化参数:如果神经网络的权重初始化不当,比如将权重初始化为较大的值,那么在一开始进行反向传播计算梯度时,就很容易产生较大的梯度,后续随着训练迭代,这种较大梯度可能不断累积,引发梯度爆炸。
  • 激活函数选择问题:部分激活函数(如 Sigmoid 函数在输入值较大或较小时),其导数趋近于 0 或者非常大,当网络中较多神经元的激活函数处于这样的区间时,会导致梯度计算出现异常大的值,进而可能引发梯度爆炸情况。

3.3 梯度消失

梯度消失(Gradient Vanishing)同样是在神经网络训练过程中出现的棘手问题。它指的是在反向传播计算参数梯度时,梯度的值变得极小,近乎趋近于零,使得在利用基于梯度的优化算法更新网络参数时,参数几乎无法得到有效调整,进而影响网络的学习和收敛能力,导致网络难以训练出理想的性能表现。

主要产生的原因有:

  • 深层网络的链式求导法则影响:当网络层数较多时,如果每一层的局部导数都小于 1,经过多层相乘传递后,梯度就会呈指数级衰减。
  • 权重初始化不合理:如果权重初始值设置得太小,在开始反向传播计算梯度时,得到的梯度值本身就比较小,随着训练迭代,在经过多层网络的传递过程中,小梯度不断相乘累积,就容易造成梯度越来越小,直至出现梯度消失状况。
  • 激活函数特性:像 Sigmoid 函数,其导数在输入值较大或较小时趋近于 0。对于较深的神经网络,经过若干层后,神经元的输入很容易落入导数接近 0 的区间,这样后续反向传播计算梯度时,每层传递过来的梯度都会乘上这个极小的导数,从而使得梯度不断变小,最终出现梯度消失现象。Tanh 函数也存在类似的情况,在两端极限位置导数接近 0,同样可能引发梯度消失问题。

左边:梯度消失现象。右边:梯度爆炸现象。
在这里插入图片描述

相关文章:

深度学习——神经网络中前向传播、反向传播与梯度计算原理

一、前向传播 1.1 概念 神经网络的前向传播(Forward Propagation)就像是一个数据处理的流水线。从输入层开始,按照网络的层次结构,每一层的神经元接收上一层神经元的输出作为自己的输入,经过线性变换(加权…...

解决git push报错:not valid: is this a git repository?

今天想把代码更新到仓库里,执行git push origin master:main的时候报错:not valid: is this a git repository? 查了好多方法都没用。后来经过这篇文章的启发:https://zhuanlan.zhihu.com/p/301518109 可能是由于校园网的问题,…...

树形查询转成TreeNode[],添加新节点

在使用PrimeVue的TreeTable组件时,需要将带有层级的数据转换为TreeNode[]类型的数据结构。TreeNode是PrimeVue中定义的一个接口,用于表示树节点。通常,带有层级的数据是一个嵌套的对象或数组,其中每个对象可能包含子对象&#xff…...

【Rust自学】8.2. Vector + Enum的应用

8.2.0. 本章内容 第八章主要讲的是Rust中常见的集合。Rust中提供了很多集合类型的数据结构,这些集合可以包含很多值。但是第八章所讲的集合与数组和元组有所不同。 第八章中的集合是存储在堆内存上而非栈内存上的,这也意味着这些集合的数据大小无需在编…...

攻防世界web第十题Web_python_template_injection

这是题目,从题目上看是一个python模板注入类型的题目。 首先测试是否存在模板注入漏洞,构造http://61.147.171.105:57423/{{config}} 得到 说明存在模板注入漏洞,继续注入 构造http://61.147.171.105:57423/{{‘’.class.mro}}: 得到 再构造…...

vmware 修改Ubuntu终端字体大小

1. 2、 3、 4、 5、 6、点击select...

API 设计:从基础到最佳实践

https://levelup.gitconnected.com/api-design-101-from-basics-to-best-practices-a0261cdf8886 在本次深入研究中,我们将从基础开始,逐步了解 API 设计,并逐步实现定义卓越 API 的最佳实践。 作为开发人员,您可能熟悉其中的许多…...

ROUGE指标在自然语言处理中的应用:从理论到实践

引言 你是否曾经遇到过机器生成的文本摘要与原文内容不符的情况?或者在使用机器翻译时,发现译文虽然“看起来”正确,但语义却与原文相差甚远?在自然语言处理(NLP)领域,如何科学地评估生成文本的…...

GraalVM:云原生时代的Java虚拟机

1. 概述 GraalVM是由Oracle公司开发的一款高性能、多语言的虚拟机平台。它不仅兼容传统的JVM字节码执行,还引入了即时编译(JIT)技术的革新,以及对多种编程语言的支持。GraalVM旨在通过提供更高效的执行环境来满足云计算环境中日益…...

Linux 信号集与信号掩码

目录 一、引言 二、信号集是什么 三、信号集关键函数 1.信号集的创建与初始化 2.信号的添加与删除 3.信号集的阻塞与解除阻塞 四、信号集实际应用场景 五、信号掩码的作用 六、信号掩码相关函数 1.sigprocmask 函数 2.sigemptyset 和 sigfillset 函数 七、信号掩码注…...

如何设置Edge浏览器访问软件

使用Edge浏览器访问分销ERP A\V系列软件时会出现各种报错,如何设置Edge浏览器使其正常访问,请看下面的具体操作。 一、打开Edge浏览器,点击右上角的 设置及其他,如图: 二、在弹出界面中,点击 扩展&#xff…...

DL笔记:旋转编码RoPE

1 背景 由于计算资源限制,目前的LLM大多在较短的上下文长度中进行训练,在推理中,如果超出预训练的长度,模型的性能将会显著降低 ——>需要一个可提供外推性的位置编码最经典的绝对位置编码就是原始Transformer中的那个sinusoi…...

C语言自定义类型与文件操作

构造类型 枚举类型 若定义不相关的常量使用宏定义;若定义一组相关的常量使用枚举。switch中case后访问的就是枚举。 定义: 我们一般情况下定义常量使用宏定义(#define),宏定义适合没有关联关系的常量;但有时需要对一组有关联关系…...

《计算机网络A》单选题-复习题库解析-3

目录 106、MAN通常是指( ) 107、下列因素中,不会影响信道数据传输速率的是( ) 108、以太网交换机进行转发决策时使用的PDU地址是( ) 109、下列机制中,可以解决因数据帧丢失而…...

VM虚拟机配置ubuntu网络

目录 桥接模式 NAT模式 桥接模式 特点:ubuntu的IP地址与主机IP的ip地址不同 第一部分:VM虚拟机给ubuntu的网络适配器,调为桥接模式 第二部分:保证所桥接的网络可以上网 第三部分:ubuntu使用DHCP(默认&…...

【每日学点鸿蒙知识】Web高度适配、变量声明规范、动画取消、签名文件、包体积优化相关

1、HarmonyOS Web页面高度适配? 在Web页面设置高度100%时,发现和Web控件的高度不一致,这个需要设置什么可以达到页面高度和Web容器高度一致 目前只支持两种web布局模式,分别为Web布局跟随系统WebLayoutMode.NONE和Web基于页面大…...

uniapp使用ucharts组件

1.ucharts准备 有两种使用方式:一种是在uni的插件市场下载(组件化开发)。一种是手动引入ucharts包。官方都封装好组件了,我们不用岂不是浪费。 直接去dcloud插件市场(DCloud 插件市场)找,第一…...

LabVIEW工程师的未来发展

对于LabVIEW工程师以及更广义的编程从业者(包括“高级民工”码农)来说,随着AI技术和软件编程的逐步成熟,确实面临一些新的挑战和机遇。以下是对此问题的深入分析和未来方向的建议: 现状分析:技术过剩与竞争…...

java的bio、nio、aio 以及操作系统的select、poll、epoll

在 Java 和其他编程语言中,I/O 模型的选择对网络应用的性能和可扩展性有着重要影响。以下是 BIO(Blocking I/O)、NIO(Non-blocking I/O)、AIO(Asynchronous I/O),以及操作系统级别的…...

2024 年发布的 Android AI 手机都有什么功能?

大家好,我是拭心。 2024 年是 AI 快速发展的一年,这一年 AI 再获诺贝尔奖,微软/苹果/谷歌等巨头纷纷拥抱 AI,多款强大的 AI 手机进入我们的生活。 今年全球 16% 的智能手机出货量为 AI 手机,到 2028 年,这…...

RLHF,LM模型

LLM(Large Language Model) RLHF(Reinforcement Learning from Human Feedback),即以强化学习方式依据人类反馈优化语言模型。 RLHF思想:使用强化学习的方式直接优化带有人类反馈的语言模型。RLHF使得在一般文本数据语料库上训练的语言模型能与复杂的人类价值观对齐。 R…...

【机器学习】工业 4.0 下机器学习如何驱动智能制造升级

我的个人主页 我的领域:人工智能篇,希望能帮助到大家!!!👍点赞 收藏❤ 随着科技的飞速发展,工业 4.0 浪潮正席卷全球制造业,而机器学习作为这一变革中的关键技术,正以前…...

REST与RPC的对比:从性能到扩展性的全面分析

在微服务架构中,服务间通信是核心问题之一。常见的两种通信方式是REST(Representational State Transfer)和RPC(Remote Procedure Call)。它们各有优缺点,适用于不同场景。本文将从性能、扩展性、兼容性和开…...

MATLAB中将MAT文件转换为Excel文件

MATLAB中将MAT文件转换为Excel文件 MATLAB提供了多种方法将MAT文件中的数据导出到Excel文件中。下面介绍几种常用的方法: 1. 使用 writetable 函数 优点: 功能强大,可以灵活控制输出格式。用法: data load(your_data.mat); …...

leetcode hot 100 跳跃游戏2

45. 跳跃游戏 II 已解答 中等 相关标签 相关企业 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j…...

【Cesium】八、Cesium 默认地图不显示,不加载默认Bing地图

文章目录 前言实现方法App.vue 前言 Cesium 默认加载的地图是bing地图&#xff0c;个人认为请求bing地图会收到网络限制&#xff0c;导致地图资源下载很慢&#xff0c;所以设置默认不加载bing地图&#xff08;后续我使用的是天地图&#xff09; 参考文章&#xff1a; cesium …...

【新方法】通过清华镜像源加速 PyTorch GPU 2.5安装及 CUDA 版本选择指南

下面详细介绍所提到的两条命令&#xff0c;它们的作用及如何在你的 Python 环境中加速 PyTorch 等库的安装。 1. 设置清华镜像源 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple这条命令的作用是将 pip &#xff08;Python 的包管理工具&#xf…...

MySQL的sql操作有哪些

MySQL 的 SQL 操作可以分为几个主要类别&#xff0c;每个类别包含了一系列的语句&#xff0c;用于执行不同的数据库操作&#xff1a; 数据查询语言&#xff08;DQL&#xff09; SELECT&#xff1a;用于从一个或多个表中检索数据。可以使用 WHERE 子句进行条件筛选&#xff0c…...

ArcGIS计算矢量要素集中每一个面的遥感影像平均值、最大值等统计指标

本文介绍在ArcMap软件中&#xff0c;基于矢量面要素集&#xff0c;计算在其中每一个面区域内&#xff0c;遥感影像的像元个数、平均值、总和等统计值&#xff0c;并将统计信息附加到矢量图层的属性表中的方法。 首先&#xff0c;明确一下本文的需求。现在有一个矢量面要素集&am…...

EasyExcel(环境搭建以及常用写入操作)

文章目录 EasyExcel环境搭建1.创建模块 easyexcel-demo2.引入依赖3.启动类创建 EasyExcel写1.最简单的写入1.模板2.方法3.结果 Write01.xlsx 2.指定字段不写入Excel1.模板2.方法3.结果 Write02.xlsx 3.指定字段写入excel1.模板2.方法3.结果 Write03.xlsx 4.按照index顺序写入ex…...