“科研流水线”及师生合作

  • 山世光 (2014年以后的旧数据)
  • 1725

    不经意间,自己在计算机应用专业领域从事科研工作已经十余年了!围绕着人脸识别这一典型的应用问题,我和合作者们(开始主要是导师,后来是师弟师妹们,现在则包括了自己指导的研究生)在图像处理、计算机视觉和模式识别等学科领域滚打摸爬了十余载,回过头来看看走过的这段历程,似乎还有点成绩。更重要的是,回首这些年来走过的科研历程,在科研观念和研究方法论、问题发现与解决技巧、论文发表与学生培养等等诸多方面似乎还是蛮有心得的。其中最重要的,还是我对于科学研究,至少是计算机应用专业领域的科研工作流程的认识越来越清晰,对不同身份的研究人员(主要是导师和研究生)在其中扮演的角色越来越明确,因而可以相对高效的运转这样一条“科研流水线”。下面就重点谈谈我个人对所谓“科研流水线”及其中师生合作双赢关系的认识。
    我认为科学研究,至少是计算机应用专业领域的科研,往往遵循一个由12个步骤形成的流水过程(如右图所示)。该过程乍看起来很像软件工程中讲述的“需求-设计-实现-测试”这一软件开发流程,实际上,个人认为这种相似性其实很必然,毕竟大多数的计算机应用研究是要面向特定需求或解决特定问题的,因此会遵循“问题—思路—算法—实验”的类似流程。但二者的根本不同在于,软件开发的目标是确定的,因此强调的是“满足需求,实现功能”,甚至允许是“不管白猫黑猫,抓住老鼠便是好猫”的做法。而科学研究的目标往往是不确定的(极端情况下甚至可能是无解的),因此更强调理论上的简约与完美,强调逻辑上的严谨和缜密,强调解决方法的优雅与推广性,强调算法的最优化(最好能做到“后无来者”——别人不用做了),强调对前人工作的理性质疑和批判,当然最最重要的是强调创新,最被推崇的就是“前无古人”的开创性工作。这些特征必然要体现在科学研究流程中的每个环节上,下面结合自己的科研实践,谈谈我对该流程中每个环节的认识,并分析导师和研究生在其中的不同职责。

    步骤1:科学的需求分析:科学研究的需求来源是非常多样的,常见的如国家重大需求、产业共性需求、社会发展需求、人民生活需求等等。还有一类需求则来源于更纯粹、更抽象的学科发展内在的前进动力,如学科理论基础的完整性和统一性,也可能来源于技术本身发展的惯性趋势(即所谓技术引导需求)。此外,研究人员的好奇心和个人兴趣往往也会成为一种内在的科研动力。无论哪种需求,都应该得到理性的尊重。在这一阶段,导师乃至研究团队学科带头人的作用往往是决定性的,研究生大多处于被动接受的位置。但实际上,导师的研究方向一般都是确定的,所以,研究生在选择导师时一定要审视自己内心的“兴趣”所在,扪心自问是否与导师的研究方向一致,避免以后不得不做自己没兴趣的事情。“兴趣是最好的老师”,没有兴趣就少了一位老师,这道理很明显。
    步骤2:确定研究课题:需求分析的结果往往是一个大问题或大任务,需要首先将其分解为一个个条件更为可控的子任务或者子问题,这里我称之为研究课题(不是指科研项目)。例如我们在进行人脸识别这一大问题的研究时,其中有一类“单一样本人脸识别问题”,即:每个待识别人在数据库中只注册了一个图像的情况,这就是一个具体的研究课题。从师生合作的角度来说,研究生往往在入学后不久就被分配了一个具体的研究课题,所以这一课题的确定往往都是导师决定的。这当然非常考验导师对于科学需求和研究趋势的把握,过难或过易的研究课题都可能给研究生未来的科研生涯带来不利的影响。幸运的是,该环节一般与接下来的调研环节是强耦合的,调研的结果可能会进一步修正研究课题的具体任务。
    步骤3:调研state of the art:即针对给定的研究课题,通过调查研究,回答下述问题:在该课题上国内外有哪些研究者,已经做了哪些工作,这些工作如何分类、有何优缺点,当前最好的方法已经做到了什么程度,还有什么问题没有解决,目前的发展趋势是什么等。这是科学研究中至关重要的一环,很多研究工作之所以最终成为同行不屑一顾的“垃圾”,很多是因为调研上出了问题,导致或者重复了别人的工作,或者解决了别人早已解决了的问题,或者做了远不及当前最好系统的结果。在这一环节上,我的基本经验是:一定要尽快找到该方向上的3到5个state of the art的技术或方法,并尽早跟踪实现它们!这里我之所以保留英文,是因为实在找不到合适的翻译,而这个英文词组本身含义非常清晰(如果一定要翻译的直白一点的话,可能是“某方向上的最好的东西”之类的意思)。State of the art之所以重要,是因为科研的目标当然是要超越现在最好的东西,如果我们连现在最好的东西是什么都不知道,何谈“超越”?
    那么该如何调研如何发现state of the art?个人经验有几条:1)先看针对该方向的最新综述(Survey或Review),现在国内期刊上也经常发表综述文章,可以参考但我建议一定不要只参考中文综述;2)找该领域方向最顶级的国际会议和期刊,把其中最近3~5年的相关文章都泛读一遍,看其中最常被引用、最多被比较的工作有哪些,然后精读其中至少50篇;3)找出领域大牛并经常关注领域大牛的研究动向。这一点请一定不要误解为迷信权威,理性的质疑权威往往是突破的契机,但质疑一定要建立在清楚了解的基础上,所以,为了打倒权威们,先去了解他们吧!4)找机会多听讲座或者看该领域大牛的Tutorial,现场聆听也许不现实,但网络时代资源是足够丰富的。
    在调研阶段,师生共进是非常重要的。研究生有足够的时间和精力可以大量的阅读论文,从而能够把握更多的文献和细节,但可能因缺少全局观而判断力不足,因而难以形成有效地知识体系;而导师往往本就在相关领域具有一定的基础,而且知识体系更全面,可以形成更好的判断。因此,在这一阶段,研究生与导师应该多交流,共同形成对研究方向的准确把握,从而提出真正有价值的学术问题。
    步骤4:提出新问题:如前所述,调研的结果应该是提出真正有价值的学术问题。让我们再次重温爱因斯坦的至理名言吧:“提出(发现)一个问题往往比解决一个问题更为重要,因为解决一个问题也许只是一个数学上或实验上的技巧而已。而提出新的问题、新的可能性,从新的角度看旧问题,却需要创造性的想象力,而且标志着科学的真正进步”。那么这样的好问题从何而来?我的经验是:问题根源于研究者对相关领域知识体系的全面把握和对已有方法优缺点的准确认识。对知识体系全局的掌握使我们有可能知道现有体系哪里不完善,不完美,不优雅,哪里有漏洞可以弥补,哪里应该有一个新的增长点。而对已有方法优缺点的认识,特别是对现有state of the art方法之“不能”和“失败案例”的认识,使得我们可以直接提出问题:如何克服现有方法的某某缺陷?
    在这个环节上,我认为导师要起更大的作用,导师具有的全局观可以帮助提出更有价值、更具一般性的学术问题。而高年级的研究生也应该逐渐担负起更多的责任,特别是在深刻掌握了领域典型state of the art方法之后(应该仔细研读3遍以上),可以针对这些方法的缺点提出具体的问题。师生的互动讨论,则可以提炼出全局和局部上都具有价值的科学问题。
    步骤5:独立思考问题:即通常所说的分析问题。之所以强调独立思考,是因为我感觉在网络时代,很多研究者特别是研究生的独立思考能力被大大抑制了,容易受到前人工作的影响,因而陷入已有的窠臼不能自拔,特别是对热门方法的推崇,更加重了这些研究人员研究的从属地位。所以,我建议在这个阶段应该少看文献,而多像胡适先生倡导的“大胆假设”,或者像CMU Takeo Kanade教授说的“像外行一样思考”。我认为无论大胆假设还是外行思考,都是在强调“直觉”,强调“常识逻辑推理”的重要性。在这一个阶段,我认为导师和研究生的职责应该是基本平等的,特别是高年级的研究生,必须逐渐养成独立思考的习惯(我认为思考更多的是习惯,而不是能力)。
    步骤6:提出新解决思路:这一环节其实是独立思考的结果,与独立思考问题是不可分的。这里需要强调的是,我感觉在这方面导师应该发挥更大的作用,特别是在指导低年级研究生时,提出明确、具体、可行的研究思路是非常关键的,因为低年级同学往往“思而无果”。而在指导高年级研究生时,则可以从较高的方法论层次上或者从技术路线层次上给出问题的指导性解决思路。例如,针对上述的单一样本人脸识别问题,我提出了采用回归方法从单一样本预测类内散度的思路,该思路经过博士生形式化和具体算法设计后,取得了较好的实验效果,因而被领域顶级国际会议接收。
    步骤7:解决思路的形式化:上述的解决思路往往是文字化的描述,因不够严格而存在种种不确定性,因此,有必要把思路从文字变成符号,从而得到精确的、形式化的符号式表述。这一点最近我感触颇多,我发现有时候把自己的思路和研究生沟通后,研究生设计的算法并没有遵循我的思路,也就是出现了理解的偏差。究其原因,是因为没有对思路进行必要的形式化。在这一点上,导师可以有意识的锻炼研究生的形式化能力,把思路通过语言描述后,可以安排研究生进行形式化,然后再对形式化后的思路进行审查和进一步讨论。同样的,对问题和思路进行形式化可能也是一种习惯,是严谨和缜密科学精神的具体体现。
    步骤8:求解算法设计:即根据形式化后的研究思路进行具体算法设计的过程。我认为这个工作更多应该是研究生的职责,导师的作用更多的应该是对设计出来的算法进行评价或纠偏。当然,如果是低年级研究生,导师需要更多的参与到算法设计中。需要注意的是,一个研究思路可能存在很多种可能的实现算法,研究生的算法设计能力在这里会有很明显的体现:两个不同的研究生去实现同样一个思路,可能会有完全不同的结果甚至得出相反的结论。原因就在于其设计的算法是否真的忠实反映了所提出的问题解决思路。坦率的说,在这一点上,好学生和差学生的差别很明显:一个好学生可以把一个平凡的思路做的有声有色,而一个差学生可能会把一个很好的思路做死。
    步骤9:算法实现:这一步骤更多涉及的是编码实现,一般来说主要是研究生的职责。导师一般认为这应该是研究生的基本功,所以往往不够关注,但其实事关科研效率。试想,一个编程实现能力强的研究生2天可以完成的算法实现和调试,在一个缺少编程经验的同学那里,可能需要2个星期才能实现,科研效率的差别是显而易见的。所以,研究生应该重视自己的编程实现和调试能力的提高,尽量不要在这个问题上拖自己科研的后腿。
    步骤10:量化评估实验设计:计算机应用专业本质上属于工程性学科,因此,除了必要的理论分析,评估实验通常是验证解决思路可行性、算法设计合理性和算法实现正确性的必需手段。我的经验是评估实验要注意三点:1)度量算法好坏的标准应该是领域同行公认的指标,除非你证明这些指标存在问题;2)评估实验一定要有量化的结果,即使是主观评测,也应该有足够的被试进行评价,从而给出量化的评价结果;3)实验数据应该是国际同行公认的、中等以上难度的数据库,最好是state of the art方法所采用的那些测试数据集;4)实验评估必须是无偏向性的,绝对不能挑选数据或者只测试对自己的算法有利的指标,掩耳盗铃的故事大家都知道,后果很严重。在这个步骤中,研究生当然是主力,但导师必须要对实验设计进行必要的审核,以确定评估实验是无偏的、量化的、能够匹配所提出问题的。
    步骤11:实验观察&对比分析:得到评估实验结果并进行对比分析显然是科学研究过程中最值得期待和令人兴奋的步骤,但同时也是最考验研究人员洞察力和逻辑推理能力的过程。因为实验结果是解决思路、算法设计、算法实现和实验评估等前述多种因素共同作用的结果,特别是实验结果不好或者有异常的时候,我们必须反向推理,去寻求结果异常的根源何在:是思路本身有问题?算法设计不合理?实现有错误?还是实验设计不合适?这是最需要导师和研究生密切配合的时候,丰富的研究经验使得导师有可能根据实验结果直接指导研究生可能的问题在哪里,甚至观察出实验结果中异常点,从而发现有价值的改进线索。为此,研究生应该尽可能多的提供给导师除了最终结果之外的中间结果,以便导师做出更准确的判断,进而反馈改进解决思路及形式化、优化算法设计、调优算法参数或者改进实验评估策略。太多的例子已经表明:国内外研究人员在很多问题的解决思路上往往是趋同的,最终取得成功的往往是那些通过上述反馈调整把这些思路做到了“极致”的那些研究者!
    值得特别关注的是该与什么方法进行对比分析。我的经验是:一定要跟state of the art的3~5种方法进行全面、系统的对比。否则是不宜得出任何确定性的结论的,而如果作为论文投稿,没有这种对比也一般不会被审稿人接受。其原因还是基于前述的道理:计算机应用科学研究的价值更多体现在state of the art结果的不断超越和更迭上。
    步骤12:得出结论&提出新问题:上述实验结果如果足够充分而且对比丰富,则提供了宝贵的第一手资料,足以支撑一些基本的结论。更重要的是,所谓“实践出真知”,这些结果和对比分析为我们提供了更为宝贵的经验,可以使我们更深刻的认识相关课题领域存在的真实问题是什么,什么样的思路可能是有效的,从而使我们可以进一步提出新问题或者新的解决思路,从而再次回到科研流程的第4个步骤上。在这样一个节点上,导师和研究生的深入讨论是发现新问题、诞生新思路的法宝。
    需要说明的是,尽管上述自上而下的流程中的每个步骤都是很重要的,但我个人认为这恰如河流,还是有上下游之分的。总体而言,越是上游的步骤,就越重要一些。比如问题比思路重要,思路则比算法重要,而算法则比实现重要,等等。因此,不难发现,研究人员的成长过程一般都像逆流而上的鱼儿一样“力争上游”。总体而言,这没有错。我也主张研究生培养可以遵循这样的一个过程:在低年级的时候侧重在“实现”层面(由导师等完成其他主要步骤),而随着年级的增高,工作重点必须逐渐往上游提升,最终应具备独立完成从提出问题到得出结论这一全过程的能力——即所谓独立从事科研工作的能力。但是,这里必须强调两点:1)上游重要并不等于下游不重要,如前所述,同样的好问题或好思路,可能因为后续实现过程的种种问题而被扼杀;反过来,一个看似平凡的思路,被做到极致也可能产出非常好的成果。特别是根据评估实验结果和对比进行反馈修正上游步骤的能力,更是至关重要的。2)导师应该加强对研究生研究流程全过程的“监控”,并在每个环节上给出全局性的建议和帮助,必要时要及时纠偏,以免研究生走过多的弯路。这一点是非常必要的,因为研究生很多时候处在科研流程的局部,容易陷入“局部最优”,而不是“全局最优”。
                                         (山世光,研究员,中科院计算所)