【深度学习笔记】优化算法——动量法

news2024/12/26 23:35:47

动量法

🏷sec_momentum

在 :numref:sec_sgd一节中,我们详述了如何执行随机梯度下降,即在只有嘈杂的梯度可用的情况下执行优化时会发生什么。
对于嘈杂的梯度,我们在选择学习率需要格外谨慎。
如果衰减速度太快,收敛就会停滞。
相反,如果太宽松,我们可能无法收敛到最优解。

基础

本节将探讨更有效的优化算法,尤其是针对实验中常见的某些类型的优化问题。

泄漏平均值

上一节中我们讨论了小批量随机梯度下降作为加速计算的手段。
它也有很好的副作用,即平均梯度减小了方差。
小批量随机梯度下降可以通过以下方式计算:

g t , t − 1 = ∂ w 1 ∣ B t ∣ ∑ i ∈ B t f ( x i , w t − 1 ) = 1 ∣ B t ∣ ∑ i ∈ B t h i , t − 1 . \mathbf{g}_{t, t-1} = \partial_{\mathbf{w}} \frac{1}{|\mathcal{B}_t|} \sum_{i \in \mathcal{B}_t} f(\mathbf{x}_{i}, \mathbf{w}_{t-1}) = \frac{1}{|\mathcal{B}_t|} \sum_{i \in \mathcal{B}_t} \mathbf{h}_{i, t-1}. gt,t1=wBt1iBtf(xi,wt1)=Bt1iBthi,t1.
为了保持记法简单,在这里我们使用 h i , t − 1 = ∂ w f ( x i , w t − 1 ) \mathbf{h}_{i, t-1} = \partial_{\mathbf{w}} f(\mathbf{x}_i, \mathbf{w}_{t-1}) hi,t1=wf(xi,wt1)作为样本 i i i的随机梯度下降,使用时间 t − 1 t-1 t1时更新的权重 t − 1 t-1 t1
如果我们能够从方差减少的影响中受益,甚至超过小批量上的梯度平均值,那很不错。
完成这项任务的一种选择是用泄漏平均值(leaky average)取代梯度计算:

v t = β v t − 1 + g t , t − 1 \mathbf{v}_t = \beta \mathbf{v}_{t-1} + \mathbf{g}_{t, t-1} vt=βvt1+gt,t1

其中 β ∈ ( 0 , 1 ) \beta \in (0, 1) β(0,1)
这有效地将瞬时梯度替换为多个“过去”梯度的平均值。
v \mathbf{v} v被称为动量(momentum),
它累加了过去的梯度。
为了更详细地解释,让我们递归地将 v t \mathbf{v}_t vt扩展到

v t = β 2 v t − 2 + β g t − 1 , t − 2 + g t , t − 1 = … , = ∑ τ = 0 t − 1 β τ g t − τ , t − τ − 1 . \begin{aligned} \mathbf{v}_t = \beta^2 \mathbf{v}_{t-2} + \beta \mathbf{g}_{t-1, t-2} + \mathbf{g}_{t, t-1} = \ldots, = \sum_{\tau = 0}^{t-1} \beta^{\tau} \mathbf{g}_{t-\tau, t-\tau-1}. \end{aligned} vt=β2vt2+βgt1,t2+gt,t1=,=τ=0t1βτgtτ,tτ1.

其中,较大的 β \beta β相当于长期平均值,而较小的 β \beta β相对于梯度法只是略有修正。
新的梯度替换不再指向特定实例下降最陡的方向,而是指向过去梯度的加权平均值的方向。
这使我们能够实现对单批量计算平均值的大部分好处,而不产生实际计算其梯度的代价。

上述推理构成了"加速"梯度方法的基础,例如具有动量的梯度。
在优化问题条件不佳的情况下(例如,有些方向的进展比其他方向慢得多,类似狭窄的峡谷),"加速"梯度还额外享受更有效的好处。
此外,它们允许我们对随后的梯度计算平均值,以获得更稳定的下降方向。
诚然,即使是对于无噪声凸问题,加速度这方面也是动量如此起效的关键原因之一。

正如人们所期望的,由于其功效,动量是深度学习及其后优化中一个深入研究的主题。
例如,请参阅[文章](https://distill.pub/2017/momentum/)(作者是 :cite:Goh.2017),观看深入分析和互动动画。
动量是由 :cite:Polyak.1964提出的。
:cite:Nesterov.2018在凸优化的背景下进行了详细的理论讨论。
长期以来,深度学习的动量一直被认为是有益的。
有关实例的详细信息,请参阅 :cite:Sutskever.Martens.Dahl.ea.2013的讨论。

条件不佳的问题

为了更好地了解动量法的几何属性,我们复习一下梯度下降,尽管它的目标函数明显不那么令人愉快。
回想我们在 :numref:sec_gd中使用了 f ( x ) = x 1 2 + 2 x 2 2 f(\mathbf{x}) = x_1^2 + 2 x_2^2 f(x)=x12+2x22,即中度扭曲的椭球目标。
我们通过向 x 1 x_1 x1方向伸展它来进一步扭曲这个函数

f ( x ) = 0.1 x 1 2 + 2 x 2 2 . f(\mathbf{x}) = 0.1 x_1^2 + 2 x_2^2. f(x)=0.1x12+2x22.

与之前一样, f f f ( 0 , 0 ) (0, 0) (0,0)有最小值,
该函数在 x 1 x_1 x1的方向上非常平坦。
让我们看看在这个新函数上执行梯度下降时会发生什么。

%matplotlib inline
import torch
from d2l import torch as d2l

eta = 0.4
def f_2d(x1, x2):
    return 0.1 * x1 ** 2 + 2 * x2 ** 2
def gd_2d(x1, x2, s1, s2):
    return (x1 - eta * 0.2 * x1, x2 - eta * 4 * x2, 0, 0)

d2l.show_trace_2d(f_2d, d2l.train_2d(gd_2d))
epoch 20, x1: -0.943467, x2: -0.000073

在这里插入图片描述

从构造来看, x 2 x_2 x2方向的梯度比水平 x 1 x_1 x1方向的梯度大得多,变化也快得多。
因此,我们陷入两难:如果选择较小的学习率,我们会确保解不会在 x 2 x_2 x2方向发散,但要承受在 x 1 x_1 x1方向的缓慢收敛。相反,如果学习率较高,我们在 x 1 x_1 x1方向上进展很快,但在 x 2 x_2 x2方向将会发散。
下面的例子说明了即使学习率从 0.4 0.4 0.4略微提高到 0.6 0.6 0.6,也会发生变化。
x 1 x_1 x1方向上的收敛有所改善,但整体来看解的质量更差了。

eta = 0.6
d2l.show_trace_2d(f_2d, d2l.train_2d(gd_2d))
epoch 20, x1: -0.387814, x2: -1673.365109

在这里插入图片描述

动量法

动量法(momentum)使我们能够解决上面描述的梯度下降问题。
观察上面的优化轨迹,我们可能会直觉到计算过去的平均梯度效果会很好。
毕竟,在 x 1 x_1 x1方向上,这将聚合非常对齐的梯度,从而增加我们在每一步中覆盖的距离。
相反,在梯度振荡的 x 2 x_2 x2方向,由于相互抵消了对方的振荡,聚合梯度将减小步长大小。
使用 v t \mathbf{v}_t vt而不是梯度 g t \mathbf{g}_t gt可以生成以下更新等式:
v t ← β v t − 1 + g t , t − 1 , x t ← x t − 1 − η t v t . \begin{aligned} \mathbf{v}_t &\leftarrow \beta \mathbf{v}_{t-1} + \mathbf{g}_{t, t-1}, \\ \mathbf{x}_t &\leftarrow \mathbf{x}_{t-1} - \eta_t \mathbf{v}_t. \end{aligned} vtxtβvt1+gt,t1,xt1ηtvt.
请注意,对于 β = 0 \beta = 0 β=0,我们恢复常规的梯度下降。
在深入研究它的数学属性之前,让我们快速看一下算法在实验中的表现如何。

def momentum_2d(x1, x2, v1, v2):
    v1 = beta * v1 + 0.2 * x1
    v2 = beta * v2 + 4 * x2
    return x1 - eta * v1, x2 - eta * v2, v1, v2

eta, beta = 0.6, 0.5
d2l.show_trace_2d(f_2d, d2l.train_2d(momentum_2d))
epoch 20, x1: 0.007188, x2: 0.002553

在这里插入图片描述

正如所见,尽管学习率与我们以前使用的相同,动量法仍然很好地收敛了。
让我们看看当降低动量参数时会发生什么。
将其减半至 β = 0.25 \beta = 0.25 β=0.25会导致一条几乎没有收敛的轨迹。
尽管如此,它比没有动量时解将会发散要好得多。

eta, beta = 0.6, 0.25
d2l.show_trace_2d(f_2d, d2l.train_2d(momentum_2d))
epoch 20, x1: -0.126340, x2: -0.186632

在这里插入图片描述

请注意,我们可以将动量法与随机梯度下降,特别是小批量随机梯度下降结合起来。
唯一的变化是,在这种情况下,我们将梯度 g t , t − 1 \mathbf{g}_{t, t-1} gt,t1替换为 g t \mathbf{g}_t gt
为了方便起见,我们在时间 t = 0 t=0 t=0初始化 v 0 = 0 \mathbf{v}_0 = 0 v0=0

有效样本权重

回想一下 v t = ∑ τ = 0 t − 1 β τ g t − τ , t − τ − 1 \mathbf{v}_t = \sum_{\tau = 0}^{t-1} \beta^{\tau} \mathbf{g}_{t-\tau, t-\tau-1} vt=τ=0t1βτgtτ,tτ1
极限条件下, ∑ τ = 0 ∞ β τ = 1 1 − β \sum_{\tau=0}^\infty \beta^\tau = \frac{1}{1-\beta} τ=0βτ=1β1
换句话说,不同于在梯度下降或者随机梯度下降中取步长 η \eta η,我们选取步长 η 1 − β \frac{\eta}{1-\beta} 1βη,同时处理潜在表现可能会更好的下降方向。
这是集两种好处于一身的做法。
为了说明 β \beta β的不同选择的权重效果如何,请参考下面的图表。

d2l.set_figsize()
betas = [0.95, 0.9, 0.6, 0]
for beta in betas:
    x = torch.arange(40).detach().numpy()
    d2l.plt.plot(x, beta ** x, label=f'beta = {beta:.2f}')
d2l.plt.xlabel('time')
d2l.plt.legend();

在这里插入图片描述

实际实验

让我们来看看动量法在实验中是如何运作的。
为此,我们需要一个更加可扩展的实现。

从零开始实现

相比于小批量随机梯度下降,动量方法需要维护一组辅助变量,即速度。
它与梯度以及优化问题的变量具有相同的形状。
在下面的实现中,我们称这些变量为states

def init_momentum_states(feature_dim):
    v_w = torch.zeros((feature_dim, 1))
    v_b = torch.zeros(1)
    return (v_w, v_b)
def sgd_momentum(params, states, hyperparams):
    for p, v in zip(params, states):
        with torch.no_grad():
            v[:] = hyperparams['momentum'] * v + p.grad
            p[:] -= hyperparams['lr'] * v
        p.grad.data.zero_()

让我们看看它在实验中是如何运作的。

def train_momentum(lr, momentum, num_epochs=2):
    d2l.train_ch11(sgd_momentum, init_momentum_states(feature_dim),
                   {'lr': lr, 'momentum': momentum}, data_iter,
                   feature_dim, num_epochs)

data_iter, feature_dim = d2l.get_data_ch11(batch_size=10)
train_momentum(0.02, 0.5)
loss: 0.246, 0.013 sec/epoch

在这里插入图片描述

当我们将动量超参数momentum增加到0.9时,它相当于有效样本数量增加到 1 1 − 0.9 = 10 \frac{1}{1 - 0.9} = 10 10.91=10
我们将学习率略微降至 0.01 0.01 0.01,以确保可控。

train_momentum(0.01, 0.9)
loss: 0.261, 0.013 sec/epoch

在这里插入图片描述

降低学习率进一步解决了任何非平滑优化问题的困难,将其设置为 0.005 0.005 0.005会产生良好的收敛性能。

train_momentum(0.005, 0.9)
loss: 0.245, 0.013 sec/epoch

在这里插入图片描述

简洁实现

由于深度学习框架中的优化求解器早已构建了动量法,设置匹配参数会产生非常类似的轨迹。

trainer = torch.optim.SGD
d2l.train_concise_ch11(trainer, {'lr': 0.005, 'momentum': 0.9}, data_iter)
loss: 0.247, 0.012 sec/epoch

在这里插入图片描述

理论分析

f ( x ) = 0.1 x 1 2 + 2 x 2 2 f(x) = 0.1 x_1^2 + 2 x_2^2 f(x)=0.1x12+2x22的2D示例似乎相当牵强。
下面我们将看到,它在实际生活中非常具有代表性,至少最小化凸二次目标函数的情况下是如此。

二次凸函数

考虑这个函数

h ( x ) = 1 2 x ⊤ Q x + x ⊤ c + b . h(\mathbf{x}) = \frac{1}{2} \mathbf{x}^\top \mathbf{Q} \mathbf{x} + \mathbf{x}^\top \mathbf{c} + b. h(x)=21xQx+xc+b.

这是一个普通的二次函数。
对于正定矩阵 Q ≻ 0 \mathbf{Q} \succ 0 Q0,即对于具有正特征值的矩阵,有最小化器为 x ∗ = − Q − 1 c \mathbf{x}^* = -\mathbf{Q}^{-1} \mathbf{c} x=Q1c,最小值为 b − 1 2 c ⊤ Q − 1 c b - \frac{1}{2} \mathbf{c}^\top \mathbf{Q}^{-1} \mathbf{c} b21cQ1c
因此我们可以将 h h h重写为

h ( x ) = 1 2 ( x − Q − 1 c ) ⊤ Q ( x − Q − 1 c ) + b − 1 2 c ⊤ Q − 1 c . h(\mathbf{x}) = \frac{1}{2} (\mathbf{x} - \mathbf{Q}^{-1} \mathbf{c})^\top \mathbf{Q} (\mathbf{x} - \mathbf{Q}^{-1} \mathbf{c}) + b - \frac{1}{2} \mathbf{c}^\top \mathbf{Q}^{-1} \mathbf{c}. h(x)=21(xQ1c)Q(xQ1c)+b21cQ1c.

梯度由 ∂ x f ( x ) = Q ( x − Q − 1 c ) \partial_{\mathbf{x}} f(\mathbf{x}) = \mathbf{Q} (\mathbf{x} - \mathbf{Q}^{-1} \mathbf{c}) xf(x)=Q(xQ1c)给出。
也就是说,它是由 x \mathbf{x} x和最小化器之间的距离乘以 Q \mathbf{Q} Q所得出的。
因此,动量法还是 Q ( x t − Q − 1 c ) \mathbf{Q} (\mathbf{x}_t - \mathbf{Q}^{-1} \mathbf{c}) Q(xtQ1c)的线性组合。

由于 Q \mathbf{Q} Q是正定的,因此可以通过 Q = O ⊤ Λ O \mathbf{Q} = \mathbf{O}^\top \boldsymbol{\Lambda} \mathbf{O} Q=OΛO分解为正交(旋转)矩阵 O \mathbf{O} O和正特征值的对角矩阵 Λ \boldsymbol{\Lambda} Λ
这使我们能够将变量从 x \mathbf{x} x更改为 z : = O ( x − Q − 1 c ) \mathbf{z} := \mathbf{O} (\mathbf{x} - \mathbf{Q}^{-1} \mathbf{c}) z:=O(xQ1c),以获得一个非常简化的表达式:

h ( z ) = 1 2 z ⊤ Λ z + b ′ . h(\mathbf{z}) = \frac{1}{2} \mathbf{z}^\top \boldsymbol{\Lambda} \mathbf{z} + b'. h(z)=21zΛz+b.

这里 b ′ = b − 1 2 c ⊤ Q − 1 c b' = b - \frac{1}{2} \mathbf{c}^\top \mathbf{Q}^{-1} \mathbf{c} b=b21cQ1c
由于 O \mathbf{O} O只是一个正交矩阵,因此不会真正意义上扰动梯度。
z \mathbf{z} z表示的梯度下降变成

z t = z t − 1 − Λ z t − 1 = ( I − Λ ) z t − 1 . \mathbf{z}_t = \mathbf{z}_{t-1} - \boldsymbol{\Lambda} \mathbf{z}_{t-1} = (\mathbf{I} - \boldsymbol{\Lambda}) \mathbf{z}_{t-1}. zt=zt1Λzt1=(IΛ)zt1.

这个表达式中的重要事实是梯度下降在不同的特征空间之间不会混合。
也就是说,如果用 Q \mathbf{Q} Q的特征系统来表示,优化问题是以逐坐标顺序的方式进行的。
这在动量法中也适用。

v t = β v t − 1 + Λ z t − 1 z t = z t − 1 − η ( β v t − 1 + Λ z t − 1 ) = ( I − η Λ ) z t − 1 − η β v t − 1 . \begin{aligned} \mathbf{v}_t & = \beta \mathbf{v}_{t-1} + \boldsymbol{\Lambda} \mathbf{z}_{t-1} \\ \mathbf{z}_t & = \mathbf{z}_{t-1} - \eta \left(\beta \mathbf{v}_{t-1} + \boldsymbol{\Lambda} \mathbf{z}_{t-1}\right) \\ & = (\mathbf{I} - \eta \boldsymbol{\Lambda}) \mathbf{z}_{t-1} - \eta \beta \mathbf{v}_{t-1}. \end{aligned} vtzt=βvt1+Λzt1=zt1η(βvt1+Λzt1)=(IηΛ)zt1ηβvt1.

在这样做的过程中,我们只是证明了以下定理:带有和带有不凸二次函数动量的梯度下降,可以分解为朝二次矩阵特征向量方向坐标顺序的优化。

标量函数

鉴于上述结果,让我们看看当我们最小化函数 f ( x ) = λ 2 x 2 f(x) = \frac{\lambda}{2} x^2 f(x)=2λx2时会发生什么。
对于梯度下降我们有

x t + 1 = x t − η λ x t = ( 1 − η λ ) x t . x_{t+1} = x_t - \eta \lambda x_t = (1 - \eta \lambda) x_t. xt+1=xtηλxt=(1ηλ)xt.

∣ 1 − η λ ∣ < 1 |1 - \eta \lambda| < 1 ∣1ηλ<1时,这种优化以指数速度收敛,因为在 t t t步之后我们可以得到 x t = ( 1 − η λ ) t x 0 x_t = (1 - \eta \lambda)^t x_0 xt=(1ηλ)tx0
这显示了在我们将学习率 η \eta η提高到 η λ = 1 \eta \lambda = 1 ηλ=1之前,收敛率最初是如何提高的。
超过该数值之后,梯度开始发散,对于 η λ > 2 \eta \lambda > 2 ηλ>2而言,优化问题将会发散。

lambdas = [0.1, 1, 10, 19]
eta = 0.1
d2l.set_figsize((6, 4))
for lam in lambdas:
    t = torch.arange(20).detach().numpy()
    d2l.plt.plot(t, (1 - eta * lam) ** t, label=f'lambda = {lam:.2f}')
d2l.plt.xlabel('time')
d2l.plt.legend();

在这里插入图片描述

为了分析动量的收敛情况,我们首先用两个标量重写更新方程:一个用于 x x x,另一个用于动量 v v v。这产生了:
[ v t + 1 x t + 1 ] = [ β λ − η β ( 1 − η λ ) ] [ v t x t ] = R ( β , η , λ ) [ v t x t ] . \begin{bmatrix} v_{t+1} \\ x_{t+1} \end{bmatrix} = \begin{bmatrix} \beta & \lambda \\ -\eta \beta & (1 - \eta \lambda) \end{bmatrix} \begin{bmatrix} v_{t} \\ x_{t} \end{bmatrix} = \mathbf{R}(\beta, \eta, \lambda) \begin{bmatrix} v_{t} \\ x_{t} \end{bmatrix}. [vt+1xt+1]=[βηβλ(1ηλ)][vtxt]=R(β,η,λ)[vtxt].

我们用 R \mathbf{R} R来表示 2 × 2 2 \times 2 2×2管理的收敛表现。
t t t步之后,最初的值 [ v 0 , x 0 ] [v_0, x_0] [v0,x0]变为 R ( β , η , λ ) t [ v 0 , x 0 ] \mathbf{R}(\beta, \eta, \lambda)^t [v_0, x_0] R(β,η,λ)t[v0,x0]
因此,收敛速度是由 R \mathbf{R} R的特征值决定的。
请参阅文章 :cite:Goh.2017了解精彩动画。
请参阅 :cite:Flammarion.Bach.2015了解详细分析。
简而言之,当 0 < η λ < 2 + 2 β 0 < \eta \lambda < 2 + 2 \beta 0<ηλ<2+2β时动量收敛。
与梯度下降的 0 < η λ < 2 0 < \eta \lambda < 2 0<ηλ<2相比,这是更大范围的可行参数。
另外,一般而言较大值的 β \beta β是可取的。

小结

  • 动量法用过去梯度的平均值来替换梯度,这大大加快了收敛速度。
  • 对于无噪声梯度下降和嘈杂随机梯度下降,动量法都是可取的。
  • 动量法可以防止在随机梯度下降的优化过程停滞的问题。
  • 由于对过去的数据进行了指数降权,有效梯度数为 1 1 − β \frac{1}{1-\beta} 1β1
  • 在凸二次问题中,可以对动量法进行明确而详细的分析。
  • 动量法的实现非常简单,但它需要我们存储额外的状态向量(动量 v \mathbf{v} v)。

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

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

相关文章

【ETCD】简介安装常用操作---图文并茂详细讲解

目录 一 简介 1.1 etcd是什么 1.2. 特点 1.3. 使用场景 1.4 关键字 1.5 工作原理 二 安装 2.1 etcd安装前介绍 2.2 安装 2.3 启动 2.4 创建一个etcd服务 三 常用操作 一 简介 1.1 etcd是什么 etcd是CoreOS团队于2013年6月发起的开源项目&#xff0c;它的目标是构建…

爬虫实战——巴黎圣母院新闻【内附超详细教程,你上你也行】

文章目录 发现宝藏一、 目标二、简单分析网页1. 寻找所有新闻2. 分析模块、版面和文章 三、爬取新闻1. 爬取模块2. 爬取版面3. 爬取文章 四、完整代码五、效果展示 发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不…

【开源】SpringBoot框架开发河南软件客服系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统管理人员2.2 业务操作人员 三、系统展示四、核心代码4.1 查询客户4.2 新增客户跟进情况4.3 查询客户历史4.4 新增服务派单4.5 新增客户服务费 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的河…

10、Linux项目部署-WAR包、JAR包

一、WAR包 第一步&#xff0c;把War包解压&#xff0c;再重新打包成Zip。 第二步&#xff0c;在Linux里创建一个项目文件夹&#xff0c;将Zip的内容解压在这个文件夹内。 例如&#xff0c;创建的项目文件夹是/usr/local/software/project1 第三步&#xff0c;修改Tomcat配置…

Linux基础IO【 详 解 】

文章目录 C语言文件IOC语言文件接口汇总默认打开的三个流 系统文件IOopenclosewriteread 文件描述符fd文件描述符的分配规则重定向重定向的本质dup2 FILEFILE当中的文件描述符FILE当中的缓冲区 理解文件系统初识inode磁盘分区与格式化介绍 软硬链接软链接硬链接软硬链接的区别 …

混合专家系统(MoE)概述

MoE概述 神经网络的学习能力受限于它的参数规模&#xff0c;因此寻找更有效的方法来增加模型的参数已成为深度学习研究的趋势。混合专家系统 (MoE) 可以大幅增加模型参数规模且不会等比例地增加模型计算量&#xff0c;对于单个样本&#xff0c;神经网络只有某些部分被激活。在混…

基于JAVA+ springboot实现的抗疫物质信息管理系统

基于JAVA springboot实现的抗疫物质信息管理系统设计和实现 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 …

手机ip地址获取失败是什么原因

在移动互联网时代&#xff0c;手机的IP地址不仅是设备在网络中的唯一标识&#xff0c;还关系到我们的网络体验与数据安全。然而&#xff0c;有时我们在使用手机时可能会遇到IP地址获取失败的情况。这种情况不仅会影响我们的在线活动&#xff0c;还可能引发一系列问题。本文将探…

【动态规划】二维费用的背包问题

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;【LeetCode】winter vacation training 目录 &#x1f449;&#x1f3fb;一和零 &#x1f449;&#x1f3fb;一…

智慧城市的新引擎:物联网技术引领城市创新与发展

目录 一、引言 二、物联网技术与智慧城市的融合 三、物联网技术在智慧城市中的应用 1、智慧交通管理 2、智慧能源管理 3、智慧环保管理 4、智慧公共服务 四、物联网技术引领城市创新与发展的价值 五、挑战与前景 六、结论 一、引言 随着科技的日新月异&#xff0c;物…

国家妇女节放假是法定的假日

在这个充满活力和希望的春天&#xff0c;我们迎来了一个特殊的节日——国家妇女节。这是一个属于所有女性的节日&#xff0c;是一个庆祝女性成就、关爱女性权益的时刻。在这个特殊的日子里&#xff0c;我们不禁要问&#xff1a;国家妇女节放假是法定假日吗&#xff1f;让我们一…

北斗卫星引领智能油气管线革新

北斗卫星引领智能油气管线革新 现代化的油气管线系统已成为国家经济发展的重要基础设施&#xff0c;而北斗卫星则为这些管线注入了新的活力。北斗卫星作为中国自主研发的卫星导航定位系统&#xff0c;其准确度和稳定性在全球范围内享有盛誉。在智能化时代的背景下&#xff0c;…

Pytorch线性回归实现(原理)

设置梯度 直接在tensor中设置 requires_gradTrue&#xff0c;每次操作这个数的时候&#xff0c;就会保存每一步的数据。也就是保存了梯度相关的数据。 import torch x torch.ones(2, 2, requires_gradTrue) #初始化参数x并设置requires_gradTrue用来追踪其计算历史 print(x…

炼石入选国家互联网应急中心CNCERT首批数据安全支撑单位

2024年2月22日&#xff0c;国家计算机网络应急技术处理协调中心&#xff08;以下简称CNCERT&#xff09;公示发布了第十届CNCERT网络安全应急服务支撑单位遴选结果&#xff0c;炼石成功入选首批“数据与软件安全评测领域”应急服务支撑单位&#xff01;本次遴选根据申报单位综合…

MySQL学习笔记(一)数据库事务隔离级别与多版本并发控制(MVCC)

一、数据库事务隔离级别 数据库事务的隔离级别有4种&#xff0c;由低到高分别为Read uncommitted &#xff08;读未提交&#xff09;、Read committed&#xff08;读提交&#xff09; 、Repeatable read&#xff08;可重复读&#xff09; 、Serializable &#xff08;串行化&a…

世界的尽头是sql注入漏洞

sql注入漏洞大家都了解吧&#xff1f;但是人类也会有类似sql注入型的漏洞存在&#xff01; sql注入本质是数据内容被当做命令执行。 举个简单的例子&#xff1a; 某国面临全国性战争&#xff0c;发起全国性的捐款捐物&#xff0c;基本流程是&#xff1a; 居民填写自愿捐助单由军…

连接kafka报错:java.io.IOException: Can‘t resolve address:

修改电脑host文件:C:\Windows\System32\drivers\etc\hosts 加上一行 192.168.1.XXX MHA_SLAVE2&#xff08;192.168.1.XXX 这个是安装kafka 的服务器地址&#xff0c;MHA_SLAVE2是kafka的容器id&#xff09;

基于深度学习的驾驶员分心驾驶行为(疲劳+危险行为)预警系统使用YOLOv5+Deepsort实现驾驶员的危险驾驶行为的预警监测

人物专注性检测 项目快速预览 主要不同地方为&#xff1a; 1、疲劳检测中去掉了点头行为的检测&#xff0c;仅保留闭眼检测和打哈欠检测。 2、Yolov5的权重进行了重新训练&#xff0c;增加了训练轮次。 3、前端UI进行了修改&#xff0c;精简了部分功能。 项目介绍 该项目…

数字时代下的内部审计蜕变:探索数字化转型的七大关键领域

写在前面 内部审计是一种独立的、客观的确认和咨询活动&#xff0c;包括鉴证、识别和分析问题以及提供管理建议和解决方案。狭义的数字化转型是指将企业经营管理和业务操作的各种行为、状态和结果用数字的形式来记录和存储&#xff0c;据此再对数据进行挖掘、分析和应用。广义…

企业上了BI,做了很多报表,老板为什么还是不满意?

上次讲了企业有了ERP为什么还要上BI&#xff0c;但是部分企业在部署商业智能BI后&#xff0c;没有感受到商业智能BI的高价值&#xff0c;让很多企业老板感觉不太满意。 经过分析后我们发现&#xff0c;很多企业是冲着商业智能BI的火热部署的&#xff0c;并不清楚商业智能BI的具…