深度学习pytorch之19种优化算法(optimizer)解析
提示:有谬误请指正
摘要
本博客详细介绍了多种常见的深度学习优化算法,包括经典的LBFGS 、Rprop 、Adagrad、RMSprop 、Adadelta 、ASGD 、Adamax、Adam、AdamW、NAdam、RAdam以及SparseAdam等,通过对这些算法的公式和参数说明进行详细解析,博客旨在为机器学习工程师和研究人员提供清晰的理论指导,帮助读者选择合适的优化算法提升模型训练效率。
父类定义Optimizer
torch.optim.Optimizer(params, defaults)
params (iterable): 一个可迭代对象,包含 :class:torch.Tensor 或 :class:dict。指定应该被优化的 Tensors。
defaults (dict): 一个字典,包含优化选项的默认值(当参数组未指定时使用)。
子类算法介绍
以下优化函数位于torch.optim包、timm.optim包内,使用句式形如:
optimizer = optim.SGD(model.parameters(), lr = 0.01, momentum=0.9)
1、SGD (Stochastic Gradient Descent) 1951
说明:随机梯度下降(Stochastic Gradient Descent, SGD)是最基础的优化算法之一。它在每次迭代中随机选择一个或一小批样本进行梯度计算并更新模型参数。
公式:
θ t + 1 = θ t − η ⋅ g t \theta_{t+1} = \theta_t - \eta \cdot g_t θt+1=θt−η⋅gt
其中:
- θ t \theta_t θt: 在时间步 (t) 的模型参数
- θ t + 1 \theta_{t+1} θt+1: 在时间步 (t+1) 的模型参数
- η \eta η: 学习率 (learning rate)
- g t g_t gt: 时间步 (t) 的梯度,计算基于单个样本的损失函数对参数的导数
函数定义:
def __init__(self, params, lr=required, momentum=0, dampening=0,weight_decay=0, nesterov=False, *, maximize=False, foreach: Optional[bool] = None):
params (iterable): 需要优化的参数,或者定义了参数组的字典。
lr (float): 学习率。
momentum (float, optional): 动量因子(默认值:0)。
weight_decay (float, optional): 权重衰减(L2惩罚项)(默认值:0)。
dampening (float, optional): 动量的阻尼因子(默认值:0)。
nesterov (bool, optional): 是否启用 Nesterov 动量(默认值:False)。
maximize (bool, optional): 是否基于目标函数最大化参数,而不是最小化(默认值:False)。
foreach (bool, optional): 是否使用优化器的“foreach”实现(默认值:None)。
使用方式:
optimizer = torch.optim.SGD(params, lr=0.1, momentum=0, dampening=0, weight_decay=0, nesterov=False)
2、LBFGS (Limited-memory Broyden-Fletcher-Goldfarb-Shanno) 1980
说明:有限内存布罗伊登 - 弗莱彻 - 戈德法布 - 香农算法(Limited-memory Broyden–Fletcher–Goldfarb–Shanno, LBFGS)是一种用于求解无约束优化问题的拟牛顿法,它通过使用有限的内存来近似海森矩阵的逆,从而减少了内存需求。
公式:
θ t + 1 = θ t − α t H t ∇ θ J ( θ t ) \theta_{t+1} = \theta_t - \alpha_t H_t \nabla_{\theta} J(\theta_t) θt+1=θt−αtHt∇θJ(θt)
其中:
- θ t \theta_t θt 是当前的参数
- α t \alpha_t αt 是步长
- H t H_t Ht是近似的海森矩阵
- ∇ θ J ( θ t ) \nabla_{\theta} J(\theta_t) ∇θJ(θt) 是当前的梯度
函数定义:
def __init__(self,params,lr=1,max_iter=20,max_eval=None,tolerance_grad=1e-7,tolerance_change=1e-9,history_size=100,line_search_fn=None):
lr (float): 学习率(默认值:1)。
max_iter (int): 每个优化步骤的最大迭代次数(默认值:20)。
max_eval (int): 每个优化步骤的最大函数评估次数(默认值:max_iter * 1.25)。
tolerance_grad (float): 关于一阶最优性的终止容忍度(默认值:1e-5)。
tolerance_change (float): 关于函数值/参数变化的终止容忍度(默认值:1e-9)。
history_size (int): 更新历史的大小(默认值:100)。
line_search_fn (str): 线搜索方法,取值为 ‘strong_wolfe’ 或 None(默认值:None)。
使用方式:
optimizer = torch.optim.LBFGS(params,lr=1,max_iter=20,max_eval=None,tolerance_grad=1e-7,tolerance_change=1e-9)
3、Rprop (Resilient Propagation) 1993
说明:弹性反向传播算法(Resilient Backpropagation, Rprop)是一种专门为神经网络设计的优化算法,它只考虑梯度的符号而忽略梯度的大小,从而避免了梯度大小对学习率的影响。
公式:
θ t + 1 = θ t − η i ⋅ sign ( ∇ θ J ( θ t ) ) \theta_{t+1} = \theta_t - \eta_i \cdot \text{sign}(\nabla_{\theta} J(\theta_t)) θt+1=θt−ηi⋅sign(∇θJ(θt))
其中:
- η i \eta_i ηi 是每个参数的独立学习率
- sign ( ∇ θ J ( θ t ) ) \text{sign}(\nabla_{\theta} J(\theta_t)) sign(∇θJ(θt)) 是梯度的符号函数
函数定义:
def __init__(self, params, lr=1e-2, etas=(0.5, 1.2), step_sizes=(1e-6, 50),foreach: Optional[bool] = None):
params (iterable): 需要优化的参数,或者定义参数组的字典。
lr (float, optional): 学习率(默认值:1e-2)。
etas (Tuple[float, float], optional): 一对 (etaminus, etaplus),分别是乘法增长因子和减少因子(默认值:(0.5, 1.2))。
step_sizes (Tuple[float, float], optional): 最小和最大允许步长的一对值(默认值:(1e-6, 50))。
foreach (bool, optional): 是否使用优化器的“foreach”实现(默认值:None)。
使用方式:
optimizer = torch.optim.Rprop(params, lr=1e-2, etas=(0.5, 1.2), step_sizes=(1e-6, 50))
4、Adagrad(Adaptive Gradient Algorithm)2011
说明:自适应梯度算法(Adaptive Gradient Algorithm, Adagrad)是一种自适应学习率的优化算法,它为不同的参数分配不同的学习率,在处理稀疏数据时表现良好。
公式:
θ t + 1 = θ t − η G t + ϵ ∇ θ J ( θ t ) \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{G_t + \epsilon}} \nabla_{\theta} J(\theta_t) θt+1=θt−Gt+ϵη∇θJ(θt)
其中:
- G t G_t Gt 是历史梯度平方的累计和
- ϵ \epsilon ϵ 是避免除以零的常数
函数定义:
def __init__(self,params,lr=1e-2,lr_decay=0,weight_decay=0,initial_accumulator_value=0,eps=1e-10,foreach: Optional[bool] = None,*,maximize: bool = False):
params (iterable): 需要优化的参数,或者定义参数组的字典。
lr (float, optional): 学习率(默认值:1e-2)。
lr_decay (float, optional): 学习率衰减(默认值:0)。
weight_decay (float, optional): 权重衰减(L2惩罚项)(默认值:0)。
eps (float, optional): 加到分母上的项,以提高数值稳定性(默认值:1e-10)。
foreach (bool, optional): 是否使用优化器的“foreach”实现(默认值:None)。
maximize (bool, optional): 是否基于目标最大化参数,而不是最小化(默认值:False)。
使用方式:
optimizer = torch.optim.Adagrad(params, lr=0.01, lr_decay=0, weight_decay=0)
5、RMSprop (Root Mean Square Propagation) 2012
说明:均方根传播算法RMSprop 是对 Adagrad 的一种改进,它通过引入衰减因子,指数移动平均的方式来调整学习率,解决了 Adagrad 在训练后期学习率下降过快过小的问题。
公式:
θ t + 1 = θ t − η E [ ∇ θ J ( θ t ) ] 2 + ϵ ∇ θ J ( θ t ) \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{E[\nabla_{\theta} J(\theta_t)]^2 + \epsilon}} \nabla_{\theta} J(\theta_t) θt+1=θt−E[∇θJ(θt)]2+ϵη∇θJ(θt)
其中:
- E [ ∇ θ J ( θ t ) ] 2 E[\nabla_{\theta} J(\theta_t)]^2 E[∇θJ(θt)]2 是梯度平方的移动平均
- ϵ \epsilon ϵ 是避免除以零的常数
函数定义:
def __init__(self, params, lr=1e-2, alpha=0.99, eps=1e-8, weight_decay=0, momentum=0,centered=False, foreach: Optional[bool] = None):
params (iterable): 需要优化的参数,或者定义参数组的字典。
lr (float, optional): 学习率(默认值:1e-2)。
momentum (float, optional): 动量因子(默认值:0)。
alpha (float, optional): 平滑常数(默认值:0.99)。
eps (float, optional): 加到分母上的项,以提高数值稳定性(默认值:1e-8)。
centered (bool, optional): 如果为True,则计算中心化的RMSProp,梯度将根据其方差的估计进行归一化。
weight_decay (float, optional): 权重衰减(L2惩罚项)(默认值:0)。
foreach (bool, optional): 是否使用优化器的“foreach”实现(默认值:None)。
使用方式:
optimizer = torch.optim.RMSprop(params, lr=0.01, alpha=0.99, eps=1e-08, weight_decay=0, momentum=0, centered=False)
6、Adadelta 2012
说明:自适应学习率调整Adadelta 是对 Adagrad 和 RMSprop 的改进,通过使用梯度平方的指数移动平均来调整学习率,避免了 Adagrad 学习率单调递减的问题。
公式:
θ t + 1 = θ t − η E [ Δ θ ] t 2 + ϵ Δ θ t \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{E[\Delta \theta]^2_t + \epsilon}} \Delta \theta_t θt+1=θt−E[Δθ]t2+ϵηΔθt
其中:
- E [ Δ θ ] t 2 E[\Delta \theta]^2_t E[Δθ]t2 是梯度的更新的平方的滑动平均
函数定义:
def __init__(self, params, lr=1.0, rho=0.9, eps=1e-6, weight_decay=0,foreach: Optional[bool] = None, *, maximize: bool = False):
params (iterable): 需要优化的参数,或者定义参数组的字典。
rho (float, optional): 用于计算平方梯度的移动平均的系数(默认值:0.9)。
eps (float, optional): 加到分母上的项,以提高数值稳定性(默认值:1e-6)。
lr (float, optional): 用于缩放梯度更新的系数,在应用到参数之前(默认值:1.0)。
weight_decay (float, optional): 权重衰减(L2惩罚项)(默认值:0)。
foreach (bool, optional): 是否使用优化器的“foreach”实现(默认值:None)。
maximize (bool, optional): 基于目标最大化参数,而不是最小化(默认值:False)。
使用方式:
optimizer = torch.optim.Adadelta(params, lr=1.0, rho=0.9, eps=1e-6, weight_decay=0)
7、ASGD (Averaged Stochastic Gradient Descent)2012
说明:平均随机梯度下降(Average Stochastic Gradient Descent, ASGD)是一种对随机梯度下降的改进算法,它通过对梯度更新的参数进行取平均,来减少参数更新的方差,提高算法的稳定性。
公式:
θ t + 1 = θ t − η t ∇ θ J ( θ t ) \theta_{t+1} = \theta_t - \eta_t \nabla_{\theta} J(\theta_t) θt+1=θt−ηt∇θJ(θt)
同时,参数会更新为所有迭代的平均值:
θ avg = 1 t ∑ i = 1 t θ i \theta_{\text{avg}} = \frac{1}{t} \sum_{i=1}^{t} \theta_i θavg=t1i=1∑tθi
其中:
- θ t \theta_t θt: 在时间步 (t) 的模型参数
- θ avg \theta_{\text{avg}} θavg: 在时间步 (t) 的模型参数的平均值
- η \eta η: 学习率 (learning rate)
- ∇ θ J ( θ t ) \nabla_{\theta} J(\theta_t) ∇θJ(θt): 在时间步 (t) 计算的梯度
函数定义:
def __init__(self, params, lr=1e-2, lambd=1e-4, alpha=0.75, t0=1e6, weight_decay=0,foreach: Optional[bool] = None):
params (iterable): 需要优化的参数,或者定义参数组的字典。
lr (float, optional): 学习率(默认值:1e-2)。
lambd (float, optional): 衰减项(默认值:1e-4)。
alpha (float, optional): 用于更新学习率的幂次(默认值:0.75)。
t0 (float, optional): 开始平均的点(默认值:1e6)。
weight_decay (float, optional): 权重衰减(L2惩罚项)(默认值:0)。
foreach (bool, optional): 是否使用优化器的“foreach”实现(默认值:None)。
使用方式:
optimizer = torch.optim.ASGD(params, lr=1e-2, lambd=1e-4, alpha=0.75, t0=1e6, weight_decay=0)
8、SGDP (Stochastic Gradient Descent with Momentum and Nesterov Accelerated Gradient)2015
说明:平均随机梯度下降(Average Stochastic Gradient Descent, ASGD)是一种对随机梯度下降的改进算法,它通过对梯度更新的参数进行取平均,来减少参数更新的方差,提高算法的稳定性。
公式:
-
计算动量:首先,计算当前的动量:
v t + 1 = μ v t + η ∇ θ J ( θ t ) v_{t+1} = \mu v_t + \eta \nabla_{\theta} J(\theta_t) vt+1=μvt+η∇θJ(θt) -
Nesterov 加速:然后,通过提前计算在更新后的位置的梯度来进行梯度修正:
θ t + 1 = θ t − v t + 1 \theta_{t+1} = \theta_t - v_{t+1} θt+1=θt−vt+1
其中
- θ t \theta_t θt 是当前参数
- $ v_t$是动量(前一次更新的累积梯度)
- η \eta η是学习率
- μ \mu μ是动量因子
- ∇ θ J ( θ t ) \nabla_{\theta} J(\theta_t) ∇θJ(θt) 是当前的梯度
函数定义:
def __init__(self, params, lr=required, momentum=0, dampening=0,weight_decay=0, nesterov=False, eps=1e-8, delta=0.1, wd_ratio=0.1):
params (iterable): 需要优化的参数,或者定义了参数组的字典。
lr (float): 学习率。
momentum (float, optional): 动量因子(默认值:0)。
weight_decay (float, optional): 权重衰减(L2惩罚项)(默认值:0)。
dampening (float, optional): 动量的阻尼因子(默认值:0)。
nesterov (bool, optional): 是否启用 Nesterov 动量(默认值:False)。
eps (float, optional): 加到分母上的项,以提高数值稳定性(默认值:1e-8)。
delta(float, optional):调节学习率的更新或梯度的平滑度,影响参数更新时的速度(默认值:0.1)。
wd_ratio(float, optional): 控制 weight decay (权重衰减)应用到参数更新时的比例(默认值:0.1)。
使用方式:
from timm.optim.sgdp import SGDP
optimizer = SGDP(params, lr=required, momentum=0, dampening=0,weight_decay=0, nesterov=False, eps=1e-8, delta=0.1, wd_ratio=0.1)
9、Adamax 2014
说明:Adamax 是 Adam 的一个变体,使用 L∞ 范数来代替 Adam 中的二阶矩估计(L2范数),在某些情况下比 Adam 更稳定。
公式:
θ t + 1 = θ t − η m ^ t / ( v ^ t + ϵ ) \theta_{t+1} = \theta_t - \frac{\eta}{\hat{m}_t / (\hat{v}_t + \epsilon)} θt+1=θt−m^t/(v^t+ϵ)η
其中:
- m ^ t \hat{m}_t m^t 是梯度的一阶矩的估计
- v ^ t \hat{v}_t v^t 是梯度的二阶矩的估计
函数定义:
def __init__(self, params, lr=2e-3, betas=(0.9, 0.999), eps=1e-8,weight_decay=0, foreach: Optional[bool] = None, *, maximize: bool = False):
params (iterable): 需要优化的参数,或者定义参数组的字典。
lr (float, optional): 学习率(默认值:2e-3)。
betas (Tuple[float, float], optional): 用于计算梯度及其平方的运行平均值的系数。
eps (float, optional): 加到分母上的项,以提高数值稳定性(默认值:1e-8)。
weight_decay (float, optional): 权重衰减(L2惩罚项)(默认值:0)。
foreach (bool, optional): 是否使用优化器的“foreach”实现(默认值:None)。
maximize (bool, optional): 基于目标最大化参数,而不是最小化(默认值:False)。
使用方式:
optimizer = torch.optim.Adamax(params, lr=2e-3, betas=(0.9, 0.999), eps=1e-8,weight_decay=0)
10、Adam (Adaptive Moment Estimation) 2015
说明:自适应矩估计(Adaptive Moment Estimation, Adam)结合了 AdaGrad 和 RMSProp 的优点,通过计算梯度的一阶矩估计(均值)和二阶矩估计(方差)来为不同的参数动态调整学习率,具有较强的收敛性能
公式:
θ t + 1 = θ t − η m ^ t v ^ t + ϵ \theta_{t+1} = \theta_t - \frac{\eta \hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon} θt+1=θt−v^t+ϵηm^t
其中:
- m ^ t \hat{m}_t m^t是梯度的一阶矩估计
- v ^ t \hat{v}_t v^t 是梯度的二阶矩估计
函数定义:
def __init__(self, params, lr=1e-3, betas=(0.9, 0.999), eps=1e-8,weight_decay=0, amsgrad=False, *, foreach: Optional[bool] = None,maximize: bool = False, capturable: bool = False):
params (iterable): 需要优化的参数,或者定义参数组的字典。
lr (float, optional): 学习率(默认值:1e-3)。
betas (Tuple[float, float], optional): 用于计算梯度及其平方的运行平均值的系数(默认值:(0.9, 0.999))。
eps (float, optional): 加到分母上的项,以提高数值稳定性(默认值:1e-8)。
weight_decay (float, optional): 权重衰减(L2惩罚项)(默认值:0)。
amsgrad (boolean, optional): 是否使用AMSGrad算法变体,来源于论文《On the Convergence of Adam and Beyond》(默认值:False)。
foreach (bool, optional): 是否使用优化器的“foreach”实现(默认值:None)。
maximize (bool, optional): 基于目标最大化参数,而不是最小化(默认值:False)。
capturable (bool, optional): 是否允许将此实例捕获到CUDA图中。传入True可能会影响未图形化的性能,因此如果不打算捕获图形,建议保持False(默认值:False)。
使用方式:
optimizer = torch.optim.Adam(params, lr=1e-3, betas=(0.9, 0.999), eps=1e-8,weight_decay=0, amsgrad=False)
11、AdamW 2017
说明:AdamW 是 Adam 的一种变体,主要解决了 Adam 在使用正则化时存在的问题。它加入了权重衰减进行改进,来更好地处理正则化。
公式:
θ t + 1 = θ t − η ⋅ m ^ t v ^ t + ϵ − η ⋅ λ θ t \theta_{t+1} = \theta_t - \eta \cdot \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon} - \eta \cdot \lambda \theta_t θt+1=θt−η⋅v^t+ϵm^t−η⋅λθt
其中:
- λ \lambda λ是权重衰减系数
函数定义:
def __init__(self, params, lr=1e-3, betas=(0.9, 0.999), eps=1e-8, weight_decay=1e-2, amsgrad=False, *, maximize: bool = False,foreach: Optional[bool] = None,capturable: bool = False):
params (iterable): 需要优化的参数,或者定义参数组的字典。
lr (float, optional): 学习率(默认值:1e-3)。
betas (Tuple[float, float], optional): 用于计算梯度及其平方的运行平均值的系数(默认值:(0.9, 0.999))。
eps (float, optional): 加到分母上的项,以提高数值稳定性(默认值:1e-8)。
weight_decay (float, optional): 权重衰减系数(默认值:1e-2)。
amsgrad (boolean, optional): 是否使用AMSGrad算法变体,来源于论文《On the Convergence of Adam and Beyond》(默认值:False)。
maximize (bool, optional): 基于目标最大化参数,而不是最小化(默认值:False)。
foreach (bool, optional): 是否使用优化器的“foreach”实现(默认值:None)。
capturable (bool, optional): 是否允许将此实例捕获到CUDA图中。传入True可能会影响未图形化的性能,因此如果不打算捕获图形,建议保持False(默认值:False)。
使用方式:
optimizer = torch.optim.AdamW(params, lr=1e-3, betas=(0.9, 0.999), eps=1e-8, weight_decay=1e-2, amsgrad=False)
12、NAdam (Nesterov-accelerated Adaptive Moment Estimation) 2017
说明:NAdam 是 Adam 的一个改进版本,结合了 Nesterov 加速梯度(NAG)方法
公式:
θ t + 1 = θ t − η ⋅ m ^ t v ^ t + ϵ \theta_{t+1} = \theta_t - \frac{\eta \cdot \hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon} θt+1=θt−v^t+ϵη⋅m^t
参数说明:
- θ t \theta_t θt: 在时间步 (t) 的模型参数。
- η \eta η: 学习率(Learning rate),控制每次更新的步长。
- m ^ t \hat{m}_t m^t: 第 (t) 次时间步的偏置校正后的动量估计。
Nadam 中使用了 Nesterov 加速梯度的动量估计公式:
m ^ t = β 1 ⋅ m ^ t − 1 + ( 1 − β 1 ) ⋅ ∇ θ J ( θ t ) \hat{m}_t = \beta_1 \cdot \hat{m}_{t-1} + (1 - \beta_1) \cdot \nabla_{\theta} J(\theta_t) m^t=β1⋅m^t−1+(1−β1)⋅∇θJ(θt)
其中, β 1 \beta_1 β1 是一阶动量的衰减率(通常接近 1)。
- v ^ t \hat{v}_t v^t: 第 (t) 次时间步的偏置校正后的平方梯度估计:
v ^ t = β 2 ⋅ v ^ t − 1 + ( 1 − β 2 ) ⋅ ( ∇ θ J ( θ t ) ) 2 \hat{v}_t = \beta_2 \cdot \hat{v}_{t-1} + (1 - \beta_2) \cdot (\nabla_{\theta} J(\theta_t))^2 v^t=β2⋅v^t−1+(1−β2)⋅(∇θJ(θt))2
其中 β 2 \beta_2 β2是 二阶动量的衰减率,控制历史梯度平方的影响,通常接近 1
函数定义:
def __init__(self, params, lr=2e-3, betas=(0.9, 0.999), eps=1e-8,weight_decay=0, momentum_decay=4e-3, foreach: Optional[bool] = None):
params (iterable): 需要优化的参数,或者定义参数组的字典。
lr (float, optional): 学习率(默认值:2e-3)。
betas (Tuple[float, float], optional): 用于计算梯度及其平方的运行平均值的系数(默认值:(0.9, 0.999))。
eps (float, optional): 加到分母上的项,以提高数值稳定性(默认值:1e-8)。
weight_decay (float, optional): 权重衰减(L2惩罚)(默认值:0)。
momentum_decay (float, optional): 动量衰减(默认值:4e-3)。
foreach (bool, optional): 是否使用优化器的“foreach”实现(默认值:None)。
使用方式:
optimizer = torch.optim.NAdam(params, lr=2e-3, betas=(0.9, 0.999), eps=1e-8,weight_decay=0, momentum_decay=4e-3)
13、RAdam (Rectified Adam) 2018
说明:Rectified Adam(RAdam)是对 Adam 算法的改进,通过自适应学习率调整机制,解决了 Adam 在小批量训练时的不稳定性问题。
公式:
θ t + 1 = θ t − η ⋅ m ^ t v ^ t + ϵ ⋅ rectifier ( t ) \theta_{t+1} = \theta_t - \frac{\eta \cdot \hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon} \cdot \text{rectifier}(t) θt+1=θt−v^t+ϵη⋅m^t⋅rectifier(t)
其中,rectifier(t) 是对学习率进行修正的函数。
函数定义:
def __init__(self, params, lr=1e-3, betas=(0.9, 0.999), eps=1e-8,weight_decay=0, foreach: Optional[bool] = None):
params (iterable): 需要优化的参数,或者定义参数组的字典。
lr (float, optional): 学习率(默认值:1e-3)。
betas (Tuple[float, float], optional): 用于计算梯度及其平方的运行平均值的系数(默认值:(0.9, 0.999))。
eps (float, optional): 加到分母上的项,以提高数值稳定性(默认值:1e-8)。
weight_decay (float, optional): 权重衰减(L2惩罚)(默认值:0)。
foreach (bool, optional): 是否使用优化器的“foreach”实现(默认值:None)。
使用方式:
optimizer = torch.optim.RAdam(params, lr=1e-3, betas=(0.9, 0.999), eps=1e-8,weight_decay=0)
14、SparseAdam 2018
说明:SparseAdam 是 Adam 算法专门针对稀疏梯度进行优化的版本,通常是在 Adam 算法基础上针对稀疏数据场景的修改和扩展。
公式:
-
计算一阶矩估计(梯度的均值):
m t = β 1 m t − 1 + ( 1 − β 1 ) g t m_t = \beta_1 m_{t-1} + (1 - \beta_1) g_t mt=β1mt−1+(1−β1)gt -
计算二阶矩估计(梯度的平方的均值):
v t = β 2 v t − 1 + ( 1 − β 2 ) g t 2 v_t = \beta_2 v_{t-1} + (1 - \beta_2) g_t^2 vt=β2vt−1+(1−β2)gt2 -
修正一阶矩估计和二阶矩估计(以抵消初始化偏差):
m ^ t = m t 1 − β 1 t , v ^ t = v t 1 − β 2 t \hat{m}_t = \frac{m_t}{1 - \beta_1^t}, \quad \hat{v}_t = \frac{v_t}{1 - \beta_2^t} m^t=1−β1tmt,v^t=1−β2tvt -
更新参数(只对非零梯度进行更新):
θ t + 1 = θ t − η v ^ t + ϵ m ^ t \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{\hat{v}_t} + \epsilon} \hat{m}_t θt+1=θt−v^t+ϵηm^t
其中:
- g t g_t gt 是当前时刻的梯度。
- β 1 , β 2 \beta_1, \beta_2 β1,β2 是动量参数(通常设置为 0.9 和 0.999)。
- η \eta η 是学习率。
- ϵ \epsilon ϵ 是用于防止除零错误的小常数(通常设置为 1e-8)。
函数定义:
def __init__(self, params, lr=1e-3, betas=(0.9, 0.999), eps=1e-8):
params (iterable): 需要优化的参数,或者定义参数组的字典。
lr (float, optional): 学习率(默认值:1e-3)。
betas (Tuple[float, float], optional): 用于计算梯度及其平方的运行平均值的系数(默认值:(0.9, 0.999))。
eps (float, optional): 加到分母上的项,以提高数值稳定性(默认值:1e-8)。
使用方式:
optimizer = torch.optim.SparseAdam(params, lr=1e-3, betas=(0.9, 0.999), eps=1e-8)
15、Adafactor 2018
说明:Adafactor 的更新规则与 Adam 类似,但它在梯度更新时使用了低秩矩阵近似,避免了存储整个梯度二阶矩阵,从而大大减少了内存消耗。
- 梯度的平方累积:
Adafactor 使用梯度的指数衰减平均来估计梯度的方差:
v t , diag = β 1 v t − 1 , diag + ( 1 − β 1 ) g t 2 v_{t, \text{diag}} = \beta_1 v_{t-1, \text{diag}} + (1 - \beta_1) g_t^2 vt,diag=β1vt−1,diag+(1−β1)gt2
v t , offdiag = β 2 v t − 1 , offdiag + ( 1 − β 2 ) g t g t − 1 v_{t, \text{offdiag}} = \beta_2 v_{t-1, \text{offdiag}} + (1 - \beta_2) g_t g_{t-1} vt,offdiag=β2vt−1,offdiag+(1−β2)gtgt−1
其中:
- v t , diag v_{t, \text{diag}} vt,diag 表示梯度平方的对角部分(用于每个维度的自适应学习率)。
- v t , offdiag v_{t, \text{offdiag}} vt,offdiag 是梯度协方差的离对角部分(用于捕捉不同维度之间的相关性)。
- g t g_t gt是当前的梯度。
- β 1 \beta_1 β1 和 β 2 \beta_2 β2 是衰减系数。
-
更新规则:
Adafactor 对参数更新采用以下公式:θ t + 1 = θ t − η ⋅ g t v t , diag + ϵ \theta_{t+1} = \theta_t - \eta \cdot \frac{g_t}{\sqrt{v_{t, \text{diag}}} + \epsilon} θt+1=θt−η⋅vt,diag+ϵgt
其中:
- θ t \theta_t θt 是当前的参数值。
- η \eta η 是学习率。
- v t , diag v_{t, \text{diag}} vt,diag 是在每个维度上的累积平方梯度。
- ϵ \epsilon ϵ 是一个小常数,用于避免除零错误。
函数定义:
def __init__(self, params, lr=None, eps=1e-30, eps_scale=1e-3, clip_threshold=1.0,decay_rate=-0.8, betas=None, weight_decay=0.0, scale_parameter=True, warmup_init=False):
params (iterable): 要优化的参数迭代器,或者定义参数组的字典。
lr (float, optional): 外部学习率(默认值:None)。
eps (tuple[float, float]): 用于正则化常数的平方梯度和参数规模的常数(默认值:(1e-30, 1e-3))。
clip_threshold (float): 最终梯度更新的均方根阈值(默认值:1.0)。
decay_rate (float): 用于计算平方梯度的运行平均值的系数(默认值:-0.8)。
beta1 (float): 用于计算梯度运行平均值的系数(默认值:None)。
weight_decay (float, optional): 权重衰减(L2惩罚)(默认值:0)。
scale_parameter (bool): 如果为True,学习率将按参数的均方根进行缩放(默认值:True)。
warmup_init (bool): 是否使用预热初始化来进行时间依赖的学习率计算,具体取决于是否使用了预热初始化(默认值:False)。
使用方式:
from timm.optim.adafactor import Adafactor
optimizer = Adafactor(params, lr=None, eps=1e-30, eps_scale=1e-3, clip_threshold=1.0,decay_rate=-0.8, betas=None, weight_decay=0.0)
16、NovoGrad 2019
说明:由 NVIDIA 团队提出,通过结合自适应梯度的方法与基于二阶矩阵的优化技巧,克服了传统的梯度下降法和一些常见优化算法在训练过程中可能遇到的挑战,如稀疏性和梯度消失问题。
公式:
θ t + 1 = θ t − η g t v t + ϵ \theta_{t+1} = \theta_t - \eta \frac{g_t}{\sqrt{v_t} + \epsilon} θt+1=θt−ηvt+ϵgt
其中:
- θ t \theta_t θt:参数向量(当前迭代时的权重)
- η \eta η:学习率
- g t g_t gt:梯度向量
- v t v_t vt:梯度的动量(历史信息)
- ϵ \epsilon ϵ:避免除以零的小常数
函数定义:
def __init__(self,params,lr=1e-3,betas=(0.95, 0.98),eps=1e-8,weight_decay=0,grad_averaging=False,amsgrad=False):
params (iterable): 要优化的参数的可迭代对象,或定义参数组的字典。
lr (float, optional): 学习率(默认值:1e-3)。
betas (Tuple[float, float], optional): 用于计算梯度及其平方的运行平均值的系数(默认值:(0.95, 0.98))。
eps (float, optional): 加入分母的项,以提高数值稳定性(默认值:1e-8)。
weight_decay (float, optional): 权重衰减(L2惩罚)(默认值:0)。
grad_averaging: 梯度平均。
amsgrad (boolean, optional): 是否使用AMSGrad变体,这个变体来自论文《On the Convergence of Adam and Beyond》中的算法(默认值:False)
使用方式:新版timm已舍弃该算法
from timm.optim.novograd import NovoGrad
optimizer = NovoGrad(params,lr=1e-3,betas=(0.95, 0.98),eps=1e-8,weight_decay=0)
17、NvNovoGrad 2020
说明:NvNovoGrad 采用了与 Adam 类似的思路,使用了梯度的 一阶矩估计(即动量项)和 二阶矩估计(即梯度的平方的指数衰减平均)。
公式:
-
一阶矩估计(动量项):
m t = β 1 m t − 1 + ( 1 − β 1 ) g t m_t = \beta_1 m_{t-1} + (1 - \beta_1) g_t mt=β1mt−1+(1−β1)gt -
二阶矩估计(梯度平方的移动平均):
v t = β 2 v t − 1 + ( 1 − β 2 ) g t 2 v_t = \beta_2 v_{t-1} + (1 - \beta_2) g_t^2 vt=β2vt−1+(1−β2)gt2 -
更新参数:
θ t = θ t − 1 − η m t v t + ϵ \theta_t = \theta_{t-1} - \frac{\eta m_t}{\sqrt{v_t} + \epsilon} θt=θt−1−vt+ϵηmt
其中
- θ t \theta_t θt 是当前参数,
- g t g_t gt 是当前的梯度,
- m t m_t mt 是一阶矩(梯度的动量估计),
- v t v_t vt 是二阶矩(梯度平方的动量估计),
- η \eta η 是学习率,
- β 1 \beta_1 β1 和 β 2 \beta_2 β2分别是一阶和二阶矩的衰减率,
- ϵ \epsilon ϵ 是一个小常数(用于避免除零)
函数定义:
def __init__(self, params, lr=1e-3, betas=(0.95, 0.98), eps=1e-8,weight_decay=0, grad_averaging=False, amsgrad=False):
params (iterable): 要优化的参数的可迭代对象,或定义参数组的字典。
lr (float, optional): 学习率(默认值:1e-3)。
betas (Tuple[float, float], optional): 用于计算梯度及其平方的运行平均值的系数(默认值:(0.95, 0.98))。
eps (float, optional): 加入分母的项,以提高数值稳定性(默认值:1e-8)。
weight_decay (float, optional): 权重衰减(L2惩罚)(默认值:0)。
grad_averaging: 梯度平均。
amsgrad (boolean, optional): 是否使用AMSGrad变体,这个变体来自论文《On the Convergence of Adam and Beyond》中的算法(默认值:False)。
使用方式:
from timm.optim.nvnovograd import NvNovoGrad
optimizer = NvNovoGrad(params, lr=1e-3, betas=(0.95, 0.98), eps=1e-8,weight_decay=0, grad_averaging=False, amsgrad=False)
18、AdamP 2020
说明:AdamP 与 Adam 的最大区别在于它对 权重衰减(weight decay) 的处理方式。标准的 Adam 优化算法中,权重衰减是作为一种正则化方式直接加到梯度上,而 AdamP 采用了更合适的方式,在梯度更新前对每个参数的梯度做了 正则化 处理,能够更有效地将权重衰减融入到优化过程中。
公式:
- 动量更新:
与 Adam 一样,AdamP 使用一阶矩和二阶矩的更新:
m t = β 1 m t − 1 + ( 1 − β 1 ) g t m_t = \beta_1 m_{t-1} + (1 - \beta_1) g_t mt=β1mt−1+(1−β1)gt
v t = β 2 v t − 1 + ( 1 − β 2 ) g t 2 v_t = \beta_2 v_{t-1} + (1 - \beta_2) g_t^2 vt=β2vt−1+(1−β2)gt2
其中:
- m t m_t mt 是梯度的动量(与梯度的加权平均相关)。
- v t v_t vt 是梯度的平方的加权平均(即梯度的方差估计)。
- g t g_t gt 是当前梯度。
- β 1 \beta_1 β1 和 β 2 \beta_2 β2 是衰减率超参数。
- 梯度校正:
与 Adam 类似,为了消除动量的偏差,AdamP 会对 m t m_t mt和 v t v_t vt进行偏差校正:
m ^ t = m t 1 − β 1 t \hat{m}_t = \frac{m_t}{1 - \beta_1^t} m^t=1−β1tmt
v ^ t = v t 1 − β 2 t \hat{v}_t = \frac{v_t}{1 - \beta_2^t} v^t=1−β2tvt
- 权重衰减的处理:
AdamP 的关键区别在于它采用了一种不同的方式来处理权重衰减。具体来说,在每次更新时,AdamP 会通过以下方式将权重衰减与梯度结合:
θ t + 1 = θ t − η ⋅ m ^ t v ^ t + ϵ − η ⋅ λ ⋅ θ t \theta_{t+1} = \theta_t - \eta \cdot \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon} - \eta \cdot \lambda \cdot \theta_t θt+1=θt−η⋅v^t+ϵm^t−η⋅λ⋅θt
其中:
- θ t \theta_t θt 是当前的参数。
- η \eta η是学习率。
- λ \lambda λ 是权重衰减因子(通常为一个很小的值,如 (10^{-4}) 或 (10^{-5}))。
- ϵ \epsilon ϵ 是一个小常数,防止除零错误。
函数定义:
def __init__(self, params, lr=1e-3, betas=(0.9, 0.999), eps=1e-8,weight_decay=0, delta=0.1, wd_ratio=0.1, nesterov=False):
使用方式:
from timm.optim.adamp import AdamP
optimizer = AdamP(params, lr=1e-3, betas=(0.9, 0.999), eps=1e-8,weight_decay=0, delta=0.1, wd_ratio=0.1)
19、Adahessian 2021
说明:AdaHessian 引入了 Hessian 矩阵(即二阶导数矩阵)的近似,它包含了损失函数的二阶信息,能够更精确地调整学习率和梯度更新方向。AdaHessian 结合了梯度的一阶矩、二阶矩和 Hessian 矩阵的信息。
公式:
-
梯度计算:
g t = ∇ θ L ( θ t ) g_t = \nabla_\theta L(\theta_t) gt=∇θL(θt)
其中, g t g_t gt是损失函数 L ( θ ) L(\theta) L(θ)关于模型参数 θ t \theta_t θt的梯度。 -
Hessian 矩阵的近似:
AdaHessian 通过一种高效的方式来近似 Hessian 矩阵,避免了直接计算二阶导数带来的高计算成本。通常,AdaHessian 使用二阶矩的估计来近似 Hessian。具体的近似方法可以通过使用 Kronecker-factored Approximate Curvature (K-FAC) 技术或其他矩阵分解方法来实现。 -
更新规则:
AdaHessian 使用自适应的学习率来更新参数。其更新公式如下:
θ t + 1 = θ t − η t v t + ϵ ⋅ H ^ t − 1 g t \theta_{t+1} = \theta_t - \frac{\eta_t}{\sqrt{v_t + \epsilon}} \cdot \hat{H}_t^{-1} g_t θt+1=θt−vt+ϵηt⋅H^t−1gt
其中:- η t \eta_t ηt 是学习率。
- v t v_t vt 是梯度的一阶矩估计(类似于 Adam 中的一阶动量)。
- H ^ t \hat{H}_t H^t 是对 Hessian 矩阵的近似。
- ϵ \epsilon ϵ是一个小常数,防止除零错误。
- H ^ t − 1 \hat{H}_t^{-1} H^t−1是 Hessian 矩阵的逆近似。
函数定义:
def __init__(self, params, lr=0.1, betas=(0.9, 0.999), eps=1e-8, weight_decay=0.0,hessian_power=1.0, update_each=1, n_samples=1, avg_conv_kernel=False):
params (iterable): 可迭代的参数,定义了要优化的参数或包含参数组的字典。
lr (float, optional): 学习率(默认值:0.1)。
betas ((float, float), optional): 用于计算梯度和平方海森矩阵迹的运行平均的系数(默认值:(0.9, 0.999))。
eps (float, optional): 加入分母中的小项,以提高数值稳定性(默认值:1e-8)。
weight_decay (float, optional): 权重衰减(L2 正则化)参数(默认值:0.0)。
hessian_power (float, optional): 海森矩阵迹的指数(默认值:1.0)。
update_each (int, optional): 每经过 该 步数后才计算海森矩阵迹的近似值(用于节省时间)(默认值:1)。
n_samples (int, optional): 采样 z 的次数,用于近似海森矩阵迹(默认值:1)。
使用方式:
from timm.optim.adahessian import Adahessian
optimizer = Adahessian(params, lr=0.1, betas=(0.9, 0.999), eps=1e-8, weight_decay=0.0,hessian_power=1.0, update_each=1, n_samples=1)
相关文章:
深度学习pytorch之19种优化算法(optimizer)解析
提示:有谬误请指正 摘要 本博客详细介绍了多种常见的深度学习优化算法,包括经典的LBFGS 、Rprop 、Adagrad、RMSprop 、Adadelta 、ASGD 、Adamax、Adam、AdamW、NAdam、RAdam以及SparseAdam等,通过对这些算法的公式和参数说明进行详细解析…...
C#贪心算法
贪心算法:生活与代码中的 “最优选择大师” 在生活里,我们常常面临各种选择,都希望能做出最有利的决策。比如在超市大促销时,面对琳琅满目的商品,你总想用有限的预算买到价值最高的东西。贪心算法,就像是一…...
SSH无密登录配置
SSH无密登录配置 1、在用户目录下创建.ssh目录 mkdir /home/atguigu/.ssh2、在.ssh目录下生成ssh秘钥(需要切换到Hadoop集群使用的用户,再运行命令) ssh-keygen -t rsa然后敲(三个回车),就会生成两个文件…...
Rust并发编程实践:10分钟入门系统级编程
目录 学前一问:Rust为何而出现? 摘要 引言 正文解析: 一、Rust中的并发编程基础 1.1 线程 1.2 协程 二、Rust并发编程的高级特性 2.1 通道 2.2 原子操作 2.3 锁 三、实例展示:优化并发编程性能 1. 并行计算 2. 异步…...
Linux 命令大全完整版(06)
2. 系统设置命令 pwunconv 功能说明:关闭用户的投影密码。语法:pwunconv补充说明:执行 pwunconv 指令可以关闭用户投影密码,它会把密码从 shadow 文件内,重回存到 passwd 文件里。 rdate(receive date) 功能说明&a…...
VSCode 中设置 Git 忽略仅因时间戳修改导致的文件变更【使用deepseek生成的一篇文章】
在 VSCode 中设置 Git 忽略仅因时间戳修改导致的文件变更,可通过以下步骤实现: 确认是否为纯时间戳修改 首先确认文件的修改是否仅涉及时间戳,使用终端运行: git diff -- <file>若输出为空但 Git 仍提示修改,可…...
echarts找不到了?echarts社区最新地址
前言:在之前使用echarts的时候,还可以通过上边的导航栏找到echarts社区,但是如今的echarts变更之后,就找不到echarts社区了。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客 如今…...
Git-速查
Git 安装 Git 之后,你可以… 配置全局用户信息(推荐) 全局设置,创建本地仓库时默认分支名称为 main(你需要什么名称就该什么名称)【推荐配置为 main 】 git config --global init.defaultBranch main全…...
AxiosError: Network Error
不知怎么的,项目还在开发阶段,之前还好好的,玩儿了两天再一打开发现页面无法显示数据了,报错如下: 我以为是后端出问题了,但是后端控制台无报错,又用postman测试了一下,可以获取到数…...
ImGui 学习笔记(三)—— 隐藏主窗口窗口关闭检测
ImGui 的主窗口是平台窗口,默认是可见的,这会影响视觉效果。那么怎么隐藏 ImGui 的主窗口呢? 这很简单,但是需要针对后端做一些修改。 本文仅介绍在 glfwopengl3 和 win32dx11 两种实现上如何修改。 在 win32dx11 实现上&#…...
周末总结(2024/02/22)
工作 人际关系核心实践: 要学会随时回应别人的善意,执行时间控制在5分钟以内 坚持每天早会打招呼 遇到接不住的话题时拉低自己,抬高别人(无阴阳气息) 朋友圈点赞控制在5min以内,职场社交不要放在5min以外 职场的人际关系在面对利…...
SOME/IP--协议英文原文讲解11
前言 SOME/IP协议越来越多的用于汽车电子行业中,关于协议详细完全的中文资料却没有,所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块: 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 4.2.6 Er…...
Spring Boot 概要(官网文档解读)
Spring Boot 概述 Spring Boot 是一个高效构建 Spring 生产级应用的脚手架工具,它简化了基于 Spring 框架的开发过程。 Spring Boot 也是一个“构件组装门户”,何为构件组装门户呢?所谓的“构件组装门户”指的是一个对外提供的Web平台&#x…...
图像处理篇---图像处理中常见参数
文章目录 前言一、分贝(dB)的原理1.公式 二、峰值信噪比(PSNR, Peak Signal-to-Noise Ratio)1.用途2.公式3.示例 三、信噪比(SNR, Signal-to-Noise Ratio)1.用途2.公式3.示例 四、动态范围(Dyna…...
Win11更新系统c盘爆满处理
1.打开磁盘管理 2.右击c盘选择属性,进行磁盘管理,选择详细信息。 3.选择以前安装的文件删除即可释放c盘空间。...
C++关键字之mutable
1.介绍 在C中,mutable是一个关键字,用于修饰类的成员变量。它的主要作用是允许在常量成员函数或常量对象中修改被标记为mutable的成员变量。通常情况下,常量成员函数不能修改类的成员变量,但有些情况下,某些成员变量的…...
vue3 采用xlsx库实现本地上传excel文件,前端解析为Json数据
需求:本地上传excel 文件,但需要对excel 文件的内容进行解析,然后展示出来 1. 安装依赖 首先,确保安装了 xlsx 库: bash复制 npm install xlsx 2. 创建 Vue 组件 创建一个 Vue 组件(如 ExcelUpload.v…...
【Linux系统】—— 冯诺依曼体系结构与操作系统初理解
【Linux系统】—— 冯诺依曼体系结构与操作系统初理解 1 冯诺依曼体系结构1.1 基本概念理解1.2 CPU只和内存打交道1.3 为什么冯诺依曼是这种结构1.4 理解数据流动 2 操作系统2.1 什么是操作系统2.2 设计OS的目的2.3 操作系统小知识点2.4 如何理解"管理"2.5 系统调用和…...
易语言模拟真人鼠标轨迹算法 - 防止游戏检测
一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序,它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言,原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势: 模拟…...
PHP旅游门票预订系统小程序源码
🌍 旅游门票预订系统:一站式畅游新体验,开启您的梦幻旅程 🌟 一款基于ThinkPHPUniapp精心雕琢的旅游门票预订系统,正翘首以待,为您揭开便捷、高效、全面的旅游预订新篇章!它超越了传统预订平台…...
侯捷 C++ 课程学习笔记:内存管理的每一层面
目录 一、C 应用程序的内存管理架构 二、C 内存原语 三、内存管理的实际应用 四、学习心得 一、C 应用程序的内存管理架构 C 应用程序的内存管理架构可以分为多个层次,从应用程序到操作系统 API,每一层都提供了不同的内存管理功能。 架构图…...
Python开发Django面试题及参考答案
目录 Django 的请求生命周期是怎样的? Django 的 MTV 架构中的各个组件分别是什么? Django 的 URL 路由是如何工作的? Django 的视图函数和视图类有什么区别? Django 的模板系统是如何渲染 HTML 的? Django 的 ORM 是如何工作的? Django 的中间件是什么?它的作用是…...
前端js进阶,ES6语法,包详细
进阶ES6 作用域的概念加深对js理解 let、const申明的变量,在花括号中会生成块作用域,而var就不会生成块作用域 作用域链本质上就是底层的变量查找机制 作用域链查找的规则是:优先查找当前作用域先把的变量,再依次逐级找父级作用域直到全局…...
【三十四周】文献阅读:DeepPose: 通过深度神经网络实现人类姿态估计
目录 摘要AbstractDeepPose: 通过深度神经网络实现人类姿态估计研究背景创新点方法论归一化网络结构级联细化流程 代码实践局限性实验结果总结 摘要 人体姿态估计旨在通过图像定位人体关节,是计算机视觉领域的核心问题之一。传统方法多基于局部检测与图模型&#x…...
将 Vue 项目打包后部署到 Spring Boot 项目中的全面指南
将 Vue 项目打包后部署到 Spring Boot 项目中的全面指南 在现代 Web 开发中,前后端分离架构已经成为主流。然而,在某些场景下,我们可能需要将前端项目(如 Vue)与后端项目(如 Spring Boot)集成部…...
Linux 权限系统和软件安装(二):深入理解 Linux 权限系统
在 Linux 的世界里,权限系统犹如一位忠诚的卫士,严密守护着系统中的文件与目录,确保只有具备相应权限的用户才能进行操作。与其他一些操作系统不同,Linux 并不依据文件后缀名来标识文件的操作权限,而是构建了一套独特且…...
计算机网络常考大题
运输层的主要功能 运输层为应用进程之间提供端到端的逻辑通信。 运输层还要对收到的报文进行差错检测。 运输层需要有两种不同的运输协议,即面向连接的 TCP 和无连接的 UDP 传输控制协议 TCP 概述 TCP 是面向连接的运输层协议。 每一条 TCP 连接只能有两个端点…...
百度首页上线 DeepSeek 入口,免费使用
大家好,我是小悟。 百度首页正式上线了 DeepSeek 入口,这一重磅消息瞬间在技术圈掀起了惊涛骇浪,各大平台都被刷爆了屏。 百度这次可太给力了,PC 端开放仅 1 小时,就有超千万人涌入体验。这速度,简直比火…...
《跟李沐学 AI》AlexNet论文逐段精读学习心得 | PyTorch 深度学习实战
前一篇文章,使用 AlexNet 实现图片分类 | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started 本篇文章内容来自于学习 9年后重读深度学习奠基作之一:AlexNet【下】【论文精读】】的心得。 《跟李沐…...
Linux搭建Nginx直播流媒体服务RTMP/RTSP转Http-flv视频浏览器在线播放/Vue/Java/ffmpeg
参考文章: https://blog.csdn.net/whatareyouding/article/details/144317654 https://www.cnblogs.com/Gredae/p/18362900 https://www.cnblogs.com/kn-zheng/p/17422707.html https://blog.51cto.com/u_16099344/10281495 https://www.tulingxueyuan.cn/tlzx/jsp…...
Node.js高频面试题精选及参考答案
目录 什么是 Node.js?它的主要特点有哪些? Node.js 的事件驱动和非阻塞 I/O 模型是如何工作的? 为什么 Node.js 适合处理高并发场景? Node.js 与传统后端语言(如 Java、Python)相比,有哪些优势和劣势? 简述 Node.js 的运行原理,包括 V8 引擎的作用。 什么是 Nod…...
公开整理-最新中国城市统计NJExcel+PDF版本(1985-2024年)
数据简介:《中国城市统计NJ》从1985年开始,本NJ内容共分四个部分:第一部分是全国城市行政区划,列有不同区域、不同级别的城市分布情况;第二、三部分分别是地级以上城市统计资料和县级城市统计资料,具体包括人口、劳动力及土地资源、综合经济、工业、交通…...
ModuleNotFoundError: No module named ‘xgboost‘
问题: --------------------------------------------------------------------------- ModuleNotFoundError Traceback (most recent call last) Cell In[1], line 64 import pickle5 from sklearn.metrics import mean_squared_error, r2_…...
应用层协议HTTP
应用层协议HTTP 引言 应用层协议是程序员自己制定的,但是良好的协议是保证网络通信的基础,前代的计算工程师已经帮助我们制定了一些很好用的应用层协议,http(hybertext transfer protocol)(超文本传输协议)就是其中之一。 http协议是客户端…...
常见的“锁”有哪些?
悲观锁 悲观锁认为在并发环境中,数据随时可能被其他线程修改,因此在访问数据之前会先加锁,以防止其他线程对数据进行修改。常见的悲观锁实现有: 1.互斥锁 原理:互斥锁是一种最基本的锁类型,同一时间只允…...
PAT 甲级 1091 Acute Stroke
一开始只是简单的递归(bfs),导致最后两个没法通过(爆栈了) //最后两个案例没有通过,只是最简单的bfs暴力算法 #include<cstdio> using namespace std; int v[62][1288][130]{0}; int find(int i,int…...
flowable适配达梦数据库
文章目录 适配相关问题无法从数据库产品名称“DM DBMS”中推断数据库类型分析解决 构建ibatis SqlSessionFactory时出错:inStream参数为null分析解决 liquibase相关问题问题一:不支持的数据库 Error executing SQL call current_schema: 无法解析的成员访…...
Git入门:数据模型 to 底层原理
版本控制系统(VCS)是软件开发中不可或缺的工具,而Git作为现代版本控制的事实标准,其底层设计远比表面命令更加优雅。本文将从数据模型的角度,揭示Git的核心工作原理。 Git的核心概念 1. 快照(Snapshot&am…...
Bootstrap Blazor UI 中 <Table> 组件 <TableColumn> 使用备忘01:EF Core 外码处理
应用场景:将外码转换为对应的文本进行显示、编辑。 例如,有一个【用户】表,其中有一个【用户类型ID】字段;另有一个【用户类型】表,包含【ID】、【名称】等字段。现在要求在 <Table> 组件显示列表中,…...
Redis过期数据处理
Redis缓存过期后数据还能恢复吗? Redis缓存过期后,数据通常会被删除,但可以通过以下几种方法尝试恢复数据: 1. 数据备份恢复 RDB 持久化恢复:Redis 提供了 RDB(Redis Database Backup)持久化…...
零基础学C/C++160——字符串
题目描述 给定两个由小写字母组成的字符串A和B,判断B中的字符是否全部在A中出现。 输入 输入为多组测试数据。 输入数据只有一行,包含2个字符串A和B,每个字符串后面有一个#字符标记(#不属于A或B),其中B…...
Spring Boot+Vue项目从零入手
Spring BootVue项目从零入手 一、前期准备 在搭建spring bootvue项目前,我们首先要准备好开发环境,所需相关环境和软件如下: 1、node.js 检测安装成功的方法:node -v 2、vue 检测安装成功的方法:vue -V 3、Visu…...
Linux 命令大全完整版(13)
5.文件管理命令 patch 功能说明:修补文件。语 法:patch [-bceEflnNRstTuvZ][-B <备份字首字符串>][-d <工作目录>][-D <标示符号>][-F <监别列数>][-g <控制数值>][-i <修补文件>][-o <输出文件>][-p &l…...
MySQL面试学习
MySQL 1.事务 事务的4大特性 事务4大特性:原子性、一致性、隔离性、持久性 原⼦性: 事务是最⼩的执⾏单位,不允许分割。事务的原⼦性确保动作要么全部完成,要么全不执行一致性: 执⾏事务前后,数据保持⼀…...
CentOS中shell脚本对多台机器执行下载安装
1.建立免密ssh连接 详情见这篇: CentOS建立ssh免密连接(含流程剖析)-CSDN博客 2.脚本编写 我这里只是简单写了个demo进行演示,如果服务器很多可以先暂存成文件再逐行读取host进行连接并执行命令 用node1去ssh连接node2和node…...
【Java】多线程和高并发编程(四):阻塞队列(上)基础概念、ArrayBlockingQueue
文章目录 四、阻塞队列1、基础概念1.1 生产者消费者概念1.2 JUC阻塞队列的存取方法 2、ArrayBlockingQueue2.1 ArrayBlockingQueue的基本使用2.2 生产者方法实现原理2.2.1 ArrayBlockingQueue的常见属性2.2.2 add方法实现2.2.3 offer方法实现2.2.4 offer(time,unit)方法2.2.5 p…...
C语言多人聊天室 ---chat(客户端聊天)
head.h #ifndef __HEAD_H #define __HEAD_H// 常用头文件 #include <stdio.h> #include <stdlib.h> #include <string.h>// 网络编程涉及的头文件 #include <sys/socket.h> #include <netinet/in.h> #include <netinet/ip.h>#include <…...
设计模式教程:命令模式(Command Pattern)
1. 什么是命令模式? 命令模式(Command Pattern)是一种行为型设计模式。它将请求封装成一个对象,从而使你能够用不同的请求、队列和日志请求以及支持可撤销操作。 简单来说,命令模式通过把请求封装成对象的方式解耦了…...
【华三】STP的角色选举(一文讲透)
【华三】STP的角色选举 一、引言二、STP基础概念扫盲三、根桥选举过程详解四、根端口选举过程详解五、指定端口选举过程详解六、阻塞端口七、总结与配置建议七、附录**1. BPDU字段结构图(文字描述)****2. 华三STP常用命令速查表** 文章总结 一、引言 在…...
Trae+Qt+MSVC环境配置
Trae Trae是字节跳动基于VSCode推出的AI集成开发环境(IDE),是一款专为中文开发者深度定制的智能编程工具。其目标是通过AI技术实现从“Copilot”到“Autopilot”的编程模式演进。 类似这样的IDE比如Windsurf、Cursor,都是基于VS…...