1. 前言
小白做科研时间已有三年,码龄两年(研究生初期使用Matlab
就不算进去啦),大方向是深度学习和计算机视觉。这个期间踩过无数的坑,所以做个科研总结,希望自己和志趣相同的小火把不去踩同样的坑。
2. 给自己的科研建议
Tip 1: 前期不要怼轮子
我把这个建议放在首位。怼轮子指凭一己之力推导出某个复杂算法的全部公式,或者是复现出某个复杂算法的全部代码。在初次入坑的时候,该领域的知识点并没有融会贯通,更何况复杂算法是多个领域互相交叉的结果。举个例子,比如说SLAM
中经典算法Vins
,理解它需要掌握多方面的知识,四元数,IMU
模型,滑窗优化,BA
优化等等。对一个只会BA
的小白来说,是难以下手的。再举一个例子。比如说计算机视觉中的目标检测算法,搭建一个网络很简单,但是数据输入输出流,Cuda
实现IOU
计算以及NMS
,这些细节是非常复杂的且必要的。一句话,在初次入门某个领域的时候,不要着急去做一些难度极大的工作(如果有大牛带的话,可以忽视这句话)。
Tip 2:带着目的去修改/理解轮子
随着CV
方向算法越来越复杂,算法实现和工程实现的界限越来越模糊。在以往,写一个ICP
算法,或者描述子匹配算法,再或者写一个BP
算法顶多不超过百行。可是领域内的前沿算法,比如目标检测或者SLAM
,代码都是数千行也上,甚至是万行的,基本上是有大牛团队维护的(比如Google
的激光SLAM
工程项目)。并且这些复杂算法是不同语言混合实现的,比如C
,C++
,Python
,Cuda
等语言,调用各种各样的第三方库,软件规模也是很复杂宏大的。对于一个初次入门的小白,不是项目的工程人员,读懂复杂代码的每一行代码无疑是极其困难的。所以,一定要放弃那种“我非要读懂全部代码不可”的,略带好奇宝宝的,完美主义心态。拒绝完美主义。初次接触一个大型算法或者复杂的论文,应该先抓住主线,理解整个算法模块的布局。
最好的办法是带着自己的目的去参与到的轮子代码理解中去。例子一:这个检测算法很酷炫,我想加点新功能,那我该怎样去修改呢。例子二:这个SLAM
算法真棒,我想加点小功能,我该如何去实现。例子三:Paper A提出一个检测算法的Attention
模块,我想把它用在现有的Baseline
上。如果我去添加这些新功能,首要问题是它们应该添加在工程中的哪个文件;以及需要借助已有工程中的哪些Class
,哪些API
,以及哪些系统变量。带着问题去读代码,改代码,会事半功倍。
Tip 3:广泛地学,有选择地深,有技巧地读,理智地追论文
大势所趋,CV
方向算法理论也将是复杂化的,多个大领域Topic
相交而成。比如说AI
图像对话,训练网络去描述一幅图像中发生的故事,就涉及到NLP
领域。基于深度学习的三维重建算法,也会汲取传统三维重建的理论。基于深度学习的无监督的深度估计,也会汲取一些计算机图形学的理论和传统图像处理的理论,去设计复杂但有意义的损失函数。以及需要涉猎些复杂的深度学习基础数学理论。如果你的课题有幸接触前沿,你就会发现要求学习的东西有很多。但是有一点,你所学的东西,是为了你的项目/论文服务的,所学的东西是要用在实践上的,能推得出公式,并且能够写在代码里。每天时间都是有限的,所以,理论深入是有选择性的,优先去深入一个最为有助于提高你项目/论文的那一块理论。
几乎每一个领域都会有非常厚的专著,几千页的经典著作。 就算是什么都能不干,从头到尾读一遍,也得花上几个月甚至大半年。况且,要搞懂每一个细节,不花上一年以上的时间是根本不可能的。对于学硕/专硕,根本没有这么多时间。此外,你不妨静下新来想一想:你的项目/论文真的需要这几千页全部的知识吗?与其去读著作,入坑的小白不妨先去看看网课,或者听院系老师讲课,和导师交流,获得对这一领域的一个大致的知识。然后随着自己工作的需要,翻阅经典书籍,解决自己的问题和疑惑。
Tip 4:天马行空可以,但要优先专注于手头的项目/论文
有时候翻翻论文就有会有很多点子和想法。但是要切记,实现一个想法,并让这个想法产生令人满意的结果,这个过程至少需要专心工作一个月或两个月以上,甚至更多。此外,后续的写论文改论文时间也要个四五十天。我所说的专心工作大体指的是一天内大概六七个小时聚焦于此,一周有至少五天这样的工作时间。因此,实现一个想法要付出很大时间精力,而不是想当然地一个下午就能完成。如果你手头上有项目/论文,基本上是没有精力去搞出一个新东西。因此,唯一能够争取的是把眼下的任务做完。如果你手头上的工作恰好是你感兴趣的,那么请专注于眼前的工作;如果手头上的工作是被逼无奈的,丝毫提不起兴趣的,时间可以五五开,哈哈。不管怎样,每天拿出一个小时或者半个小时,天马行空地翻翻论文,想想点子也是很有意思的。总之,天马行空是可以的,但是眼下应该优先专注于手头的项目/论文。
Tip 5:建立自己的持续更新的观念,在科研上,也在生活上
相比前面几条建议,这一条建议比较抽象。笛卡尔说过,我思故我在。你对世界的认识是建立在你与世界打交道的过程中。人价值观的确立(独立的人格,一个存在的人),在于他/她不断对自身实践活动思索的结果。从这样的角度看,我思故我在。从事科研活动,每天与小伙伴讨论问题,每天解决Bug,每天接触新的论文,会增长你对涉猎领域的理解,形成一个自己独有的科学理念或价值观念。这样的话,就不会人云亦云,或者盲目跟风,陷入别人画饼的圈套之中。一个科研者,不仅科研能力强,与此同时,也得有足够的情商,会为人处世,明辨是非,享受生活,乐观面对各种局面。如果不去思考,更新自己的观念,你就会被别人,或是自己,当作一个工具(Tool
)。仅此而已。
3. 结语
究竟什么时候才能造轮子呢?首先需要具备两个条件:(1)高度掌握涉猎领域内核心理论;(2)高度掌握涉猎领域内核心理论代码实现。满足这个两个条件,基本上就是这个领域的专家。其次还有一个可选条件:(3)你拥有一个具备专业知识和编程能力的团队。媒体经常去报道有很多年纪轻轻的牛人单枪匹马造了很多厉害的工程。尽管去羡慕他们吧。但是不能指望自己一蹴而就去做一个复杂庞大的工程项目。
最后送给自己一句话,认清自己,毅行科研。