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

神经网络的数学之旅:从输入到反向传播

目录

    • 神经网络简介
      • 神经元
      • 激活函数
      • 神经网络
    • 神经网络的工作过程
      • 前向传播(forward)
      • 反向传播(backward)
      • 训练神经网络

神经网络简介

神经元

在深度学习中,必须要说的就是神经⽹络,或者说是⼈⼯神经⽹络(artificial neural network)。神经⽹络是⼀种⼈类受到⽣物神经细胞结构启发⽽研究出的算法体系。

神经⽹络这个名字容易让⼈觉得特别神秘,不像我们接触过的程序算法那样直观,在编程的时候我们常⽤到的都是⼀些加减乘除、循环、分⽀、⽐⼤⼩、读写等等,使⽤这些基本步骤就能够完成⼀个明确的⽬标务,然⽽神经⽹络和这种直观的⽅式还真有些不同

在这里插入图片描述

上图⼀个最简单的神经元,有⼀个输⼊,⼀个输出,中间是⼀个参数,然后节点表⽰进⾏某种运算,所以它表达的含义跟⼀个普通函数没什么区别。不过需要注意的是,我们⽬前使⽤的神经元内部的运算通常有两个部分组成,第⼀部分是所谓的线性模型,可以把它理解为一个简单的包含加减乘除的函数,假设为 f ( x ) = 2 x + 1 f(x) = 2x + 1 f(x)=2x+1,它是图 中圆圈内的第一个部分。图中圆圈内运算的另外一部分激活函数,这一部分也不是很复杂,就是将第一部分线性模型的结果再通过一个激活函数计算,这个函数通常是非线性的,例如 f ( x ) = 1 1 + e − 2 x + 1 f(x) = \frac{1}{1+e^{-2x+1}} f(x)=1+e2x+11,其中 2 x + 1 2x + 1 2x+1是第一部分的线性函数。我们可以看出它虽然和普通的函数没什么区别,但这种方式的确是神经网络工作的原理。

在这里插入图片描述

我们接着看上图,输入 x x x 可以是一个一维向量,也可以是三维向量,当然也可以是一个更多的 n n n 维向量。对于 n n n 维向量输入项的神经元 f ( x ) f(x) f(x) 来说,这个函数就是:

f ( x ) = w x + b f(x) = wx + b f(x)=wx+b
其中 x x x 是一个 n × 1 n \times 1 n×1 的矩阵也就是 n n n 维列向量,而 w w w 是一个 1 × n 1 \times n 1×n 的权重矩阵, b b b 是偏置项。这个过程是在计算什么?权重矩阵和偏置项到底是什么?我们举一个例子来说明,假设 x x x 是一个这样的矩阵:

( 1 180 70 ) \begin{pmatrix} 1 \\ 180 \\ 70 \end{pmatrix} 118070

这个特征向量有三个维度,比如说第一行代表性别,数值1代表男生,数值0代表女生,第二行代表身高180cm,第三行代表体重70kg,这是一个多维度的描述,可能是描述人的体重情况。然后根据不同的人有不同的特征向量, w w w 是一个 1 × n 1 \times n 1×n 的矩阵,它表示权重的概念,就是表示每一项的重要程度,例如 [ 0.1 × 0.03 × 0.06 ] [0.1 \times 0.03 \times 0.06] [0.1×0.03×0.06] b b b 是偏置项,它是一个实数值,假设在这里 b b b 就是 1 × 1 1 \times 1 1×1 的矩阵0,整个函数则表示为 w w w x x x 进行内积操作,乘出来是一个实数,然后加上 b b b,即

f ( x ) = 0.1 × 1 + 0.03 × 180 + 0.06 × 70 + 0 = 9.7 f(x) = 0.1 \times 1 + 0.03 \times 180 + 0.06 \times 70 + 0 = 9.7 f(x)=0.1×1+0.03×180+0.06×70+0=9.7
最终的结果是 9.7,那么我们在这定义一个区间 ( 6 , 13 ) (6,13) (6,13),只要结果在这个区间内则体重正常。不在区间的话就通过一些算法计算,进而调整 w w w b b b,使得计算结果尽量落在这个区间,这样做的前提是我们给出的数据都是正常体重的数据,经过大量数据的演算推导,我们就能够获得精确度极高的 w w w b b b 的值,从而确定 f ( x ) f(x) f(x),如此一来,我们就可以使用这个确定的函数 f ( x ) f(x) f(x) 来检验新的体重是否标准了。

在以后训练神经网络的时候,这些 w w w b b b 参数,是我们最终想要得到的最有价值的东西,有这些参数之后我们就可以拿新的输入 x x x,通过计算来预测结果。

通常,我们在训练神经网络的时候,会需要大量的数据样本,这些数据样本里面我们已知的有输入 x x x,然后还会有已经知道的输出 f ( x ) f(x) f(x) y y y,这个输出通常称为标签,例如一张猫的图片,输入就是这张图片的像素矩阵,输出就是图片的名称-猫(当然可以拿数字来代替,计算机并不清楚文字猫和数字 0的区别)。

这里我们引入一个新的概念,叫做损失函数。我们简单解释一下,在训练神经网络的时候,一开始,我们会初始化 w w w b b b 参数,假设定义它们的矩阵里面全是接近 0 的浮点小数,那么输入与其计算后会得到结果 f ′ ( x ) f'(x) f(x),但是这个数据真实的标签却是 f ( x ) f(x) f(x)。我们会定义一个损失函数,它代表了计算输出的标签与真实数据的标签的差距,通常把这个函数写作为 Loss:

L o s s = ∑ i = 1 n ∣ w x i + b − y i ∣ Loss = \sum_{i=1}^{n} |wx_i + b - y_i| Loss=i=1nwxi+byi
上式举了一个损失函数的例子, w x i + b wx_i + b wxi+b 为输入通过线性模型计算得出的 f ′ ( x ) f'(x) f(x)

∣ w x i + b − y i ∣ |wx_i + b - y_i| wxi+byi 代表求 f ′ ( x ) f'(x) f(x) f ( x ) f(x) f(x) 之间差的绝对值, ∑ i = 1 n ∣ w x i + b − y i ∣ \sum_{i=1}^{n} |wx_i + b - y_i| i=1nwxi+byi 代表将从 1 开始到 n 所有差的绝对值加起来。那么这个函数有什么用途呢?我们训练神经网络的最终目的是得到合适的 w w w b b b,那么这个损失函数足够小的情况下,就代表神经网络计算出的结果与真实的结果差距足够小,也就说明我们的 w w w b b b 越可靠。至于怎么通过这个函数去不断的调整 w w w b b b 呢?我们后面部分会讲解。

激活函数

激活函数(activation function),也叫作激励函数。在第一小节神经元中,我们提到过这个名词,也大概说明了一下什么是激活函数,它是在神经元中跟随 f ( x ) = w x + b f(x) = wx + b f(x)=wx+b 之后加入的非线性因素激活函数在神经元线性模型之后使得神经网络能够学习和逼近复杂的函数关系,如下图右半部分部分:

11

那么解释一下什么是非线性,生活中的各种事物抽象为数学模型后几乎都是非线性。举个例子,理想情况下房子越大,价格越贵,这里的面积与价格可以视作线性关系,但是真实情况下,房价不仅受到面积的影响因素,还会受到地理位置、时间、楼层等因素的影响,那么这几种因素与房价就不是线性关系了。通常神经元的串联和并联叠加构成了神经网络,如果都是线性模型的叠加,那最终整个网络也是线性的,也就是矩阵相乘的关系,但是其中加入了激活函数,那么叠加之后的神经网络理论上就可以构成任意复杂的函数从而解决一些复杂问题。下面我们给出神经网络中常用到的三种激活函数:

在这里插入图片描述

可以看到第⼀种 sigmoid 函数,是将线性模型的计算结果投射到 0 到 1 之间,第⼆个 TanH 函数是将线性模型的计算结果投射到-1 到 1 之间,最后⼀个 ReLU 是将线性模型计算结果⼩于 0的部分投射为 0,⼤于等于 0 的部分投射为计算结果本⾝。


激活函数(Activation Function)的作用主要是引入非线性,使得神经网络能够学习和逼近复杂的函数关系。其主要作用包括:
1. 引入非线性
• 线性变换本质上只是输入数据的加权和,即使有多层神经网络,若无激活函数,整个网络仍等效于一个线性变换,无法学习复杂的模式。
• 激活函数如 ReLU、Sigmoid、Tanh 能够引入非线性,使得神经网络能够学习更复杂的映射关系。
2. 特征提取和表示学习
• 在深度神经网络中,不同层的激活函数能够帮助网络提取不同层次的特征,从而提高模型的表达能力。
3. 梯度传播
• 适当的激活函数能够确保梯度的有效传播,避免梯度消失或梯度爆炸问题。例如,ReLU(修正线性单元)可以在正值区域保持梯度不变,而 Sigmoid 在极端值时会导致梯度消失。
4. 增加网络的表达能力
• 通过非线性变换,神经网络可以逼近任何复杂的函数(根据通用逼近定理),使其能够处理更复杂的任务,如图像识别、自然语言处理等。

常见激活函数:
Sigmoid: σ ( x ) = 1 1 + e − x \sigma(x) = \frac{1}{1+e^{-x}} σ(x)=1+ex1
• 优点:输出范围 (0,1),适用于二分类任务。
• 缺点:易导致梯度消失,计算复杂。
Tanh: tanh ⁡ ( x ) = e x − e − x e x + e − x \tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} tanh(x)=ex+exexex
• 优点:输出范围 (-1,1),比 Sigmoid 更平衡。
• 缺点:仍有梯度消失问题。
ReLU(Rectified Linear Unit): f ( x ) = max ⁡ ( 0 , x ) f(x) = \max(0, x) f(x)=max(0,x)
• 优点:计算简单,不易发生梯度消失。
• 缺点:可能会出现“死亡 ReLU”(某些神经元可能永远不会被激活)。
Leaky ReLU: f ( x ) = max ⁡ ( α x , x ) f(x) = \max(\alpha x, x) f(x)=max(αx,x)
• 改进:当 x < 0 时,仍然有小的梯度,缓解死亡 ReLU 问题。
Softmax:
• 作用:用于多分类任务,将输出转换为概率分布。


神经网络

神经网络就是神经元首尾相接形成一个类似网络的结构来协同计算,这个算法体系被称为神经网络

在这里插入图片描述

上图是⼀个⾮常简单的神经⽹络结构,在神经⽹络中通常会分为:输⼊层、隐藏层、输出层。输⼊层在整个⽹络最前端,图中为最左侧(也有⾃下⽽上的结构⽰意图),它直接接受输⼊的向量,输⼊层通常不计⼊层数,隐藏层这⼀层可以有多层,在⽐较深的⽹络中,隐藏层能达到数⼗上百层,输出层是最后⼀层,⽤来输出整个⽹络计算后的结果,这⼀层可能是⽐较复杂的类型的值或者向量,根据不同的需求输出层的构造也是不同的。

神经元就是通过这种结构进⾏数据传递,数据经过前⼀个神经元的计算输出给下⼀层的神经元当做输⼊,因为前⼀层的神经元节点连接了下⼀层的所有节点,因此这种前后层相互连接的⽹络也叫作全连接神经⽹络,这是⼀种⾮常常⻅的⽹络结构。

神经网络的工作过程

前向传播(forward)

在前⾯我们接触过了⼀种简单的神经⽹络结构,叫做全连接神经⽹络,同时,这种神经元从输⼊层开始,接受前⼀级输⼊,并输出到后⼀级,直⾄最终输出层,由于数据是⼀层⼀层从输⼊⾄输出传播的,也叫作前馈神经⽹络

在这里插入图片描述

这是一个简单的神经网络结构, i 1 i1 i1 i 2 i2 i2 分别是两个输入,隐藏层有两个神经元节点 h 1 h1 h1 h 2 h2 h2,偏置项 b 1 b1 b1 b 2 b2 b2,输出层也有 2 个神经元节点 o 1 o1 o1 o 2 o2 o2,那么前向传播过程中,隐藏层神经元节点线性部分计算有:

l h 1 = w 1 × i 1 + w 2 × i 2 + b 1 l_{h1} = w1 \times i1 + w2 \times i2 + b1 lh1=w1×i1+w2×i2+b1
假设激活函数为 sigmoid,那么第一个隐藏层节点输出为:

o u t h 1 = 1 1 + e − l h 1 out_{h1} = \frac{1}{1 + e^{-l_{h1}}} outh1=1+elh11

同理:

o u t h 2 = 1 1 + e − l h 2 out_{h2} = \frac{1}{1 + e^{-l_{h2}}} outh2=1+elh21

输出层 o1 节点假设激活函数为 sigmoid(这里使用激活函数的作用往往是根据特定的需求,比如多分类问题需要用到 softmax 函数),那么:

l o 1 = w 5 × o u t h 1 + w 6 × o u t h 2 + b 2 l_{o1} = w5 \times out_{h1} + w6 \times out_{h2} + b2 lo1=w5×outh1+w6×outh2+b2

同理:

l o 2 = w 7 × o u t h 1 + w 8 × o u t h 2 + b 2 l_{o2} = w7 \times out_{h1} + w8 \times out_{h2} + b2 lo2=w7×outh1+w8×outh2+b2

这样整个网络的前向传播输出:

o u t o 1 = 1 1 + e − l o 1 out_{o1} = \frac{1}{1 + e^{-l_{o1}}} outo1=1+elo11

o u t o 2 = 1 1 + e − l o 2 out_{o2} = \frac{1}{1 + e^{-l_{o2}}} outo2=1+elo21

这时如果将我们的参数都赋值为常数带入进去,然后设定一组真实的数据(其中包含输入 i 1 i1 i1 i 2 i2 i2,也包含一个与之对应的输出 out),输入之后会计算得到一个计算结果,然后将计算结果与我们设定的真实结果 out 做比较,会出现差距,那么损失函数我们上一章已经提到了,假设损失函数是:

E t o t a l = 1 n ∑ i = 1 n ( t a r g e t − o u t p u t ) 2 E_{total} = \frac{1}{n} \sum_{i=1}^{n}(target - output)^2 Etotal=n1i=1n(targetoutput)2

其中 t a r g e t target target 代表数据样本的标签,是理论输出的值, o u t p u t output output 代表神经网络计算的输出,那么这两者之间的差值就能代表当前神经网络计算的误差,这里取其平方再加和除 n n n 的意义是,实际输出与我们期望的输出差距越大,代价越高,然后取其均方差,则有:

E o 1 = 1 2 ( t a r g e t − o u t o 1 ) 2 E_{o1} = \frac{1}{2}(target - out_{o1})^2 Eo1=21(targetouto1)2

E o 2 = 1 2 ( t a r g e t − o u t o 2 ) 2 E_{o2} = \frac{1}{2}(target - out_{o2})^2 Eo2=21(targetouto2)2

E t o t a l = E o 1 + E o 2 E_{total} = E_{o1} + E_{o2} Etotal=Eo1+Eo2

有了这个损失函数就可以学习接下来的反向传播了

反向传播(backward)

反向传播,顾名思义,反向传播算法是利⽤损失函数进⽽从输出到输⼊⽅向传播达到调整参数的⽬的,它的存在主要是解决深层(多个隐藏层)神经⽹络的参数更新问题,反向传播算法就是梯度下降应⽤了链式法则,在机器学习中,梯度下降法的作用就是:最小化一个损失函数,链式法则是微积分中的求导法则,⽤于复合函数的求导,在神经⽹络中只要有了隐藏层,那么隐藏层的权重参数与损失函数会构成复合函数,因此使⽤链式法则解决复合函数求导问题达到调整权重参数的⽬的.

我们将上⼀⼩节中的神经⽹络拿过来,并将输⼊、输出、权值、偏置都赋予实数,来演⽰⼀下反向传播的过程,具体实数赋值如下:

在这里插入图片描述

上图中,将输⼊赋值 0.10 与 0.20,隐藏层权重为0.05、0.15、0.10、0.20,偏置为 0.35,输出层权重为 0.25、0.35、0.30、0.40,偏置为0.50,最终赋值输出为 0.85、0.30,注意这个输出是我们预设好的标签
就是我们希望输⼊ 0.10 与 0.20 后,通过神经⽹络计算,最终输出 0.85 与 0.30。 通过上⼀节的前向传播,我们得到了前向传播中各个节点的计算公式,将实数带⼊公式我们可以得到:

隐藏层第一个节点线性部分:
l h 1 = 0.05 × 0.10 + 0.15 × 0.20 + 0.35 = 0.385 l_{h1} = 0.05 \times 0.10 + 0.15 \times 0.20 + 0.35 = 0.385 lh1=0.05×0.10+0.15×0.20+0.35=0.385

隐藏层第二个节点线性部分:
l h 2 = 0.10 × 0.10 + 0.20 × 0.20 + 0.35 = 0.400 l_{h2} = 0.10 \times 0.10 + 0.20 \times 0.20 + 0.35 = 0.400 lh2=0.10×0.10+0.20×0.20+0.35=0.400

隐藏层第一个节点输出:
o u t h 1 = 1 1 + e − 0.385 = 0.595078474 out_{h1} = \frac{1}{1 + e^{-0.385}} = 0.595078474 outh1=1+e0.3851=0.595078474

隐藏层第二个节点输出:
o u t h 2 = 1 1 + e − 0.4 = 0.598687660 out_{h2} = \frac{1}{1 + e^{-0.4}} = 0.598687660 outh2=1+e0.41=0.598687660
同理,输出层线性部分:

l o 1 = 0.25 × 0.595078474 + 0.35 × 0.598687660 + 0.50 = 0.8583102995 l_{o1} = 0.25 \times 0.595078474 + 0.35 \times 0.598687660 + 0.50 = 0.8583102995 lo1=0.25×0.595078474+0.35×0.598687660+0.50=0.8583102995

l o 2 = 0.30 × 0.595078474 + 0.40 × 0.598687660 + 0.50 = 0.9179986062 l_{o2} = 0.30 \times 0.595078474 + 0.40 \times 0.598687660 + 0.50 = 0.9179986062 lo2=0.30×0.595078474+0.40×0.598687660+0.50=0.9179986062

输出层输出:

o u t o 1 = 1 1 + e − 0.8583102995 = 0.702307507 out_{o1} = \frac{1}{1 + e^{-0.8583102995}} = 0.702307507 outo1=1+e0.85831029951=0.702307507

o u t o 2 = 1 1 + e − 0.9179986062 = 0.714634132 out_{o2} = \frac{1}{1 + e^{-0.9179986062}} = 0.714634132 outo2=1+e0.91799860621=0.714634132

损失函数计算结果:

E o 1 = ∑ i = 1 n 1 2 ( 0.85 − 0.702307507 ) 2 = 0.010906536 E_{o1} = \sum_{i=1}^{n} \frac{1}{2} (0.85 - 0.702307507)^2 = 0.010906536 Eo1=i=1n21(0.850.702307507)2=0.010906536

E o 2 = ∑ i = 1 n 1 2 ( 0.30 − 0.714634132 ) 2 = 0.085960731 E_{o2} = \sum_{i=1}^{n} \frac{1}{2} (0.30 - 0.714634132)^2 = 0.085960731 Eo2=i=1n21(0.300.714634132)2=0.085960731

E t o t a l = 0.010906536 + 0.085960731 = 0.096867268 E_{total} = 0.010906536 + 0.085960731 = 0.096867268 Etotal=0.010906536+0.085960731=0.096867268

到这之后可以看到我们的总误差的数值,那么接下来进行反向传播算法,在反向传播算法里面应用了很多导数的知识,我们重点放在过程上。

对于权重参数 w 5 w5 w5 来说,我们想知道它的变化对损失函数的影响有多大,是根据最后的总损失函数反馈到 o u t o 1 out_{o1} outo1,然后由 o u t o 1 out_{o1} outo1 反馈到 l o 1 l_{o1} lo1,最后由 l o 1 l_{o1} lo1 反馈到 w 5 w5 w5,那么我们对其求偏导并且根据链式法则有:

∂ E t o t a l ∂ w 5 = ∂ E t o t a l ∂ o u t o 1 × ∂ o u t o 1 ∂ l o 1 × ∂ l o 1 ∂ w 5 \frac{\partial E_{total}}{\partial w5} = \frac{\partial E_{total}}{\partial out_{o1}} \times \frac{\partial out_{o1}}{\partial l_{o1}} \times \frac{\partial l_{o1}}{\partial w5} w5Etotal=outo1Etotal×lo1outo1×w5lo1
那么:

E t o t a l = 1 2 ( 0.85 − o u t o 1 ) 2 + 1 2 ( 0.3 − o u t o 2 ) 2 E_{total} = \frac{1}{2}(0.85 - out_{o1})^2 + \frac{1}{2}(0.3 - out_{o2})^2 Etotal=21(0.85outo1)2+21(0.3outo2)2
对上述 o u t o 1 out_{o1} outo1 求偏导,根据求导公式得:

∂ E t o t a l ∂ o u t o 1 = 2 × 1 2 ( 0.85 − o u t o 1 ) × − 1 = 0.702307507 − 0.85 = − 0.147692493 \frac{\partial E_{total}}{\partial out_{o1}} = 2 \times \frac{1}{2}(0.85 - out_{o1}) \times -1 = 0.702307507 - 0.85 = -0.147692493 outo1Etotal=2×21(0.85outo1)×1=0.7023075070.85=0.147692493

接着计算 ∂ o u t o 1 ∂ l o 1 \frac{\partial out_{o1}}{\partial l_{o1}} lo1outo1

o u t o 1 = 1 1 + e − l o 1 out_{o1} = \frac{1}{1 + e^{-l_{o1}}} outo1=1+elo11

这是对 sigmod 函数进行求导:

∂ o u t o 1 ∂ l o 1 = o u t o 1 × ( 1 − o u t o 1 ) = 0.702307507 × ( 1 − 0.702307507 ) = 0.209071672 \frac{\partial out_{o1}}{\partial l_{o1}} = out_{o1} \times (1 - out_{o1}) = 0.702307507 \times (1 - 0.702307507) = 0.209071672 lo1outo1=outo1×(1outo1)=0.702307507×(10.702307507)=0.209071672
接着往下计算 ∂ l o 1 ∂ w 5 \frac{\partial l_{o1}}{\partial w5} w5lo1

l o 1 = w 5 × o u t h 1 + w 6 × o u t h 2 + b 2 l_{o1} = w5 \times out_{h1} + w6 \times out_{h2} + b2 lo1=w5×outh1+w6×outh2+b2

∂ l o 1 ∂ w 5 = 1 × o u t h 1 × w 5 1 − 1 + 0 + 0 = 0.595078474 \frac{\partial l_{o1}}{\partial w5} = 1 \times out_{h1} \times w5^{1-1} + 0 + 0 = 0.595078474 w5lo1=1×outh1×w511+0+0=0.595078474

最后三项相乘得出

∂ E t o t a l ∂ w 5 = − 0.147692493 × 0.209071672 × 0.595078474 = − 0.018375021 \frac{\partial E_{total}}{\partial w5} = -0.147692493 \times 0.209071672 \times 0.595078474 = -0.018375021 w5Etotal=0.147692493×0.209071672×0.595078474=0.018375021
到这之后我们可以根据梯度下降的算法来更新 w 5 w5 w5 权重了:
w 5 + = w 5 − η ∂ E t o t a l ∂ w 5 = 0.25 − 1 × ( − 0.018375021 ) = 0.268375021 w_5^+ = w_5 - \eta \frac{\partial E_{total}}{\partial w_5} = 0.25 - 1 \times (-0.018375021) = 0.268375021 w5+=w5ηw5Etotal=0.251×(0.018375021)=0.268375021

上述的式子是梯度下降的算法, η \eta η 是学习率,就是说梯度下降的步幅,是由工程师凭借经验或者测试而确定的数值, w 5 w_5 w5 被更新为 w 5 + w_5^+ w5+。同理我们也可以将 w 6 , w 7 , w 8 w6, w7, w8 w6,w7,w8 更新完成。当我们使用更新完之后的参数再带入神经网络去计算时,会发现最终的输出与真实的输出已经更接近了。这就是梯度下降算法的作用.

对于隐藏层更新权重时,例如更新 w 1 w1 w1,使用的方法基本与前文更新 w 5 w5 w5 是一致的,从 o u t o 1 , l o 1 , w 5 out_{o1}, l_{o1}, w5 outo1,lo1,w5 三处分别求偏导再求其乘积,但有区别.

损失函数对 w 1 w1 w1 权重求偏导:

∂ E t o t a l ∂ w 1 = ∂ E t o t a l ∂ o u t h 1 × ∂ o u t h 1 ∂ l h 1 × ∂ l h 1 ∂ w 1 \frac{\partial E_{total}}{\partial w1} = \frac{\partial E_{total}}{\partial out_{h1}} \times \frac{\partial out_{h1}}{\partial l_{h1}} \times \frac{\partial l_{h1}}{\partial w1} w1Etotal=outh1Etotal×lh1outh1×w1lh1
由图中的传递方式可以看到, o u t h 1 out_{h1} outh1 会接受有 E o 1 E_{o1} Eo1,与 E o 2 E_{o2} Eo2 两个地方传来的误差损失。

那么 ∂ E t o t a l ∂ o u t h 1 \frac{\partial E_{total}}{\partial out_{h1}} outh1Etotal 就可以拆为:

∂ E t o t a l ∂ o u t h 1 = ∂ E o 1 ∂ o u t h 1 + ∂ E o 2 ∂ o u t h 1 \frac{\partial E_{total}}{\partial out_{h1}} = \frac{\partial E_{o1}}{\partial out_{h1}} + \frac{\partial E_{o2}}{\partial out_{h1}} outh1Etotal=outh1Eo1+outh1Eo2
继续往下计算 ∂ E o 1 ∂ o u t h 1 \frac{\partial E_{o1}}{\partial out_{h1}} outh1Eo1,主要是利用链式法则将隐藏层与输出层链接起来计算:

∂ E o 1 ∂ o u t h 1 = ∂ E o 1 ∂ l o 1 × ∂ l o 1 ∂ o u t h 1 \frac{\partial E_{o1}}{\partial out_{h1}} = \frac{\partial E_{o1}}{\partial l_{o1}} \times \frac{\partial l_{o1}}{\partial out_{h1}} outh1Eo1=lo1Eo1×outh1lo1
那么可以利用输出层的计算结果( ∂ E o 1 ∂ o u t o 1 \frac{\partial E_{o1}}{\partial out_{o1}} outo1Eo1 ∂ E t o t a l ∂ o u t o 1 \frac{\partial E_{total}}{\partial out_{o1}} outo1Etotal 结果相等):

∂ E o 1 ∂ l o 1 = ∂ E o 1 ∂ o u t o 1 × ∂ o u t o 1 ∂ l o 1 = − 0.147692493 × 0.209071672 = − 0.030878316 \frac{\partial E_{o1}}{\partial l_{o1}} = \frac{\partial E_{o1}}{\partial out_{o1}} \times \frac{\partial out_{o1}}{\partial l_{o1}} = -0.147692493 \times 0.209071672 = -0.030878316 lo1Eo1=outo1Eo1×lo1outo1=0.147692493×0.209071672=0.030878316
接着:

l o 1 = w 5 × o u t h 1 + w 6 × o u t h 2 + b 2 l_{o1} = w5 \times out_{h1} + w6 \times out_{h2} + b2 lo1=w5×outh1+w6×outh2+b2

∂ l o 1 ∂ o u t h 1 = w 5 = 0.25 \frac{\partial l_{o1}}{\partial out_{h1}} = w5 = 0.25 outh1lo1=w5=0.25

最终:

∂ E o 1 ∂ o u t h 1 = ∂ E o 1 ∂ l o 1 × ∂ l o 1 ∂ o u t h 1 = − 0.030878316 × 0.25 = − 0.007719579 \frac{\partial E_{o1}}{\partial out_{h1}} = \frac{\partial E_{o1}}{\partial l_{o1}} \times \frac{\partial l_{o1}}{\partial out_{h1}} = -0.030878316 \times 0.25 = -0.007719579 outh1Eo1=lo1Eo1×outh1lo1=0.030878316×0.25=0.007719579
同样我们可以计算出:

∂ E o 2 ∂ o u t h 1 = 0.025367174 \frac{\partial E_{o2}}{\partial out_{h1}} = 0.025367174 outh1Eo2=0.025367174
那么:

∂ E t o t a l ∂ o u t h 1 = ∂ E o 1 ∂ o u t h 1 + ∂ E o 2 ∂ o u t h 1 = − 0.007719579 + 0.025367174 = 0.017647595 \frac{\partial E_{total}}{\partial out_{h1}} = \frac{\partial E_{o1}}{\partial out_{h1}} + \frac{\partial E_{o2}}{\partial out_{h1}} = -0.007719579 + 0.025367174 = 0.017647595 outh1Etotal=outh1Eo1+outh1Eo2=0.007719579+0.025367174=0.017647595
在这之后我们计算第二部分 ∂ o u t h 1 ∂ l h 1 \frac{\partial out_{h1}}{\partial l_{h1}} lh1outh1

o u t h 1 = 1 1 + e − l h 1 out_{h1} = \frac{1}{1 + e^{-l_{h1}}} outh1=1+elh11

∂ o u t h 1 ∂ l h 1 = o u t h 1 ( 1 − o u t h 1 ) = 0.595078474 × ( 1 − 0.595078474 ) = 0.240960084 \frac{\partial out_{h1}}{\partial l_{h1}} = out_{h1}(1 - out_{h1}) = 0.595078474 \times (1 - 0.595078474) = 0.240960084 lh1outh1=outh1(1outh1)=0.595078474×(10.595078474)=0.240960084

然后计算第三部分 ∂ l h 1 ∂ w 1 \frac{\partial l_{h1}}{\partial {w1}} w1lh1

l h 1 = w 1 × i 1 + w 2 × i 2 + b 1 l_{h1} = w1 \times i1 + w2 \times i2 + b1 lh1=w1×i1+w2×i2+b1

∂ l h 1 ∂ w 1 = i 1 = 0.1 \frac{\partial l_{h1}}{\partial w1} = i1 = 0.1 w1lh1=i1=0.1

那么三项相乘:
∂ E t o t a l ∂ w 1 = ∂ E t o t a l ∂ o u t h 1 × ∂ o u t h 1 ∂ l h 1 × ∂ l h 1 ∂ w 1 \frac{\partial E_{total}}{\partial w1} = \frac{\partial E_{total}}{\partial out_{h1}} \times \frac{\partial out_{h1}}{\partial l_{h1}} \times \frac{\partial l_{h1}}{\partial w1} w1Etotal=outh1Etotal×lh1outh1×w1lh1

∂ E t o t a l ∂ w 1 = 0.017647595 × 0.240960084 × 0.1 = 0.000425237 \frac{\partial E_{total}}{\partial w1} = 0.017647595 \times 0.240960084 \times 0.1 = 0.000425237 w1Etotal=0.017647595×0.240960084×0.1=0.000425237

最后梯度下降算法更新 w 1 w1 w1

w 1 + = w 1 − η ∂ E t o t a l ∂ w 1 = 0.05 − 1 × 0.000425237 = 0.049574763 w_1^+ = w_1 - \eta \frac{\partial E_{total}}{\partial w1} = 0.05 - 1 \times 0.000425237 = 0.049574763 w1+=w1ηw1Etotal=0.051×0.000425237=0.049574763
同理也可以将 w 2 , w 3 , w 4 w2, w3, w4 w2,w3,w4 更新完成,最后将更新完的所有参数全部带入重新计算,得出新的输出,然后再根据损失函数、反向传播、梯度下降不停的去迭代更新参数,最终理论上输出的结果会无限接近真实结果,那么这一组参数就会变得非常有价值。上文中的理论推导都是基于简单的实数,并且网络结构简单,目的是理解神经网络的工作过程。真实的环境中都是使用矩阵批量计算的,并且已经有很多深度学习工具帮我们实现了计算过程,我们学会调用对应的函数就能便捷的实现计算过程。

训练神经网络

训练神经⽹络,也是使⽤梯度下降⽅法。神经⽹络模型的参数,与其隐藏层数量和神经元数量相关,学习率可以在经验值 1e-3 范围内进⾏探索。 ⼀个合适的学习率能够让我们的损失函数在合适的时间内收敛到局部最⼩值。

损失函数(loss function)是⽤来评估模型的预测结果与真实结果不⼀致程度的函数。学完前⾯内容之后,我们已经知道了神经⽹络的⼯作过程,在前向传播计算完之后会得出⼀个输出,这个输出就是模型的预测值,真实值是在准备数据时就定义好的。

⽐如说 1000 张猫的图⽚,那么图⽚像素矩阵就是我们的输⼊,我们命名这些图为猫 1、猫 2…,这个就是⼿动打上去的标签,但是计算机是不能理解的,这样就需要将名字为猫的图⽚也转化为⼀个输出值矩阵,矩阵中以猫为名字的图⽚我们定义为 1,我们就知道将猫图⽚的像素矩阵输⼊之后经过计算得出的结果我们去和 1 ⽐较,如果计算的预测值和真实值 1 不同,接着进⾏反向传播、梯度下降优化等等训练神经⽹络,这样我们最终会得到⼀个猫图⽚像素矩阵与数字 1 的映射关系。

这个过程中,每次计算的值是预测值,真实值是概率值,通常取值为1(100%)。预测值通常需要softmax函数转换为概率值。然后才是通过损失函数计算预测和真实之间的误差。损失函数⼀个⾮负实值函数,通常会经过绝对值或者平⽅的⽅式让其变为⾮负,因为如果第⼀次计算差距是负数,第⼆次是正数,那么就会抵消了,变为没有误差,那肯定是不合适的。损失函数越⼩,模型就越健壮。

相关文章:

神经网络的数学之旅:从输入到反向传播

目录 神经网络简介神经元激活函数神经网络 神经网络的工作过程前向传播&#xff08;forward&#xff09;反向传播&#xff08;backward&#xff09;训练神经网络 神经网络简介 神经元 在深度学习中&#xff0c;必须要说的就是神经⽹络&#xff0c;或者说是⼈⼯神经⽹络&#…...

软件测试的页面交互标准:怎样有效提高易用性

当用户遇到"反人类"设计时 "这个按钮怎么点不了&#xff1f;"、"错误提示完全看不懂"、"我输入的内容去哪了&#xff1f;"——这些用户抱怨背后&#xff0c;都指向同一个问题&#xff1a;页面交互的易用性缺陷。作为软件测试工程师&a…...

Linux419 三次握手四次挥手抓包 wireshark

还是Notfound 没连接 可能我在/home 准备配置静态IP vim ctrlr 撤销 u撤销 配置成功 准备关闭防火墙 准备配置 YUM源 df -h 未看到sr0文件 准备排查 准备挂载 还是没连接 计划重启 有了 不重启了 挂载准备 修改配置文件准备 准备清理缓存 ok 重新修改配…...

玩转Docker | 使用Docker部署tududi任务管理工具

玩转Docker | 使用Docker部署tududi任务管理工具 前言一、tududi介绍Tududi简介核心功能特点二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署tududi服务下载镜像创建容器创建容器检查容器状态检查服务端口安全设置四、访问tududi服务访问tududi首页登录tu…...

ueditorplus编辑器已增加AI智能

之前功能请参考:https://www.geh3408.top/blog/76 下载:https://gitee.com/mo3408/ueditorplus 注意:key值需要单独获取,默认为DeepSeek,默认key有限制,请更换为自己的。 演示地址:https://www.geh3408.top/ueditorplus/dist 更多体验:ueditorplus编辑器已增加AI智…...

深度学习数据预处理:Dataset类的全面解析与实战指南

前言 在深度学习项目中&#xff0c;数据预处理是模型训练前至关重要的一环。一个高效、灵活的数据预处理流程不仅能提升模型性能&#xff0c;还能大大加快开发效率。本文将深入探讨PyTorch中的Dataset类&#xff0c;介绍数据预处理的常见技巧&#xff0c;并通过实战示例展示如何…...

【机器学习-周总结】-第4周

以下是本周学习内容的整理总结&#xff0c;从技术学习、实战应用到科研辅助技能三个方面归纳&#xff1a; 文章目录 &#x1f4d8; 一、技术学习模块&#xff1a;TCN 基础知识与结构理解&#x1f539; 博客1&#xff1a;【时序预测05】– TCN&#xff08;Temporal Convolutiona…...

高可靠 ZIP 压缩方案兼容 Office、PDF、TXT 和图片的二阶段回退机制

一、引言 在企业级应用中&#xff0c;经常需要将多种类型的文件&#xff08;如 Office 文档、PDF、纯文本、图片等&#xff09;打包成 ZIP 并提供给用户下载。但由于文件路径过长、特殊字符或权限等问题&#xff0c;Go 标准库的 archive/zip 有时会出现“压缩成功却实际未写入…...

【HDFS入门】HDFS数据冗余与容错机制解析:如何保障大数据高可靠存储?

目录 1 HDFS冗余机制设计哲学 1.1 多副本存储策略的工程权衡 1.2 机架感知的智能拓扑算法 2 容错机制实现原理 2.1 故障检测的三重保障 2.2 数据恢复的智能调度 3 关键场景容错分析 3.1 数据中心级故障应对 3.2 数据损坏的校验机制 4 进阶优化方案 4.1 纠删码技术实…...

06-libVLC的视频播放器:推流RTMP

创建媒体对象 libvlc_media_t* m = libvlc_media_new_path(m_pInstance, inputPath.toStdString().c_str()); if (!m) return -1; // 创建失败返回错误 libvlc_media_new_path:根据文件路径创建媒体对象。注意:toStdString().c_str() 在Qt中可能存在临时字符串析构问题,建议…...

【DT】USB通讯失败记录

项目场景&#xff1a; DT小板 USB通讯失败 问题描述 V1.1 板子含有降压电路、电容充电电路、姿态传感电路&#xff0c;语音电路、电弧电路、TF卡电路 焊接完成&#xff1a;功能正常 V1.2 为方便数传模块拔插&#xff0c;把座子缩小并做在了背面&#xff0c;下载口反向方便狭…...

【笔记】网路安全管理-实操

一、系统安全防护-Windows 开始-》管理工具-》本地安全策略-》账户策略-》密码策略-》 1.密码必须符合复杂性要求。双击打开-》勾选已启用-》单击:应用-》单击:确定 2.密码长度最小值。双击打开-》设置密码长度最小值为:?个字符 3.密码最短使用期限。双击打开-》设置密码…...

FFMPEG-视频解码-支持rtsp|rtmp|音视频文件(低延迟)

本人亲测解码显示对比延迟达到7到20毫秒之间浮动兼容播放音视频文件、拉流RTSP、RTMP等网络流 基于 Qt 和 FFmpeg 的视频解码播放器类,继承自 QThread,实现了视频流的解码、播放控制、帧同步和错误恢复等功能 工作流程初始化阶段: 用户设置URL和显示尺寸 调用play()启动线程解…...

LDR、MOV和STR指令详解

文章目录 前言 一、LDR指令详解 1.基本语法 2.寻址方式 3.伪指令形式 二、MOV指令详解 1.基本语法 2.常见用法 3.特殊变体 三、STR指令详解 1.基本语法 2.寻址方式 四、三者区别与联系 1.基本语法 2.操作效率 3.大数值处理 总结 前言 ARM汇编中的LDR、MOV和STR是三个最基础也最…...

MATLAB 控制系统设计与仿真 - 41

鲁棒控制的其他函数 - 回路成型函数 loopsyn 灵敏度问题由鲁棒控制工具箱中的loopsyn就可以直接求解&#xff0c;该函数采用H无穷回路成型算法设计控制器&#xff0c;函数的调用格式为&#xff1a; [K,CL,gamma,info] loopsyn(G,Gd) % G为受控对象模型% Gd为期望的回路传递函…...

Scade 语言词法介绍

Scade 6 是一种具备形式化语法与形式化语义的领域特定语言&#xff08;注1&#xff09;。自2008年发布&#xff08;注5&#xff09;起&#xff0c;在 Scade Suite 产品系列中语言定义方面到目前未产生重要的改变(注2)。在下面的内容中将介绍Scade 语言的词法(注3)。 注1&#x…...

Replicate Python client

本文翻译整理自&#xff1a;https://github.com/replicate/replicate-python 文章目录 一、关于 Replicate Python 客户端相关链接资源关键功能特性 二、1.0.0 版本的重大变更三、安装与配置1、系统要求2、安装3、认证配置 四、核心功能1、运行模型2、异步IO支持3、流式输出模型…...

LLM做逻辑推理题 - 如何找出不标准的球?

题目: 有80个外观一致的小球&#xff0c;其中一个和其它的重量不同&#xff0c;&#xff08;不知道更轻还是更重&#xff09;。现在给你一个天平&#xff0c;允许你称四次&#xff0c;把重量不同的球找出来&#xff0c;怎么称&#xff1f; 1. 答案 第1次称量&#xff1a;天平…...

[密码学基础]国密算法深度解析:中国密码标准的自主化之路

国密算法深度解析&#xff1a;中国密码标准的自主化之路 国密算法&#xff08;SM系列算法&#xff09;是中国自主研发的密码技术标准体系&#xff0c;旨在打破国际密码技术垄断&#xff0c;保障国家信息安全。本文将从技术原理、应用场景和生态发展三个维度&#xff0c;全面解…...

【计算机视觉】三维视觉项目 - Colmap二维图像重建三维场景

COLMAP 3D重建 项目概述项目功能项目运行方式1. 环境准备2. 编译 COLMAP3. 数据准备4. 运行 COLMAP 常见问题及解决方法1. **编译问题**2. **运行问题**3. **数据问题** 项目实战建议项目参考文献 项目概述 COLMAP 是一个开源的三维重建软件&#xff0c;专注于 Structure-from…...

基于Fabric.js的选座布局系统开发笔记

项目概述 最近开发了一个简单的选座布局系统&#xff0c;主要用于会议、活动或餐厅等场景的座位和桌子布局设计。系统基于HTML5 Canvas和Fabric.js库实现&#xff0c;支持添加座位、桌子&#xff0c;并能保存布局数据。 技术栈 • HTML5 Canvas&#xff1a;作为绘图的基础 •…...

PHP怎样连接MySQL数据库?

方法一&#xff1a;使用 mysqli 扩展 mysqli 是 MySQL 的改进版扩展&#xff0c;提供了面向对象和过程化的接口。 面向对象风格 <?php$servername "localhost"; $username "your_username"; $password "your_password"; $dbname &quo…...

将飞帆制作的网页作为 Vue 2 组件引入到自己网页中使用

飞帆平台有一个功能&#xff1a;不仅所有的网页都是通过控件搭建而成&#xff0c;而且生成的网页又是一个大控件&#xff0c;可以导入到你自己的网页使用。 这篇文章&#xff0c;我们要讲的就是如何将飞帆生成的网页作为控件&#xff08;组件&#xff09;导入到自己的网页中。…...

Python制作简易PDF查看工具PDFViewerV1.0显示优化

原文说明 为不破坏原文结构,因此功能优化不在原文中维护了。关于这款工具原文请通过下面链接访问。Python制作简易PDF查看工具PDFViewerV1.0 这款小工具基本功能已经可以作为一款文档浏览器使用,但还有一些美中不足的地方,本文将介绍对文本查找功能的优化调整。 优化效果 …...

YOLOv11改进有效涨点专栏:从理论到实战的深度优化指南

## YOLOv11的进化之路 在目标检测领域,YOLO系列算法始终保持着革命性的创新步伐。YOLOv11作为该系列的最新演进版本,在保持实时检测优势的同时,通过架构层面的深度优化实现了精度与速度的平衡。本文将从**七大核心模块**出发,系统性地解析针对YOLOv11的有效改进方案,涵盖从…...

【EDA软件】【设计约束和分析操作方法】

1. 设计约束 设计约束主要分为物理约束和时序约束。 物理约束主要包括I/O接口约束&#xff08;如引脚分配、电平标准设定等物理属性的约束&#xff09;、布局约束、布线约束以及配置约束。 时序约束是FPGA内部的各种逻辑或走线的延时&#xff0c;反应系统的频率和速度的约束…...

JVM基础认知:JVM到底是什么?为什么它如此重要?

随着 Java 语言在企业级应用、互联网服务、嵌入式系统等领域的广泛采用&#xff0c;JVM&#xff08;Java Virtual Machine&#xff0c;Java虚拟机&#xff09;成为了支撑整个生态的核心基础。初学者往往会把注意力集中在 Java 代码本身&#xff0c;却忽视了背后那台“看不见的机…...

javassist

使用javassist获取参数名 1&#xff0c;添加依赖 需要在pom.xml文件中添加下面的依赖&#xff1a; <dependency><groupId>org.javassist</groupId><artifactId>javassist</artifactId><version>3.28.0-GA</version> </depende…...

【C++算法】66.栈_比较含退格的字符串

文章目录 题目链接&#xff1a;题目描述&#xff1a;解法C 算法代码&#xff1a; 题目链接&#xff1a; 844. 比较含退格的字符串 题目描述&#xff1a; 解法 用字符串来模拟栈。 C 算法代码&#xff1a; class Solution { public:bool backspaceCompare(string s, string t…...

游戏引擎学习第235天:在 Windows 上初始化 OpenGL

奇怪有问题 之前没注意到 这个问题是Count 0 GlobalConstants_Renderer_UsedDebugCamer 打开的话会有Bug Count是零的话就不让排序了 game.h: 查阅 TODO 列表 大家好&#xff0c;欢迎来到 game Hero&#xff0c;这是一档我们在直播中一起编写完整游戏的节目。不幸的是&a…...

FPGA系列之DDS信号发生器设计(DE2-115开发板)

一、IP核 IP(Intellectual Property)原指知识产权、著作权等&#xff0c;在IC设计领域通常被理解为实现某种功能的设计。IP模块则是完成某种比较复杂算法或功能&#xff08;如FIR滤波器、FFT、SDRAM控制器、PCIe接口、CPU核等&#xff09;并且参数可修改的电路模块&#xff0c…...

修改Theme SHELL美化panel

安装 使用 使用Tweaks进行设置 需要创建.themes文件夹&#xff0c;在当前目录下 mkdir ~/.themes从官网下载文件 https://www.gnome-look.org/p/1013030 将打包压缩文件移动到~/themes&#xff0c;并解压 tar -xvf 01-Flat-Remix-Light-20250413.tar.xz然后使用 按 Alt F2…...

Sentinel源码—5.FlowSlot借鉴Guava的限流算法二

大纲 1.Guava提供的RateLimiter限流使用示例 2.Guava提供的RateLimiter简介与设计 3.继承RateLimiter的SmoothBursty源码 4.继承RateLimiter的SmoothWarmingUp源码 3.继承RateLimiter的SmoothBursty源码 (1)SmoothBursty的初始化流程 (2)SmoothBursty的初始化完成后的变量…...

自由学习记录(56)

从贴图空间&#xff08;texture space&#xff09;将值还原到切线空间&#xff08;tangent space&#xff09;向量 tangentNormal.xy (packedNormal.xy * 2 - 1) * _BumpScale; 背后的知识点&#xff1a;法线贴图中的 RGB 是在 0~1 范围内编码的向量 所以贴图法线是怎么“压…...

计算机网络八股——HTTP协议与HTTPS协议

前言&#xff1a; 到时候我想要写一篇文章就是&#xff1a;在浏览器中输入URL并按下回车会发生什么&#xff1f; 然后将几篇文章全部串联到一起&#xff0c;现在几天的任务就是将这里的每个小部分进行一个详细的介绍 HTTP1.1简述与特性 Web 上的通信都是建⽴在 HTTP 协议上的…...

JAVAEE(网络原理—UDP报头结构)

我们本篇文章要讲的是UDP的报头结构以及注意事项。 下面呢&#xff0c;我先说一下UDP是什么&#xff1f; 1.UDP是什么&#xff1f; UDP是一种网络协议。网络协议是计算机网络中&#xff0c;为了使不同设备之间能够准确、高效地进行数据交换和通信&#xff0c;而预先制定的一…...

Redis-分布式锁

Redis-分布式锁 文章目录 Redis-分布式锁1.基本原理和不同方式实现方式对比2.Redis分布式锁的基本实现思路3.分布式锁误删问题一4.分布式锁误删问题二5.Redission1.功能介绍2.快速入门3.可重入锁原理4.锁重试和WatchDog机制1.锁重试2. WatchDog 机制&#xff08;锁自动续期&…...

如何优雅地为 Axios 配置失败重试与最大尝试次数

在 Vue 3 中&#xff0c;除了使用自定义的 useRequest 钩子函数外&#xff0c;还可以通过 axios 的拦截器 或 axios-retry 插件实现接口请求失败后的重试逻辑。以下是两种具体方案的实现方式&#xff1a; 方案一&#xff1a;使用 axios 拦截器实现重试 实现步骤&#xff1a; 通…...

Windows使用SonarQube时启动脚本自动关闭

一、解决的问题 Windows使用SonarQube时启动脚本自动关闭&#xff0c;并发生报错&#xff1a; ERROR: Elasticsearch did not exit normally - check the logs at E:\Inori_Code\Year3\SE\sonarqube-25.2.0.102705\sonarqube-25.2.0.102705\logs\sonarqube.log ERROR: Elastic…...

MYSQL初阶(暂为自用草稿)

目录 基本操作 database操作 table操作 数据类型 INT类型 bit类型 FLOAT类型 CHAR类型 DATE类型 SEL类型 表的约束 列约束 NULL DEFAULT PRIMARY KEY UNIQUE KEY 表约束 PRIMARY KEY FOREIGN KEY 其他补充 AUTO_INCREMENT COMMENT ZEROFILL 表的CRUD …...

交换排序——快速排序

交换排序的基本思路&#xff1a;把序列中的两个元素进行比较&#xff0c;根据需求对两个元素进行交换。特点是较大的元素向序列的尾部移动&#xff0c;较小的元素向序列的前部移动。 hoare法 在序列中任取一个元素作为基准值&#xff0c;一趟排序完成之后&#xff0c;以基准值为…...

资源-又在网上淘到金了

前言&#xff1a; 本期再分享网上冲浪发现的特效/动画/视频资源网站。 一、基本介绍&#xff1a; mantissa.xyz&#xff0c;about作者介绍为&#xff1a;Midge “Mantissa” Sinnaeve &#xff08;米奇辛纳夫&#xff09;是一位屡获殊荣的艺术家和导演&#xff0c;提供动画、…...

CSS中的`transform-style`属性:3D变换的秘密武器

在CSS中&#xff0c;当我们尝试创建复杂的3D场景时&#xff0c;transform-style属性变得尤为重要。它决定了子元素是在3D空间中呈现还是被展平到2D平面中。本文将深入探讨transform-style的用法&#xff0c;并通过具体的代码示例来展示如何利用这个属性来增强你的网页设计。 什…...

Step文件无法编辑怎么办?

Step文件无法编辑怎么办&#xff1f; 这里介绍两种方法&#xff0c; 1、 直接导入 准备step文件&#xff0c;solidworks导入后是这样&#xff0c;不能在上面直接编辑 图 1 点击右键&#xff0c;选择解除特征&#xff08;不同版本的可能不太一样&#xff0c;这里是solidworks2…...

从 LabelImg 到 Label Studio!AI 数据标注神器升级,Web 版真香

视频讲解&#xff1a; 从 LabelImg 到 Label Studio&#xff01;AI 数据标注神器升级&#xff0c;Web 版真香 Label Studio 支持图像、文本、音频、视频、时间序列等多类型数据标注&#xff0c;覆盖计算机视觉&#xff08;目标检测、语义分割&#xff09;、自然语言处理&#x…...

纯FPGA实现驱动AD9361配置的思路和实现之一 概述

我们在做ZYNQ系统开发时候做的IP基本都是AXI_LITE_SLAVE&#xff0c;是SLAVE&#xff0c;从设备。就是提供了若干寄存器接口供MASTER进行读写。SLAVE里面的逻辑通过读写动作或者读写的数据进行响应的动作。这种方式的好处是硬件层面可以访问寄存器&#xff0c;软件层面是可以实…...

Nacos配置中心服务端源码解析

文章目录 概述一、配置持久化到数据库二、发布事件2.1、事件发布者端2.1.1、DefaultPublisher#publish2.1.2、DefaultPublisher#run2.1.3、DefaultPublisher#receiveEvent 2.2、事件订阅者端2.2.1、Subscriber#onEvent2.2.2、ConfigCacheService#dump 总结&#xff1a;Nacos 配…...

SAP系统工艺路线的分配物料出现旧版包材

问题:工艺路线的物料错了 这是3月份技术部发现的问题,10000209这个成品有两个版本的BOM, 在创建新版的工艺路线里,发现分配的物料仍然是旧版的物料. 原因排查: 1 BOM中物料错误? 2 选错了生产版本,选了版本1? 3 生产版本设置中的可选BOM错误? 解决&#xff1a;把可选的BOM…...

JVM虚拟机--JVM的组成

(一)JVM的组成 一、JVM介绍 &#xff08;1&#xff09;JVM的作用 我们知道&#xff0c;Java代码要想在计算机中正常运行&#xff0c;就需要经过编译为class二进制字节码文件&#xff0c;而JVM就提供了class二进制字节码的运行环境。 一次编写&#xff0c;到处运行 因为JVM是…...

科学研究:怎么做

科研&#xff08;科学研究&#xff09;​​ 是指通过系统化的方法&#xff0c;探索自然、社会或人文领域的未知问题&#xff0c;以发现新知识、验证理论或解决实际问题的活动。它的核心是​​基于证据的探索与创新​​&#xff0c;旨在推动人类认知和技术的进步。 科研的核心要…...