一、三大数据集:角色、作用与注意事项
训练集(Training Set)
-
占比:通常 60-80%
-
主要作用:模型学习数据模式,更新权重参数。直接用于“学习” 。模型通过反复查看训练集中的数据和标签(答案),调整自身的内部参数(权重),来学习从输入到输出的映射规律(比如识别猫的图片)。
-
使用方式:每个训练周期(epoch)都使用
-
目标:让模型记住知识(拟合数据)。
-
关键注意:
- 需要足够大的数据量以确保学习有效性
- 需要合适的数据预处理和增强
- 训练过程中会看到模型对其"过拟合"是正常现象
验证集(Validation Set)
-
占比:通常 10-20%
-
主要作用:
- 监控训练:检测过拟合/欠拟合,监控模型在验证集上的表现。当训练集误差持续下降,但验证集误差开始上升时,说明模型可能过拟合了(只记住了训练数据的噪声),此时应停止训练。
- 超参数调优:选择最佳超参数配置,调整学习率、网络层数等不由模型自己学习 的参数,根据验证集的表现找到最优组合。
- 模型选择:比较不同模型架构,比较不同模型架构(如线性模型 vs. 神经网络)在验证集上的表现,选择更好的一个。
- 早停决策:确定最佳停止训练时机
-
关键特性:
- 不参与权重更新:仅用于前向传播,计算评估指标(准确率、损失等)
- 可多次使用:在整个调参过程中反复使用
- 决策依据:所有超参数调整的唯一依据
- 验证集影响权重的路径
text
验证集表现 → 修改超参数(如学习率η) → 影响下次训练中的权重更新 → 获得新权重 ↑ ↓ 评估 不直接修改 仅前向传播 而是改变更新规则关键在于:验证集本身不直接参与权重更新
-
目标:指导如何优化模型和学习过程,但不参与直接学习
测试集(Test Set)
-
占比:通常 10-20%
-
主要作用:
- 最终评估:提供无偏的性能估计,用于“最终评估” 。在整个模型开发流程完全结束后(包括用验证集确定了最佳模型和超参数),我们使用测试集对模型进行一次唯一且最终的性能评估。
- 模拟生产环境:评估模型在真实场景的表现
-
黄金法则:
- 一次性使用:仅在最终评估时使用一次
- 完全隔离:开发过程中绝对不可见
- 绝不调参:不能根据测试集结果调整任何参数
-
- 目标:提供对模型泛化能力的无偏估计,即预测未来新数据的能力。这个分数是论文中报告的数字,也是决定模型能否上线的依据。
标准工作流程图示:

记住这个流程:用训练集学习 -> 用验证集调优和选择 -> 用测试集做最终、一次性的评估。
重要原则与补充:
- 数据独立同分布:理想情况下,这三个集合都应来自同一个数据分布,且是随机抽样得到的。这样才能保证评估的有效性。
- 验证集和测试集的必要性:如果只用训练集和测试集,开发者可能会在测试集上反复调参,导致测试集被“污染”,其评估结果不再公正。引入验证集就是为了建立一个“缓冲区”。
- 划分比例:常见比例如 60%/20%/20% 或 70%/15%/15%。数据量极大时(如百万级),验证/测试集的比例可以更小(如 98%/1%/1%)。
- 交叉验证:在小数据集上,为了更充分地利用数据,会使用 K折交叉验证:将训练集分成K份,轮流将其中一份作为验证集,其余作为训练集,最后取平均性能。但测试集仍然需要单独保留,用于最终评估。
二、权重修改准则与优化方法
第一部分:权重修改准则 —— 我们“为什么”要修改权重?
权重的修改不是随机的,而是遵循一个核心准则:通过最小化(或最大化)一个目标函数来调整权重,使模型的预测输出尽可能接近真实值。 这个目标函数通常被称为 损失函数 或 代价函数。

第二部分:优化方法 —— 我们“如何”修改权重?
有了准则(最小化损失),我们需要具体的算法来指导权重的更新。这个过程就是优化。
1. 权重更新的基本原理
核心思想:梯度下降
几乎所有优化方法都基于 梯度下降 的思想。其核心是:
-
计算梯度:计算损失函数 L(w_old)关于每个权重w_old的偏导数,得到梯度向量 ∇L(w_old)。
- 梯度的意义:指向损失函数上升最快的方向。因此,负梯度方向就是损失函数下降最快的方向。
-
沿负梯度方向更新:将权重向负梯度方向移动一小步。
# 权重更新公式(梯度下降)
w_new = w_old - η * ∇L(w_old)
# 其中:
# η = 学习率(超参数)
# ∇L = 损失函数的梯度
# w = 权重参数
主要优化方法(梯度下降的变体)
根据计算梯度时使用的数据量不同,主要分为三类:
| 方法 | 如何计算梯度(关键区别) | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 批量梯度下降 | 使用全部训练集计算平均梯度。 | 梯度方向准确,收敛稳定。 | 计算开销大,速度慢;无法处理超出内存的数据集。 | 小型数据集,凸优化问题。 |
| 随机梯度下降 | 每次随机使用一个样本计算梯度。 | 计算快,可在线学习;有一定的随机性,可能跳出局部极小值。 | 梯度噪声大,收敛不稳定,容易振荡。 | 大规模数据集,非凸问题。 |
| 小批量梯度下降 | 每次使用一小批样本计算平均梯度。 | 最常用。平衡了速度与稳定性,利于GPU并行计算。 | 需要设置批大小这个超参数。 | 绝大多数深度学习场景。 |
2. 核心优化算法对比
基础的梯度下降只用了梯度的一阶信息。高级算法通过引入动量、自适应学习率等概念,使其更快、更稳。
| 优化器 | 适用场景 | 关键参数 | 优点 | 缺点 |
|---|---|---|---|---|
| SGD | 凸优化问题 | 学习率 | 简单、理论保证 | 收敛慢、易震荡 |
| SGD+Momentum | 非凸优化 | 学习率、动量(0.9) | 加速收敛、减少震荡 | 可能错过最优解 |
| Adam | 深度学习默认 | lr, β1, β2 | 自适应学习率、收敛快 | 可能泛化稍差 |
| RMSProp | RNN/LSTM | 学习率、衰减率 | 适合非平稳目标 | 对学习率敏感 |
3. 权重更新实战准则
准则1:梯度检查
- 目的:确保反向传播正确实现
- 方法:数值梯度 ≈ 解析梯度
- 公式:
|数值梯度 - 解析梯度| / (|数值梯度| + |解析梯度|) < 1e-7
准则2:学习率选择策略
# 学习率范围测试(LR Range Test)
learning_rates = [1e-6, 1e-5, 1e-4, 1e-3, 1e-2, 1e-1]
# 选择损失下降最快但未震荡的学习率
准则3:批次归一化(BatchNorm)
- 作用:稳定训练,允许更高学习率
- 位置:卷积/全连接层后,激活函数前
- 注意:训练和推理时行为不同
准则4:权重初始化策略
| 初始化方法 | 适用激活函数 | 公式/原理 |
|---|---|---|
| Xavier/Glorot | Tanh, Sigmoid | std = sqrt(2/(n_in + n_out)) |
| He初始化 | ReLU及变体 | std = sqrt(2/n_in) |
| LeCun初始化 | SELU | std = sqrt(1/n_in) |
三、超参数修改准则与调优策略
第一部分:超参数修改的核心理念与准则
什么是超参数?
超参数是训练开始前人为设定的参数,模型无法从数据中直接学习。它们是训练过程的"控制旋钮"。
主要超参数类别:
- 模型架构相关:网络层数、隐藏层神经元数、卷积核尺寸、激活函数选择等
- 优化过程相关:学习率(最重要!)、优化器类型、动量系数、批次大小
- 正则化相关:L1/L2正则化系数、Dropout率、数据增强强度
- 训练调度相关:训练轮数、学习率衰减策略、早停耐心值
超参数优先级(调整顺序)
第一优先级(必须调): 学习率、批次大小
第二优先级(重要): 网络结构、优化器参数
第三优先级(精细调): 正则化参数、学习率调度
第四优先级(可选): 其他超参数
修改的核心准则:平衡偏差与方差
这是超参数调优的根本指导思想:
优先级:
| 场景 | 训练误差 | 验证误差 | 诊断 | 优先级 |
|---|---|---|---|---|
| 高偏差 | 高 | 高 | 欠拟合 | 优先解决 |
| 高方差 | 低 | 高 | 过拟合 | 其次解决 |
| 两者都高 | 高 | 非常高 | 严重欠拟合+过拟合 | 先偏差后方差 |
| 理想情况 | 低 | 低 | 良好拟合 | 无需调整 |
具体诊断与修改准则:
| 现象 | 可能原因 | 修改方向(准则) |
|---|---|---|
| 训练损失下降慢/不下降 | 学习率太小、模型太简单 | 增大学习率、增加模型容量(层数/宽度)、减少正则化 |
| 训练损失振荡大 | 学习率太大、批次太小 | 减小学习率、增大批次大小、使用梯度裁剪 |
| 训练损失正常但验证损失高 | 过拟合、数据分布不一致 | 增强正则化(Dropout/L2)、数据增强、简化模型、获取更多数据 |
| 训练和验证损失都高 | 严重欠拟合、模型架构不适合 | 大幅增加模型复杂度、检查数据质量、更换模型架构 |
第二部分:具体超参数调优准则
学习率(Learning Rate)
-
范围:通常 1e-6 到 1
-
调优策略:
# 学习率调度策略 1. 固定学习率:适合简单任务 2. 阶梯下降:每N个epoch减半 3. 余弦退火:平滑周期性调整 4. One Cycle Policy:先升后降,快速收敛 -
诊断准则:
- 损失不下降 → 学习率太小
- 损失NaN/震荡 → 学习率太大
- 验证损失先降后升 → 考虑早停或衰减
批次大小(Batch Size)
-
经验值:32, 64, 128, 256
-
调整准则:
- GPU内存允许范围内尽量大
- 线性缩放规则:batch size乘以k → 学习率乘以k,增大 batch size 时,通常可适当增大学习率。
- 小batch size通常泛化更好但训练更慢
正则化参数
| 正则化类型 | 超参数 | 调优准则 | 典型值 |
|---|---|---|---|
| L2正则化 | λ | 过拟合时增大 | 1e-4, 1e-5 |
| Dropout | p | 过拟合时增大丢弃率 | 0.2-0.5 |
| 数据增强 | 增强强度 | 始终使用,强度逐渐增加 | - |
网络结构超参数
# 逐步复杂化准则
1. 从浅层网络开始(如2-3层)
2. 逐步增加层数,直到验证集性能不再提升
3. 每层神经元数:通常从大到小(如512→256→128)
4. 使用残差连接(ResNet)解决深度网络梯度消失
第三部分:系统性调参方法
主流搜索方法
| 方法 | 原理 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 手动搜索 | 基于经验手动调整 | 直观,可以利用领域知识 | 效率低,不系统 | 初步探索、调试 |
| 网格搜索 | 在预设网格上穷举所有组合 | 系统全面,易于并行 | 维度灾难,计算成本高 | 超参数少(≤4) |
| 随机搜索 | 在预设范围内随机采样 | 比网格搜索高效,能发现意外好解 | 可能错过最优区域 | 大多数情况,推荐 |
| 贝叶斯优化 | 建立代理模型预测目标函数,智能选择下一个采样点 | 非常高效,样本利用率高 | 实现复杂,需要连续变量 | 计算成本高的场景 |
| 进化/遗传算法 | 模拟自然选择,优胜劣汰 | 能跳出局部最优,适合复杂空间 | 需要大量计算,参数多 | 超参数空间复杂时 |
网格搜索(Grid Search)
param_grid = {
'learning_rate': [0.1, 0.01, 0.001],
'batch_size': [32, 64, 128],
'dropout': [0.3, 0.5, 0.7]
}
# 优点:全面;缺点:计算成本高
随机搜索(Random Search)
param_dist = {
'learning_rate': loguniform(1e-4, 1e-1),
'batch_size': [32, 64, 128, 256],
'hidden_units': randint(50, 500)
}
# 通常比网格搜索更高效
贝叶斯优化(Bayesian Optimization)
# 使用Optuna等库
import optuna
def objective(trial):
lr = trial.suggest_loguniform('lr', 1e-5, 1e-1)
n_layers = trial.suggest_int('n_layers', 1, 5)
# 训练并返回验证集性能
return validation_score
自动化调参框架
# Ray Tune示例
from ray import tune
tune.run(
train_func,
config={
"lr": tune.loguniform(1e-4, 1e-1),
"batch_size": tune.choice([16, 32, 64])
},
num_samples=100,
resources_per_trial={"cpu": 2, "gpu": 0.5}
)
4. 训练过程监控与调整
学习曲线诊断
# 观察训练/验证损失曲线
if train_loss << val_loss: # 过拟合
solutions = ["增加正则化", "使用Dropout", "数据增强", "早停"]
elif train_loss ≈ val_loss且都高: # 欠拟合
solutions = ["增加模型复杂度", "增加训练轮数", "减小正则化"]
elif 损失震荡: # 学习率问题
solutions = ["减小学习率", "增加批次大小", "添加梯度裁剪"]
早停策略(Early Stopping)
class EarlyStopping:
def __init__(self, patience=10, min_delta=0):
self.patience = patience # 容忍轮数
self.min_delta = min_delta # 最小改进阈值
# 当验证损失连续patience轮未改善时停止
5. 超参数调优最佳实践
实践1:分阶段调参
不要同时调整所有超参数,应按重要性分层进行:
第一层(绝对核心):
学习率:对模型性能影响最大,应先确定合适范围
批次大小:影响训练稳定性和速度
优化器选择:Adam通常是好的默认选择
第二层(模型结构):
网络深度/宽度:控制模型容量
Dropout率/L2系数:控制正则化强度
第三层(调度策略):
学习率衰减策略:何时衰减、衰减多少
早停耐心值:防止过拟合
实践2:保留最佳检查点
# 保存验证集性能最佳的模型
checkpoint = ModelCheckpoint(
'best_model.h5',
monitor='val_accuracy',
save_best_only=True,
mode='max'
)
实践3:超参数敏感性分析
分析每个超参数对性能的影响程度
绘制超参数与验证性能的热图或折线图
实践4:超参数之间的相互作用
学习率与权重衰减相互影响
Dropout率与网络容量需要平衡
批次大小与BN层的效果相关
实践5:实用工具推荐
自动化调优:
Optuna(功能强大,支持多种采样算法)
Ray Tune(分布式调优,与PyTorch/TF集成好)
Hyperopt(经典的贝叶斯优化库)
可视化与追踪:
TensorBoard / Weights & Biases(记录和对比实验)
MLflow(管理完整的ML生命周期)
实用调整流程
1. 先用默认/经验参数跑一个 baseline
2. 观察训练/验证曲线:
- 欠拟合? → 增加模型容量、减小正则化、增加训练轮数
- 过拟合? → 增加正则化、使用 Dropout、早停、数据增强
3. 调学习率(最重要):
- 用学习率范围测试(LR Range Test)找合适范围
4. 调 batch size(通常设为 32/64/128)
5. 调正则化参数(L2、Dropout)
6. 调优化器参数(如 Adam 的 beta1, beta2, epsilon)
7. 循环 2-6,直到验证集性能满意
8. 最后在测试集上评估一次
四、完整工作流程示例
五、常见问题解决方案
问题1:训练集和验证集分布差异大
解决方案:
- 检查数据划分的随机性
- 确保预处理方式一致
- 考虑使用分层抽样
问题2:超参数组合爆炸
解决方案:
- 先进行粗粒度搜索
- 使用随机搜索而非网格搜索
- 利用迁移学习减少需要调的参数
问题3:计算资源有限
解决方案:
- 使用小规模实验确定大致范围
- 采用更高效的搜索算法(如贝叶斯优化)
- 考虑使用较小模型或数据子集进行初步调参
问题4:结果复现性差
解决方案:
- 固定随机种子
- 详细记录所有超参数和实验条件
- 使用版本控制记录代码和数据
六、实用检查清单
训练前检查
- 数据已正确划分为三个独立集
- 测试集已完全隔离
- 所有预处理只在训练集上计算统计量
- 设置了合适的权重初始化
- 选择了合适的优化器和初始学习率
训练中监控
- 定期在验证集上评估
- 保存最佳模型检查点
- 记录训练/验证损失曲线
- 监控梯度范数(防止梯度爆炸/消失)
调参后验证
- 最终模型只在测试集上评估一次
- 对比多个模型的测试集性能
- 进行统计显著性检验
- 记录所有实验细节以便复现
总结
权重更新是模型"学习知识"的过程,由优化算法自动完成;超参数调整是"选择学习方法"的过程,需要基于验证集性能进行人为或自动的优化。两者相辅相成,共同决定了模型的最终性能。正确使用三个数据集,遵循科学的调参准则,是机器学习项目成功的关键。
1万+

被折叠的 条评论
为什么被折叠?



