算法落地的一些总结

根据博主自己算法落地和一些其他博主的总结

面试的时候,面试官特别讨厌直接使用paperswithcode上SOTA模型,如果该模型work的话,就直接用,并没有思考该模型为什么适用于特征任务,因此尝试法并不可取,这也是本博文的初衷。

1、熟悉数据

吴恩达:80%数据 + 20%的模型 = 更好的AI
对于新的项目任务来说,第一步就是需要熟悉数据,例如检测任务,可以写一个可视化代码查看标注是否合理,查看一下待检测物体的大小分布情况(方便anchor设定),查看图片大小,查看类别分布情况(是否出现长尾现象)等等。

2、算法选型

在接到一个新领域的任务时,需要调研相关领域的算法,例如博主之前做过动作检测,一开始自己并不是很熟悉这个领域,因此一开始的时候调研会花掉很长的时间,这一部分也是需要耐心的时候。虽然调研的时候需要花费一些时间,但是这样在算法选型上可以少做一些实验,性价比很高!例如动作检测:openpose,slowfast,hrnet等,建议之间看mmdet 系列的!强推强推强推!
不太可取的思路:

  1. 在指标上太钻牛角尖,例如指标在自己数据集上效果不太好的情况,立马换别的算法,或者立马换一个backbone。需要认真分析是什么指标效果不好,ap还是ar差?,是自己训练有问题(lr),还是当前数据不太适合该算法,还是评测指标不合理
  2. 不进行相关调研,直接上SOTA算法:例如当前任务检测目标是小目标,而SOTA算法偏向于检测中大目标,再例如:SOTA没有针对自己场景数据做一些优化。或者是当前任务对FPS要求高,而SOTA模型往往都是很重的网络。

3.基于已有实现来优化算法

对于某个任务在选择好合适的算法以后,最好选用github上star比较高的开源项目进行算法的复现。
这样做的目的:

  • 更方便深入的理解算法的具体细节,文章不可能对整个模型说的特别具体(使用额外的tricks),需要我们在阅读源码。
  • 能快速掌握算法的基础性能,比如复现算法大概的运行速度和达到的效果
  • 不用自己做一些无用功

利用改进开源项目模型有下面几点思路:

  • 代码是否实现了文章一些涨点的trick,如果没有可以尝试。
  • 文章一般会分析实验结果,后面会有作者自己的一些观点,他们可能会说明为什么有些情况文章的算法效果较差。
  • 有些文章会写他们将来可能的工作,这也是一个改进思路
  • 需要可视化查看实验结果(特别是跑自己的数据集),结果可能与作者在公开数据集展示出的问题不一样,分析效果差的原因

4.从0复现算法

一些建议:

  • 尽量测试每一个细节,从数据接口,模型,到loss输出,到最终的评测代码。保证每个部分都可控
  • 测试数据接口,从单进程,batch为1开始,方便打印数值进行对比
  • 不要随意的去随机,尽量保证问题可以复现比如先不要加入随机数据增强,模型的随机种子固定。
  • 用少量的数据,这样可以快速的做实验,也可以让模型快速过拟合。模型能过拟合可以大概确定模型是可以学到点什么的。
  • 尽量按照原文来复现,在复现前,先不要过多的添加自己独特的想法。比如训练参数,模型backbone,数据增强方式等等先按照文章来。不清楚的点可以尝试email作者或者寻找相关圈子讨论。
  • 日志打印全,比如解loss为nan的情况,需要知道是forward的导致还是bp导致。

5.一些有用的训练建议

  • 保证数据是可靠的
  • 有预训练模型一定一定一定要用上!
  • 通常学习率参数小于1e-5基本没啥用了,比如cosine或者step操作,最后的学习率到1e-5就好了。当然特殊任务不一样
  • bn在训练时记得打开更新(特别是tf的小伙伴,容易漏),不然可能出现的问题是训练时loss下降很快,测试感觉模型就没收敛
  • sgd是很棒的,但是实验用adam或许收敛速度更好
  • 如果想要很好的压榨出一个算法的性能,请先保证当前模型能到达相应的性能再去压榨。而不是盲目的换模块,疯狂调参,那样可能只是浪费时间
  • 不要太相信自己的调参技术,在没有一个较好的baseline情况下,调参不会有质的飞跃(除非是之前参数造成了某种bug)
  • 数据小时,使用了预训练模型记得固定前几层的模型参数,还可以用小点的学习率
  • 重复训练可能可以提升点数,将一个模型训练好后,用训练好的模型做预训练模型载入,继续用同一套参数训练。
  • DL没有像机器学习有那么多公式支撑,很多都是make sense就做个实验来验证,所以尽量多阅读论文,看看别人的实验,这样就可以减少不必要的实验

猜你喜欢

转载自blog.csdn.net/weixin_45074568/article/details/124850999