(转自林达华)深入问题本身
很多做research的朋友喜欢top-downapproach,包括我自己。就是说,在开始一个topic的时候,在第一时间就设定了大体的formulation,model又或者methodology。至于选择哪种设定,往往取决于研究者本身的偏好,知识背景,或者对问题的第一反应。
接下来的事情就顺理成章了,推导数学模型和相关公式以及算法步骤,然后设计程序进行实验。当然少不了再拉上几个相关工作,比较一番。如果自己的设计很幸运地有明显的improvement,于是非常满意,开始写paper(在不少情况下,paper的理论部分甚至提前写好了)。可是,如果不work呢?通常大家会采取下面一些方法中的一种或者几种:
- 观察实验结果,猜想几个不work的原因,然后回头局部调整模型和算法;
- 换一下数据集,看看能不能work
- 祭起“终极法宝”——调参数,人工修改或者写脚本遍历,直到找到一组work的参数为止。不过,那些作为“绿叶”用的参照算法,通常是没有这种待遇了。
无论如何,你总算把实验搞定了。但是,为什么work呢?除了几条曲线,你总得找一些“让人信服”的理由。在我所在的领域,有一些理由几乎是万能的,因而普遍出现在paper里面:
- 以前的算法,不考虑某某因素,而这个因素是很重要的,我的算法考虑了,所以效果更好
- 以前的算法,把某些因素分开考虑,但是它们实际上是相关联了,我的算法把它们结合在一起,体现了这种关联关系,所以更好
- 以前的算法是线性的,但是这个问题本身明显是非线性的,我这里用了非线性的方法,所以更符合实际。为了进一步解释清楚,还画出一些二维或者三维的toy samples,显示出线性和非线性有“多么巨大的差别”
- 以前的方法用的是参数化模型(比如高斯分布),而现实世界明显不是这样子,我这里采用非参数化模型,能更准确地逼近实际分布
- 主流方法大都采用某某算法完成某个步骤,或者某某特征来描述某个方面,其实这个算法或者特征在这里不太适合,我换了一个更适合的或者更“先进”的。
还有很多,不一而足。总体来说,就是增加了某方面的复杂性,推广了模型,或者把某些部分变得更加时髦,数学更深。正因为多了东西可以调节,只要花上足够时间去设定参数,还是有很大机会能找到一组能得到improvement的参数的。可是,这种improvement是不是真正有意义呢?是不是足够significant,以至于所增加的复杂性是值得的呢?
我们的世界总是无限复杂的,和无数的因素相关,这些因素又总是有某种联系。我们的前辈们留给我们的最好的方法,就是从问题中分离出最关键的要素,和最重要的关系,而非不断地增加价值不大的因素,建立意义不大的联系。
我并不是一个完全拒绝复杂,但是我个人觉得对复杂性的增长应该慎重。每增加一个要素,都应该是基于对问题的深入分析,而不是先入为主的设想和冠冕堂皇的理由。这不完全是知识能力的问题,更多的是一种治学态度——是不是愿意安心下来对问题本身进行深入细致的解剖,找出问题本身的关键所在,而不是脱离问题预先构想某种“漂亮”模型或者“巧妙”方法,并且通过上面所述的种种方法推销出去。
研究是一种创新的过程,广拓思路是必须的。但是真正有价值的novelty应该是建立在对问题本身的深入理解,确实发现了别人忽略的关键因素,或者主流算法的真正不足,并且创造性地提出解决方法。这需要持之以恒的努力。真正经得起考验的学术价值,源于解决还没有被解决的问题,而不是使用了某种所谓别人没用过的“新颖”方法来解决本来已经解决的问题,又或者给模型加入某个要素来取得非实质性的性能改进。
上面所说的这些问题,几乎都发生在我的身上。而汤老师的很多建议,其实正是指出了这些问题,却没有被我认真思考,反而总是以为只要理论做得高深,模型设计得精巧,就是好的工作。来了MIT之后,更多地阅读一些有历史价值的文章(现在看CVPR反而比较少了),接触一些更加solid的工作。许多有重要贡献的工作,往往未必有很炫的方法和模型,但是,其对于问题本身的深入发掘和洞察却令我惭愧。
要做真正的学问,首先要戒除浮躁。