深度学习pytorch之19种优化算法(optimizer)解析

news2025/2/25 7:29:13

提示:有谬误请指正

摘要

本博客详细介绍了多种常见的深度学习优化算法,包括经典的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ηisign(θ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=θtGt+ϵ ηθ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=θtE[θ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=θtE[Δθ]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=1tθ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)是一种对随机梯度下降的改进算法,它通过对梯度更新的参数进行取平均,来减少参数更新的方差,提高算法的稳定性。
公式:

  1. 计算动量:首先,计算当前的动量:
    v t + 1 = μ v t + η ∇ θ J ( θ t ) v_{t+1} = \mu v_t + \eta \nabla_{\theta} J(\theta_t) vt+1=μvt+ηθJ(θt)

  2. Nesterov 加速:然后,通过提前计算在更新后的位置的梯度来进行梯度修正:
    θ t + 1 = θ t − v t + 1 \theta_{t+1} = \theta_t - v_{t+1} θt+1=θtvt+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=θtm^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=θtv^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=θtv^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=β1m^t1+(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=β2v^t1+(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=θtv^t +ϵηm^trectifier(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 算法基础上针对稀疏数据场景的修改和扩展。

公式:

  1. 计算一阶矩估计(梯度的均值):
    m t = β 1 m t − 1 + ( 1 − β 1 ) g t m_t = \beta_1 m_{t-1} + (1 - \beta_1) g_t mt=β1mt1+(1β1)gt

  2. 计算二阶矩估计(梯度的平方的均值):
    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=β2vt1+(1β2)gt2

  3. 修正一阶矩估计和二阶矩估计(以抵消初始化偏差):
    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

  4. 更新参数(只对非零梯度进行更新):
    θ t + 1 = θ t − η v ^ t + ϵ m ^ t \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{\hat{v}_t} + \epsilon} \hat{m}_t θt+1=θtv^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 类似,但它在梯度更新时使用了低秩矩阵近似,避免了存储整个梯度二阶矩阵,从而大大减少了内存消耗。

  1. 梯度的平方累积
    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=β1vt1,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=β2vt1,offdiag+(1β2)gtgt1

其中:

  • 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 是衰减系数。
  1. 更新规则
    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 类似的思路,使用了梯度的 一阶矩估计(即动量项)和 二阶矩估计(即梯度的平方的指数衰减平均)。

公式:

  1. 一阶矩估计(动量项)
    m t = β 1 m t − 1 + ( 1 − β 1 ) g t m_t = \beta_1 m_{t-1} + (1 - \beta_1) g_t mt=β1mt1+(1β1)gt

  2. 二阶矩估计(梯度平方的移动平均)
    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=β2vt1+(1β2)gt2

  3. 更新参数
    θ t = θ t − 1 − η m t v t + ϵ \theta_t = \theta_{t-1} - \frac{\eta m_t}{\sqrt{v_t} + \epsilon} θt=θt1vt +ϵη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 采用了更合适的方式,在梯度更新前对每个参数的梯度做了 正则化 处理,能够更有效地将权重衰减融入到优化过程中。
公式:

  1. 动量更新
    与 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=β1mt1+(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=β2vt1+(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 是衰减率超参数。
  1. 梯度校正
    与 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

  1. 权重衰减的处理
    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 矩阵的信息。
公式:

  1. 梯度计算
    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的梯度。

  2. Hessian 矩阵的近似
    AdaHessian 通过一种高效的方式来近似 Hessian 矩阵,避免了直接计算二阶导数带来的高计算成本。通常,AdaHessian 使用二阶矩的估计来近似 Hessian。具体的近似方法可以通过使用 Kronecker-factored Approximate Curvature (K-FAC) 技术或其他矩阵分解方法来实现。

  3. 更新规则
    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=θtvt+ϵ ηtH^t1gt
    其中:

    • η 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^t1是 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)

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

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

相关文章

使用 BFS 解决 最短路问题

找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏: 优选算法专题 目录 1926.迷宫中离入口最近的出口 433.最小基因变化 127.单词接龙 675.为高尔夫比赛砍树 1926.迷宫中离入口最近的出口 题…

【嵌入式Linux应用开发基础】网络编程(1):TCP/IP协议栈

目录 一、TCP/IP协议栈分层与核心协议 2.1. 应用层 2.2. 传输层 2.3. 网络层 2.4. 链路层 二、嵌入式Socket编程关键步骤 2.1. TCP服务端流程 2.2. TCP客户端流程 三、TCP/IP协议栈的配置与调试 四、嵌入式场景优化策略 4.1. 资源管理 4.2. 性能调优 4.3. 健壮性保…

BUUCTF--[极客大挑战 2019]RCE ME

目录 URL编码取反绕过 异或绕过 异或的代码 flag 借助蚁剑中的插件进行绕过 利用动态链接库 编写恶意c语言代码 进行编译 然后再写一个php文件 将这两个文件上传到/var/tmp下 运行payload 直接看代码 <?php error_reporting(0); if(isset($_GET[code])){$code$_G…

【K8s】专题十六(2):Kubernetes 包管理工具之 Helm 使用

本文内容均来自个人笔记并重新梳理&#xff0c;如有错误欢迎指正&#xff01; 如果对您有帮助&#xff0c;烦请点赞、关注、转发、订阅专栏&#xff01; 专栏订阅入口 | 精选文章 | Kubernetes | Docker | Linux | 羊毛资源 | 工具推荐 | 往期精彩文章 【Docker】&#xff08;全…

VMware NSX 4.X Professional V2(2V0-41.24)题库2

What are two supported host switch modes? (Choose two.) A. Overlay Datapath B. Secure Datapath C. Standard Datapath D. Enhanced Datapath E. DPDK Datapath 答案&#xff1a;CD 完整题库见文章底部&#xff01; Which is an advantage of an L2 VPN in an NSX 4.x …

算法-数据结构-图的构建(邻接矩阵表示)

数据定义 //邻接矩阵表示图 //1.无向图是对称的 //2.有权的把a,到b 对应的位置换成权的值/*** 无向图* A B* A 0 1* B 1 0*/ /*** 有向图* A B* A 0 1* B 0 0*/import java.util.ArrayList; import java.util.List;/*** 带权图* A B* A 0 1* B 0 0*/ p…

ARCGIS国土超级工具集1.4更新说明

ARCGIS国土超级工具集V1.4版本&#xff0c;功能已增加至54 个。本次更新在V1.3版本的基础上&#xff0c;新增了“拓扑问题修复工具”并同时调整了数据处理工具栏的布局、工具操作界面的选择图层下拉框新增可选择位于图层组内的要素图层功能、数据保存路径新增了可选择数据库内的…

Ollama+Cherrystudio+beg-m3+Deepseek R1 32b部署本地私人知识库(2025年2月win11版)

之前综合网络各方面信息得到的配置表&#xff1a; 在信息爆炸的时代&#xff0c;数据安全和个性化需求愈发凸显。搭建本地私人知识库&#xff0c;不仅能确保数据的安全性&#xff0c;还能根据个人需求进行个性化定制&#xff0c;实现知识的高效管理和利用。随着技术的不断发展…

用Golang与WebAssembly构建高性能Web应用:详解`syscall/js`包

用Golang与WebAssembly构建高性能Web应用&#xff1a;详解syscall/js包 引言为什么选择syscall/js包&#xff1f;适用场景 syscall/js包概述syscall/js包的核心概念1. js.Global2. js.Value3. js.Func4. js.Null 和 js.Undefined syscall/js包在WebAssembly中的位置 环境配置与…

【每日八股】计算机网络篇(一):概述

OSI 的 7 层网络模型&#xff1f; OSI&#xff08;Open Systems Interconnection&#xff0c;开放互联系统&#xff09;是由国际标准化组织&#xff08;ISO&#xff09;提出的一种网络通信模型。 自上而下&#xff0c;OSI 可以被分为七层&#xff0c;分别是&#xff1a;应用层…

C语言中的文件和文件操作

文件操作 一、文件的打开和关闭二、文件的顺序读写fgetc和fputcfgets和fputsfscanf和fprintfsscanf和sprintffread和fwrite 三、文件的随机读写1.fseek2.ftell3.rewind 四、补充1.文件读取结束的判定2.文件缓冲区 一、文件的打开和关闭 流和标准流 流&#xff1a;想象为流淌着…

2.24力扣每日一题--设计有序流

1656. 设计有序流 - 力扣&#xff08;LeetCode&#xff09; &#xff08;设计一个可以存储n个字符串的数据结构&#xff0c;其中满足存在一个”指针“&#xff0c;用以展示当下是否还存在空间存储&#xff0c;每个字符串有自己ID需要存储&#xff09; 数据结构&#xff1a; 字…

架构——Nginx功能、职责、原理、配置示例、应用场景

以下是关于 Nginx 的功能、职责、原理、配置示例、应用场景及其高性能原因的详细说明&#xff1a; 一、Nginx 的核心功能 1. 静态资源服务 功能&#xff1a;直接返回静态文件&#xff08;如 HTML、CSS、JS、图片、视频等&#xff09;。配置示例&#xff1a;server {listen 80…

涉密载体管控系统革新:RFID技术引领,信息安全新境界

行业背景 文件载体管控系统DW-S402是用于对各种SM载体进行有效管理的智能柜&#xff08;智能管理系统&#xff09;&#xff0c;实现对载体的智能化、规范化、标准化管理&#xff0c;广泛应用于保密、机要单位以及企事业单位等有载体保管需求的行业。 随着信息化技术发展&…

基于 SpringBoot 的 “电影交流平台小程序” 系统的设计与实现

大家好&#xff0c;今天要和大家聊的是一款基于 SpringBoot 的 “电影交流平台小程序” 系统的设计与实现。项目源码以及部署相关事宜请联系我&#xff0c;文末附上联系方式。 项目简介 基于 SpringBoot 的 “电影交流平台小程序” 系统设计与实现的主要使用者分为 管理员 和…

【Rust中级教程】2.9. API设计原则之显然性(obvious) :文档与类型系统、语义化类型、使用“零大小”类型

喜欢的话别忘了点赞、收藏加关注哦&#xff08;加关注即可阅读全文&#xff09;&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 2.9.1. 文档与类型系统 用户可能不会完全理解API的所有规则和限制。所以你写的API应该让你…

【网络编程】广播和组播

数据包发送方式只有一个接受方&#xff0c;称为单播。如果同时发给局域网中的所有主机&#xff0c;称为广播。只有用户数据报(使用UDP协议)套接字才能广播&#xff1a; 广播地址以192.168.1.0 (255.255.255.0) 网段为例&#xff0c;最大的主机地址192.168.1.255代表该网段的广…

Lecture 1 - AI Systems (Overview)

一、Machine Learning Approach标准机器学习流程 • Train ML algorithm&#xff08;训练机器学习算法&#xff09;&#xff1a;基于收集的数据训练机器学习模型。 二、Machine Learning for Adaptation&#xff08;适应性机器学习&#xff09; 加入了数据更新和自动化的部分…

Ansible 学习笔记

这里写自定义目录标题 基本架构文件结构安装查看版本 Ansible 配置相关文件主机清单写法 基本架构 Ansible 是基于Python实现的&#xff0c;默认使用22端口&#xff0c; 文件结构 安装 查看用什么语言写的用一下命令 查看版本 Ansible 配置相关文件 主机清单写法

springboot005学生心理咨询评估系统(源码+数据库+文档)

源码地址&#xff1a;学生心理咨询评估系统 文章目录 1.项目简介2.部分数据库结构与测试用例3.系统功能结构4.包含的文件列表&#xff08;含论文&#xff09;后台运行截图 1.项目简介 ​ 使用旧方法对学生心理咨询评估信息进行系统化管理已经不再让人们信赖了&#xff0c;把现…