一、概念
1、导数和偏导数
导数是函数在某一点处关于单一自变量的变化率,即函数值随输入变量的微小变化而产生的瞬时变化率。导数的几何意义是表示函数图像在该点的切线斜率。示例:若 f(x)=x2,则 f′(x)=2x,表示在任意点 x 处,f(x) 的变化率是 2x。
偏导数是多元函数对某一个自变量的导数,而将其他自变量的值视为常数。
示例:若 f(x,y)=x2 * y,则:
- 关于x的偏导数=2x+y(将 y 视为常数),
- 关于y的偏导数=x2(将 自变量x的值视为常数)。
比较:
导数 | 偏导数 |
---|---|
针对一元函数 y=f(x) | 针对多元函数 z=f(x,y,…) |
只有一个自变量 | 对某一自变量求导,其他变量视为常数 |
几何意义:切线斜率 | 几何意义:沿坐标轴方向的斜率 |
2、梯度下降算法
梯度下降算法(Gradient Descent)是一种优化算法,用于最小化目标函数,例如损失函数或代价函数。梯度是目标函数关于各个参数的偏导数,表示了目标函数在每个参数方向上的变化率。梯度下降算法广泛应用于机器学习和深度学习模型的参数优化。
梯度下降算法的基本思想是,假设我们有一个目标函数 f(x1,x2,…,xn),其中x1,x2,…,xn是函数的参数,例如机器学习模型中的权重。梯度下降算法通过计算该函数在当前点的梯度,并沿着梯度的反方向(即负梯度方向)更新参数,使得目标函数的值逐步减少,最终收敛到局部最优或全局最优点(最小)。直观上,可以将目标函数/损失函数想象为一个山谷,梯度下降算法的作用类似于“顺着山坡往下走”,直到找到最低点,为最优解。
对于多元目标函数 f(x1,x2,…,xn),其梯度是一个向量,由所有变量的偏导数组成:
∇f=(关于x1的偏导数,关于x2的偏导数,…,关于xn的偏导数)
- 梯度指向函数值增长最快(变化率最大)的方向。
- 梯度下降中,我们沿梯度的反方向(即 −∇f)迭代更新参数,以减小(变化率)函数值。变化率趋近为0时候,为梯度下降法的最优解。
3、实例演示
目标函数: f(x,y)=x2+2y2(这是一个凸函数,最小值在 (0,0))。
步骤:
- 计算偏导数:关于x的偏导数=2x, 关于y的偏导数 = 4y
- 初始化:设 (x0,y0)=(1,1),学习率 α=0.1。
- 第一次迭代:
- x1=1−0.1×2×1=0.8
- y1=1−0.1×4×1=0.6
- 函数值从 f(1,1)=3 降至 f(0.8,0.6)=0.82+2×0.62=1.04。
4、学习率的调整策略
学习率(α)是梯度下降算法中最关键的超参数之一,它决定了每次参数更新时的步长大小,直接影响模型的收敛速度、稳定性和最终性能。过大:可能导致震荡(不收敛)或越过最优解。过小:收敛速度极慢,训练时间过长。
学习率与损失函数的关系:
- 凸函数:固定学习率可能收敛到全局最优。
- 非凸函数(如神经网络):学习率需动态调整以避免局部最优。
(1) 固定学习率
- 简单但需手动调参,适用于简单模型(如线性回归)。
- 典型值:0.001、0.01、0.1(根据问题规模调整)。
(2) 学习率衰减(Learning Rate Decay)
逐步减小学习率,平衡初期快速收敛和后期稳定性:
- 指数衰减:αt=α0⋅e−kt
- 逆时衰减:αt=α0/(1+kt)
- 余弦退火:周期性调整学习率(适合深度学习)。
(3) 自适应学习率方法
自动调整不同参数的学习率:
方法 | 原理 | 优点 |
---|---|---|
Momentum | 引入动量项,加速收敛并减少震荡(类似惯性) | 缓解局部最优 |
Adagrad | 对稀疏特征赋予更大学习率,适合处理稀疏数据 | 自适应调整 |
RMSprop | 改进 Adagrad,解决其学习率过早衰减问题 | 适合非凸优化 |
Adam | 结合 Momentum 和 RMSprop,主流深度学习优化器 | 快速收敛、鲁棒性强 |
5. 学习率与其他问题的关联
- 梯度消失/爆炸:学习率过大可能加剧梯度爆炸(LSTM/RNN 中常见)。
- 批量大小(Batch Size):学习率通常需随 Batch Size 增大而线性增加(如 Large Batch Training)。
- 正则化:高学习率可能需配合更强的权重衰减(L2 正则化)。
6. 代码示例
(1) PyTorch 中的学习率设置
import torch.optim as optim
model = ... # 定义模型
optimizer = optim.SGD(model.parameters(), lr=0.01) # 固定学习率
# 学习率衰减
scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1)
for epoch in range(100):
train(...)
scheduler.step() # 每30轮学习率×0.1
(2) 使用 Adam 优化器
optimizer = optim.Adam(model.parameters(), lr=0.001) # 默认学习率
总结
- 学习率是梯度下降的“步长”,直接影响训练效果。
- 调参建议:从小值开始(如 0.001),结合衰减策略或自适应方法(如 Adam)。
- 深度学习:优先尝试自适应优化器,而非固定学习率。
通过合理设置学习率,可以显著提升模型收敛速度和性能!
二、开发框架
XGBoost 和 LightGBM 是两个基于梯度提升决策树(Gradient Boosted Decision Tree, GBDT) 的高效机器学习库,主要用于结构化数据的分类和回归任务。
XGBoost(Extreme Gradient Boosting)
核心特点
- 梯度提升思想:通过迭代地构建决策树模型,每棵树学习前序模型的残差(损失函数的负梯度),逐步优化预测结果。
- 正则化优化:内置 L1/L2 正则化(
lambda
和alpha
参数),防止过拟合。 - 高效实现:支持并行计算(多线程)、分布式训练,内置交叉验证(
cv
参数)和早停机制(early_stopping_rounds
)。 - 灵活的数据处理:支持缺失值(
missing
参数)和自定义评估指标。
LightGBM(Light Gradient Boosting Machine)
核心特点
- 梯度提升优化:继承 GBDT 思想,但引入了 梯度单边采样(Gradient One-Side Sampling) 和 互斥特征捆绑(Exclusive Feature Bundling),显著减少计算量。
- 内存友好:直接使用内存存储数据,适合大数据集。
- 支持多种数据类型:除数值型外,还支持类别型(
categorical
参数)和时间序列数据。 - 高效训练:采用叶子节点生长策略(Leaf-wise Growth)而非深度优先,速度更快,精度更高。