神经网络项目的构成 1.数据模块输入数据所在的文件地址or数据内容输出一个存储了数据XY的数据结构。Ⅰ.数据集的划分1. 简单二分法训练集Training 测试集Testing划分将全部可用数据Available Data拆分为训练集Training用于模型训练更新参数w、b其保留XY测试集Testing作为「留存样本holdout sample」绝不参与训练仅在训练完成后评估模型最终性能。其只保留XY隐藏适用场景入门练习、简单项目无需频繁调参。2. 专业三分法训练集Training 验证集Validation 测试集Testing划分将全部可用数据进一步拆分为训练集Training核心训练数据用于更新模型参数其保留XY参与训练数据量一般占60%-80%验证集Validation验证留存样本在训练过程中评估模型效果、调整超参数如学习率、优化器选择是超参数调优的试金石避免在测试集上作弊其保留XY不参与训练测试集Testing测试留存样本仅在模型最终定型后使用模拟从未见过的真实数据评估模型泛化能力。绝不参与训练只能用一次否则失去「未知数据」的意义。其只保留XY隐藏适用场景科研、工业界项目是专业开发的标准划分。数据集划分必须随机用恋爱场景解释就是❌ 错误做法把来自学校学生的样本全放训练集把来自社会人士的样本全放测试集 → 训练出来的模型完全不适配社会上的情况✅ 正确做法随机打乱所有样本后再划分保证训练集、验证集、测试集的分布一致比如都包含不同外貌、性格、学历、学校/社会环境的人这样模型学到的规律才通用。这张图用「恋爱预测」的生活化类比把抽象的数据集划分讲得非常透彻TR 学规律调参、VA 调规律调超参、TE 验规律验参数据批量训练的必要性为什么不能用所有数据算 loss核心问题如果每次都用全部数据算loss会触发 3 个致命问题1. 内存 / 算力爆炸最直接的问题真实项目中数据量极大比如百万级图片、千万级文本一次性把所有数据塞进模型会直接导致内存溢出OOM程序崩溃即使能跑计算速度也极慢完全无法高效训练。2. 梯度更新不及时训练效率极低用全量数据算loss→ 得到的是「全量梯度」更新一次参数要遍历所有数据训练进度极慢比如有 500 个样本要等 500 个样本都算完才更新一次参数对批量训练比如每 16 个样本就更新一次参数loss下降更快训练效率高得多。3. 无法实现「在线学习 / 随机梯度」优化原理问题图中的同心圆是损失函数的等高线红色箭头是「梯度下降方向」全量数据梯度箭头方向非常平滑沿着「平均梯度」走容易卡在中间的局部最优批量数据梯度箭头会轻微抖动因为是小批量样本的梯度反而更容易走到最中心的全局最优若用小批量 / 单个样本梯度带有「噪声」方向会轻微抖动反而更容易跳出局部最优、找到全局最优这也是 SGD 的核心优势。因此取数据不需要全量小批量取数既高效又能优化模型效果。2.模型模块先定义出自己的模型。然后输入数据X经模型前向传播输出预测值。其对应于我前篇文章所创建的fun(x, w, b)函数是模型学习的核心环节负责更新参数w、b输入Training Data训练集特征X、标签Y前向传播将x输入Model得到预测值​计算损失对比预测值和真实标签y计算loss参数更新基于loss反向传播求梯度用学习率lr优化模型参数。3.超参数模块定义除模型中内部参数以外的超参数。一般包括学习率优化器优化算法损失函数等。其对应与我前篇文章的lr0.001、sgd函数梯度下降算法、maeLoss函数损失函数是监控模型效果、调整超参数的环节绝不更新模型参数输入val Data验证集特征X、标签Y前向传播将x输入Model得到预测值​模型结构和训练阶段完全一致但是不参与训练效果评估对比预测值和真实标签y评估模型效果如计算验证集 loss、准确率等。4.模型循环训练1.配置与初始化设备指定将模型迁移到 GPU如果有或 CPU 上运行。监控指标初始化列表plt_train_loss用于记录训练损失初始化列表plt_val_loss用于记录验证损失min_val_loss初始化一个很大的值用于后续保存最优模型。2.设置学习轮数设置学习轮数对应与我前篇文章的for epoch in range(epochs):3.训练阶段是模型学习的核心环节负责更新参数w、b输入Training Data训练集特征X、标签Y前向传播将x输入Model得到预测值​计算损失对比预测值和真实标签y计算loss参数更新基于loss反向传播求梯度用学习率lr优化模型参数。对应前篇代码片段pred_y fun(batch_x, w_0, b_0) # Model → ŷ loss maeLoss(pred_y, batch_y) # loss 计算 loss.backward() # 反向传播求梯度 sgd([w_0, b_0], lr) # 用lr更新参数Model4.验证阶段是监控模型效果、调整超参数的环节绝不更新模型参数输入val Data验证集特征X、标签Y前向传播将x输入Model得到预测值​模型结构和训练阶段完全一致但是不参与训练效果评估对比预测值和真实标签y评估模型效果如计算验证集 loss、准确率等。对应代码片段# 验证阶段 model.eval() # 切换到评估模式 with torch.no_grad(): pred_y_val fun(X_val, w_0, b_0) # Model → ŷ val_loss maeLoss(pred_y_val, Y_val) # 效果评估5.模型保存min_val_loss是 “最优模型判定标准”只有验证集损失最低的模型才会被保存而非训练最后一轮的模型。训练后期模型会对训练集过拟合训练损失下降但验证损失上升保存 “验证损失最低” 的模型本质是选择泛化能力最强的版本。在真实项目中数据模块是最麻烦的数据清洗、异构格式解析、工程化加载、版本管理等琐碎工作占项目开发的大部分时间相比之下模型、超参数、训练循环都有成熟的模板 / 工具反而更容易实现