一个算法工程师复现算法的踩坑总结

简介: 一个算法工程师复现算法的踩坑总结

08d9d95f48570139a7ce9e00fcfe36aa.png


大家好,我是对白。


作为一名算法工程师,主要是想把自己模型调优和复现算法遇到的一些坑总结一下(里面的一行字可能是我当时花费了一周甚至更长时间得到的总结),希望能对读者有所帮助。


一、熟悉数据


模型是数据的浓缩版----Andrew NG的二八定律,即80%的数据+20%的=更好的AI


对于新上手的一任务来说,需要熟悉你的数据。拿检测任务来说,可以写个可视化代码查看标注是否合理,查看一下待检测物体的大小分布情况(例如anchor的预设),查看一下图片大小,查看类别分布情况(例如是否有极端的分布)等等。


二、算法选型


在接到一个新领域的新任务时,需要调研相关领域算法,对该领域的发展有个大概的了解,掌握一些关键算法(比如历年的SOTA)的思路。虽然调研需要花费一些时间,但是这样在算法选型上可以少做一些实验,性价比是很高的。站在他们的肩膀上就好了。


不太可取的思路:


  1. 在指标上太钻牛角尖。有些算法工程师遇到指标在自己数据集效果不太好的情况时,立马换别的算法,或者立马换个backbone,或者立马换个loss去做实验。(需要认真分析为什么效果不好,是自己训练有问题,还是当前数据不太适合该算法,是评测指标不合理,还是评测指标实现有问题。)


  1. 不进行相关调研,直接上SOTA算法。这样做会有一些不太理想的问题,比如SOTA可能没有针对自己场景的数据做优化,比如当前任务是小目标居多(通过分析数据得到),虽然SOTA的总的mAP很高,但是small mAP比之前算法还低,那就要慎用 。比如SOTA用的是很重的网络,但是任务是速度快,或者速度与效果兼顾,那也应该慎用。


三、基于已有实现来优化算法


对于某个任务在选择好合适的算法以后,如果有相应的效果比较好的开源实现,最好用开源项目进行算法的复现。


这样做的目的:


  1. 更方便深入的理解算法的具体细节,比如可能代码在文章没有提到的某些层上偷摸的加了一个shift操作,比如文章提到的一些trick代码根本没有实现,比如代码用了额外的数据训练但文章没有提到,比如文章描述的数据增强方式与代码的实现不一样等。(这些可能发生在开源复现者没有“一比一”复现论文的情况,也可能发生在论文作者自己没有实现的情况)


  1. 能快速掌握算法的基础性能,比如复现算法大概的运行速度(特别是文章没给出的时候)和达到的效果


不用自己做一些无用功。要知道重写和调试一份新的模型不仅费时费力,可能还因为文章没有写清楚一些细节,导致你几乎无法复现到相应的结果。


利用开源项目已复现的算法(这里复现不是完全能与代码作者或者文章作者结果一致,可能是数据增强,随机种子导致结果有偏差,但已获取到八九不离十的结果)来改进模型可以有下面几点思路:


  1. 代码是否实现了文章一些涨点的trick,如果没有可以尝试


  1. 文章一般会分析实验结果,后面会有作者自己的一些观点,他们可能会说明为什么有些情况文章的算法效果较差


  1. 有些文章会写他们将来可能的工作,这也是一个改进思路


需要可视化查看实验结果(特别是跑自己的数据集),结果可能与作者在公开数据集展示出的问题不一样,分析效果差的原因


四、从0复现算法


复现算法是一个比较大的工程,这里的大工程不只是指代码多或者工作量大,而是没有一个基础版,导致引入的不可控因素太多调试困难,比如数据接口是否有问题,模型是否搭建正确,训练方式是否存在问题。


在复现算法或者优化算法是比较头疼的是一切训练正常,loss曲线比你想象的还好看,训练了一年后(just kidding, maybe longer),测试一下发现效果奇差无比,都不好意思说是自己写的代码。一年就过去了。


这里有下面一些建议:


  1. 尽量测试每一个细节,从数据接口,模型,到loss输出,到最终的评测代码。保证每个部分都可控。


  1. 测试数据接口,从单进程,batch为1开始,方便打印数值进行对比。


  1. 不要随意的去随机,尽量保证问题可以复现比如先不要加入随机数据增强,模型的随机种子固定。


  1. 用少量的数据,这样可以快速的做实验,也可以让模型快速过拟合。模型能过拟合可以大概确定模型是可以学到点什么的。


  1. 尽量按照原文来复现,在复现前,先不要过多的添加自己独特的想法。比如训练参数,模型backbone,数据增强方式等等先按照文章来。不清楚的点可以尝试email作者或者寻找相关圈子讨论。


  1. 日志打印全,比如解loss为nan的情况,需要知道是forward的导致还是bp导致。


五、一些或许有用的训练建议


  1. 保证数据是可靠的


  1. 有预训练模型最好用上


  1. 通常学习率参数小于1e-5基本没啥用了,比如cosine或者step操作,最后的学习率到1e-5就好了。当然特殊任务不一样


  1. bn在训练时记得打开更新(特别是tf的小伙伴,容易漏),不然可能出现的问题是训练时loss下降很快,测试感觉模型就没收敛


  1. sgd是很棒的,但是实验用adam或许收敛速度更好


  1. 如果想要很好的压榨出一个算法的性能,请先保证当前模型能到达相应的性能再去压榨。而不是盲目的换模块,疯狂调参,那样可能只是浪费时间


  1. 不要太相信自己的调参技术,在没有一个较好的baseline情况下,调参不会有质的飞跃(除非是之前参数造成了某种bug)


数据小时,使用了预训练模型记得固定前几层的模型参数,还可以用小点的学习率


loss balance有时候很有用


重复训练可能可以提升点数,将一个模型训练好后,用训练好的模型做预训练模型载入,继续用同一套参数训练。有点像CyclicLR

https://pytorch.org/docs/stable/generated/torch.optim.lr_scheduler.CyclicLR.html#torch.optim.lr_scheduler.CyclicLR


DL没有像机器学习有那么多公式支撑,很多都是make sense就做个实验来验证,所以尽量多阅读论文,看看别人的实验,这样就可以减少不必要的实验


这篇文章是为了分享自己的一些心得,希望读者能用得上,如果有严重错误还请告知,不想误导他人


相关文章
|
2月前
|
机器学习/深度学习 分布式计算 算法
【算法工程师】成为一名优秀的机器学习算法工程师所需知识及资料汇总-附思维导图
成为一名优秀的机器学习算法工程师所需要具备的技能和知识,包括理论基础、数学能力、编程技能、实践经验以及对特定领域的深入了解,并提供了学习资源和面试准备建议。
77 3
【算法工程师】成为一名优秀的机器学习算法工程师所需知识及资料汇总-附思维导图
|
4月前
|
算法 调度
【完全复现】基于改进粒子群算法的微电网多目标优化调度
该文档描述了一个使用改进粒子群算法实现的微电网多目标优化调度的Matlab程序。该模型旨在最小化运行成本和环境保护成本,将多目标问题通过权值转换为单目标问题解决。程序中定义了决策变量,如柴油发电机、微型燃气轮机、联络线和储能的输出,并使用全局变量处理电负荷、风力和光伏功率等数据。算法参数包括最大迭代次数和种群大小。代码调用了`PSOFUN`函数来执行优化计算,并展示了优化结果的图表。
|
11月前
|
算法 数据挖掘 知识图谱
LINE算法复现 图表示学习 基于line 算法的节点分类 聚类显示 完整代码+数据
LINE算法复现 图表示学习 基于line 算法的节点分类 聚类显示 完整代码+数据
41 0
|
11月前
|
算法 数据挖掘
Struc2vec 算法复现 基于 struc2vec 节点分类聚类实战 完整代码+数据
Struc2vec 算法复现 基于 struc2vec 节点分类聚类实战 完整代码+数据
59 0
|
11月前
|
算法
Deepwalk算法复现: 基于 deepwalk的网络节点分类 聚类分析 完整代码+数据
Deepwalk算法复现: 基于 deepwalk的网络节点分类 聚类分析 完整代码+数据
89 0
|
传感器 机器学习/深度学习 算法
【WSN】移动传感器网络动态覆盖的分布式防拥塞算法matlab复现
【WSN】移动传感器网络动态覆盖的分布式防拥塞算法matlab复现
|
算法 调度
(文章复现)基于灰狼算法(GWO)的交直流混合微网经济调度matlab代码
参考文献: [1]高瑜,黄森,陈刘鑫等.基于改进灰狼算法的并网交流微电网经济优化调度[J].科学技术与工程, 2020,20(28):11605-11611. [2]邓长征,冯朕,邱立等.基于混沌灰狼算法的交直流混合微网经济调度[J].电测与仪表, 2020, 57(04):99-107.
|
算法 调度 Python
改进的多目标差分进化算法在电力系统环境经济调度中的应用(Python代码实现)【电气期刊论文复现】
改进的多目标差分进化算法在电力系统环境经济调度中的应用(Python代码实现)【电气期刊论文复现】
125 0
(文章复现)《基于改进教与学算法的配电网无功优化》
在解决配电网无功优化问题中,智能启发式算法得到了广泛应用。采用了教与学优化算法求解含分布式电源的配电网无功优化问题。现将精英策略引入教与学算法,改进了该算法的搜索能力,提高了求解的稳定性。以有功网损最小为目标建立了无功优化模型,并基于改进的IEEE 33母线配电网系统进行仿真计算,结果验证了基于精英策略改进的教与学算法具有更强的收敛性和鲁棒性,能获得更好的优化结果。
|
人工智能 算法
【每日算法Day 102】美团 AI 平台算法工程师面试编程题
【每日算法Day 102】美团 AI 平台算法工程师面试编程题
141 0
下一篇
无影云桌面