一个算法工程师复现算法的踩坑总结
仅作学术分享,不代表本公众号立场,侵权联系删除
转载于:作者丨Michael
来源丨我爱计算机视觉
博客地址:https://blog.csdn.net/liuxiaoheng1992/article/details/120228724
作为一名算法工程师,主要是想把自己模型调优和复现算法遇到的一些坑总结一下(里面的一行字可能是我当时花费了一周甚至更长时间得到的总结),希望能对读者有所帮助。
一、熟悉数据
模型是数据的浓缩版----Andrew NG的二八定律,即80%的数据+20%的=更好的AI
对于新上手的一任务来说,需要熟悉你的数据。拿检测任务来说,可以写个可视化代码查看标注是否合理,查看一下待检测物体的大小分布情况(例如anchor的预设),查看一下图片大小,查看类别分布情况(例如是否有极端的分布)等等。
二、算法选型
在接到一个新领域的新任务时,需要调研相关领域算法,对该领域的发展有个大概的了解,掌握一些关键算法(比如历年的SOTA)的思路。虽然调研需要花费一些时间,但是这样在算法选型上可以少做一些实验,性价比是很高的。站在他们的肩膀上就好了。
不太可取的思路:
在指标上太钻牛角尖。有些算法工程师遇到指标在自己数据集效果不太好的情况时,立马换别的算法,或者立马换个backbone,或者立马换个loss去做实验。(需要认真分析为什么效果不好,是自己训练有问题,还是当前数据不太适合该算法,是评测指标不合理,还是评测指标实现有问题。)
不进行相关调研,直接上SOTA算法。这样做会有一些不太理想的问题,比如SOTA可能没有针对自己场景的数据做优化,比如当前任务是小目标居多(通过分析数据得到),虽然SOTA的总的mAP很高,但是small mAP比之前算法还低,那就要慎用 。比如SOTA用的是很重的网络,但是任务是速度快,或者速度与效果兼顾,那也应该慎用。
三、基于已有实现来优化算法
对于某个任务在选择好合适的算法以后,如果有相应的效果比较好的开源实现,最好用开源项目进行算法的复现。
这样做的目的:
更方便深入的理解算法的具体细节,比如可能代码在文章没有提到的某些层上偷摸的加了一个shift操作,比如文章提到的一些trick代码根本没有实现,比如代码用了额外的数据训练但文章没有提到,比如文章描述的数据增强方式与代码的实现不一样等。(这些可能发生在开源复现者没有“一比一”复现论文的情况,也可能发生在论文作者自己没有实现的情况)
能快速掌握算法的基础性能,比如复现算法大概的运行速度(特别是文章没给出的时候)和达到的效果
不用自己做一些无用功。要知道重写和调试一份新的模型不仅费时费力,可能还因为文章没有写清楚一些细节,导致你几乎无法复现到相应的结果。
利用开源项目已复现的算法(这里复现不是完全能与代码作者或者文章作者结果一致,可能是数据增强,随机种子导致结果有偏差,但已获取到八九不离十的结果)来改进模型可以有下面几点思路:
代码是否实现了文章一些涨点的trick,如果没有可以尝试
文章一般会分析实验结果,后面会有作者自己的一些观点,他们可能会说明为什么有些情况文章的算法效果较差
有些文章会写他们将来可能的工作,这也是一个改进思路
需要可视化查看实验结果(特别是跑自己的数据集),结果可能与作者在公开数据集展示出的问题不一样,分析效果差的原因
四、从0复现算法
复现算法是一个比较大的工程,这里的大工程不只是指代码多或者工作量大,而是没有一个基础版,导致引入的不可控因素太多调试困难,比如数据接口是否有问题,模型是否搭建正确,训练方式是否存在问题。
在复现算法或者优化算法是比较头疼的是一切训练正常,loss曲线比你想象的还好看,训练了一年后(just kidding, maybe longer),测试一下发现效果奇差无比,都不好意思说是自己写的代码。一年就过去了。
这里有下面一些建议:
尽量测试每一个细节,从数据接口,模型,到loss输出,到最终的评测代码。保证每个部分都可控。
测试数据接口,从单进程,batch为1开始,方便打印数值进行对比。
不要随意的去随机,尽量保证问题可以复现比如先不要加入随机数据增强,模型的随机种子固定。
用少量的数据,这样可以快速的做实验,也可以让模型快速过拟合。模型能过拟合可以大概确定模型是可以学到点什么的。
尽量按照原文来复现,在复现前,先不要过多的添加自己独特的想法。比如训练参数,模型backbone,数据增强方式等等先按照文章来。不清楚的点可以尝试email作者或者寻找相关圈子讨论。
日志打印全,比如解loss为nan的情况,需要知道是forward的导致还是bp导致。
五、一些或许有用的训练建议
保证数据是可靠的
有预训练模型最好用上
通常学习率参数小于1e-5基本没啥用了,比如cosine或者step操作,最后的学习率到1e-5就好了。当然特殊任务不一样
bn在训练时记得打开更新(特别是tf的小伙伴,容易漏),不然可能出现的问题是训练时loss下降很快,测试感觉模型就没收敛
sgd是很棒的,但是实验用adam或许收敛速度更好
如果想要很好的压榨出一个算法的性能,请先保证当前模型能到达相应的性能再去压榨。而不是盲目的换模块,疯狂调参,那样可能只是浪费时间
不要太相信自己的调参技术,在没有一个较好的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就做个实验来验证,所以尽量多阅读论文,看看别人的实验,这样就可以减少不必要的实验
这篇文章是为了分享自己的一些心得,希望读者能用得上,如果有严重错误还请告知,不想误导他人
公众号:AI蜗牛车
保持谦逊、保持自律、保持进步
发送【蜗牛】获取一份《手把手AI项目》(AI蜗牛车著)
发送【1222】获取一份不错的leetcode刷题笔记
发送【AI四大名著】获取四本经典AI电子书
一个算法工程师复现算法的踩坑总结相关推荐
- 什么是算法工程师?算法工程师有前景吗?
什么是算法工程师?算法工程师说目前最炙手可热的岗位.虽然算法工程师一直被频频提及,但是许多人对这个岗位的了解还知之甚少.那么算法工程师究竟是做什么的?前景怎么样呢?下面我们来一起解开这个高薪技术岗位的 ...
- 【人人都是算法工程师】算法工程师的“三年面试五年模拟”之独孤九剑秘籍(先行版)
0 导读 这是我写在公众号里的一篇文章,在此分享到知乎上,一来是希望能和知乎上的朋友们一起交流学习CV算法以及相应的知识,也欢迎大家关注我的公众号WeThinkIn. 公众号原文: [人人都是算法工程 ...
- 基于卷积神经网络的密集人群估计/人群计数算法【内含教程和踩坑】
文章目录 前言 一.什么是密集人群估计 二.实验前准备 1.Github开源项目--Awesome Crowd Counting 2.数据集下载 3.环境配置 三.ShanghaiTech数据集实验 ...
- 25~50K|云视科技SLAM算法工程师/机器人算法软件工程师招聘(社招+实习)
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 深圳市云视机器人有限公司成立于2019年11月,是一家专注于服务型机器人技术开发及大规模制造的高科技公 ...
- 年薪40-80K *14 | 网境科技SLAM算法工程师、算法科学家招聘
网境科技(深圳)有限公司诚招有志之士加盟 www.netverseai.com 公司介绍 Netverse网境是一家 AR/MR 产品研发商:通过对全链路技术(显示光学.机器人传感器.终端硬件.人工智 ...
- 算法工程师0——算法工程师学习进阶路线
如果想进行python学习,下面是一条很详细的流程图,具体学习内容参考黑马的培训: http://www.itheima.com/ 不打广告,不打广告! 黑马的课程在b站和淘宝都可以找到,自学能力差请 ...
- 算法工程师和算法框架开发,谁会代表未来?
算法和算法框架是机器学习非常重要的两个因素,算法就是诸如LR.GBDT.DNN.DeepFM这样的实际解决某个数学问题的公示实现.算法框架指的是计算框架,计算框架可以让算法执行更高效,比如最早玩深度学 ...
- 4种SpringBoot 接口幂等性的实现方案!最后一个80%以上的开发会踩坑
点击上方 蓝字 关注我们! 来源:mydlq.club/article/94/ 一.什么是幂等性 二.什么是接口幂等性 三.为什么需要实现幂等性 四.引入幂等性后对系统的影响 五.Restful AP ...
- 一份来自贾扬清的AI修炼指南:不存在算法工程师,调参侠没有市场
作者 | 陈彩娴.蒋宝尚 编辑 | 青 暮 算法工程师不仅需要具备牛逼的算法能力,还要精通业务.善于沟通?(小本子赶紧记下来!) 8月23日晚,知乎直播"AI时代听大咖聊"邀请到A ...
最新文章
- BiB: 电子科大邹权组构建基于肠道菌群平衡的疾病预测模型及微生物生物标志物发掘平台...
- 二代数据 模拟软件wgsim
- Zookeeper架构
- linux下rsync+inotify实现服务器之间文件实时同步
- 智能的定义是什么?如何正确理解智能家居?
- 基于Proxy思想的Android插件框架
- cxTreeList交换当前两个节点的的位置
- 该虚拟机似乎正在使用
- favicon图标制作
- index mysql_mysql 原理~ index的详解
- python入门基础教程-Python入门基础教程:WSGI
- 如何在命令行更改IP地址
- 数据库——模式分解和关系范式的分解
- SPSS Modeler 数据审核学习笔记
- 【论文阅读】去偏、缓解数据稀疏的多任务因果推荐CVR优化
- 宏碁暗影骑士擎安装双系统踩坑记录
- 管理网络(网络概念)
- Javascript 计算众数和中位数的代码
- SGO基线解算软件(南方测绘UI设计最美观的一款新版)
- 用74LS153D画出三人表决电路