Files
2024-08-10 19:46:55 +08:00

153 lines
11 KiB
Markdown
Raw Permalink Blame History

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