如何做研究
0. 讲在前面
Author:任浩帆
Email: yqykrhf@163.com 术语介绍的补充:Spy
仅供参考,如有不足,不吝赐教。
术语的介绍
**Benchmark:** 评测的基准。通常会是一些公开的数据集。
Baseline: 基准,一般指的是一个现有的工作。
**SOTA **(state-of-art): 截止目前,指标最好。
举个例子:
我们选取 XXX-Net 作为我们的 Baseline,在加入我们设计的注意力机制的模块,在 KITTI 这个 Benchmark 上性能达到了 SOTA。
Backbone:
这个单词原意指的是人的脊梁骨,后来引申为支柱,核心的意思。
在神经网络中,尤其是 CV 领域,一般先对图像进行特征提取(常见的有 vggnet,resnet,谷歌的 inception),这一部分是整个 CV 任务的根基,因为后续的下游任务都是基于提取出来的图像特征去做文章(比如分类,生成等等)。
所以将这一部分网络结构称为 backbone 十分形象,仿佛是一个人站起来的支柱。
Solid
一般是描述这个工作非常扎实。
这个工作很 solid。每一步都 make sense(合理)。没有特意为了刷 benchmark 上的指标,用一些 fancy trick(奇技淫巧)。
Robust
鲁棒性,是描述一个系统受到外界的干扰情况下,仍然能保持较好的性能。
举个例子:
我们的系统的图片加入大量的噪声,已经旋转平移缩放以后,仍然能正确的分类,这表明了我们的工作具有一定的鲁棒性。
坐而论道
2.1 研究是什么
从实际的几个例子讲起:
- 某学生,被老师分配了一个课题的名字:《语义分割》。之后开始看相关的论文,了解到有实时语义分割,视频语义分割,跨模态语义分割等等子任务或者交叉任务,然后跟导师开始汇报自己的一些感想,最后在老师的建议之下拟定了具体的课题,开始思考解决方案。
- 某学生,被老师分配了一个课题的名字:《存在遮挡情况下的单目人体重建》 。之后这个学生对这个问题提出了有效的解决方案。
- 某同学在 waymo(Google 自动驾驶子公司)实习,发现没有用神经网络来直接处理点云的工作。于是决定做一个神经网络能够直接输入点云,经过几番尝试以后,提出了《第一个能直接处理点云的网络》。
- 某高校的本科生在 lcw 下的指导下做科研的流程:老师直接给给一个 basic idea,然后让本科做实验,在这个工程中非常有针对性的指导。
例 1 是在给定一个大题目的基础下,去阅读论文寻找小题目。
例 2 是在给定一个具体细致的题目基础下,直接去想如何解决。
例 3 是在实际工作的情况下发现了一个非常有意义的问题,然后思考如何解决。
例 4 是直接给定一个 idea,去实现,研究者所需要完成的几乎是工程实践。
理想情况下,研究流程应该包含:
Step 1. 提出问题
Step 2. 提出解决方案
Step 3. 验证解决方案的有效性。
有些问题是一直存在,但没有彻底解决的。这一类的问题通常,就不存在 Step 1。从事这一课题的研究者经常会在 2,3 之间来回反复。
2.2 如何做研究
从上一小节的几个例子当中,其实不同的人做研究所需要完成的工作是完全不一样的。很多时候只需要做 step 3 即可,从功利的角度来讲这是性价比最高的。
如果我们是一个合格的博士或者我们致力于如此,那么首先的第一步要找到一个好的问题,这是一个非常重要的开始,** 一个好的问题往往意味着研究已经成功了一半。 ** 什么是一个好的问题?它可能会有以下几个特点:
- 理论上能实现某种意义上的统一,从而使得问题的描述变得非常优雅。比如 DepthAwareCNN
- 对于之后的工作非常具有启发的作用,甚至达到某种意义的纠偏作用。比如 OccuSeg
- 本身足够 solid,可以作为 meta algorithm。比如 Mask-RCNN
- 是一个大家没有引起足够重视,却非常棘手且非常迫切的问题。比如相机快速运动下的重建,MBA-VO
2.2.1 如何去找一个好的问题
如何确保自己选的问题是一个好的问题?这需要和指导老师及时的反馈。如果指导老师不给力,那么一些方法仅供参考。
- 自己和工业界的一些人去交流与沟通,看看实际落地的痛点是什么?面对这些痛点,已有的研究方法能否解决,是否有一些现有的 benchmark 或者容易制作的 benchmark 来做为评价标准。
- 做加法。举个例子:图片可以做语义分割。那么图片 + 深度图如何更好的做语义分割。图片 + 文字描述的做语义分割。现在的语义分割的标注都是 0,1,2,3 这些数字,然后每一个数字对应一个实际的类别,这个对应表是认为规定的。如果我把 0,1 的对应关系换掉。重新训练以后就,网络的性能是否会影响?
- 做减法。对于点云的语义分割的标注,通过是非常费时费力的。那么对于点云来说,少量的标注是否是可行的?比如只标注百分之 10 的点。
以上是一些技巧,把输入调整一下,约束去掉一些,就会有很多新的问题。这个过程通常被叫做 **“调研”**
这个过程在是一个相对比较痛苦的过程,因为调研的过程中你会发现很多问题,想到很多所谓创新的解决方法,但是实际上你会发现你的解决方法已经有很多人做过了。这一阶段调整心态很重要,切忌急于求成。
2.2.2 如果提出解决方法
这个阶段需要百折不挠,小步快跑了。一下是有一些可能有帮助的技巧:
- 多读本领域的论文。(说起来非常玄妙,会在如何读论文部分详细解释)
- 读一些基础,跨领域的论文。把其他领域的方法搬过来直接用。直接用通常情况下会存在一些问题,那么需要针对性的做一些改进。
- 从历史出发。将你面对的问题抽象成数学问题,这个数学问题可能过去很多人都遇到过,去看一看他们是如何解决的,从中获取一些灵感。
2.2.3 如果做实验
做实验的目的是为了快速的验证想法的正确性。以下两个东西最好要有
- 版本控制
- 日志系统
剩下就是一些工程习惯的问题,比如出现错误用 std::cerr
而不是 std::cout
。这是一个需要实践积累的部分,与做研究有些脱节,之后有时间会在其他小节做一些补充。
快速出成果的捷径与方法
如何快速的出成果,不管别人如何帮你,前提是你自己要足够的强。不能存在 **“靠别人” ** 的想法。
对于一个博士生来讲,出成果保毕业,那么可能要对学术的进展要敏感,比如 Nerf 八月份刚出来的时候,如果你非常敏锐的意识到这个工作的基础性和重要性。那么你稍微思考一两个月,总是能有一些创新的 ieda 产生的。所以这个 timing 和 senstive 就非常重要,当然导师是不是审稿人可能更重要。
对于一个本科生来讲,当然是跟着指导老师的脚步去做。但是如果指导老师只是把你当成一个工具人,一直打杂货的话。你想发论文,一种所谓的捷径是 A+B。就是把一个方法直接拿过来用在另一个地方,大概率这样会有一些问题,那么你就可以针对性的改进,如何针对性的改进?不好的方式是 A+B 套娃,好一些的方式是分析这个不好的原因在哪里,现有的方法多大程度可以帮助解决这个问题,或者现有的方法解决不了这个问题,但是其中的一个模块是否是可以参考的。
3.2 学习别人是如何改进网络的(Beta)
自 UNet 提出后就有许多的魔改版本,如 UNet++, U2Net, 而这些 UNet 的性能也十分优异。
可以参考 UNet 的发展历程,去学习如何在前人的工作上加以改进和提升。
注:通过历史的演变来学习是非常有必要的,但是你需要注意一点的是,深度学习很多时候会出现一些情况:
- 你认为你提出的改进方法是有效的,但是实际是不 OK 的
- 你认为你提出的方法可能有效,实际上也确实有效。然而你不能以令人信服的方式说明这为什么有效。
举个例子 ResNet 为什么有效。“因为网络越深,可以拟合的函数空间就会复杂,但是越深网络效果反而变差。那么从一个角度来思考:网络至少某一层 i 开始到最后一层 k,如果学习到的函数是 f (x)=x 的恒等映射,那么网络变深以后至少输出是和 i-1 层的是一模一样的,从而网络变深可能不一定会变好,但是至少不会变差才对。” 看起来很有道理,然后 CVPR2021 分享会,ResNet 的作者之一,xiangyu zhang 说 “当时也完全不能使人很信服的解释为什么 ResNet 就一定效果好,感觉更像是基于一些灵感,得到了一个很棒的东西,更像是一个工程化的问题,而不是一个研究。但我们可以先告诉别人这个是非常有效的,至于为什么有效,可能需要其他人来解决。”
再举一个例子 BN (Batch normalization) 为什么有效,你去看 BN 的原论文和之后关于 BN 为什么有效的研究,会发现原论文认为有效的原因是不太能让人信服的。但这不妨碍 BN 有效,而且非常快的推广起来。
其实这件事可以类比于中医,做研究就好比要提出一套理论,但是我不知怎得忽然发现有一个方子经过测试非常有效,但是我确实不能给出一个很好的理论解释说明这个房子为什么有效。但是我尽快把这个方子告诉大家,这同样是非常有意义的。
举这个两个例子是为了说明,类似 ResNet 这种拍一拍脑袋就想出的 idea,一天可能能想出十几个,但是最后做出来,并且真正 work 的非常少。这里面就存在一个大浪淘沙的过程,可能我们看到的经典的网络,比如 Unet 就是拍拍脑袋,迅速做实验出来的。我认为这种思考方式仅仅值得参考,并不值得效仿。现在早已经不是 5 年前那样,却设计各种 fancy 的网络结构去发论文的年代了。
那么我们应该如何对待神经网络?(之后再写)
但我想 Charles qi 的思考方式是值得借鉴的。论文的顺序是
PointNet------>PointNet++------>PointFrustum-------->VoteNet
有对应的中文 Talk。但我建议先去读论文,之后再看 talk。
我们不应该无脑的认为我们给什么数据,网络就会得到好的结果。说什么高层,底层特征云云。
思考问题可以先从类似哲学的 high level 层面开始,但是具体操作一定要 make sense,不然只是一个空想家。