import{_ as e,c as a,o as t,a4 as r}from"./chunks/framework.DtvhUNIn.js";const b=JSON.parse('{"title":"如何做研究","description":"","frontmatter":{},"headers":[],"relativePath":"技术资源汇总(杭电支持版)/4.人工智能/4.7如何做研究.md","filePath":"技术资源汇总(杭电支持版)/4.人工智能/4.7如何做研究.md"}'),p={name:"技术资源汇总(杭电支持版)/4.人工智能/4.7如何做研究.md"},o=r('
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
鲁棒性,是描述一个系统受到外界的干扰情况下,仍然能保持较好的性能。
举个例子:
我们的系统的图片加入大量的噪声,已经旋转平移缩放以后,仍然能正确的分类,这表明了我们的工作具有一定的鲁棒性。
从实际的几个例子讲起:
例 1 是在给定一个大题目的基础下,去阅读论文寻找小题目。
例 2 是在给定一个具体细致的题目基础下,直接去想如何解决。
例 3 是在实际工作的情况下发现了一个非常有意义的问题,然后思考如何解决。
例 4 是直接给定一个 idea,去实现,研究者所需要完成的几乎是工程实践。
理想情况下,研究流程应该包含:
Step 1. 提出问题
Step 2. 提出解决方案
Step 3. 验证解决方案的有效性。
有些问题是一直存在,但没有彻底解决的。这一类的问题通常,就不存在 Step 1。从事这一课题的研究者经常会在 2,3 之间来回反复。
从上一小节的几个例子当中,其实不同的人做研究所需要完成的工作是完全不一样的。很多时候只需要做 step 3 即可,从功利的角度来讲这是性价比最高的。
如果我们是一个合格的博士或者我们致力于如此,那么首先的第一步要找到一个好的问题,这是一个非常重要的开始,**一个好的问题往往意味着研究已经成功了一半。 **什么是一个好的问题?它可能会有以下几个特点:
如何确保自己选的问题是一个好的问题?这需要和指导老师及时的反馈。如果指导老师不给力,那么一些方法仅供参考。
以上是一些技巧,把输入调整一下,约束去掉一些,就会有很多新的问题。这个过程通常被叫做**“调研”**
这个过程在是一个相对比较痛苦的过程,因为调研的过程中你会发现很多问题,想到很多所谓创新的解决方法,但是实际上你会发现你的解决方法已经有很多人做过了。这一阶段调整心态很重要,切忌急于求成。
这个阶段需要百折不挠,小步快跑了。一下是有一些可能有帮助的技巧:
做实验的目的是为了快速的验证想法的正确性。以下两个东西最好要有
剩下就是一些工程习惯的问题,比如出现错误用 std::cerr 而不是 std::cout。这是一个需要实践积累的部分,与做研究有些脱节,之后有时间会在其他小节做一些补充。
如何快速的出成果,不管别人如何帮你,前提是你自己要足够的强。不能存在 **“靠别人” **的想法。
对于一个博士生来讲,出成果保毕业,那么可能要对学术的进展要敏感,比如 Nerf 八月份刚出来的时候,如果你非常敏锐的意识到这个工作的基础性和重要性。那么你稍微思考一两个月,总是能有一些创新的 ieda 产生的。所以这个timing 和 senstive就非常重要,当然导师是不是审稿人可能更重要。
对于一个本科生来讲,当然是跟着指导老师的脚步去做。但是如果指导老师只是把你当成一个工具人,一直打杂货的话。你想发论文,一种所谓的捷径是 A+B。就是把一个方法直接拿过来用在另一个地方,大概率这样会有一些问题,那么你就可以针对性的改进,如何针对性的改进?不好的方式是 A+B 套娃,好一些的方式是分析这个不好的原因在哪里,现有的方法多大程度可以帮助解决这个问题,或者现有的方法解决不了这个问题,但是其中的一个模块是否是可以参考的。
自 UNet 提出后就有许多的魔改版本,如 UNet++, U2Net, 而这些 UNet 的性能也十分优异。
可以参考 UNet 的发展历程,去学习如何在前人的工作上加以改进和提升。
注:通过历史的演变来学习是非常有必要的,但是你需要注意一点的是,深度学习很多时候会出现一些情况:
举个例子 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,不然只是一个空想家。
',70),i=[o];function l(n,s,h,c,d,_){return t(),a("div",null,i)}const u=e(p,[["render",l]]);export{b as __pageData,u as default};