刘挺博客
http://users.ir-lab.org/~tliu/blog/
怎样做实验
技术科学是实验科学,一项技术提出来,到底好不好使,“实验是检验技术的唯一标准”。怎样用实验去验证一个想法是否正确呢?第一步是收集数据,第二步是根据你提出的算法编写程序,运行程序,获得实验结果,第三步是对实验结果进行分析,得出结论。
1、收集数据
收集到的数据必须真实可信,数据就是“证据”,有的人专门搜集对自己有利的证据,比如你要做一个问答系统,需要收集一些问题,那么最好的做法是从某个实际运行的网站获得真实的用户提问,而不应该自己提一些问题。自己提问,因为研制者自己知道什么样的问题能够处理,什么样的问题处理不了,所以你以及你所在小组的同学们提的问题往往会容易一些,以至于不利于激活技术难点。
收集到的数据要有足够的规模,具有统计意义,有的学者用几十个句子做实验数据,在提倡大规模真实文本处理的今天,这样的玩具性实验是不被业界认可的。从研究到开发,到产品,再到市场,本来是一个漫长的过程,但是由于今天的NLP和IR学术界越来越重视大规模真实网络数据的使用,以及很多产品直接在互联网上提供服务,从互联网上来到互联网上去,从一开始实验环境就是真实的,就是大规模的,因此从研究到市场的距离被猛然拉近了。这是我们这个行当目前的一个突出优势,必须坚持。
如果你所从事的研究已经有现成的国际标准评测数据,那么就应该要用标准数据,以便和国际同行比较交流。如果你的研究领域比较新,没有标准数据,也没有关系,只要你自己采集的数据真实充分,同样可以说明问题。
2、编写程序
编程是研究人员的基本功,研究人员不应该在编程上有什么障碍,应该能够做到有了想法就能够快速实现一套相应的程序代码。你写的程序是否与你设计的算法完全吻合,是一个需要探讨的问题,有时候你觉得你设计了一个天才的算法,一定能够获得10%以上的指标提升,但实验结果令你大失所望,这是你不要立即心灰意冷,首先要自己检查你的程序,没准是某一行代码出了问题呢。在编程代码方面,还应该注意的一个问题是积累工具。由于你可能长期在一个课题上开展工作,因此非常有必要积累一些常用的代码,比如对语料进行预处理的代码等,这样可以节约很多时间。
用于研究的程序不一定太追求可靠性和速度,因为它的核心目标是验证算法的合理性。但这并不意味着可以乱写程序,造成频繁出错,弄得自己心烦意乱,本来注意力在算法验证上,这样一来不得不把注意力放在调试程序上面。程序的速度也必须考虑,如果每运行一次都需要一天一宿,每当你有一个新的想法,即使是一个小小的改进,都等到第二天早晨才能看到结果,你的研究一定会被这蜗牛般的程序速度拖累得奄奄一息。
3、分析结果
经过一番努力,你的程序调通了,实验结果出来了,你的伟大设计是否真的卓越无比呢?我敢说,10次有9次都会不如人意,怎么会这样?没办法,因为你在做创新性的工作,“你向前一小步,就是人类的一大步”,这注定是一件艰难的工作。
如果你的实验结果达到了预期的效果,说明你触摸到了真理,可喜可贺。但不能停留在实验验证上,要给出理论分析,为什么你的方法能够取得比别人更好的结果,说不出让人信服的道理来,仍会受到同行的质疑。实验结果再好,仍然达不到100%,做错了的都是哪些数据,具有什么样的特点,可以对这些数据进行细分类,分别找出解决办法,在以后的工作中继续改进。如果实验结果不佳也不用沮丧,因为你已经知道“研究中不如意事十之八九”,我就常常碰到这种情况,特别是我给研究生们出了新点子,他们按照我的想法作了实验,结果效果不佳,我多少会觉得有点尴尬。遇到这样的情况,说明这一仗没有打好,对敌情估计的不够充分,有点像“三打祝家庄”,头两会不了解祝家庄的机关埋伏,只好积累经验,第三回再打。有时,实验结果神奇地超出国际最好水平10%以上,遇到这种情况,几乎可以断言你的实验做错了,或者你的实验条件跟别人并不完全相同,切勿盲目乐观。
前面讲过,创新应该是在世界范围内取得最佳结果,因此你的实验结果要在同等条件下和国际上的最好水平进行比较,方能证明你的成功。很多刚开始搞研究的人,往往犯一个致命的错误,就是儿童式的直线思维,例如:<问题>有人求我画一辆汽车;<工具>我找了一支铅笔和一张打印纸;<结果>我画了一辆奔驰(完)。你为什么要用铅笔,而不用毛笔,不用油画笔,为什么不用宣纸,不用油画布?别人用的是什么工具,有没有人用过油画笔和油画布?如果有,他们的作品是否比你的好?你为什么画了一辆奔驰,而不画宝马?你怎么知道别人喜欢奔驰,不喜欢宝马?比较和思辨是科学的翅膀,没有翅膀,就只能在地上爬行。我找到了一支铅笔,因此我就用铅笔画了;我熟悉铅笔的运用;我看到我的一个同学画了一幅铅笔画很好看,因此我也用了铅笔,等等,这些都不是理由,你必须在比较中思辨,在思辨中给出令人信服的理由。
最后还要问问自己,根据你的实验是否具有可重复性,也就是说是否任何一个学者在地球的任何一个角落只要按照你的实验方法重新做一遍,就能够得到相同的结果。真理应该是放之四海而皆准的,如果你的实验不能被重复,它的价值就会被打上一个大大的问号。
怎样写论文
要写好论文,首先要对写论文的意义有足够的认识。不少工科大学的研究生对工程开发很有兴趣,对做实验也还可以,就是在写论文这个环节上打不起精神来,总是草草应付。其实,“立言”与“立功”同样重要,多年后你开发的软件早已被淘汰,但是你在论文中表述的思想精华,却能够持续地对业内同行产生影响。科学的大厦需要每个研究者添砖加瓦,而科学的砖瓦就是“学术论文”,你再才华横溢,再巧思独运,如果不能以学术论文的形式把你的成果展示给整个学术界,你的学术贡献仍然无从体现。一个工程项目可能殷泽一时一地,一个学术思想却能够影响深远。认为写论文是“虚”的,干项目,干产品是“实”的,这种想法是错误的。
认识到了发表论文的价值,就有助于激发撰写论文的激情。科学论文是严谨的,学理工的人也比学文科的人更显冷静,但是写学术论文和写小说一样需要热情。你做了两年的工作,面对难题,几番挫败,终于找到了一条解决之路,你的喜悦从内心深处涌起,快乐需要与知音分享,此时此刻,你的家人由于不懂你的专业,已经无法在深层次理解你的成功,何不拿起笔来,写一篇论文,把你的成果告诉全世界的同行。
写论文很象编程序,作者就是程序员,每个概念就是一个变量,每行语句都是一条代码,变量的定义要清楚,代码的可读性要强。自己写完了论文,最好请导师和同学帮助挑错,这是在做测试;根据大家的意见要反复修改,这就是在调程序,调程序要细工慢火,一点点地熬,不厌其烦。审稿人相当于软件认证机构,最终的运行是在每个读者的大脑中进行的。如果论文写得不好,审稿人和读者看到一半就无法跟上作者的思维了,这就属于死机了。如果我们拿出调程序的态度调文章,用软件工程的思想管理写文章的全过程,那论文的录取率一定会大幅度攀升。
我有一个学生,写一个摘要,总共四五个句子,他要闭门谢客,整整写一个下午,反复斟酌调整,下过这样的功夫,论文的命中率肯定高。一般人都缺乏耐心,论文写完了就想投出去,不愿意看第二遍。其实“反复修改”是决定论文质量的最关键的一环。我认识一个论文高手,他写完论文就放在抽屉里,过几周拿出来再看再改,如此反复多次再投出去,命中率很高。写论文细活,是妙龙绣凤,是雕梁画栋,不是挖煤打铁,不是担水挑粪,没有细密的心思,没有绝佳的耐力,没有创造艺术品的雅趣是做不好的。
编程序,脑子里要想着用户的需求,写文章,也不是内心独白,要始终在心里有一个读者模型。很多初学者喜欢自说自话,概念A不定义清楚,就开始用A描述别的事情,或者把在A的基础上才能够理解的概念B早早地抛了出来。你自己知道A是怎么回事,不能就认为读者们也会理解,作者要找到“导游”的感觉,始终想着读者走到了哪一步,如果觉得某个环节很重要,读者不一定能够完全明白,还有换一种说法再作解释,绝对不能自己连蹦带跳地往前跑,把读者扔在半路不管了。顾客是上帝,读者是我们的上帝。
不要认为自己以前没有写过学术论文就打怵,其实学术论文也是一种议论文,我们在中学里都学过议论文的写作,议论文要有“论点、论据、论证”三个要素。一篇学术论文的论点通常是:“我提出的方法M比现有的其它方法在问题Q上更有效”。为了证明你的论点,需要“摆事实,讲道理”,事实就是实验,光有事实没有理论分析也不行,难以让人信服,二者缺一不可。很多人说自己的英语不行,影响了论文的发表,其实英语不是最重要的问题,最重要的是论证行文的内在逻辑,论证要丝丝入扣,清澈见底,不能枝杈横生,云山雾罩。好的论文还能起承转合,层层深入,带领读者一起走过九曲回肠,直至柳暗花明,让同行们读罢拍案叫绝。
论文怎么才能越写越好呢,关键还是要多实践,在实践中不断总结经验。美国的孩子从小就自己去图书馆查资料,针对一个题目写长篇大论,长大了,他们写出的学术论文冗长,但的确逻辑清楚,文字干净。我们的同学有的语文没有学好,不但布局谋篇不擅长,语法也常有错误,特别是有的还把网络上的语言习惯搬了上来,别字很多,排版凌乱,让人一看就不舒服。耐着性子看看其中的内容吧,看了半天也发现不了论文的要点,论文没有经过精心的组织,简单把一些实验堆砌在一起,啰里啰唆,如同梦呓,这样的论文在审稿人那里,极可能在30秒之内被枪毙。审稿人往往都是业内专家,专家都非常忙,抽空审阅一下论文,如果你不能再论文的开头用最简洁清楚的话语描述清楚你的问题以及你的创新性的解法,就剩下在收到退稿信后大声疾呼:“(审稿人)根本就没读懂”。行有不中,反求诸己,抱怨没有用,还是在投稿前下足功夫吧。
|