前言
在文章《机器学习从业者如何兼顾理论与工程》中,小夕对编程语言的选择进行了小小建议。鉴于有些同学对小夕建议的“主python,辅C++,备用matlab和java”疑问较大,小夕在此详细解释一下,也欢迎大家补充新观点哦。
为什么不是matlab?
有同学问小夕,为什么将matlab作为备用语言而不是主力语言呢?matlab也很好用啊~
其实这句话是没错的。小夕觉得,暂且不论matlab超容易学的傻瓜式语法,如果论快速实现一个机器学习的新算法的话,“matlab+库”应该比“python+库”更加方便,实现效率更高。
而且更加重要的是,以小夕感性的实践,matlab对内存的管理真的是非常非常棒,不愧是基于C实现的,这一点的优势是python和java很难比拟的。因此,在个人的电脑上训练一个深度学习model的话,可能python会由于内存不够而无法继续,而matlab完全可能胜任(以后小夕有时间给大家做个正式的对比实验)。
这也是为什么,学术界的大牛们,还有实验室的老师们,甚至Andrew Ng说的硅谷的程序员们在验证新算法时,似乎都是用matlab。
但是,注意,从头到尾,小夕一直在夸matlab实现新算法时怎么怎么样。但是相信大部分人学习机器学习还是要走向工业界的,哪怕是在学术界,一般也不会是做纯理论的,哪怕是做纯理论的,一般也不会完全不接触dirty的原始数据,或者完整工程,或者别人用其他语言实现的源码。因此,这就是说,如果要用一门语言实现一个完整的工程,那这门语言的工具库必须形成一个完整的开发链。比如原始数据是在互联网上需要自己搜集,那么这门语言:
1、最好有简单易用的爬虫库
2、要有简单易用的dirty数据预处理的库
3、要有高效率的科学计算库
4、如果数据量很大,而数据或模型并行性良好,因此要有简单易用的gpu计算支持
5、做完之后要有简单易用的可视化库
然而,matlab非常擅长第3步,第5步也不错,第4好像也还可以(虽然小夕没用matlab并行计算过),第2有点不方便但是也还可以,但是第1就有点非主流了。应该“得益于”matlab是商业软件,而非开源吧。
如果换成python呢?
第1就不用说了,scrapy应该没有人不知道吧。。。给满分是没有多少疑问的。第2步也不用说了,pandas等库也是耳熟能详的名字。第3步,numpy、scipy、tensorflow(咦?有人以为tensorflow是专门做深度学习的?)等,虽然内存管理、易用程度上会比matlab逊色一些,但是做科学计算的话最少也是第二名吧。第4步,cuda(配合深度学习框架)、openCL的支持不必说了。第5步,与matlab孰优孰劣不多说,有matplotlib等库的支持,就算比matlab差,也不会差很多。
这样的对比应该比较明显啦,可以将matlab看作一个专才,将python看作一个优秀的通才。因此在特定问题上,matlab可能会甩python及其库一截,但是比拼一个完整的工程的话,用matlab的综合代价可能会高很多了。
因此,小夕说,matlab当然要掌握啦,但是只是作为一个备选语言。在你复现一篇很新的论文的时候,恰好这个论文中的算法又难以使用当前已有的框架实现的时候,就是matlab大显身手的时候。
或者你们实验室的服务器突然挂掉了,而你要急着训练一个很吃内存的model,那么丢给matlab,在你的小本本上慢慢跑(其实跑的真的很快)也是可以的啦。
因此python,就是小夕推荐的主力语言,正是因为小夕发现python似乎在机器学习及其周边需求上,几乎总是有非常棒而毋庸置疑的库存在,而且语法本身又没有C/C++/Java的限制多,因此用来实现一个以科学计算(比如机器学习)为核心的完整工程是十分完美的。
为什么要C++?
那么小夕为什么要辅助C++呢?python不是已经那么棒了吗?为什么是C++而不是Java呢?
除了众所周知的”速度“原因之外,小夕觉得还有一个相当重要的原因就是“内存管理”。
python毕竟是一个脚本语言,虽然易用,开发效率高,然而正所谓“越高级的语言越慢、越消耗资源”,虽然python在科学计算上优化很足,这方面速度很快了,但是由于太过智能的语法和自动内存管理而导致内存消耗会比手动管理内存时多很多,这对于工业界产品而言是噩梦般的存在。因此,如果将来并不是奔着“此生只做绝对理论研究”的目标,那么C++就是继python之后第二需要掌握的语言。因此,在这方面,Java的重要度就比C++差一些了。
当然啦,为什么是C++而不是C,相信大家都清楚啦。工业界不仅需要速度与资源,还需要”面向对象“!我们做的是软件!高效的上层软件!
小夕今天特意的搜了一下百度的人工智能相关岗位(机器学习、深度学习、模式识别、自然语言处理等)(虽然百度的道德底线有问题,但是在人工智能技术上,还是不否认其成绩的),发现了相当多的python+C++组合,小夕真想说,【此处已打码】\(//∇//)\~
当然啦,C++也是Google开发人工智能产品的主力语言(道听途说),虽然貌似Google在大力推广Go语言?
哪里有Java了?
当然,也不是所有公司都是python+C++的,比如twitter就是python+java开发产品的,很多中小企业也是python+java的组合(毕竟C++相对来说难学)。
所以不要再纠结太多编程语言的事情啦,反正主python,辅C++,备用matlab和java的建议可以结合自己的情况来~在人工智能行业,编程语言真是最不重要的东西啦~没人会在你的C++代码中纠结“你在传地址时用的是指针(*)还是引用(&)”,但是会纠结“你的这个神经网络为什么要这样初始化呢?”