TF_OD API示例配置中train_hyperparameter为何用step而非epoch
TF OD API 训练配置采用step作为进度计数单位的设计考量
- 适配通用输入场景
TF OD API的设计目标是同时覆盖固定规模离线数据集、无明确样本边界的流式数据集两类使用场景:后者包括在线实时增强生成的训练数据、持续接入的增量标注数据、合成数据等,这类输入没有固定的总样本量,根本无法定义「遍历全量数据一次」的epoch概念。用step(即完成一次batch数据处理、一次全局参数更新)作为统一计数单位,不需要提前获取数据集总规模,对所有输入类型都兼容。 - 保障分布式训练的进度对齐
在多卡/多节点分布式训练场景下,不同硬件节点的数据加载速度、batch切分逻辑可能存在细微差异,如果以epoch作为调度单位,很容易出现节点间进度不同步的问题。step计数和全局参数更新次数严格绑定,无论使用多少张训练卡、单卡batch size设置为多少,完成一次全局参数更新即计为1个step,学习率调度、checkpoint保存、训练终止等逻辑都可以严格对齐,不会出现进度漂移。 - 训练调度逻辑更可控
目标检测模型的训练策略(比如学习率warmup、分段学习率衰减)大多是按参数更新次数设计的,用step作为计数单位时,调整batch size、更换数据集规模都不需要重新换算调度节点对应的数值,做对比实验时固定总step数,就能保证不同实验配置下的参数更新总次数一致,变量控制更严谨。 - 无训练数据遍历遗漏风险
关于step计数可能导致训练末期无法遍历全量数据的疑虑,实际上已知batch size的前提下step和epoch本身就可以互相换算,二者没有本质差异:如果使用固定规模的离线数据集,完全可以通过公式num_steps = (训练集总样本量 / 全局有效batch_size) * 目标训练epoch数计算出需要配置的总训练step数,填入配置文件的train_hyperparameter.num_steps字段即可,完全可以保证训练过程精准遍历对应轮次的全量训练数据,不会出现末尾数据漏训的问题。官方示例默认用step作为单位,只是提供了通用性更强的配置选项,并不强制用户必须脱离epoch逻辑设置参数。
内容的提问来源于stack exchange,提问作者Roy
相关产品推荐
相关产品推荐

