由搭建Infrastructure of Machine Learning所想到的

这一段时间和唐良师兄一起做一些Machine Learning的基础工作,准备把目前一些最基本的算法用C++实现做成库,方便以后实验室做实验。同时他的观点和我一直所想的一些观点一致,现在正好借此机会写出来。

      这个工作看起来非常的没意思,只是做一些前人早就已经完成的工作,相当的没有创造性,也不能够有所成果。其实不然,这样做是有很多好处的。而且对于实验室对于个人来说都有好处。

      首先对于实验室。我想做过论文实验的人很多都有这样的体会,那就是做一个对比试验需要做很多重复性的工作,把别人的文章中的数据结构和算法重新实现一遍,然后和自己的做比较。这样是很耗费精力的,因为每次做实验都要多写很多的重复性程序,其实真正有价值的只是自己那个,其他的只是“绿叶”而已。可是不这样做不行,因为在很多情况下对比实验是必须的,没有的话自己的数据结构或者算法会显得相当没有说服力。因此大家通常有两条途径获得对比程序,第一是直接找原作者找现成的代码,第二是自己实现,两种方法各有利弊。

      对于第一种而言,这种方法很省力,而且得到的代码也是由原作者亲自写的,既能够完全反映原作者的想法又有权威性。但是它有一个缺点,那就是当时的程序所处的环境也许和你现在的环境不一样,或者使用的程序语言不一样,和自己的程序不具有可比性,不能够拿来做对比试验。另外,原作者的测试数据与自己的测试数据也可能类型不同,这样原作者的程序也不能拿来直接用。总而言之,使用原作者现成的程序的局限性很大。

      对于第二种方法来说,自己写程序确实能够完全满足自己订立的规约,能够很好的用到自己设计的实验当中,而且自己写的程序具有很好的可比性,能够做到各个程序在完全相同的环境下运行,做出的实验比较公正真实。然而这样做的时间成本很高,而且经常是做的重复性工作,往往做一个对比实验需要若干个其他同类型的程序,全部自己从头一个个写相当耗费时间,而且一些程序还需要其他的基础,比如使用其他的更基础的数据结构和算法,这样下来我们又需要实现那些程序,这样是相当漫长而痛苦的一个过程。

      因此,如果对自己所有的实验订立一个统一的标准的话,那么以往做实验时做过的工作就可以重用,从而大大减少实验准备时间。当然,对于一个实验室或者一个group而言,大家可以共同订立一个规约,从而可以共享以往的实验资源,这样对大家都有好处。国外很多的实验室都有自己的一套体系,都具有积累了多年的实验资源。这样,如果需要做一个新的实验,只需要简单的使用以前的资源,节省了大量的时间,同时减少了出现错误的几率。然而国内的情况并不是这么理想,有相当大一部分实验室是单兵作战,或者是一个非延续性的团体。大家做实验都是“自己做原材料,从原始社会开始工作”,这样是很难达到很高的水平的,这不是因为我们达不到高水平,而是因为从最基础的开始做起达到高水平时间成本太高了,一般人承受不了。我们国人的科研能力应该说是相当强的,不然顶级会议上不会出现这么多华裔人的面孔。

      现在来说说对于个人的好处,这个就不细讲了。无非就是可以让自己快速的熟悉这个领域,其次就是提高自己的动手能力。对于前者,有些人会说,看专著读综述可以更快的了解。这个确实没错,但是这样只是被动的接收知识,很难以牢固的掌握。俗话说百闻不如一见,同样,百见不如一练,只有自己亲手做过的事情自己才有印象。也许有人有这个经历,上课总觉得不如自己看书效果来得好,一上课就犯困,但是自己看书就不会困。这是因为我们的注意力没法集中的原因,主动接收信息和被动接收信息无论从强度还是持续性来说差别都是很大的。可能大家也有这样的感觉,那就是看过的书学过的内容过了一段时间就会遗忘。这是很正常的现象,而且印象越浅的东西遗忘得越快,另外就是别人的东西比自己的东西遗忘的快,这些都是客观规律。如果我们要想遗忘的慢些,那么自己动手重复前人的最基础的工作就是一种很好的方法了。这样学到的知识是扎扎实实的,而不是仅仅浮于纸面上。纸面上的东西学的再好,即使倒背如流,那始终是别人的东西,只是能够用来考考试。只有把纸面上的东西消化了,那才能够真正达到融会贯通的程度,才能源于他人,超越他人,也才能算得上是熟悉了这个领域,如果自己不投身进来,那永远是个门外汉。

      对于提高动手能力这一点,这一点也显而易见。对于我们这个以应试教育为主的国家来说,现在有很多学生具有很强的考试能力,然而在真正决定生产力的实际动手能力上来说是欠缺很多的。虽然这个问题在近几年开始有所改善,但是依然问题严重。总体来说,我们学生的实际动手能力普遍不足,能力高的人可谓凤毛麟角,而理论与实践能力均强者更是寥寥无几。这种情况与国外有着很大的差距,据我所知,国外CS本科生的很多课都有课程设计,比如如果学数据库的话就很可能把所有选课的人分成若干小组,每个小组独立开发出一个具有基本功能的小型数据库来,然后再进行评比。当然,我们也有课程设计课,但是含金量怎么样呢,这个我们就心知肚明了,似乎写一个B树或者B+树的就算很好的了,写一个独立存在的数据库就不用考虑了。也许有人会认为这些都是别人已经做过的事情,我们不用去重做。那好,这个观点很正确,前面我也提过,重复工作不用去做。但是有一个前提,那就是如果让我们去实现一个很基础的东西,比如B树,我们能够很容易的搞定,那么我们就确实不需要考虑这些基础的东西了。但是如果我们连基础都不能够深入理解的话就不要去架构空中楼阁了。那是不牢靠的。总而言之,无论是做工程还是做理论(做纯计算理论者除外),动手能力都必不可少。做工程的不必多说,动手能力不强没法做出来。对于做理论的来说,没有扎实的功底来实现实验,那么再绝妙的idea都是没有说服力的。

      以上就是我的一些看法,可能不完全正确,不对之处请提出。

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值