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,则合并到相似类或复制补齐
超参搜索又用测试集 加第二层验证(嵌套交叉验证)或单独留一份 “最终测试” 锁进保险箱
Logo

脑启社区是一个专注类脑智能领域的开发者社区。欢迎加入社区,共建类脑智能生态。社区为开发者提供了丰富的开源类脑工具软件、类脑算法模型及数据集、类脑知识库、类脑技术培训课程以及类脑应用案例等资源。

更多推荐