向AI转型的程序员都关注公众号 机器学习AI算法工程训YOLO这件事说难听点就是体力活。学习率蒙一个batch size试一轮mosaic开还是关再跑一次。工业缺陷检测这种场景1800张图摆在那里模型选型、超参配置、数据增强每一步都有人教你最佳实践但你真金白银白银下去结果往往和你预想的不太一样。3 月初Andrej Karpathy开源了AutoResearch。这项目做的事情很直接让AI Agent在H100上自主训练小型GPT模型靠一个git commit/reset的反馈循环跑了100多轮实验。https://github.com/karpathy/autoresearchKarpathy 的 Autoresearch 到底是啥考虑到有些盆友可能还没了解过 Autoresearch我先用些大白话尝试把这个项目的核心机制讲清楚已经上过手的可以跳过。原版做了什么这个项目做的事情很具体就是让 AI AgentClaude Code 或 Codex在 H100 上自主训练一个 5000 万参数的小型 GPT 语言模型。整个项目只有三个核心文件文件角色谁能改prepare.py数据准备 评估函数计算 val_bpb即验证集上的 bits per byte谁都不能改保证评估标准一致train.py模型架构 训练逻辑 所有超参数Agent 自由修改program.md给 Agent 的任务说明书实验规则、输出格式、约束条件人类写实验循环的流程大致是这样的Agent 修改 train.py → git commit → 在 H100 上训练 5 分钟固定时间预算→ 看 val_bpb 是否比上轮好 → 好就保留这次 commit差就 git reset 回滚 → 继续下一轮永不停止。一小时大约能跑 12 轮实验一个晚上能跑 100 轮左右。这里有一个设计上值得说下的地方固定 5 分钟时间预算意味着不同的模型架构在相同时间内会训练不同的步数。大模型跑得慢、步数少小模型跑得快、步数多。这也是自动形成了一种效率竞赛不是谁的模型最强而是谁能在 5 分钟内学到最多。我看完第一反应是——这东西能迁移到YOLO吗答案是能。而且跑出来的结果让我重新审视了调参这件事。下面是我完整复盘这次实验的全过程中间踩了哪些坑、最后怎么突破的以及为什么说这些经验可以迁移到RAG、OCR、Prompt优化这些更常见的业务场景。1 | AutoResearch的四要素框架在说YOLO之前先把AutoResearch的核心逻辑讲清楚。Karpathy Loop能跑起来依赖四个不可分割的要素要素定义作用可编辑文件Agent唯一能改的代码搜索空间的边界标量指标一个数字判断好坏优化的方向固定周期每轮实验耗时基本一致保证公平比较Keep/Discard比上轮好就留差就回滚防止退化实验循环是这样的Agent修改train.py → git commit → 训练固定时间5分钟 → 验证集指标比上轮好 → 保留/回滚 → 继续下一轮。永不停止。关键差异在于Agent不是网格采样而是在看懂历史实验结果之后提出假设、验证假设。 它可以改模型结构、改loss函数、改优化器实现——这是Optuna做不到的。传统AutoML搜的是数字学习率0.001到0.1之间采样AutoResearch搜的是代码。应用到YOLO上我只需要把这四要素重新映射可编辑文件 → train.pyYOLO训练脚本 标量指标 → mAP0.5越高越好 固定周期 → 15 epoch ≈ 3-7分钟H100 Keep/Discard → git commit/reset剩下的就是跑。2 | 为什么选YOLOv8 NEU-DETYOLO是工业视觉检测的事实标准YOLOv8又是其中最成熟的选择。Ultralytics维护API封装好一行model.train()启动训练一行model.val()拿指标。数据集选了NEU-DET东北大学发布的钢铁表面缺陷检测基准。1800张200×200灰度图6类缺陷斑块、划痕、麻面、夹杂、氧化铁皮压入、龟裂每类300张完美均衡。选这个数据集有三个原因第一数据量刚好。1800张图15 epoch一轮在H100上只要3-5分钟一个晚上能跑100轮实验。十万张级别的数据集单轮训练要几十分钟实验总量直接缩水。第二有公开benchmark可对标。Faster R-CNN在NEU-DET上跑出过76.6%YOLOv8默认配置是75.9%。方便评估优化效果在什么水平。第三工业场景贴合度高。钢铁缺陷检测是典型的质检场景和企业实际项目有共通之处。不过也要说清楚局限200×200分辨率偏低尤其是crazing龟裂类缺陷细密裂纹在放大后几乎和正常纹理分不清。YOLOv8默认输入是640×640意味着原图被放大3倍多引入插值伪影。yolov8m以上的模型在这种数据量下容易过拟合——后来的实验也验证了这一点。3 | 从V1到V2一次关键升级V1Mac上的轻量验证V1是在MacBook Pro M4 Pro上跑的。手搓了一个auto_experiment.py脚本模拟Karpathy LoopLLM看完历史实验结果后输出JSON格式的超参数建议脚本启动YOLOv8训练跑完15 epoch读取mAP比较keep或discard。跑了两个夜间session总计约9.5小时25轮实验。因为用的是Apple MPS单轮训练要14-38分钟平均22分钟比H100慢了一个量级。中间踩了两个坑MPS训练时生成的临时缓存文件把磁盘撑满导致崩溃SSD只剩37GB。后来限制了imgsz不超过640每轮训练后清理缓存才稳定住。合上笔记本盖子会触发macOS睡眠训练进程直接挂掉。得用caffeinate命令保持唤醒。最终mAP从baseline的0.719提到了0.7595.6%。LLM发现了几个关键规律学习率0.004-0.005最优baseline的0.01太高、关闭mosaic数据增强200×200小图四合一拼接后缺陷几乎不可见、5度微旋转有效但超过8度就有害。但V1有一个硬伤LLM只能输出超参数JSON不能直接改训练代码。搜索空间被锁死在数值参数层面。想试改模型结构、改loss函数做不到。要验证Agent自主改代码的完整闭环必须升级硬件和工具链。V2H100 Claude Code的完整闭环V2的升级就两件事GPU换成H100Agent换成Claude Code。但这两个变量一换能力边界完全不同了。维度V1V2硬件Mac M4 ProMPSNVIDIA H100 80GBCUDAAgentMiniMax 2.7只输出JSONClaude Code直接读写代码搜索空间超参数超参数 模型结构 Loss函数 Assigner策略单轮耗时~22分钟~3-7分钟实验总数25轮64轮H100按小时租3美元一小时实际花了10个小时。这个成本结构直接影响了实验设计的每一个决策模型尺寸只对比了n/s/m三个l和x没跑因为大模型训练慢、单轮成本高短跑用15 epoch快速筛选只有确认有潜力的配置才拉到100 epoch长跑验证。V2的64轮实验分成四个阶段每个阶段有明确的目标和退出条件Phase 13轮基线建立—— 对yolov8n/s/m三个尺寸各跑一次15 epoch基线淘汰不值得继续投入的模型。Phase 2~15轮超参搜索—— 在保留的模型上做系统性超参搜索lr、batch、optimizer、augmentation。Phase 32轮长跑验证—— 将Phase 2冠军以100 epoch长跑验证短跑结果是否可靠。Phase 4~45轮结构与Loss探索—— 在超参天花板之上尝试代码级突破。分阶段的好处是给Agent一个课程表。全参数空间太大如果一上来就让Agent同时搜学习率、模型结构、loss函数它很容易迷失方向。分阶段相当于每次只打开一扇门确认天花板位置之后再进入下一个阶段。4 | 64轮实验从超参天花板到Loss突破Phase 1-2超参搜索的天花板Phase 1很快出了第一个意外最大的yolov8m表现最差。模型参数量mAP0.5结论yolov8n~3M0.7294保留yolov8s~11M0.7304保留yolov8m~26M0.7193淘汰1800张200×200小图模型太大反而过拟合。yolov8m直接淘汰后续只保留n和s两条路线。Phase 2在n和s两条路线上做系统超参搜索。V1积累的先验lr 0.004-0.005最优、关闭mosaic、微旋转5度作为起点但不是标准答案。搜索过程中有几个关键节点s线上hp_s_002batch64达到0.7625成为阶段冠军n线上hp_n_005AdamW, lr0.001达到0.7553。之后连续多轮无法突破这个水平——imgsz800更慢还更差、degrees3不如5、scale0.10/0.20不如0.15全部discard。判定超参搜索已经充分天花板到了。Phase 3短跑冠军 ≠ 长跑冠军把Phase 2的两条路线冠军分别以100 epoch做长跑训练验证短跑结果是否可靠。结果出现反转模型15ep短跑mAP100ep长跑mAP排名变化yolov8shp_s_0020.7625第10.7472跌至第2yolov8nhp_n_0050.7553第20.7601升至第1yolov8s短跑赢了长跑反而输了。1800张小图上11M参数的s模型在100 epoch的训练量下开始过拟合后半段验证集成绩反而往下掉。3M参数的n模型泛化更好100 epoch下还在持续收益。这个发现直接改变了后续策略所有Phase 4的探索都以yolov8n为基础不再在s上花预算。另一个收获是确认了超参数天花板的位置conv_n_001yolov8n 100ep的0.7601基本就是纯超参优化能到的极限了。要想继续往上走必须在模型结构或者训练目标层面做文章。Phase 4a结构改造十轮全灭超参数天花板确认之后Agent开始尝试修改模型结构来寻找突破。具体做法是在train.py里动态生成YAML结构变体通过替换backbone或head中的特定层来插入新模块。把backbone最深层的C2f替换成C2PSA带注意力的版本只需要改一行配置base_yaml[backbone][8][-1,3,C2PSA,[1024]]试过的改造和结果实验改动mAP0.5vs基线0.760struct_n_001C2PSA backbone P50.7408-0.019struct_n_002PSA after SPPF0.6586-0.101struct_n_003C2PSA head P50.7179-0.042struct_n_004C2fPSA backbone P50.7379-0.022struct_n_005C2fPSA head P50.7048-0.055struct_n_006A2C2f backbone P50.7285-0.032struct_n_007A2C2f head P50.6990-0.061struct_n_008A2C2f head P40.7364-0.024struct_n_009A2C2f head P30.7361-0.024neck_n_001YOLOv8-P2多尺度头0.5143-0.246十轮结构改造全部负收益。最惨的一次是neck_n_001换了官方YOLOv8-P2多尺度检测头mAP直接从0.76跌到0.514几乎腰斩。三种不同的注意力模块C2PSA、C2fPSA、A2C2fbackbone和head都试了P3/P4/P5各层级也覆盖了。如果放错位置或者用错模块总该有一个组合能涨。但一个都没有。最终结论不是没找到正确的打开方式而是在1800张200×200图像这个量级上YOLOv8n的3M参数已经是模型容量和数据规模之间比较好的平衡点了。往上加东西只会打破这个平衡。NEU-DET的缺陷特征主要靠纹理和中层特征来区分不依赖深层语义信息。这些额外模块引入的参数量超过了它们带来的表达能力增益导致训练不稳定。说白了数据量撑不起更大的模型容量。Phase 4b改Loss找到突破口结构路线走不通之后Agent转向了loss函数和Task-Aligned AssignerTAL的优化。这条路线最终成了整个项目的关键突破口。先解释一下TAL。YOLO训练时模型会在每张图上生成几千个预测框但只有一小部分是真正对应缺陷的正样本。TAL就是决定哪些预测框算正样本的分配器。它有几个核心参数topk控制每个真实目标最多匹配几个预测框alpha和beta控制匹配时分类得分和定位得分的权重比例。分配太松模型学到的信号里噪声太多分配太紧模型又学不到足够的正例。focused-TAL的核心改动是重写这个分配器在正样本分配时给crazing最难的龟裂类额外加一个boost系数classCrazingFocusedTaskAlignedAssigner(TaskAlignedAssigner): def__init__(self,*args, crazing_boost:float1.0,**kwargs): super().__init__(*args,**kwargs) self.crazing_boost crazing_boost defget_box_metrics(self, pd_scores, pd_bboxes, gt_labels, gt_bboxes, mask_gt): align_metric, overlaps super().get_box_metrics( pd_scores, pd_bboxes, gt_labels, gt_bboxes, mask_gt) if self.crazing_boost !1.0: gt_is_crazing gt_labels.squeeze(-1).eq(0).unsqueeze(-1) boost torch.where(gt_is_crazing, torch.full_like(align_metric, self.crazing_boost), torch.ones_like(align_metric)) align_metric align_metric * boost return align_metric, overlaps逻辑很简单如果当前真实框是crazing类就把对齐得分乘以一个boost系数。效果是crazing的预测框更容易被选为正样本模型在梯度更新时会更多地学习这个难类别的特征。推进过程先试最简单的方案给crazing类的分类loss加权x2、x3效果一般没超过基线。然后开始调TAL参数本身topk、alpha、beta同时结合类别加权和boost逐步逼近。loss_n_005是转折点topk20, alpha1.0, beta3.0, crazing_boost2.0mAP达到0.7624首次超过长期霸榜的conv_n_0010.7601。loss_n_006和loss_n_007持续提升确认了这个方向不是偶然。loss_n_007把topk保持20、beta降到2.5、boost提到2.2mAP达到0.7729成为新的短跑冠军。之后Agent在focused-TAL的参数空间里又精调了二十多轮搜索范围快速收缩从最初大范围探索topk 15-24, beta 2.3-4.0, boost 1.5-2.3到最后集中在一个很小的区间topk 21-24, beta 2.6-2.9, boost 2.0-2.15。长跑验证也做了好几轮。这里出现了一个有趣的现象短跑最优配置拿去跑100 epoch不一定是长跑最优。conv_loss_004基于短跑冠军loss_n_015跑100 epoch只拿到0.7584。而conv_loss_015基于loss_n_006的参数topk24, beta2.9, boost2.0跑100 epoch反而拿到了0.7726成为最终的长跑冠军。Phase 3那个短跑冠军≠长跑冠军的结论在loss阶段又应验了一次。最终成绩汇总里程碑实验mAP0.5crazing AP提升基线baseline_n15ep0.72940.305-超参天花板conv_n_001100ep0.76010.4430.031短跑最优loss_n_01515ep0.77450.4380.045长跑最优conv_loss_015100ep0.77260.4690.043从baseline的0.729到最终的0.773总提升5.9%。其中超参搜索贡献了前4.2个百分点focused-TAL贡献了最后1.7个百分点。crazing类AP从0.305提升到0.46953.8%是所有类别中改善幅度最大的。5 | 三条可以带走的工程结论结论一迭代次数要和数据规模匹配这条结论在V2里被验证了两次。第一次是Phase 3的模型选型yolov8s在15 epoch短跑中以0.7625领先yolov8n的0.7553。但拉长到100 epochyolov8s跌到0.7472yolov8n反而涨到0.7601排名直接反转。第二次是Phase 4b的loss优化短跑冠军loss_n_01515ep, 0.7745拿去跑100 epoch只拿到0.7584。反而是短跑排名靠后的loss_n_006的参数跑100 epoch拿到了0.7726的长跑最优。两次反转是同一个模式短跑赢家长跑输。数据量决定了有效迭代次数的上限。数据越少这个上限越低超过之后模型就是在过拟合。参数越多的模型或者拟合速度越快的配置越容易在短跑阶段看起来学得好但实际上是在记忆训练集。所以小数据集千级别用少epoch快速筛选可以但最终结论必须拿Top-N配置做长跑验证大数据集万级别以上短跑和长跑的排名一致性会更高如果你也在用Karpathy Loop做实验短跑筛选 长跑确认建议是标准流程而不是可选步骤。结论二小数据集上加模块不如减模块Phase 4a的10轮结构改造贡献了整个V2最惨不忍睹的结果10轮全灭最惨的neck_n_001直接从0.76跌到0.514。排查其实很系统三种注意力模块backbone和head都试了P3/P4/P5各层级也覆盖了。如果是放错位置或者用错模块的问题总该有一个组合能涨。但一个都没有。最终结论不是没找到正确的打开方式而是这个任务在当前数据规模下根本不需要额外的注意力模块。工厂实际场景中能拿到的标注数据往往就是几百到几千张的量级。很多朋友拿到一个检测任务第一反应是加个注意力模块、换个更大的backbone。但如果你的数据量撑不起更大的模型容量这些操作的效果大概率是负的。给一条简单的判断标准如果你的训练集不到5000张在加任何结构模块之前先评估下基础模型是不是已经够用了如果val_loss在训练后期有明显上升的趋势那大概率是过拟合。这时候应该想办法减模型或者加数据而不是堆模块。结论三改Loss是性价比最高的突破口Phase 4a和Phase 4b形成了一组对照实验对比非常直观维度结构改造Phase 4aLoss/Assigner改造Phase 4b实验轮数10轮~30轮正收益次数0多次最佳mAP提升无全部负收益0.013额外推理参数有无额外推理耗时有无结构改造好比是给模型加零件增加了模型容量但也增加了过拟合风险和推理成本。Loss/Assigner改造是改变学习方式不动模型本身只调整训练时哪些预测框算正样本、怎么算loss的规则。focused-TAL的核心操作就是一行乘法把crazing类的对齐得分乘以一个boost系数。这么小的改动带来的是crazing AP从0.305提升到0.46953.8%。而且因为Assigner只在训练时参与计算部署推理时完全不存在所以是真正的零成本优化。对于检测任务来说如果超参数已经调到位了但指标还没达到目标改Loss/改正样本分配策略应该排在改模型结构前面去尝试。投入少、风险低、收益确定性高。6 | 迁移到你的场景把这套方法浓缩成一句判断标准能不能把可编辑文件、主指标、单轮预算、keep/discard规则这四件事说清楚。如果能这个场景大概率就能套Karpathy Loop。基于这个标准现阶段最值得优先迁移的是四类企业里高频、且业务价值比较高的场景RAG检索与上下文组装优化。这类项目最常见也最容易被误解成无非就是改个Top K。真正能系统优化的往往是chunk策略、metadata filter、hybrid search、rerank、query rewrite、answer prompt这一整条链路。好处是评测集相对容易搭单轮周期短很适合做内环优化。Prompt/Context优化。我故意没只写Prompt因为在真实项目里影响结果的往往不只是那几句提示词而是system prompt、few-shot示例、上下文拼装顺序、工具调用前后约束这些东西放在一起的整体设计。这个场景非常适合做快速闭环尤其适合客服、摘要、结构化生成、Agent工作流这类任务。OCR/文档抽取流水线优化。这个方向的价值不在于单纯比拼OCR引擎而在于把预处理、版面分块、字段抽取、后处理规则、人工复核路由这些步骤串成一条可以持续优化的流水线。企业里票据、表单、报告、合同、工业文档解析这类需求很多做成之后ROI往往很直接。代码性能与质量优化。这类场景的前提是边界一定要收紧只允许改1到3个热点文件测试和benchmark脚本全部锁死。只要主指标定义清楚P95延迟、吞吐量、工具调用成功率、测试通过率这套方法一样能跑而且非常容易做出真实收益。迁移的核心原则是先把评测集建好先把可编辑面收窄再把快变量和慢变量拆开。不要一上来把所有东西混在一个loop里乱搜。AI 技术/工具 交流群机器学习算法AI大数据技术搜索公众号添加datanlp长按图片识别二维码阅读过本文的人还看了以下文章最顶尖的OCR算法有哪些最强一键抠图19Kstar 的 Rembg 开源神器实时语义分割ENet算法提取书本/票据边缘整理开源的中文大语言模型以规模较小、可私有化部署、训练成本较低的模型为主《大语言模型》PDF下载动手学深度学习-李沐PyTorch版本YOLOv9电动车头盔佩戴检测详细讲解模型训练TensorFlow 2.0深度学习案例实战基于40万表格数据集TableBank用MaskRCNN做表格检测《基于深度学习的自然语言处理》中/英PDFDeep Learning 中文版初版-周志华团队【全套视频课】最全的目标检测算法系列讲解通俗易懂《美团机器学习实践》_美团算法团队.pdf《深度学习入门基于Python的理论与实现》高清中文PDF源码《深度学习基于Keras的Python实践》PDF和代码特征提取与图像处理(第二版).pdfpython就业班学习视频从入门到实战项目2019最新《PyTorch自然语言处理》英、中文版PDF源码《21个项目玩转深度学习基于TensorFlow的实践详解》完整版PDF附书代码《深度学习之pytorch》pdf附书源码PyTorch深度学习快速实战入门《pytorch-handbook》【下载】豆瓣评分8.1,《机器学习实战:基于Scikit-Learn和TensorFlow》《Python数据分析与挖掘实战》PDF完整源码汽车行业完整知识图谱项目实战视频(全23课)李沐大神开源《动手学深度学习》加州伯克利深度学习2019春教材笔记、代码清晰易懂李航《统计学习方法》最新资源全套《神经网络与深度学习》最新2018版中英PDF源码将机器学习模型部署为REST APIFashionAI服装属性标签图像识别Top1-5方案分享重要开源CNN-RNN-CTC 实现手写汉字识别yolo3 检测出图像中的不规则汉字同样是机器学习算法工程师你的面试为什么过不了前海征信大数据算法风险概率预测【Keras】完整实现‘交通标志’分类、‘票据’分类两个项目让你掌握深度学习图像分类VGG16迁移学习实现医学图像识别分类工程项目特征工程(一)特征工程(二) :文本数据的展开、过滤和分块特征工程(三):特征缩放,从词袋到 TF-IDF特征工程(四): 类别特征特征工程(五): PCA 降维特征工程(六): 非线性特征提取和模型堆叠特征工程(七)图像特征提取和深度学习如何利用全新的决策树集成级联结构gcForest做特征工程并打分Machine Learning Yearning 中文翻译稿不断更新资源深度学习、机器学习、数据分析、python搜索公众号添加datayx