优化|如何减小噪声和误差对梯度下降法的影响

news2024/11/24 15:41:11

在这里插入图片描述

编者按:


许多精确算法在理论上能保证我们的目标函数值一直下降。在随机梯度下降以及无导数优化等情况下,目标移动方向受到噪声干扰,与实际下降方向往往会存在偏差。本文将分析噪声和下降偏差对于梯度下降法等算法的影响,并且介绍常用的改进方法。

应用背景

通常意义下,我们考虑的优化问题可写成
min ⁡ ϕ ( x ) , s.t. c i ( x ) ≥ 0 , i ∈ I . \begin{equation}\nonumber \min \phi(x), \quad \text{s.t.} c_i(x)\geq0, i\in I. \end{equation} minϕ(x),s.t.ci(x)0,iI.

我们会对 ϕ \phi ϕ c i ( i ∈ I ) c_i (i\in I) ci(iI)的性质做出一些假设 (例如函数是凸的、Lipschitz连续的), 然后在这些假设的基础上,构造具有一定收敛性的优化算法。这些收敛性结果需要一个共同的前提:对于任意的 x ∈ R n x\in\mathbb{R}^n xRn, 我们都能获得 ϕ ( x ) \phi(x) ϕ(x) c i ( x ) c_i(x) ci(x)的精确值。如果算法中涉及 (高阶) 导数的计算,那我们也假设这些导数都能够被精确算出。

然而在实际问题中,这个前提未必成立。其中一个原因在于有些优化问题涉及大量的样本,而所求的函数值被表示为不同样本对应值的平均。对于这类问题,许多随机算法应运而生,目前已有较为成熟的理论和系统的应用。这里不再赘述。在本文中,我们主要考虑另一类问题——自变量的规模不一定很大,但问题不满足上述精确性假设。

其中一个例子是阻尼器的分配 [ 1 ] ^{[1]} [1]。为了减小地震带来的经济损失,我们会在两栋相邻的建筑物之间安置阻尼器,使得建筑物具有更稳定的结构。然而阻尼器的成本较高,因此我们需要建立相应的优化问题,在尽可能少的阻尼器之下获得尽可能大的减震效果。这类优化问题的目标函数是通过地震模拟器产生的一个数值积分。由于它具有积分的形式,我们有理由认为它是可微的;但又由于它是一个黑箱函数,我们无法直接得到梯度的精确值。

类似的实际问题还有很多 [ 2 ] − [ 4 ] ^{[2]-[4]} [2][4],而这些问题大致可以分为两类。第一类可分为两种情况:(1) 函数本身不可微;(2) 由于问题的实际背景,我们无法得到可靠的近似梯度 (当然,我们可以通过差分等方式得到梯度的近似值;但如果我们在数值算法中使用这些近似值,无法得到理想的实验结果)。这类问题的求解往往需要无导数算法。在另一类问题中,函数值和导数值都可能具有一定的计算误差,但误差的大小是我们可以估计甚至控制的。对于这类问题,我们可以通过改进原有的优化算法,在新的情境下建立收敛结果。我们接下来介绍几个相应的例子。若不加说明,我们默认下文中出现的 ∥ ⋅ ∥ \|\cdot\| 表示2-范数。

在噪声下的BFGS算法 [ 5 ] ^{[5]} [5]

考虑无约束的优化问题 min ⁡ x ∈ R n ϕ ( x ) , \min_{x\in\mathbb{R}^{n}} \phi(x), xRnminϕ(x),

其中 ϕ ∈ C 1 ( R n ) \phi {\in} C^{1}(\mathbb{R}^n) ϕC1(Rn), 但函数与梯度值无法直接计算。对应地,我们可以获得它们的近似值 f f f g g g:
f ( x ) = ϕ ( x ) + ε ( x ) , g ( x ) = ∇ ϕ ( x ) + e ( x ) , \begin{equation}\nonumber f(x)=\phi(x)+\varepsilon(x), \quad g(x)=\nabla \phi(x)+e(x), \end{equation} f(x)=ϕ(x)+ε(x),g(x)=ϕ(x)+e(x),

其中误差有界,可写作 ∣ ε ( x ) ∣ ≤ ϵ f |\varepsilon(x)|\leq\epsilon_f ε(x)ϵf ∥ g ( x ) ∥ ≤ ϵ g \|g(x)\|\leq\epsilon_g g(x)ϵg。由于误差的大小只能估计,不能进一步控制 (例如让 ∣ ε ( x k ) ∣ |\varepsilon (x_k)| ε(xk)趋于 0 0 0),我们可将它看作是噪声。

对于上述问题,我们可以改进BFGS算法,它对于L-smooth的强凸函数具有全局收敛的结论。证明中的一个重要部分是对于线搜索的分析。对于噪声下的更新方向 p k = − H k g ( x k ) p_k =−H_kg(x_k) pk=Hkg(xk), 我们寻找步长 α \alpha α满足
f ( x k + α p k ) ≤ f ( x k ) + c 1 α p k T g ( x k ) , p k T g ( x k + α p k ) ≥ c 2 p k T g ( x k ) . \begin{equation}\nonumber f(x_k + αp_k) ≤ f(x_k) + c_1α p^T_k g(x_k), \quad p^T_k g(x_k + α p_k) ≥ c_2p ^T_k g(x_k).\quad \quad \quad \end{equation} f(xk+αpk)f(xk)+c1αpkTg(xk),pkTg(xk+αpk)c2pkTg(xk).

其中 c 1 , c 2 c_1,c_2 c1,c2是给定参数。如果没有噪声,这样的 α \alpha α是一定存在的。我们在用 f f f g g g替换 ϕ \phi ϕ ∇ ϕ \nabla\phi ϕ之后,需要重新分析步长 α \alpha α是否存在 (在必要的时候,可以调整线搜索准则)。可以证明, ∥ ∇ ϕ ( x k ) ∥ \|\nabla\phi(x_k)\| ∥∇ϕ(xk)足够大时,我们可以找到满足上述条件的步长 α \alpha α, 而且它在特定的线搜索参数 c 1 ′ , c 2 ′ c_1', c_2' c1,c2之下满足精确值对应的线搜索准则,即
ϕ ( x k + α p k ) ≤ ϕ ( x k ) + c 1 ′ α p k T ∇ ϕ ( x k ) , p k T ∇ ϕ ( x k + α p k ) ≥ c 2 ′ p k T ∇ ϕ ( x k ) . \begin{equation} \nonumber \phi(x_k + αp_k) ≤ \phi(x_k) + c_1'α p^T_k \nabla\phi(x_k), \quad p^T_k \nabla\phi(x_k + α p_k) ≥ c_2'p ^T_k \nabla\phi(x_k). \end{equation} ϕ(xk+αpk)ϕ(xk)+c1αpkTϕ(xk),pkTϕ(xk+αpk)c2pkTϕ(xk).
总之,这样的线搜索是良定义的,且步长满足原先(无噪声)步长的一些特性。结合改进算法的性质和误差的特点,我们最终可以得到以下收敛性结论:

**定理1:**假设 ϕ \phi ϕ是有下界且二次连续可微的强凸函数,其梯度满足lipschitz条件 ∥ ∇ ϕ ( x ) − ∇ ϕ ( y ) ∥ ≤ M ∥ x − y ∥ , ∀ x , y ∈ R n \|\nabla\phi(x)-\nabla\phi(y)\|\leq{M}\|x-y\|, \forall x,y\in\mathbb{R}^n ∥∇ϕ(x)ϕ(y)Mxy,x,yRn

计算误差始终满足 ∣ ε ( x ) ∣ ≤ ϵ f |\varepsilon(x)|\leq\epsilon_f ε(x)ϵf ∥ g ( x ) ∥ ≤ ϵ g \|g(x)\|\leq\epsilon_g g(x)ϵg c 1 , c 2 c_1,c_2 c1,c2是线搜索中用到的参数; β 1 ∈ ( 0 , 1 ) \beta_1\in(0,1) β1(0,1)是事先取定的参数。根据 [5] 中的改进算法,我们可以证明 { x k } \{x_k\} {xk}线性收敛的速度趋向于最优解邻域

N 1 = { x ∣ ∥ ∇ φ ( x ) ∥ ≤ max ⁡ { A M ϵ f β 1 , B ϵ g β 1 } } , \begin{equation}\nonumber \mathcal{N}_1 = \left\{x\mid \|∇φ(x)\| ≤ \max \left\{A\sqrt{\frac{M\epsilon_f}{β_1}} , \frac{B\epsilon_g}{β_1} \right\}\right\}, \end{equation} N1={x∥∇φ(x)max{Aβ1Mϵf ,β1Bϵg}},

其中 A = max ⁡ { 16 2 ( c 2 − c 1 ) ( 4 − c 1 − 3 c 2 ) , 8 c 1 ( 1 − c 2 ) } A = \max \left\{ \frac{16\sqrt{2}}{ \sqrt{(c_2 − c_1)(4 − c_1 − 3c_2)}} , \frac{8}{\sqrt{c_1(1 − c_2)}} \right\} A=max{(c2c1)(4c13c2) 162 ,c1(1c2) 8}, B = max ⁡ { 8 1 − c 2 , 8 ( 1 + c 1 ) c 2 − c 1 + 6 } B = \max \left\{\frac{8}{1 − c_2}, \frac{8(1 + c_1)}{c_2 − c_1} + 6 \right\} B=max{1c28,c2c18(1+c1)+6}.

可以看出,当误差 ϵ f = ϵ g = 0 \epsilon_f = \epsilon_g=0 ϵf=ϵg=0时,对应有 N 1 = { x ∗ } \mathcal{N}_1 = \{x^{*}\} N1={x}。此时定理1与BFGS算法目前在精确性假设下的最好收敛性结论对应。更进一步,我们还可以证明:

定理2:沿用定理1中的条件和算法设置。设
ϕ ^ = max ⁡ x ∈ N 1 ϕ ( x ) , N 2 = { x ∣ ϕ ( x ) ≤ ϕ ^ + 2 ϵ f } . \begin{equation}\nonumber \hat{\phi}=\max_{x\in\mathcal{N}_1}\phi(x),\quad \mathcal{N}_2 = \{x|\phi(x)\leq\hat{\phi}+2\epsilon_f\}. \end{equation} ϕ^=xN1maxϕ(x),N2={xϕ(x)ϕ^+2ϵf}.

可证明,对任意的 k > K = min ⁡ { k ∈ N ∣ x k ∈ N 1 } k>K=\min\{k\in\mathbb{N}|x_k\in\mathcal{N}_1\} k>K=min{kNxkN1} x k x_k xk都在最优解邻域 N 2 \mathcal{N}_2 N2中。

可控制误差下的改进算法

与噪声不同,我们考虑另一类问题,其中函数值与梯度值的误差可以被控制。例如问题 min ⁡ x ∈ R n ϕ ( x ) = ∫ t ∈ Ω h ( x , t ) d t , \min_{x\in\mathbb{R}^{n}} \phi(x)=\int_{t\in\Omega}h(x,t)dt, xRnminϕ(x)=tΩh(x,t)dt,

其中 h h h连续可微, Ω = [ a , b ] n \Omega=[a,b]^{n} Ω=[a,b]n , a<b。由于 ϕ \phi ϕ ∇ ϕ \nabla \phi ϕ的计算涉及数值积分 (且积分无显示表达式),我们只能获得它们的近似值,但计算的误差是可以控制的。此时我们希望改进原有的算法,且尽可能保留原先的收敛性结论

一个简单的例子是对梯度法的改进。原先的线搜索准则可写为
ϕ ( x k − α ∇ ϕ k ) ≤ ϕ k − σ α ∥ ∇ ϕ k ∥ 2 , \begin{equation}\nonumber \phi(x_k-\alpha\nabla\phi_k)\leq\phi_k-\sigma\alpha{\|\nabla\phi_k\|}^2, \end{equation} ϕ(xkαϕk)ϕkσα∥∇ϕk2,

其中 σ ∈ ( 0 , 1 ) \sigma\in(0,1) σ(0,1)是给定的参数。根据Taylor一阶展开,我们知道这样的步长存在。然而对于 f k = ϕ k + ε ( x k ) f_k=\phi_k+\varepsilon(x_k) fk=ϕk+ε(xk)和$ g_k=\nabla\phi_k+e(x_k) , 我们无法得到 , 我们无法得到 ,我们无法得到f(x_k-h{g}_k)\leq{f}_k-h|g_k|2+O(h2) ) 的性质。因此,我们考虑一个新的线搜索准则: ) 的性质。因此,我们考虑一个新的线搜索准则: )的性质。因此,我们考虑一个新的线搜索准则: f ( x k − α g k ) ≤ f k − σ α ∥ g k ∥ 2 + ξ k , f(x_k-\alpha{g}_k)\leq {f}_k-\sigma\alpha{\|g_k\|}^2+\xi_k, f(xkαgk)fkσαgk2+ξk,$

其中 ξ k ≥ ∣ ϵ ( x k − α g k ) ∣ + ∣ ϵ ( x k ) ∣ \xi_k\geq|\epsilon(x_k-\alpha{g}_k)|+|\epsilon(x_k)| ξkϵ(xkαgk)+ϵ(xk)。如果不等式取">",显然线搜索是良定义的;如果我们在计算时保证 ∥ e ( x k ) ∥ < ω ∥ g k ∥ \|e(x_k)\|<\omega\|g_k\| e(xk)<ωgk,其中 ω < 1 \omega<1 ω<1, 则可知 ϕ ( x k − h g k ) ≤ ϕ k − h g k T ∇ ϕ k + O ( h 2 ) ≤ ϕ k − h ( 1 − ω ) ∥ g k ∥ 2 + O ( h 2 ) . \begin{equation}\nonumber \phi(x_k-h{g}_k)\leq{\phi}_k-hg_k^T\nabla\phi_k+O(h^2)\leq{\phi}_k-h(1-\omega)\|g_k\|^2+O(h^2). \end{equation} ϕ(xkhgk)ϕkhgkTϕk+O(h2)ϕkh(1ω)gk2+O(h2).

此时 g k g_k gk是一个下降方向,因此我们可以选择 σ < 1 − ω \sigma<1-\omega σ<1ω, 并取 ξ k = ∣ ϵ ( x k − α g k ) ∣ + ∣ ϵ ( x k ) ∣ \xi_k =|\epsilon(x_k-\alpha{g}_k)|+|\epsilon(x_k)| ξk=ϵ(xkαgk)+ϵ(xk)。为了进一步建立收敛性结论,**我们通常需要控制计算中的误差,来保证 ∑ ξ k < ∞ \sum\xi_k<\infty ξk<。**实际上对于满足精确性假设的问题,也曾出现过类似的做法 [ 6 ] ^{[6]} [6](在线搜索中引入 ξ k \xi_k ξk项并要求 ∑ ξ k < ∞ \sum\xi_k<\infty ξk<)。

梯度法是一个很特殊的例子。包括梯度法在内,很多方法在精确性假设下计算出的更新方向 d k d_k dk ϕ \phi ϕ的下降方向。然而对于其中的一部分算法, d k d_k dk的计算涉及到历史梯度值 ( g k − 1 , g k − 2 ⋯ g_{k-1}, g_{k-2}\cdots gk1,gk2)。此时我们很难给出一个误差的限值标准,使得按标准计算的 { f i } i ≤ k \{f_i\}_{i\leq{k}} {fi}ik { g i } i ≤ k \{g_i\}_{i\leq{k}} {gi}ik能够生成一个 ϕ \phi ϕ的下降方向。尽管如此,我们仍然可以刻画算法的收敛性结果。一个常见的思路是考虑凸函数,通过 ∥ ∇ ϕ ( x ) ∥ = 0 \|\nabla\phi(x)\|=0 ∥∇ϕ(x)=0来说明算法到达函数的极小值。

为了建立算法的收敛性结果,我们需要对误差的大小做出要求。这里我们介绍一种常见的设置 [ 7 ] [ 8 ] ^{[7][8]} [7][8]。假设 ϕ \phi ϕ R n \mathbb{R}^n Rn上L-smooth的凸函数,即满足条件:
0 ≤ ϕ ( x ) − ϕ ( y ) + < ∇ ϕ ( y ) , x − y > ≤ M 2 ∥ x − y ∥ 2 , ∀ x , y ∈ R n , 0 ≤ \phi(x) − \phi(y) +\left<∇\phi (y), x − y\right> ≤ \frac{M}{2}\|x − y\|^2, \quad \forall x,y\in\mathbb{R}^{n}, 0ϕ(x)ϕ(y)+ϕ(y),xy2Mxy2,x,yRn,

其中 M > 0 M>0 M>0是强凸参数。我们接下来给出一阶 ( δ , L ) (\delta,L) (δ,L)信息的定义。

定义1 对于 δ , L > 0 \delta, L>0 δ,L>0, 函数 ϕ \phi ϕ具备一阶 ( δ , L ) (\delta,L) (δ,L)信息,当且仅当对任意的 y ∈ R n y\in\mathbb{R}^n yRn, 我们都能计算出一组 ( f ( y ) , g ( y ) ) (f(y),g(y)) (f(y),g(y))满足 0 ≤ f ( x ) − f ( y ) + < g ( y ) , x − y > ≤ L ∥ x − y ∥ 2 + δ , ∀ x ∈ R n . 0 ≤ f (x) − f(y) + \left<g(y), x − y\right> ≤ L \|x − y\|^2 + δ, \quad \forall x ∈ \mathbb{R}^n. 0f(x)f(y)+g(y),xyLxy2+δ,xRn.

以上定义可拓展到定义在 Q Q Q上的函数,其中 Q Q Q是一个闭凸集。

假设对于**任意小的 δ > 0 \delta>0 δ>0**和足够大的 L L L, 函数 ϕ \phi ϕ具有一阶 ( δ , L ) (\delta,L) (δ,L)信息。对于许多常见的一阶算法,我们可以适当选择 { δ k } \{\delta_k\} {δk} { L k } \{L_k\} {Lk}, 在第 k k k次迭代时按照一阶 ( δ k , L k ) (\delta_k,L_k) (δk,Lk)信息的标准来计算 ( f k , g k ) (f_k,g_k) (fk,gk),并用它代替 ( ϕ k , ∇ ϕ k ) (\phi_k,\nabla{\phi}_k) (ϕk,ϕk)。以梯度法 (Primal Gradient Method) 为例,它对应的收敛性结果 [ 7 ] ^{[7]} [7] ∑ i = 0 k − 1 1 L i [ ϕ ( x i + 1 ) − ϕ ( x ∗ ) ] ≤ 1 2 ∥ x 0 − x ∗ ∥ 2 + ∑ i = 0 k − 1 δ i L i . \begin{equation}\nonumber \sum_{i=0}^{k-1}\frac{1}{L_i} [ \phi(x_{i+1}) − \phi(x^∗)] ≤ \frac{1}{2}\| x_0 − x^∗\|^2 \color{red}+\sum_{i=0}^{k-1}\frac{\delta_i}{L_i}. \end{equation} i=0k1Li1[ϕ(xi+1)ϕ(x)]21x0x2+i=0k1Liδi.

ϕ \phi ϕ是L-smooth的函数,我们可以认为 { L k } \{L_k\} {Lk}有上界,且 M M M是它的一个下界。而上式可改写为
min ⁡ i = 0 , ⋯   , k − 1 { 1 L i [ ϕ ( x i + 1 ) − ϕ ( x ∗ ) ] } ≤ 1 2 k ∥ x 0 − x ∗ ∥ 2 + 1 k ∑ i = 0 k − 1 δ i L i . \begin{equation}\nonumber \min_{i=0,\cdots,k-1}\left\{\frac{1}{L_i} [\phi(x_{i+1}) − \phi(x^∗)]\right\} ≤ \frac{1}{2k}\| x_0 − x^∗\|^2 \color{red}+ \frac{1}{k} \sum_{i=0}^{k-1}\frac{\delta_i}{L_i}. \end{equation} i=0,,k1min{Li1[ϕ(xi+1)ϕ(x)]}2k1x0x2+k1i=0k1Liδi.

因此如果 lim ⁡ k → ∞ 1 k ∑ i = 0 k − 1 δ i L i = 0 \lim_{k\to\infty}\frac{1}{k}\sum_{i=0}^{k-1}\frac{\delta_i}{L_i}=0 limkk1i=0k1Liδi=0, 我们可推出 lim ⁡ k → ∞ min ⁡ i = 0 , ⋯   , k − 1 ϕ ( x i + 1 ) = ϕ ( x ∗ ) \lim_{k\to\infty}\min_{i = 0, \cdots,k-1}\phi(x_{i+1})=\phi(x^*) limkmini=0,,k1ϕ(xi+1)=ϕ(x), 即算法在 x ∗ x^* x处终止或存在子列趋近于唯一的最优解 x ∗ x^* x。其他的算法也有类似的收敛性结论,这里不再展开。

总结回顾

传统意义下,我们考虑的优化问题满足精确性假设,即目标 (约束) 函数和它的导数都可以被精确求出,然而在实际中许多问题并不满足这样的假设。对于具有大规模样本的问题,我们可以采用随机算法。在剩下的问题中,如果不能获得可靠的梯度信息,那么我们通常考虑无导数优化。如果我们能获得可靠的梯度信息,而函数值和梯度值伴随着可以估计大小的误差,那么我们考虑改进已有的一阶算法。面对具有误差的信息,一项重要的工作是制定合适的线搜索准则 (如果需要线搜索的话),并验证它是良定义的。如果误差的大小只能估计而不能控制,我们希望在足够多次迭代之后,算法能够到达最优解的某个小邻域中;如果误差的大小可以控制,我们可以通过一阶 ( δ , L ) (\delta,L) (δ,L)信息等工具,给出误差的限制标准,并在这样的标准下得到算法全局收敛的结论。

[1] Audet, C., & Hare, W. (2017). Derivative-free and blackbox optimization.​
[2] Booker, A. J., Dennis Jr, J. E., Frank, P. D., Serafini, D. B., Torczon, V., & Trosset, M. W. (1999). A Rigorous Framework by Surrogates for Optimization of Expensive Functions. Structural Optimization, 17, 1-13.​
[3] Begin, T., Baynat, B., Sourd, F., & Brandwajn, A. (2010). A DFO technique to calibrate queueing models. Computers & Operations Research, 37(2), 273-281.​
[4] Kannan, A., & Wild, S. M. (2012, June). Benefits of deeper analysis in simulation-based groundwater optimization problems. In Proceedings of the XIX International Conference on Computational Methods in Water Resources (CMWR 2012) (Vol. 4, No. 5, p. 10).​
[5] Xie, Y., Byrd, R. H., & Nocedal, J. (2020). Analysis of the BFGS method with errors. SIAM Journal on Optimization, 30(1), 182-209.​
[6] Han, S. P. (1977). A globally convergent method for nonlinear programming. Journal of optimization theory and applications, 22(3), 297-309.​
[7] Devolder, O., Glineur, F., & Nesterov, Y. (2014). First-order methods of smooth convex optimization with inexact oracle. Mathematical Programming, 146, 37-75.​
[8] Devolder, O. (2013). Exactness, inexactness and stochasticity in first-order methods for large-scale convex optimization (Doctoral dissertation, PhD thesis).

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

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

相关文章

SpringMVC08:拦截器+文件下载

目录 一、概述 二、自定义拦截器 1、新建一个Moudule&#xff0c;SpringMVC-07-Interceptor&#xff0c;添加web支持&#xff1b; 2、配置web.xml和springmvc-servlet.xml文件 3、编写一个拦截器 4、在springmvc的配置文件中配置拦截器 5、编写一个Controller&#xff0…

【数据库】Mysq备份与恢复

文章目录 一、数据库备份的分类1. 数据备份的重要性2. 数据库备份的分类3. 常见的备份方法 二、Mysql 完全备份与恢复1. Mysql 完全备份2. 数据库完全备份分类2.1 物理冷备份及恢复2.2 mysqldump 备份数据库完全备份一个或多个完整的库&#xff08;包括其中所有的表&#xff09…

基于YOLOv5实现安全帽检测识别

目录 1、作者介绍2、YOLOv5网络模型2.1 算法简介2.2 数据集介绍2.2.1 VOC数据集准备2.2.2 YOLOv5算法检测流程 3、代码实现3.1 数据集划分部分代码3.2 训练阶段3.3 测试阶段3.4 检测结果 4、问题与分析参考链接 1、作者介绍 陈梦丹&#xff0c;女&#xff0c;西安工程大学电子…

【6.20】sleep()和wait()的区别

sleep()和wait()的区别 1、wait()方法 1.1使用场景 当某个线程获取到锁后&#xff0c;却还是不满足执行的条件&#xff0c;就可以调用对象锁的wait方法&#xff0c;进入等待状态。 直到外在条件满足了&#xff0c;就可以由其它线程调用notify或者notifyAll方法&#xff0c;…

在软件研发排期中要求“倒推时间”,项目结束后悲剧了……

有没有遇到某个项目任务的研发周期已被各路boss定下&#xff0c;研发团队都觉得时间不合理&#xff0c;反馈给上级无果&#xff0c;而要求“倒推时间”进行任务排期的情况&#xff1f; 什么是“倒推时间”&#xff1f; 目标倒推法&#xff0c;从剩下的时间反推算出每天该做的事…

【Java】死锁问题及ThreadLocal

什么是死锁分析过程发生死锁的原因避免死锁ThreadLocal 什么是死锁 多个线程同时被阻塞&#xff0c;它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞&#xff0c;因此程序不可能正常终止。这是一个最严重的BUG之一。 分析过程 1.一个线程一把锁 一个线…

深入理解TDD(测试驱动开发):提升代码质量的利器

在日常的软件开发工作中&#xff0c;我们常常会遇到这样的问题&#xff1a;如何在繁忙的项目进度中&#xff0c;保证我们的代码质量&#xff1f;如何在不断的迭代更新中&#xff0c;避免引入新的错误&#xff1f;对此&#xff0c;有一种有效的开发方式能帮助我们解决这些问题&a…

14.处理大数据集

14.1 随机梯度下降 假设你正在使用梯度下降来训练一个线性回归模型 当m个样本的m很大时&#xff0c;求和计算量太大了。这种梯度下降算法有另外一个名字叫做批量梯度下降&#xff08;batch gradient desent&#xff09;。这种算法每次迭代需要使用全量训练集&#xff0c;直到算…

【代码阅读软件】Source Insight 4 使用教程 | 很详细——适合新手

目录 一、概述二、常用的几个窗口&#x1f449;2.1 符号窗口&#xff08;Symbol Window&#xff09;&#x1f449;2.2 项目文件窗口&#xff08;Project Window&#xff09;&#x1f449;2.3 关系窗口&#xff08;Relation Window&#xff09;&#x1f449;2.4 上下文窗口&…

STM32--基于固件库(Library Faction)的led灯点亮

目录 一、STM32芯片的简单介绍 二、基于固件库&#xff08;Library Faction&#xff09;的led灯点亮 这是一个学习stm32的开端&#xff0c;我们由简入难&#xff0c;之前学过C51/52或是其他型号的一般都是从led开始&#xff0c;也就是简单的输入输出端口的应用。&#xff08;想…

SpringBoot整合模板引擎Thymeleaf(1)

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl Thymeleaf概述 Thymeleaf是一种用于Web和独立环境的现代服务器端的Java模板引擎&#xff0c;主要目标是将优雅的自然模板带到开发工作流程中&#xff0c;并将HTML在浏览器中…

【kubernetes】Etcd集群部署与验证

前言:二进制部署kubernetes集群在企业应用中扮演着非常重要的角色。无论是集群升级,还是证书设置有效期都非常方便,也是从事云原生相关工作从入门到精通不得不迈过的坎。通过本系列文章,你将从虚拟机准备开始,到使用二进制方式从零到一搭建起安全稳定的高可用kubernetes集…

吐血整理,性能测试Jmeter分布式压测遇坑总结+解决

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 为什么要使用分布…

JSON.parse() 全面用法介绍

JSON 通常用于与服务端交换数据。在接收服务器数据时一般是字符串。我们可以使用 JSON.parse() 方法将数据转换为 JavaScript 对象。 语法 JSON.parse(text[, reviver]) text:必需&#xff0c; 一个有效的 JSON 字符串。 reviver: 可选&#xff0c;一个转换结果的函数&#xf…

SPI协议解析

SPI协议介绍 引言介绍SPI简介物理层协议层通讯的起始和停止信号SPI 模式 优缺点优点缺点 使用例程基于STM32的SPI通信准备硬件连接 软件实现 总结 引言 SPI是串行外设接口的缩写&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线。由于SPI高速和同步的特…

vite环境变量与模式

环境变量 Vite 在一个特殊的 import.meta.env 对象上暴露环境变量。这里有一些在所有情况下都可以使用的内建变量&#xff1a; import.meta.env.MODE: {string} 应用运行的模式。 import.meta.env.BASE_URL: {string} 部署应用时的基本 URL。他由base 配置项决定。 import.m…

【ESP8266】使用MQTT协议 连接华为云iotDA,实现设备属性上报

相关资料&#xff1a;https://github.com/CQUPTLei/ESP8266 往期文章&#xff1a;【ESP8266】基础AT指令和常用WIF指令 【MQTT 5.0】协议 ——发布订阅模式、Qos、keepalive、连接认证、消息结构 一、华为云iotDA1.1 什么是iotDA1.2 创建 iotDA 产品 二、使用ESP8266上报设备…

【杂谈理解】STM32F10X标准库工程模板

前言 基于STM官网的STM32F10x标准外设库V3.6.0版本&#xff0c;文件的操作流程是参考江科大的。记录下此文方便学习和回忆。文章后也会放置完整的工程文件和意法官网下载STM32F10x标准外设库的压缩包。 流程 到意法官网下载STM32F10x标准外设库的压缩包。先找到压缩包的地址&a…

CMake详解

file文件操作 cmake的file命令_cmake file_物随心转的博客-CSDN博客 set指令 CMake中的set指令详解_cmake set_guanguanboy的博客-CSDN博客 include_directories指令 Cmake命令之include_directories介绍 - 简书 add_subdirectory Cmake命令之add_subdirectory介绍 - 简书…

两台电脑用网线传输文件的一些问题解决

两台电脑用网线传输文件 步骤如下&#xff1a; 一、两台电脑插上网线 网线568A和568B可能没什么影响 二、 ipv4地址配置 两个网线插上电脑会自动生成一个ipv4地址 cmd里使用ipconfig查看 用这个就行了如果不想用自动生成的ip地址 也可以自己配置ipv4地址和网关&#xff08…