一、按照导数阶层对优化器划分
AI训练的优化器主要分为两大类:
只有一阶导数的优化器。
有一阶和二阶导数的优化器。
一阶导数和二阶导数在数学和应用中的区别主要体现在它们描述的变化和用途上:
一阶导数
定义:一阶导数表示函数的瞬时变化率,即函数值随自变量变化的速度。数学上,一阶导数 ( f’(x) ) 表示函数 ( f(x) ) 在点 ( x ) 处的斜率。
用途:一阶导数常用于确定函数的增长或减少趋势。例如,如果 ( f’(x) > 0 ),则函数在该点处递增;如果 ( f’(x) < 0 ),则函数在该点处递减。
几何意义:一阶导数在图形上表示切线的斜率。
二阶导数
定义:二阶导数表示一阶导数的变化率,即函数曲率的变化。数学上,二阶导数 ( f’'(x) ) 表示函数 ( f(x) ) 在点 ( x ) 处的凹凸性。
用途:二阶导数常用于分析函数的凹凸性和拐点。例如,如果 ( f’‘(x) > 0 ),则函数在该点处是凹向上的(凸);如果 ( f’'(x) < 0 ),则函数在该点处是凹向下的(凹)。
几何意义:二阶导数在图形上表示曲线的凹凸性变化。
直观理解
一阶导数:想象你在开车,一阶导数就像是你的速度表,告诉你当前的速度。
二阶导数:二阶导数则像是加速度表,告诉你速度变化的快慢。
二、常见的优化器
仅有一阶版本的优化器
SGD (Stochastic Gradient Descent):仅使用梯度信息。
Momentum SGD:在SGD基础上加入动量,仍然是基于一阶导数。
Adagrad:自适应学习率优化器,基于一阶导数。
Adadelta:改进的Adagrad,基于一阶导数。
RMSprop:自适应学习率优化器,基于一阶导数。
Adam (Adaptive Moment Estimation):结合动量和自适应学习率,基于一阶导数。
Nadam:Adam的变体,结合Nesterov动量,基于一阶导数。
AdaFactor:内存高效的优化器,基于一阶导数。
8-bit AdamW:量化的AdamW,基于一阶导数。
Paged AdamW:优化器状态在GPU和CPU RAM之间切换,基于一阶导数。
使用二阶导数的优化器包括:
Newton’s Method:使用Hessian矩阵(即二阶导数)来更新参数。
L-BFGS:一种准牛顿方法,使用近似的Hessian矩阵。
Newton’s Method
一阶导数:使用梯度信息来确定方向。
二阶导数:使用Hessian矩阵来调整步长,使得更新更精确。
L-BFGS(Limited-memory Broyden–Fletcher–Goldfarb–Shanno)
一阶导数:主要依赖梯度信息来确定方向。
二阶导数:使用近似的Hessian矩阵来调整步长,但不需要显式计算和存储完整的Hessian矩阵。这使得L-BFGS在内存和计算效率上比Newton’s Method更优。
总结
Newton’s Method:同时使用一阶和二阶导数,计算精确但资源消耗大。
L-BFGS:主要使用一阶导数,并通过近似的二阶信息来优化,适用于中等规模的任务。
三、具有二阶导数优化器的特点
内存消耗原因
Hessian矩阵:二阶优化器需要计算和存储Hessian矩阵(即损失函数的二阶导数矩阵),这对于大规模模型来说非常耗费内存。
计算复杂度:计算Hessian矩阵的复杂度较高,尤其是对于高维参数空间,这会进一步增加内存和计算资源的需求。
存储需求:除了梯度信息外,二阶优化器还需要存储额外的二阶导数信息,这会显著增加内存使用。
适用场景
由于内存和计算资源的高需求,二阶优化器通常适用于以下场景:
小规模模型:参数数量较少的模型。
高精度需求:需要更快收敛和更高精度的任务。
充足的计算资源:有足够的内存和计算能力支持二阶优化。
四、代码实现。
优化器 AdamW 必须为模型的每个参数创建并存储 2 个新参数。
AdamW优化器需要为模型的每个参数创建并存储两个新参数,主要是因为它结合了动量和自适应学习率的机制:
动量参数:AdamW使用动量来加速梯度下降的收敛速度。动量参数(通常记作 ( m_t ))是梯度的指数加权移动平均。使用动量来平滑梯度更新,累积之前的梯度信息,使得参数更新更平滑和快速。
自适应学习率参数:AdamW还使用自适应学习率来调整每个参数的学习率。自适应学习率参数(通常记作 ( v_t ))是梯度平方的指数加权移动平均。通过计算梯度平方的指数加权移动平均来调整每个参数的学习率,使得优化过程更加稳定。
Paged AdamW优化器也使用动量和自适应学习率。Paged AdamW是AdamW的一个变体,主要区别在于它的内存管理方式。Paged AdamW允许优化器状态在GPU RAM和CPU RAM之间切换,以节省内存。
Paged AdamW的独特之处在于它的内存管理策略。当GPU RAM不足时,优化器状态会被卸载到CPU RAM。这种分页机制虽然会使全量微调(FFT)变慢,但NVIDIA GPU的统一内存技术确保了性能仍然足够快。
['adamw_hf', 'adamw_torch', 'adamw_torch_fused', 'adamw_torch_xla', 'adamw_torch_npu_fused', 'adamw_apex_fused', 'adafactor', 'adamw_anyprecision', 'sgd', 'adagrad', 'adamw_bnb_8bit', 'adamw_8bit', 'lion_8bit', 'lion_32bit', 'paged_adamw_32bit', 'paged_adamw_8bit', 'paged_lion_32bit', 'paged_lion_8bit', 'rmsprop', 'rmsprop_bnb', 'rmsprop_bnb_8bit', 'rmsprop_bnb_32bit', 'galore_adamw', 'galore_adamw_8bit', 'galore_adafactor', 'galore_adamw_layerwise', 'galore_adamw_8bit_layerwise', 'galore_adafactor_layerwise', 'lomo', 'adalomo']
使用paged_adamw_8bit优化器LoRA微调qianwen2.5-14b:
优化器换成:optim="paged_adamw_32bit'",