1.num_workers 数据加载进程数
2.Batch Size 批大小 / 批次样本数
3.Learning Rate, LR 学习率
4.epoch 迭代次数
5.优化器、损失函数和梯度
6.数据处理和增强
7.数据集划分
一、num_workers数据加载进程数
- num_workers 是 PyTorch DataLoader 的一个参数,只在 CPU 端生效,作用是 用多进程并行地把数据从磁盘/内存加载到内存缓冲区,再送给 GPU。它不运行在 GPU 上,也不参与模型计算,只解决“数据供应”瓶颈。在训练时额外启动多少个并行任务来同时读取、预处理数据,保证 GPU 不断粮。
- pin_memory=True:与 num_workers 搭配使用,将加载到内存的样本锁定到固定内存区域,避免数据从 CPU 内存拷贝到 GPU 时的额外内存迁移开销,进一步提升数据投喂效率(尤其在 num_workers>0 时效果显著),且仅对 CPU→GPU 传输有效,无额外显存消耗。
- drop_last=True/False:当数据集样本数无法被 batch_size 整除时,是否丢弃最后一个不完整的 batch。 训练时可设为 True(保证每个 batch 规格一致,提升训练稳定性),验证 / 测试时设为 False(不丢弃样本,保证指标计算准确)。
1.代码位置
DataLoader(..., num_workers=k, ...)
- 主进程之外再起 k 个子进程;
- 每个子进程独立地读取、解码、数据增强;
- 子进程把样本放进 共享内存队列;
- 主进程从队列里拿数据,再 cuda() 送到 GPU
2.作用
- 掩盖数据 I/O 时间:GPU 训练一个 batch 的同时,CPU 已经在准备下一个/下几个 batch;
- 避免 GPU 饿死:若 num_workers=0,主进程自己读数据,遇到慢磁盘/大图片时 GPU 会空等。
3.最小 & 最大参数设置
| 值 |
含义 |
场景 |
| 0 |
单进程同步加载;无 IPC 开销,但最慢。 |
调试、Jupyter、Docker 容器里没开共享内存 /dev/shm 时。 |
| 1~2 |
轻度并行,安全起步。 |
小数据集、SSD、CPU 核少。 |
| 4~8 |
常见折中。 |
机械硬盘、常规 8~16 核机器。 |
| ≤ 逻辑 CPU 数 |
理论上限;再往上收益递减甚至反降。 |
你 20 核,实测 12~16 后速度不再涨。 |
| > 逻辑 CPU 数 |
进程切换开销 > 并行收益,变慢。 |
不推荐。 |
4.在CPU vs GPU 视角使用区别
| 维度 |
CPU 端 |
GPU 端 |
| 运行位置 |
仅 CPU 子进程 |
不参与 |
| 任务 |
读盘、解码、Augment、转 Tensor |
做前向/反向/参数更新 |
| 性能瓶颈 |
磁盘带宽、CPU 解码速度 |
计算量、显存带宽 |
| 参数影响 |
num_workers 越大,CPU 占用越高 |
对 GPU 无直接参数,只享受“不断粮”红利 |
| 典型现象 |
num_workers=0 时 GPU 利用率 0%→100% 抖动 |
利用率平稳 90%+ 说明管道喂饱 |
二、Batch Size批大小 / 批次样本数
-
Batch Size 是 PyTorch DataLoader(或训练循环)里每次前向-反向同时喂给 GPU 的样本数量;它只决定“一次算多少张图/条样本”,不参与数据加载方式的配置。
-
作用:在内存/显存允许范围内,越大 GPU 并行度越高、训练步数越少;但过大显存会 OOM,且需同步放大学习率以保持收敛。
-
gradient_accumulation_steps(梯度累积步数):当单卡显存不足以支撑大 batch 时, 通过多步前向 / 反向传播累积梯度,再一次性更新参数,等效于「虚拟大 batch」(等效 batch size = 实际 batch size× 累积步数),无需额外显存,即可实现大 batch 的训练效果(如提升泛化、配合 Linear Scaling)。
-
mixed_precision(混合精度训练):通过 FP16+FP32 混合精度计算,减少显存占用(通常可节省 50% 左右),从而支持更大的 batch size,同时不影响模型收敛效果,常见实现有torch.cuda.amp。
1.代码位置
DataLoader(..., batch_size=k, ...)
- 每个迭代返回 k 条样本(已堆成 [k, C, H, W] 或 [k, seq_len])。
- 多卡 DDP 时,每张卡实际分得 k / GPU 数,设置时按单卡显存计算。
2.作用
- 提高 GPU 利用率:矩阵乘法随 batch 增大而并行度提高。
- 减少训练步数:同样 epoch 内参数更新次数变少,需同步放大学习率(Linear Scaling)。
- 影响泛化:过大 batch 梯度噪声小,易陷入尖锐极小值;可用 LR Warmup + LARS/LAMB 缓解。
3. 最小 & 最大参数设置
| 值 |
含义 |
场景 |
| 1 |
最小;内存最低,梯度最噪声,收敛最不稳。 |
调试、显存极小、在线学习。 |
| 8~32 |
安全起步区;8 GB 卡可跑 224×224 图像。 |
单机 2080/3080/4090。 |
| 64~256 |
大 batch;需 LR×k。 |
11 GB+ 显存或多卡。 |
| > 512 |
超大 batch;需 Warmup + LARS/LAMB。 |
A100×8、TPU。 |
| OOM 前 |
最大上限;由显存、分辨率、序列长度共同决定。 |
倍增到 CUDA OOM,回退 20 %。 |
4.在 CPU vs GPU 视角使用区别
| 维度 |
CPU 端 |
GPU 端 |
| 是否参与计算 |
否,仅组 batch、转 Tensor |
是,一次性处理整个 batch |
| 内存占用 |
随 batch_size 线性↑(主存) |
随 batch_size 线性↑(显存) |
| 瓶颈表现 |
无直接瓶颈 |
过大→OOM;过小→GPU 空转 |
| 利用率 |
数据加载 CPU 占用几乎不变 |
batch 越大,GPU 计算效率越高 |
三、Learning Rate, LR学习率
- 优化器每次参数更新时的“步子大小”;直接决定模型能否收敛、收敛多快、以及会不会发散。
- 所有调度策略的「步数 / 周期」都与「epoch 总数、单 epoch 迭代步数(样本数 /batch size)」强相关。例如,StepLR(step_size=30)中的step_size指的是 30 个 epoch,而非 30 个 step;CosineAnnealingLR(T_max=total_epochs)中的T_max必须与总 epoch 数一致,才能实现完整的余弦衰减曲线,这样能让读者更清晰地落地调度策略。
1.代码位置
optimizer = torch.optim.SGD(model.parameters(), lr=1e-3, momentum=0.9)
optimizer = torch.optim.AdamW(model.parameters(), lr=3e-4)
2.作用
- 控制梯度下降步长,平衡“速度”与“稳定性”;
- 与 batch size、epoch、网络深度、损失函数尺度、优化器类型均联动;
- 训练全程可保持不变(常量)、分段下降(Step)、连续衰减(Cosine、Poly)、周期性重启(Cosine Restart、One-Cycle)、自适应(ReduceLROnPlateau)等。
3.最大最小设置
| 数量级 |
场景 |
备注 |
| 1e-1(0.1) |
传统 SGD + Momentum、ImageNet 初始 LR |
需配合大 batch(256+)+ Warmup,否则易发散 |
| 1e-2(0.01) |
中等网络、分类/检测默认起点 |
可接 Step 或 Cosine 下降 |
| 1e-3(0.001) |
Adam/AdamW 默认起点 |
对 Transformer、BERT、GPT 通用 |
| 3e-4(0.0001) |
Adam + DDP 大模型“万金油” |
OpenAI 论文推荐,LLM 常用 |
| 1e-4~5e-5 |
微调(Fine-tune)阶段 |
防止破坏预训练权重 |
| <1e-5 |
极小;用于最后一层或高分辨率微调 |
再小则更新过慢,训练时间爆炸 |
4.与其他核心参数的联动
| 参数 |
联动规则 & 经验 |
| batch size |
Linear Scaling:new_lr = old_lr × (new_batch / old_batch);超大 batch 需配合 Warmup(前几个 epoch 线性升 LR) |
| 优化器 |
SGD 常用 0.01~0.1;Adam 系列常用 1e-4~3e-4;LARS/LAMB 可放大到 1.0 以上 |
| 网络深度 |
残差/深层网络用较小初始 LR + Warmup,防止梯度爆炸 |
| 损失函数尺度 |
损失放大 n 倍,等效 LR 放大 n 倍;必要时加梯度裁剪 |
| epoch/迭代总步数 |
步数多时采用 Cosine、Poly、One-Cycle 等衰减策略,可避免末尾震荡 |
| 任务类型 |
分类→LR 可大;检测/分割→含多任务损失,LR 常降 1/2;生成对抗→生成器/判别器不同 LR |
5.主流调度策略
| 策略 |
简介 |
代码示例 |
| Step |
每 N epoch 乘 γ |
StepLR(optimizer, step_size=30, gamma=0.1) |
| Multi-Step |
指定里程碑下降 |
MultiStepLR(optimizer, milestones=[60,80], gamma=0.1) |
| Cosine Annealing |
平滑余弦降到 0 |
CosineAnnealingLR(optimizer, T_max=total_epochs) |
| Cosine Restart |
周期性重启 |
CosineAnnealingWarmRestarts(optimizer, T_0=10, T_mult=2) |
| One-Cycle |
先升后降+动量互补 |
OneCycleLR(optimizer, max_lr=3e-3, total_steps=steps) |
| Plateau |
指标停滞时下降 |
ReduceLROnPlateau(optimizer, mode='min', patience=5, factor=0.5) |
| Warmup + 任意 |
前若干步线性升 LR,再接上述策略 |
手写 or get_cosine_schedule_with_warmup(HuggingFace) |
四、epoch训练轮次 / 迭代周期
- 把整个训练集完整地过一遍即为一个 epoch;是衡量“模型见过所有样本一次”的基本单位,与 batch size、迭代步数(iteration)直接挂钩。
1.代码位置
for epoch in range(start_epoch, max_epochs):
train_one_epoch(...)
val(...)
scheduler.step()
2.作用
- 提供“完整遍历”概念,方便学习率调度、早停、模型保存、日志记录以 epoch 为粒度。
- 控制总训练样本曝光量:epoch 越大,模型见数据次数越多,拟合能力提高但过拟合风险提高。
- 与 batch size 共同决定总迭代步数total_steps = ceil(样本数 / batch_size) × epochs 因而影响训练时间、调度器衰减曲线、权重更新次数。
- 早停(Early Stopping)」:记录验证集的最佳指标(如准确率、损失值),当连续 N 个 epoch(patience)指标无提升甚至下降时,终止训练并加载最佳模型权重,避免无效训练和过拟合,这是 epoch 设置较大时的必备配套策略。
3.最小 & 常用范围
| 值 |
场景 |
备注 |
| 1 |
理论最小;仅用于快速冒烟测试或超大模型+超大数据(如 LLM 只跑 <1 epoch)。 |
需极大 batch + 极高 LR,配合 Warmup。 |
| 10~50 |
计算机视觉主流区间 |
CIFAR-10/100 常用 100-200;ImageNet 常用 90-120。 |
| 50~300 |
小数据集、对比学习、自监督 |
数据少靠多次迭代提性能,需强正则/早停。 |
| >300 |
极少见;GAN、扩散模型、深度生成任务可能跑 500+ |
必须配合早停(Early Stopping)或无限训练+阶段性验证。 |
4.其他核心参数的联动
| 参数 |
联动要点 |
| batch_size |
同 epoch 下,batch 越大→单 epoch 步数越少;若想保持相同“权重更新次数”需同步增加 epoch 或改用梯度累加。 |
| learning rate & scheduler |
Cosine/One-Cycle 等以 epoch 为周期;epoch 总数变化时需重设 T_max、T_0。 |
| dataset 大小 |
数据量↑可适当减少 epoch(ImageNet 1.2 M 图片 90 轮即可);数据量↓需增加 epoch 或强正则。 |
| early stopping |
若验证指标连续 N epoch 不提升则终止,防止过拟合。 |
| model checkpoint |
按 epoch 号保存,方便回滚与断点续训;epoch 编号写入文件名(ckpt_epoch_100.pth)。 |
5.实战建议
- 小数据(<10 k 图)→ epoch 可设 100~300,配合强正则(数据增强、Dropout、Weight Decay)与早停。
- 大数据(ImageNet 级)→ 90~120 epoch 足够;若用 Cosine LR,把 T_max 设成总 epoch 数即可。
- 超大模型/超大数据(LLM、 billion 级图片)→ <1 epoch 即可收敛,靠 大 batch + 高 LR + 梯度累加 实现。
- 断点续训时保存 (model, optimizer, scheduler, epoch),下次从 epoch+1 开始,避免重复计数。
- TensorBoard/Weights&Biases 记录:横轴用 global_step,但关键事件(LR 下降、最佳模型)标注 epoch 号,便于对照。
五、优化器、损失函数和梯度
- 损失函数是梯度的来源,梯度是优化器更新参数的依据,优化器是梯度的 “执行者”(决定如何利用梯度更新参数),三者形成「损失→梯度→参数更新」的闭环,让读者更清晰地理解三者的内在关联,而非孤立看待三个组件。
1.优化器Optimizer
- 根据当前梯度,对网络权重进行更新;决定“步子大小与方向”的长期策略(动量、自适应学习率、权重衰减等)。
- weight_decay(权重衰减)的单独说明:它是独立于 LR 的核心正则参数,直接影响模型过拟合程度, 可明确其取值范围(1e-5~1e-2)和适用场景(深层网络 / 大 batch 训练需增大权重衰减,微调任务需减小)。
- 优化器的「梯度清零方式」:除了optimizer.zero_grad(),还有model.zero_grad(),二者等效,但梯度累积时需注意清零时机(仅在累积步数达标、更新参数后清零)。
- 代码位置
optimizer = torch.optim.AdamW(model.parameters(), lr=3e-4, weight_decay=0.05)
| 优化器 |
简称 |
典型 LR |
优点 |
缺点 |
适用场景 |
| SGD |
随机梯度下降 |
0.01~0.1 |
简洁、泛化好 |
收敛慢、需调 momentum |
CV 分类/检测决赛 |
| SGD+Momentum |
– |
0.01~0.1 |
加速、抑制震荡 |
同 SGD |
同上,ImageNet 标配 |
| Adam |
– |
1e-4~3e-4 |
自适应、鲁棒 |
可能不收敛、泛化略差 |
NLP、GAN、初学者 |
| AdamW |
– |
1e-4~3e-4 |
解耦权重衰减 |
需配合 cosine 调度 |
Transformer、BERT、GPT |
| LARS/LAMB |
– |
可≥1.0 |
分层自适应 |
实现复杂 |
超大 batch、TPU 训练 |
**加粗样式**lr:外接学习率;
momentum:通常 0.9(SGD);
weight_decay:L2 正则系数,1e-4~0.1;
eps、betas:Adam 系列数值稳定。
2.损失函数Loss / Objective
- 量化模型输出与真值之间的“误差”,给出梯度计算的源头。
- 代码位置
criterion = nn.CrossEntropyLoss()
loss = criterion(logits, target)
loss.backward()
| 任务 |
损失函数 |
公式/特点 |
备注 |
| 分类 |
CrossEntropyLoss |
softmax + NLL |
多类单标签默认 |
| 二分类 |
BCEWithLogitsLoss |
sigmoid + BCE |
多标签/二分类 |
| 回归 |
MSELoss |
平均平方误差 |
数值预测 |
| 边框 |
SmoothL1Loss / L1-Loss |
鲁棒回归 |
R-CNN、YOLO |
| 分割 |
DiceLoss / FocalLoss |
缓解类别不平衡 |
医学影像 |
| 生成对抗 |
对抗损失 |
判别器+生成器互博 |
需要交替优化 |
3.梯度Gradient
- 损失对模型每个可学习参数求偏导,∂Loss/∂w,指示“参数朝哪个方向变小最快”。
- 代码位置
loss.backward()
optimizer.step()
optimizer.zero_grad()
| 概念 |
说明 |
常用接口 |
| 梯度累积 |
batch 太小时,多步累加梯度再一次性更新,等效扩大 batch |
loss.backward(); if (step+1)%K==0: optimizer.step(); optimizer.zero_grad() |
| 梯度裁剪 |
防止爆炸,限制最大范数 |
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=5.0) |
| 梯度消失/爆炸 |
深层网络 sigmoid/tanh 易出现;用 Residual、BN、ReLU、归一化初始化缓解。 ReLU 缓解梯度消失,sigmoid 易导致梯度消失),与前文的网络训练场景形成呼应,提升紧密度。 |
— |
| 手动调试 |
查看层梯度均值/范数 |
print(p.grad.norm()) |
六、数据处理与增强(Data Processing & Augmentation)
- 训练流程最上游环节,负责“把原始样本变成模型爱吃的张量”,同时通过随机变换人为扩充样本空间,提升泛化、抑制过拟合。
1.PyTorch 核心接口
torchvision.transforms(图像)
torchaudio.transforms(音频)
transformers Tokenizer(文本)
自定义 torch.utils.data.Dataset + collate_fn
2.典型处理流水线(图像为例)
原始图片 → 解码 → 几何/色彩增强 → Tensor → 归一化 → GPU
train_tf = T.Compose([
T.RandomResizedCrop(224, scale=(0.08, 1.0)),
T.RandomHorizontalFlip(p=0.5),
T.ColorJitter(0.4, 0.4, 0.4, 0.1),
T.RandomRotation(10),
T.ToTensor(),
T.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225])
])
val_tf = T.Compose([
T.Resize(256),
T.CenterCrop(224),
T.ToTensor(),
T.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225])
])
3.增强分类
| 类型 |
常用算子 |
效果 |
注意 |
| 几何 |
RandomCrop、RandomFlip、RandomRotation、RandomAffine、CutOut、MixUp、CutMix |
提升平移/旋转/遮挡鲁棒性 |
目标检测需同步改 bbox;分割需同步改 mask |
| 色彩 |
ColorJitter、RandomGrayscale、GaussianBlur、Solarize、AutoAugment |
抗光照、抗色偏 |
医学图像慎用,可能改变病理特征 |
| 归一化 |
ToTensor → [0,1];Normalize → 减均值除方差 |
加速收敛、防止梯度爆炸 |
均值/方差要在训练集上预先计算 |
| 维度 |
RandomErasing、GridMask、Albumentations |
随机遮挡,强迫网络关注全局 |
与 CutOut 类似,可叠加 |
| Mix 方法 |
MixUp (λ blend)、CutMix (crop & paste)、FMix (FFT mask) |
样本级线性插值,软化标签,提升泛化 |
需配合标签平滑;检测/分割需改标签比例 |
4.不同任务专属增强
| 任务 |
关键增强 |
同步标签 |
| 图像分类 |
RandomCrop + Flip + ColorJitter + MixUp |
无需额外操作 |
| 目标检测 |
RandomHorizontalFlip + RandomCrop + Resize |
必须同步翻转/裁剪 bbox |
| 实例分割 |
同上 + RandomRotation |
同步 mask |
| 语义分割 |
RandomCrop + RandomFlip + ColorJitter |
同步 mask |
| OCR |
RandomRotation + Perspective + GaussianBlur |
同步 文本框坐标 |
| 自监督 |
MoCo v3: RandomCrop + ColorJitter + RandomGrayscale + GaussianBlur + Solarize |
多视图生成,无需人工标签 |
七、数据集划分(Dataset Split)
- 把可用样本按统计无偏、分布一致的原则切成互斥子集,分别用于训练、调参和最终性能评估,防止“偷看测试集”导致过拟合或虚高指标。
- 验证 / 测试集仅做「确定性预处理」(Resize、CenterCrop、Normalize),不做任何「随机变换」(如 RandomFlip、ColorJitter),保证指标评估的客观性和可重复性。
1.黄金比例
- 传统:训练集 Train 70 % | 验证集 Val 15 % | 测试集 Test 15 %
- 大数据(十万级+):98 % : 1 % : 1 % 即可,绝对数量足够。
- 小数据(千级以内):5 折交叉验证(5-fold CV) 代替单次划分,减少方差。
2.三种集合职责
| 集合 |
别名 |
用途 |
能否调超参 |
使用次数 |
| Training |
训练集 |
模型权重学习 |
✅ |
N 次 epoch |
| Validation |
验证集 / 开发集 |
选超参、早停、模型保存 |
✅ |
每 epoch 或每 N step |
| Test |
测试集 / hold-out |
仅最终汇报 |
❌ |
1 次,仅在全部训练结束后 |
3. 划分策略
- 数据集划分必须在所有数据预处理 / 增强之前完成,且划分后的子集互斥,训练集的预处理 / 增强逻辑不可作用于验证集 / 测试集,从根源上规避数据泄露问题,这是新手最容易踩坑的点,强化后更具指导性。
| 场景 |
方法 |
关键参数 |
说明 |
| 随机充分 |
sklearn.model_selection.train_test_split |
test_size=0.2, random_state=42, stratify=y |
分类任务必用 stratify 保持类别比例 |
| 跨对象划分 |
GroupSplit |
groups=patient_id |
同一病人/用户只出现在一个集,防数据泄漏 |
| 时序数据 |
TimeSeriesSplit |
按时间先后切 |
不允许“未来”预测“过去” |
| 小样本 |
K-Fold / 5-Fold |
K=5, shuffle=True |
每折都当一次验证,平均指标更稳 |
| 超大数据 |
随机 1 % 当 Val / 1 % 当 Test |
百万级图像常用 |
绝对数量仍>1 k,误差可接受 |
4.注意事项
| 坑 |
正确做法 |
| 随机切后同一张图的不同 patch 落在训练与测试 |
先划分图片级 UID,再裁 patch |
| 增强后回头划分 |
必须先划分 → 再增强,否则测试集信息泄露 |
| 交叉验证时把增强算子也 fit 到验证集 |
验证集只做 Resize + CenterCrop + Normalize |
| 分层不均衡 |
用 stratify;若某类<样本数/K,则合并到相似类或复制补齐 |
| 超参搜索又用测试集 |
加第二层验证(嵌套交叉验证)或单独留一份 “最终测试” 锁进保险箱 |
所有评论(0)