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

优化理论及应用精解【22】

文章目录

  • 优化
    • 梯度裁剪(Gradient Clipping)
      • 定义
      • 性质
      • 公式
      • 数学原理和推导
      • 梯度裁剪的例子
      • 例子和例题
    • Julia中实现梯度裁剪
      • 梯度裁剪的计算与公式
      • 数学原理
      • 例子
    • 动量优化(Momentum Optimization)
      • 定义
      • 性质
      • 公式
      • 数学原理和推导
      • 例子
      • 例题
      • 定义
      • 性质
      • 详解
      • 例子和例题
        • 例子
        • 例题
  • 参考文献

优化

梯度裁剪(Gradient Clipping)

是在训练大型神经网络时常用的一种技术,主要用于解决梯度爆炸问题。以下是对梯度裁剪的定义、性质、公式、数学原理和推导、以及例子和例题的详细解释:

定义

梯度裁剪是一种用于防止神经网络中梯度爆炸问题的技术。其核心思想是通过设置一个阈值来限制梯度的大小,当梯度超过这个阈值时,就将其裁剪以防止它变得过大。

性质

  • 稳定性:梯度裁剪有助于稳定训练过程,防止模型由于梯度过大而无法收敛。
  • 高效性:通过减少梯度爆炸的可能性,梯度裁剪可以加快训练过程,节省时间和计算资源。
  • 重要性:对于大型语言模型(LLMs)等复杂模型,梯度裁剪是训练过程中的关键部分。

公式

梯度裁剪的公式取决于具体的裁剪方法。以下是两种常见的梯度裁剪方法及其公式:

  • 梯度值裁剪:对每个参数的梯度值进行独立裁剪,确保它们不会超过一个设定的最大值或最小值。公式如下:

    如果 gᵢ > c,则 gᵢ = c;

    如果 gᵢ < -c,则 gᵢ = -c。

    其中,gᵢ 是第 i 个参数的梯度值,c 是设定的阈值。

  • 梯度范数裁剪:计算所有参数梯度的范数(如L2范数),如果这个范数超过了设定的阈值,就将梯度缩放到这个阈值以内。公式如下:

    如果 ∥g∥ > c,则更新梯度 g 为 g × c / ∥ g ∥ g × c / ∥g∥ g×c/∥g

    其中,∥g∥ 是梯度向量的范数,c 是预设的阈值。

数学原理和推导

梯度裁剪的数学原理基于梯度的定义和性质。在机器学习中,梯度代表函数最快增加的方向和速率。在训练神经网络时,目标是最小化损失函数,这通常通过沿梯度的负方向更新参数来实现。然而,如果梯度变得过大,参数更新将变得不稳定,可能导致模型无法收敛。

梯度裁剪(Gradient Clipping)的原理是通过限制梯度的大小来防止梯度爆炸问题。在深度神经网络中,特别是在训练深层网络或处理复杂任务时,梯度可能会在反向传播过程中急剧增加,导致权重更新过大,从而使模型训练变得不稳定,甚至导致模型不收敛。梯度裁剪技术通过设定一个阈值来限制梯度的大小,当计算出的梯度超过这个阈值时,就将其裁剪(即缩小)到这个阈值以内。

具体来说,梯度裁剪有以下两种常见形式:

  1. 梯度值裁剪(Value Clipping)

    • 对每个参数的梯度值进行独立裁剪,确保梯度值不会超出设定的范围。例如,如果某个参数的梯度大于设定的最大值,就将其裁剪为该最大值;如果小于设定的最小值(通常为负值),就将其裁剪为该最小值。
  2. 梯度范数裁剪(Norm Clipping)

    • 计算所有参数梯度的范数(如L2范数),如果这个范数超过了设定的阈值,就将梯度按比例缩小,使得其范数等于这个阈值。这种方法不关注单个梯度值,而是关注梯度向量的整体大小。

梯度裁剪的公式可以表达为:

  • 对于梯度值裁剪,如果 g i > c g_i > c gi>c,则 g i = c g_i = c gi=c;如果 g i < − c g_i < -c gi<c,则 g i = − c g_i = -c gi=c,其中 g i g_i gi 是第 i i i 个参数的梯度值, c c c 是设定的阈值。
  • 对于梯度范数裁剪,如果 ∣ ∣ g ∣ ∣ > c ||g|| > c ∣∣g∣∣>c,则更新梯度 g g g g × c ∣ ∣ g ∣ ∣ g \times \frac{c}{||g||} g×∣∣g∣∣c,其中 ∣ ∣ g ∣ ∣ ||g|| ∣∣g∣∣ 是梯度向量的范数, c c c 是预设的阈值。

梯度裁剪通常在反向传播之后、参数更新之前进行。通过限制梯度的大小,梯度裁剪有助于稳定训练过程,特别是在处理长序列数据或训练深层神经网络时,可以有效防止梯度爆炸问题。

梯度裁剪的例子

假设在训练一个神经网络时,某个参数的梯度计算为10,而设定的梯度裁剪阈值为2。

  • 对于梯度值裁剪,如果原梯度值大于阈值(即10 > 2),则该梯度将被裁剪为2;如果原梯度值小于负阈值(即-10 < -2),则该梯度将被裁剪为-2。
  • 对于梯度范数裁剪,如果梯度的范数(在这个例子中只有一个梯度值,所以范数就是该梯度值的绝对值,即10)大于阈值(即10 > 2),则梯度将被缩放,新的梯度值为 10 × 2 10 = 2 10 \times \frac{2}{10} = 2 10×102=2

这些例子展示了梯度裁剪如何在训练过程中限制梯度的大小,从而帮助稳定训练并提高模型的收敛性。

梯度裁剪通过限制梯度的大小来防止这种情况。对于梯度值裁剪,它直接限制了梯度值的范围;对于梯度范数裁剪,它通过缩放梯度向量来保持其总体范数不超过特定阈值。这两种方法都可以有效地防止梯度爆炸问题。

例子和例题

例子

假设在训练一个神经网络时,某个参数的梯度值计算为10,而设定的梯度裁剪阈值为2。使用梯度值裁剪方法,该梯度将被裁剪为2(如果原梯度值大于阈值)或-2(如果原梯度值小于负阈值)。

例题

考虑一个简单的神经网络,其损失函数关于某个参数的梯度为向量 g = [3, -5, 8]。设梯度裁剪的L2范数阈值为4。请计算裁剪后的梯度。

  • 首先计算梯度向量的L2范数: ∥ g ∥ = √ ( 3 2 + ( − 5 ) 2 + 8 2 ) = √ ( 9 + 25 + 64 ) = √ 98 ≈ 9.9 。 ∥g∥ = √(3² + (-5)² + 8²) = √(9 + 25 + 64) = √98 ≈ 9.9。 g=(32+(5)2+82)=(9+25+64)=√989.9
  • 由于 ∥g∥ > 4,需要进行梯度裁剪。
  • 更新梯度 g 为 g × 4 / ∥ g ∥ ≈ [ 3 , − 5 , 8 ] × 4 / 9.9 。 g × 4 / ∥g∥ ≈ [3, -5, 8] × 4 / 9.9。 g×4/∥g[3,5,8]×4/9.9
  • 计算得到裁剪后的梯度为 [1.2, -2.0, 3.2]。

这个例题展示了如何使用梯度范数裁剪方法来限制梯度的大小,从而防止梯度爆炸问题。

Julia中实现梯度裁剪

在Julia中实现梯度裁剪,你可以定义一个函数来应用梯度裁剪算法到你的模型梯度上。这里我将提供一个简单的例子,展示如何在Julia中实现基于L2范数的梯度裁剪。

首先,假设你已经有了一个梯度向量grad,以及一个裁剪阈值clip_value。你的目标是确保梯度向量的L2范数不超过clip_value

以下是一个Julia函数的实现,该函数接受梯度向量和裁剪阈值作为输入,并返回裁剪后的梯度向量:

function clip_gradient(grad::Vector{Float64}, clip_value::Float64)
    # 计算梯度向量的L2范数
    norm_grad = norm(grad, 2)
    
    # 如果范数超过裁剪阈值,则缩放梯度
    if norm_grad > clip_value
        # 缩放因子
        scale_factor = clip_value / norm_grad
        # 裁剪梯度
        clipped_grad = grad .* scale_factor
        return clipped_grad
    else
        # 如果范数没有超过阈值,则返回原始梯度
        return grad
    end
end

在这个函数中,norm(grad, 2)计算梯度向量的L2范数(即欧几里得范数),然后检查这个范数是否超过了clip_value。如果超过了,就计算一个缩放因子scale_factor,并用它来缩放梯度向量。最后,函数返回裁剪后的梯度向量。

你可以在你的训练循环中调用这个函数来裁剪梯度,例如在更新模型参数之前:

# 假设grad是计算得到的梯度向量,clip_value是设定的裁剪阈值
clipped_grad = clip_gradient(grad, clip_value)

# 使用裁剪后的梯度来更新模型参数(这里假设有一个update_params!函数)
update_params!(model, clipped_grad)

请注意,这个实现是针对单个梯度向量的。如果你的模型有多个参数,每个参数都有自己的梯度向量,你可能需要对每个梯度向量分别调用clip_gradient函数,或者修改函数以处理一个包含所有梯度的矩阵或结构。

此外,Julia中的Flux等机器学习库可能已经内置了梯度裁剪的功能,你可以检查这些库的文档以了解如何使用它们提供的梯度裁剪功能。

梯度裁剪是一种在训练神经网络时常用的技术,用于防止梯度爆炸问题。梯度裁剪通过限制梯度的大小来确保训练过程的稳定性。以下是对梯度裁剪的计算、公式、数学原理及例子的详细解释:

梯度裁剪的计算与公式

梯度裁剪的计算通常涉及以下步骤:

  1. 计算梯度:首先,使用反向传播算法计算损失函数关于模型参数的梯度。

  2. 计算梯度范数:对于梯度裁剪,需要计算梯度向量的范数,常用的是L2范数(欧几里得范数)。假设梯度向量为g,则L2范数计算公式为:

∥ g ∥ 2 = ∑ i = 1 n ∣ g i ∣ 2 ∥ g ∥ 2 = ∑ i = 1 n ∣ g i ∣ 2 ∥ g ∥ 2 = ∑ i = 1 n ​ ∣ g i ​ ∣ 2 ​ ∥g∥2=∑i=1n|gi|2\parallel g \parallel_2 =\\ \sqrt{\sum_{i=1}^{n} |g_i|^2}∥g∥2=∑i=1n​∣gi​∣2​ g∥2=i=1ngi∣2g2=i=1ngi2 g∥2=i=1ngi2​

其中,n是梯度向量的维度,gi是梯度向量的第i个分量。

  1. 梯度裁剪:将计算得到的梯度范数与设定的裁剪阈值c进行比较。如果梯度范数大于阈值c,则按比例缩放梯度向量,使其范数等于阈值c。梯度裁剪的公式如下:

    如果 ∥g∥2>c,则更新梯度 g 为 g = g × c ∥ g ∥ 2 g = g × c ∥ g ∥ 2 g = g × ∥ g ∥ 2 ​ c ​ g=g×c∥g∥2g = g \times \frac{c}{\parallel g \parallel_2}g=g×∥g∥2​c​ g=g×cg∥2g=g×g2cg=g×g∥2​c
    否则,保持梯度不变。

数学原理

梯度裁剪的数学原理基于梯度下降算法的稳定性和数值计算中的稳定性考虑。在训练深层神经网络时,由于链式法则的应用,梯度在反向传播过程中可能会急剧增加,导致梯度爆炸问题。梯度裁剪通过限制梯度的大小,防止梯度爆炸,从而保持训练过程的稳定性。

例子

假设在训练一个神经网络时,某个参数的梯度向量为g = [3, -5, 8],设定的裁剪阈值c = 4

  1. 计算梯度范数

∥ g ∥ 2 = 32 + ( − 5 ) 2 + 82 = 9 + 25 + 64 = 98 ≈ 9.9 ∥ g ∥ 2 = 3 2 + ( − 5 ) 2 + 8 2 = 9 + 25 + 64 = 98 ≈ 9.9 ∥ g ∥ 2 ​ = 32 + ( − 5 ) 2 + 82 ​ = 9 + 25 + 64 ​ = 98 ​ ≈ 9.9 ∥g∥2=32+(−5)2+82=9+25+64=98≈9.9\parallel g \parallel_2 = \sqrt{3^2 + (-5)^2 + 8^2} = \sqrt{9 + 25 + 64} = \sqrt{98} \approx 9.9∥g∥2​=32+(−5)2+82​=9+25+64​=98​≈9.9 g∥2=32+(5)2+82=9+25+64=989.9g2=32+(5)2+82 =9+25+64 =98 9.9∥g∥2​=32+(5)2+82​=9+25+64​=98​9.9

  1. 梯度裁剪

    由于 ∥g∥2>c,我们需要对梯度向量进行裁剪。计算缩放因子:

s c a l e _ f a c t o r = c ∥ g ∥ 2 = 49.9 ≈ 0.404 s c a l e _ f a c t o r = c ∥ g ∥ 2 = 4 9.9 ≈ 0.404 s c a l e _ f a c t o r = ∥ g ∥ 2 ​ c ​ = 9.94 ​ ≈ 0.404 scale\_factor=c∥g∥2\\=49.9≈0.404scale\_factor\\ = \frac{c}{\parallel g \parallel_2} \\= \frac{4}{9.9} \approx 0.404scale\_factor=∥g∥2​c​=9.94​≈0.404 scale_factor=cg∥2=49.90.404scale_factor=g2c=9.940.404scale_factor=g∥2​c=9.94​0.404
然后,用缩放因子更新梯度向量:

g _ c l i p p e d = [ 3 , − 5 , 8 ] × 0.404 ≈ [ 1.21 , − 2.02 , 3.23 ] g _ c l i p p e d = [ 3 , − 5 , 8 ] × 0.404 ≈ [ 1.21 , − 2.02 , 3.23 ] g _ c l i p p e d ​ = [ 3 , − 5 , 8 ] × 0.404 ≈ [ 1.21 , − 2.02 , 3.23 ] g\_clipped=[3,−5,8]×0.404≈[1.21,−2.02,3.23]\\g\_clipped = [3, -5, 8] \times 0.404 \approx [1.21, -2.02, 3.23]\\g\_clipped​=[3,−5,8]×0.404≈[1.21,−2.02,3.23] g_clipped=[3,5,8]×0.404[1.21,2.02,3.23]g_clipped=[3,5,8]×0.404[1.21,2.02,3.23]g_clipped=[3,5,8]×0.404[1.21,2.02,3.23]

因此,裁剪后的梯度向量为[1.21, -2.02, 3.23]

这个例子展示了如何在训练神经网络时应用梯度裁剪技术来限制梯度的大小,从而保持训练过程的稳定性。

动量优化(Momentum Optimization)

是一种在深度学习和优化算法中广泛应用的技术,旨在加速梯度下降算法的收敛速度并提高训练的稳定性。以下是对动量优化的定义、性质、公式、数学原理、推导、例子及例题的详细解释:

定义

动量优化是在梯度下降算法的基础上引入动量(Momentum)概念的一种优化算法。它通过考虑之前的梯度信息来加速权重更新,避免在训练过程中陷入局部最优解,并减少振荡,从而提高收敛速度。

性质

  1. 加速收敛:通过引入动量,算法能够在相关方向上加速收敛,减少不必要的振荡。
  2. 稳定性提高:动量优化算法能够平滑梯度更新过程,减少梯度方向的剧烈变化,提高训练过程的稳定性。
  3. 避免局部最优解:通过累积过去的梯度信息,动量优化算法有助于跳出局部最优解,寻找全局最优解。

公式

动量优化的更新公式如下:

  • 动量项更新: v t = β v t − 1 + ( 1 − β ) ∇ θ J ( θ ) v_t = βv_{t-1} + (1-β)∇θJ(θ) vt=βvt1+(1β)θJ(θ)
  • 参数更新: θ = θ − α v t θ = θ - αv_t θ=θαvt

其中:

  • v t v_t vt是第t次迭代的动量项。
  • β是动量超参数,通常取值在0到1之间,控制之前梯度的影响程度。
  • ∇θJ(θ)是损失函数J(θ)对参数θ的梯度。
  • θ是模型参数。
  • α是学习率,控制每次更新的步长。

数学原理和推导

动量优化的数学原理基于指数加权移动平均(EWMA)和物理中的动量概念。在物理学中,动量是物体的质量和速度的乘积,表示物体运动的惯性。在优化算法中,动量项v_t可以看作之前梯度方向的加权和,它模拟了物理中的动量,使得参数更新具有惯性。

推导过程可以简述为:

  1. 初始化:动量项 v 0 v_0 v0通常初始化为零。
  2. 梯度计算:在每次迭代中,首先计算当前参数θ下的梯度 ∇ θ J ( θ ) ∇θJ(θ) θJ(θ)
  3. 动量项更新:使用动量超参数β和当前梯度更新动量项 v t v_t vt
  4. 参数更新:使用更新后的动量项v_t和学习率α来更新参数θ。

通过这个过程,动量优化算法能够平滑梯度更新路径,减少振荡,并加速收敛。

例子

假设我们有一个简单的线性回归问题,目标是最小化损失函数J(θ)。我们使用动量优化算法来更新参数θ。

  1. 初始化:设 θ 0 θ_0 θ0=0,学习率α=0.01,动量超参数β=0.9,动量项v_0=0。
  2. 梯度计算:对于每个训练样本,计算损失函数对参数θ的梯度∇θJ(θ)。
  3. 动量项更新:使用公式 v t = β v t − 1 + ( 1 − β ) ∇ θ J ( θ ) v_t = βv_{t-1} + (1-β)∇θJ(θ) vt=βvt1+(1β)θJ(θ)更新动量项。
  4. 参数更新:使用公式 θ = θ − α v t θ = θ - αv_t θ=θαvt更新参数θ。
  5. 重复:重复步骤2-4,直到满足停止条件(如达到最大迭代次数或损失函数收敛)。

例题

例题:假设我们有一个简单的二次损失函数 J ( θ ) = ( θ − 3 ) 2 J(θ) = (θ - 3)^2 J(θ)=(θ3)2,初始参数θ_0=0,学习率α=0.1,动量超参数β=0.9。请使用动量优化算法来更新参数θ,直到它收敛到最优解。

解答

  1. 初始化 θ 0 = 0 , v 0 = 0 θ_0=0,v_0=0 θ0=0v0=0
  2. 梯度计算:∇θJ(θ) = 2(θ - 3)。
  3. 动量项更新 v 1 = β v 0 + ( 1 − β ) ∇ θ J ( θ 0 ) = 0.9 ∗ 0 + 0.1 ∗ 2 ∗ ( 0 − 3 ) = − 0.6 v_1 = βv_0 + (1-β)∇θJ(θ_0) = 0.9*0 + 0.1*2*(0-3) = -0.6 v1=βv0+(1β)θJ(θ0)=0.90+0.12(03)=0.6
  4. 参数更新 θ 1 = θ 0 − α v 1 = 0 − 0.1 ∗ ( − 0.6 ) = 0.06 θ_1 = θ_0 - αv_1 = 0 - 0.1*(-0.6) = 0.06 θ1=θ0αv1=00.1(0.6)=0.06
  5. 重复:继续计算梯度、更新动量项和参数,直到θ收敛到最优解θ=3。

通过这个过程,我们可以看到动量优化算法如何逐步将参数θ调整到最优解。

以下是关于动量优化的定义、性质、公式、数学原理和推导以及例子和例题的详细介绍:

定义

动量优化算法(Momentum Optimization Algorithms)是一种在机器学习领域广泛应用的优化算法,用于加速梯度下降算法的收敛速度和提高模型的性能。它最早由Sutskever等人在2013年提出,并在AlexNet中得到应用。动量优化算法通过引入“动量”这一概念,利用之前的梯度更新信息来加速收敛过程,帮助优化过程跳出局部最优解,从而获得更好的最优解。

性质

  • 加速收敛:动量优化算法能够在梯度较大的方向上快速前进,从而加速收敛过程。
  • 减少震荡:通过引入动量,算法在梯度方向改变时能够保持一定的惯性,减少不必要的震荡。
  • 提高泛化能力:动量优化算法能够帮助模型在训练过程中更加平稳地收敛,从而提高模型的泛化能力。

详解

动量优化算法的更新公式可以表示为:

  • 动量项更新 v t = β v t − 1 + ( 1 − β ) ∇ w J ( w ) v_t = \beta v_{t-1} + (1-\beta) \nabla_w J(w) vt=βvt1+(1β)wJ(w)
  • 参数更新 w t = w t − 1 − α v t w_t = w_{t-1} - \alpha v_t wt=wt1αvt

其中,w表示待更新的权重,J(w)表示损失函数,∇wJ(w)表示损失函数对权重的梯度,α表示学习率,β表示动量系数,v表示动量向量。

动量优化算法的数学原理主要基于梯度下降算法和动量概念的加权平均。在梯度下降算法中,模型参数的更新仅依赖于当前梯度。而动量优化算法在此基础上引入了动量向量v,它是之前权重更新方向和速度的加权平均。动量向量的更新公式为:

v t = β v t − 1 + ( 1 − β ) ∇ w J ( w ) v_t = \beta v_{t-1} + (1-\beta) \nabla_w J(w) vt=βvt1+(1β)wJ(w)

其中,β表示动量系数,通常取值在0到1之间,用于控制之前梯度的影响程度。通过引入动量向量,算法在更新参数时不仅考虑当前梯度方向,还综合了之前的更新历史,从而使得优化过程更加平滑和稳定。

例子和例题

例子

假设我们有一个简单的线性回归问题,训练数据集如下。我们要拟合的线性模型为 h ( θ ) = θ 0 + θ 1 x h(θ) = θ_0 + θ_1 x h(θ)=θ0+θ1x。假设 θ 0 = 0 , θ 1 = 0 θ_0 = 0,θ_1 = 0 θ0=0θ1=0,学习率α = 0.01,动量系数β = 0.9,并且初始化动量项 v 0 = 0 v_0 = 0 v0=0

具体步骤如下:

  1. 计算梯度:损失函数J(θ)为均方误差(MSE),对于第一个样本(x_1, y_1) = (1, 2),计算损失函数对参数的梯度。
  2. 更新动量项和参数:使用梯度更新动量项 v 0 v_0 v0,然后使用更新后的动量项来更新参数 θ 0 和 θ 1 θ_0和θ_1 θ0θ1

重复上述步骤,直到满足收敛条件或达到最大迭代次数。

例题

例题:假设我们在优化一个损失函数时,使用动量优化算法进行参数更新。初始参数 θ 0 = 0 , θ 1 = 0 θ_0 = 0,θ_1 = 0 θ0=0θ1=0,学习率α = 0.01,动量系数β = 0.9。在第一次迭代时,计算得到的梯度为 ∇ θ 0 = − 2 , ∇ θ 1 = − 2 ∇θ_0 = -2,∇θ_1 = -2 θ0=2θ1=2。请计算第一次迭代后的参数值。

解答

  1. 初始化动量项 v 0 = 0 , v 1 = 0 v_0 = 0,v_1 = 0 v0=0v1=0
  2. 更新动量项

v 0 = β v − 1 + ( 1 − β ) ∇ θ 0 = 0.9 × 0 + 0.1 × ( − 2 ) = − 0.2 v_0 = βv_{-1} + (1-β)∇θ_0 = 0.9 × 0 + 0.1 × (-2) = -0.2 v0=βv1+(1β)θ0=0.9×0+0.1×(2)=0.2

$$ v_1 = βv_{-1} + (1-β)∇θ_1 = 0.9 × 0 + 0.1 × (-2) = -0.2¥¥

  1. 更新参数

θ 0 = θ 0 − α v 0 = 0 − 0.01 × ( − 0.2 ) = 0.002 θ_0 = θ_0 - αv_0 = 0 - 0.01 × (-0.2) = 0.002 θ0=θ0αv0=00.01×(0.2)=0.002

θ 1 = θ 1 − α v 1 = 0 − 0.01 × ( − 0.2 ) = 0.002 θ_1 = θ_1 - αv_1 = 0 - 0.01 × (-0.2) = 0.002 θ1=θ1αv1=00.01×(0.2)=0.002

因此,第一次迭代后的参数值为 θ 0 = 0.002 , θ 1 = 0.002 。 θ_0 = 0.002,θ_1 = 0.002。 θ0=0.002θ1=0.002

综上所述,动量优化算法通过引入动量概念,利用之前的梯度更新信息来加速收敛过程,并提高模型的性能。它在深度学习、自然语言处理、计算机视觉等领域得到了广泛应用。

参考文献

  1. 文心一言

http://www.kler.cn/news/334424.html

相关文章:

  • 数据库常见的安全特性有哪些
  • C语言代码练习(test_1_20)
  • Day02-MySQL数据库服务体系结构
  • Java第二阶段---11封装---第一节 封装(Encapsulation)
  • Relu激活
  • 前端性能优化 面试如何完美回答
  • Oracle数据库中表压缩的实现方式和特点
  • Spring Cloud之OpenFeign的具体实践
  • Qt如何将外部窗口嵌入部件中
  • 若依--文件上传前端
  • 国创——基于深度学习的实时姿态识别算法
  • 打卡第三天 P5729 【深基5.例7】工艺品制作
  • 【web安全】——SSRF服务器端请求伪造
  • 【Linux】进程控制(创建、终止、等待、替换)
  • 交换排序:冒泡排序、递归实现快速排序
  • 深度学习全景进阶:最新Python深度学习进阶与前沿应用
  • Gitlab flow工作流
  • 力扣刷题之2306.公司命名
  • 春秋云镜靶场之CVE-2022-28525
  • 关于鸿蒙next 调用系统权限麦克风