首页 / 资讯中心 / 文章详情

fast-autoaugment实战:自动搜索数据增强策略的完整指南

fast-autoaugment实战:自动搜索数据增强策略的完整指南 ★ FEATURED ARTICLE
1. 为什么数据增强值得用自动搜索来做做过图像分类项目的人大概都有过这样的经历手里攥着几千张标注图片模型训到一半发现验证集准确率死活上不去第一反应是换 backbone、调学习率、加正则折腾一圈下来发现真正卡脖子的其实是数据多样性不够。数据增强这件事看起来只是把图片翻一翻、转一转但真要做好里面的门道比想象中深得多。传统做法是人工拍脑袋定一套增强策略比如随机裁剪加水平翻转再配点颜色抖动。这套组合在早期确实够用但它有两个致命问题一是策略是固定的不管你的数据集是医学影像还是街景照片用的都是同一套二是各个增强操作的强度很难拿捏裁剪比例大了可能把目标裁掉颜色抖动猛了可能把关键纹理抹平。更麻烦的是不同增强操作之间存在耦合关系单独调每一个都挺好组合起来反而互相打架。自动增强搜索要解决的就是这个问题。它的核心思路很直接把选哪些增强操作、每个操作用什么概率和强度这件事变成一个可以优化的搜索问题让算法自己去试试出在验证集上表现最好的那套策略。fast-autoaugment 就是这类方法里比较有代表性的一个实现它的卖点是在保持搜索质量的前提下把搜索成本压到了一个普通开发者能接受的范围。我第一次接触这个方向的时候心里是打鼓的。因为早期的自动增强方法动辄要跑几千个 GPU 小时对个人开发者或者小团队来说根本不现实。fast-autoaugment 之所以值得单独拿出来讲就是它在效果和成本之间找到了一个比较务实的平衡点。它适合谁呢如果你手头有中等规模的数据集几万到几十万张想在不换模型结构的前提下把准确率再往上顶一两个点又不想花大价钱做搜索那这套方法值得认真研究一下。下面我会从它的核心机制讲起然后给出完整的实操流程再重点说说我在实际跑的过程中踩过的坑和总结出来的调参经验。内容会尽量往细里讲争取让你看完能直接上手复现。2. fast-autoaugment 的核心机制拆解2.1 把增强策略拆成子策略再组合要理解 fast-autoaugment先得理解它怎么表示一套增强策略。它没有把整条增强流水线当成一个整体去搜而是拆成了若干个子策略sub-policy。每个子策略由两个增强操作按顺序组成每个操作都带有三个属性操作类型、使用概率、以及强度等级。举个例子一个子策略可能是先以 0.6 的概率做旋转旋转角度在某个范围内随机取再以 0.4 的概率做锐度调整。整个增强策略就是若干个这样的子策略的集合训练时每张图片随机选一个子策略来应用。这种拆法的好处在于搜索空间被大幅压缩了。如果直接搜一整条流水线参数空间会爆炸拆成子策略之后每个子策略的搜索空间是可控的组合起来又能覆盖足够丰富的增强模式。这有点像做菜你不是一次性决定整桌菜的配方而是先定好几道基础菜的做法上菜时随机搭配。2.2 搜索空间的构成与操作池fast-autoaugment 的操作池通常包含十几到二十几种基础图像变换大致可以分成几类类别典型操作作用几何变换旋转、平移、剪切、翻转改变目标位置和姿态颜色变换亮度、对比度、饱和度、色相改变光照和色彩分布纹理变换锐度、模糊、浮雕改变局部纹理细节遮挡类裁剪、随机擦除模拟遮挡和部分缺失每个操作都有一个强度范围通常归一化到 0 到 1 或者 0 到某个上限之间。搜索算法要做的就是在这个操作池里挑出若干个操作给它们分配概率和强度。这里有个容易被忽略的细节不是所有操作都适合所有数据集。比如医学影像里做水平翻转可能改变解剖结构的语义街景识别里做色相大幅偏移可能让红绿灯颜色失真。所以操作池的选取本身就是一个需要结合业务判断的环节不能无脑全开。2.3 搜索算法为什么能快fast-autoaugment 名字里的fast主要体现在搜索算法的设计上。它没有用那种需要训练完整模型才能评估一个策略好坏的方法而是采用了一种基于代理任务的评估思路。简单说就是用一个小模型、少轮次、部分数据来快速评估一个候选策略的潜力把明显不行的策略尽早淘汰掉。这背后的逻辑是一个好的增强策略在小规模训练上通常也能体现出相对优势。虽然小规模评估有噪声但只要评估方式设计得当排序的可靠性是够用的。这就好比招聘时先用笔试筛一轮虽然笔试成绩不能完全代表工作能力但能快速过滤掉大部分不合适的候选人。搜索过程本身通常结合了进化算法或者强化学习的思路。进化算法的做法是维护一个策略种群每轮评估后保留表现好的通过变异和交叉产生新一代。这种方法的优点是实现简单、不容易陷入局部最优缺点是评估次数多。fast-autoaugment 通过控制种群规模和评估预算把总搜索成本压到了单卡几小时到十几小时的量级。2.4 和人工策略、其他自动方法的对比为了让你对它的定位有更清晰的认识我整理了一个对比方法类型搜索成本效果上限上手难度适用场景人工固定策略几乎为零中等低快速基线、小数据集早期自动增强极高高高大厂、充足算力fast-autoaugment中等较高中中小团队、中等数据集随机搜索基线低中等偏上低想快速验证增强价值从表里能看出来fast-autoaugment 的定位很明确它不是追求极致效果的那一档而是在可接受的成本下拿到接近最优的效果。对大多数实际项目来说这个性价比是划算的。3. 从零跑通一次搜索的完整流程3.1 环境准备与依赖确认动手之前先把环境理清楚。这套方法对框架的依赖不算重主流的深度学习框架都能跑但有几个点需要提前确认。首先是 Python 版本建议 3.8 以上太老的版本在一些数值库上会有兼容问题。然后是深度学习框架如果你用 PyTorch确认版本在 1.7 以上因为一些数据加载的接口在旧版本上行为不一致。GPU 方面搜索阶段对显存的要求不高单卡 8G 显存基本够用但如果你的数据集图片分辨率很大建议先把图片缩放到合理尺寸再喂进去。依赖安装这块除了框架本身通常还需要 numpy、Pillow 这类基础库。我建议用虚拟环境隔离避免和系统里的其他项目打架。具体命令根据你的环境来这里不展开。提示搜索阶段和最终训练阶段可以用不同的环境配置。搜索时为了快可以用小一点的输入尺寸最终训练时再切回正常尺寸。这样能省不少时间。3.2 数据集的组织方式数据增强搜索对数据集的格式有一定要求核心是要能方便地划分出训练集和验证集。常见的做法是按类别分文件夹每个类别一个目录目录里放对应的图片。这种结构大多数数据加载器都能直接识别。这里有个实操经验验证集的划分要讲究。如果验证集太小评估噪声会很大搜出来的策略可能过拟合到验证集上如果验证集太大训练数据又不够。我的经验是验证集占总体数据的 10% 到 20% 比较合适类别不均衡的话要做分层抽样保证每个类别在验证集里都有足够的样本。另外搜索阶段用的数据可以和最终训练用的数据不完全一样。比如你可以从训练集里再抽一部分出来做搜索时的评估这样能避免验证集信息泄露。虽然多了一道手续但对最终效果的可靠性有帮助。3.3 搜索配置的关键参数配置这块是重头戏参数设得好不好直接决定搜索效率和最终效果。我把几个最关键的参数列出来逐个说明。搜索预算这是最重要的参数决定了总共评估多少个候选策略。预算太小搜索不充分预算太大时间成本上去了。我的建议是从小预算开始试比如先跑 20 到 30 个候选看看效果趋势再决定要不要加大。种群规模如果用进化算法种群规模影响每轮的多样性。规模太小容易早熟规模太大评估成本高。一般设在 10 到 20 之间比较平衡。代理任务规模这是控制快的核心。代理任务用的模型可以比最终模型小训练轮次可以少用的数据比例可以低。我的经验是代理任务的训练轮次设在最终训练的 10% 到 20%数据用 20% 到 30%这样评估一个策略的时间能压到几分钟级别。操作池配置前面说过不是所有操作都适合你的数据。建议先根据业务特点筛一遍操作池把明显不合理的操作去掉。比如做文字识别大幅旋转和翻转就要慎用。强度范围每个操作的强度上限也要结合数据特点设。颜色类操作的强度上限可以适当放宽几何类操作要保守一些。3.4 启动搜索与过程监控配置写好之后就可以启动搜索了。搜索过程中有几件事需要盯着。第一是评估指标的波动。如果发现验证准确率忽高忽低说明代理任务的评估噪声太大可能需要增加评估数据量或者多轮评估取平均。第二是搜索的收敛趋势。正常情况下随着搜索进行最优策略的表现应该逐步提升然后趋于平稳。如果一直不提升可能是操作池配置有问题或者搜索空间和你的数据不匹配。第三是资源占用。搜索阶段虽然单次评估快但连续跑很多次显存和内存的累积占用要注意。我遇到过跑了几十轮之后显存碎片化导致 OOM 的情况解决办法是定期重启搜索进程或者把评估任务做成独立的子进程。注意搜索过程中产生的中间结果要定期保存。万一进程崩了不至于从头再来。保存的内容至少包括当前最优策略、对应的评估分数、以及搜索到第几轮了。3.5 拿到策略之后怎么用搜索结束后你会得到一套最优的增强策略通常表示成若干个子策略的集合。这套策略可以直接接到你的训练流水线里替换掉原来的人工增强。但这里有个关键点搜出来的策略不是拿来就用的需要做一次验证。因为搜索阶段用的是代理任务代理任务和最终任务之间有差距。正确的做法是用搜出来的策略跑一次完整的训练和人工策略的基线做对比。如果提升明显说明策略有效如果提升不明显甚至下降可能是代理任务和最终任务差距太大需要调整搜索配置重来。另外搜出来的策略可以迁移到相似的任务上。比如你在某个图像分类数据集上搜出来的策略在同类别的另一个数据集上往往也能用省去了重新搜索的成本。这也是自动增强方法的一个隐性价值。4. 实操中踩过的坑与调参心得4.1 代理任务和最终任务差距过大这是我踩的第一个大坑。一开始为了追求搜索速度我把代理任务的模型设得特别小训练轮次也压得很低。结果搜出来的策略在代理任务上表现很好但用到最终模型上几乎没提升。后来我复盘了一下问题出在代理任务太弱了。模型太小的时候它的容量有限对数据增强的敏感度和最终的大模型完全不一样。小模型可能更依赖某些特定的增强模式而大模型有自己的偏好。轮次太少也有问题增强策略的效果往往要在训练中后期才体现出来早期评估根本看不出来。调整的办法是把代理任务的规模往上提一档。模型不用和最终模型一样大但也不能太小我一般用最终模型 30% 到 50% 的参数量。训练轮次提到最终训练的 20% 到 30%。这样单次评估时间会增加但搜出来的策略可用性高很多。4.2 验证集泄露导致的假提升第二个坑更隐蔽。有一段时间我发现搜出来的策略在验证集上提升很明显但一上测试集就原形毕露。排查了很久才意识到搜索过程中反复用同一个验证集评估策略实际上是在过拟合验证集。这个问题的本质是搜索过程本身是一种优化优化的目标就是验证集上的表现。搜的次数越多策略就越倾向于那些恰好在验证集上表现好的组合哪怕这些组合并没有真正的泛化优势。解决办法有两个。一是把验证集再切一刀分出一个搜索验证集和一个最终验证集搜索时只看前者最终评估看后者。二是用交叉验证的思路把数据分成几折每轮搜索用不同的折做验证最后综合评估。第一种方法简单第二种更严谨但成本高。我一般用第一种够用了。4.3 操作池配置的取舍操作池的配置是个需要反复试的过程。我一开始图省事把能加的操作全加进去了结果搜索空间太大搜索效率很低而且搜出来的策略里经常出现一些明显不合理的操作组合。后来我总结了一个原则操作池要精不要全。具体来说先根据业务特点排除掉语义上不合理的操作比如做细粒度分类时大幅裁剪要慎用做颜色敏感的任务时色相偏移要限制。然后在剩下的操作里优先保留那些在文献和实践中被验证有效的操作。还有一个细节是操作的强度范围。强度范围设得太宽搜索空间大但容易搜出极端策略设得太窄又限制了搜索的发挥空间。我的经验是先用一个中等范围跑一轮看看搜出来的策略倾向于高强度还是低强度再根据结果调整范围。4.4 搜索预算和效果的平衡搜索预算这个事说白了就是花多少时间换多少效果。我做过几组对比实验结论是收益递减很明显。从 10 个候选加到 30 个候选效果提升比较明显从 30 个加到 100 个提升就有限了再往上加基本就是浪费算力。所以我的建议是先用小预算20 到 30 个候选跑一轮看看效果。如果提升已经达到预期就停如果还差得远再考虑加大预算。不要一上来就设一个很大的预算那样既费时间又未必划算。另外搜索预算的分配也有讲究。与其把预算平均分给所有候选不如采用逐步淘汰的策略先粗筛一轮把明显不行的淘汰掉剩下的再精细评估。这样同样的预算能覆盖更多的候选搜索效率更高。4.5 和训练流程的衔接问题最后一个坑是关于衔接的。搜出来的策略是一套增强配置但怎么把它接到训练流程里有不少细节要注意。首先是增强操作的实现一致性。搜索时用的增强实现和训练时用的必须是同一套否则搜出来的策略在训练时行为会变。我遇到过搜索时用的旋转实现和训练时用的不一样导致角度范围对不上效果大打折扣。其次是随机种子的控制。搜索和训练如果都用随机增强种子的设置会影响结果的可复现性。建议在最终训练时固定种子这样结果可复现方便对比不同策略。还有就是增强和正则化的配合。数据增强本身是一种正则化手段如果模型里已经用了很强的其他正则化比如高 dropout、强权重衰减增强的效果可能会被掩盖。这时候需要适当降低其他正则化的强度给增强留出发挥空间。5. 把搜出来的策略用出最大价值5.1 策略的迁移与复用搜出来一套好策略之后别只在一个任务上用。同类任务之间增强策略往往是可以迁移的。比如你在某个自然图像分类数据集上搜出来的策略换到另一个自然图像数据集上通常也能带来提升只是提升幅度可能不同。迁移的时候要注意两点。一是数据分布要相近如果两个数据集差异太大比如一个是自然图像一个是医学影像直接迁移可能适得其反。二是要做小规模验证迁移过来之后先跑一个短训练看看效果别直接上完整训练。这种迁移的价值在于省时间。重新搜一套策略要花几个小时甚至更久而迁移只需要一次验证训练。对于经常做类似任务的团队来说积累一个策略库是很有价值的。5.2 和其他增强手段的叠加自动搜出来的策略不是孤立的它可以和其他增强手段叠加使用。比如你可以把搜出来的策略和 MixUp、CutMix 这类样本混合方法结合往往能取得比单独用更好的效果。但叠加的时候要注意强度平衡。两种增强手段都很强的时候叠加起来可能过犹不及导致训练不稳定或者欠拟合。我的做法是先把自动策略调好再逐步加入其他增强观察验证集表现找到一个平衡点。还有一个思路是分阶段使用。训练早期用强增强让模型学到更鲁棒的特征训练后期用弱增强让模型精细化拟合。这种课程学习的思路和自动增强结合有时候能带来额外提升。5.3 什么时候该放弃自动搜索说了这么多自动搜索的好处也得说说什么情况下它不划算。如果你的数据集很小比如几千张自动搜索的收益可能不明显因为小数据集上增强策略的差异被数据本身的噪声掩盖了。这种情况下用一套经典的人工策略可能就够了。如果你的任务对增强特别敏感比如某些医学影像任务任何几何变换都可能改变语义自动搜索的空间很受限搜出来的策略可能还不如人工精心设计的。这种时候人工介入反而更靠谱。还有就是时间成本的考量。如果项目周期很紧没时间做搜索和验证那就先用人工策略顶着把自动搜索留到有充裕时间的时候再做。5.4 一个完整的落地检查清单最后给你一个落地时的检查清单照着过一遍能避开大部分坑数据集划分是否合理验证集是否足够代表整体分布操作池是否根据业务特点做了筛选有没有明显不合理的操作代理任务的规模是否和最终任务匹配会不会差距过大搜索预算是否合理有没有做逐步淘汰搜出来的策略是否在独立验证集上验证过有没有过拟合搜索验证集增强实现是否和搜索时一致随机种子是否可控和其他正则化手段的强度是否平衡有没有做迁移复用的可能能不能沉淀成策略库这套流程走下来基本能把 fast-autoaugment 的价值榨干。我个人在实际项目里的体会是它最大的价值不是那套搜出来的具体策略而是它提供了一种数据驱动的增强设计思路。以前调增强靠感觉现在有了一个可以量化评估的框架这个思维方式的转变比具体某套策略更有长期价值。
阅读完成 · 觉得有帮助?
咨询建站