AI时代,我该选择什么编程语言?

关注微信公众号, id: robot-learner

或者扫描关注,持续更新文章。

 

 

 

什么,马上都0202年了,还得自己写程序?

是的,不好意思,而且估计还得写一阵。

 

没有调查没有发言权,首先我们来看一组数据,下面是美国indeed招聘求职网站给出的数据。该网站分析了过去5年的招聘需求,对用人单位的程序员相关职位需要的编程语言或者技能要求做出了统计。下图反映了当前10大热门编程语言在过去5年随着时间的变化情况:

 

分析上面的趋势图,我们可以得出当前10大热门编程语言或者技能百分比占比和相比5年前变化百分比,如下表所示:

 

当前排名

语言或者技能

当前占比

变化范围(对比5年前)

1

SQL

21.9%

-7%

2

Java

20.8%

+6%

3

Python

18.0%

+123%

4

Linux

14.9%

0%

5

Javascript

14.5%

+17%

6

AWS

14.2%

+418%

7

C++

10.7%

+1%

8

C

10.3%

+11%

9

C#

9.3%

+11%

10

.net

8.4%

-15%

 

从上表可以看出,用人单位对Python和AWS的需求猛增,其他各个语言的需求其实变化幅度总体不大。 SQL作为数据库语言,高居第一,反映了社会对数据处理和操作的持续需求。Python语言的大幅增加直接体现了对人工智能人才的需求。而AWS作为亚马逊的云服务,增长幅度第一,反映了互联网整体走向云端,对于数据存储和API服务的极大依赖。

 

 

当然上面的10大选项并完全是编程语言,比如Linux更多是一种编程环境,虽然它也涉及到很多脚本语言。AWS是一个平台化的服务,比如AWS的S3存储系统,分布式数据库,容器化部署服务等解决方案。AWS和国内的阿里云服务类似。

 

 

如果基于上面的图表,我们似乎应该尽量去学习排名靠前的编程语言和技能。这的确是一个非常有效的策略,毕竟更多的用人单位提供这种相关的职位。

 

但另一方面,掌握什么编程语言更多的是和你需要完成的工作有直接关系。一种语言即使再热门,也不能解决所有的问题。你需要解决的问题决定了你需要掌握的语言。 这和我们学习外语挺像,虽然大家都喜欢学英语,因为英语在世界范围内应用更加广泛,但是一些小语种,比如波兰语,对于很多人来说,也是一个不错的职业选择,因为奇货可居。

 

我们进一步以AI相关工作中常见的一个场景来说明对不同编程语言或工具的依赖性。数据科学家们和数据相关的程序员常遇到这样一个完整的流程,即如何从获得数据到提供最终解决方案的整个链条,如下图所示:

 

 

 

我们就上图所示的各个环节做详细的讨论:

 

1)解决什么问题?

 

第一步是要明确解决什么问题,是需要优化企业销售的ROI (return on investment) 指标,还是要预测客户是否会购买某件商品?不同的业务问题决定了后面的各个步骤,包括如何获得数据到如何训练模型。这一步需要的工具更多的是PPT, Excel 或者白板,用来进行头脑风暴。

 

 

2)数据采集和获取

 

一旦需要解决的问题准备就绪,通常我们需要获得相应的数据。有几种情况,如果问题的解决完全能够用历史数据解决,那么历史数据一般存放在数据库。商业数据库比如Oracle 或者开源的数据库比如MySQL都是常见的类型。这种情况下涉及到的操作是数据从数据库的简单提取,转移,输出给后续操作步骤。对于后续的数据处理,通常文本文件的格式是最为简单方便的。

 

如果没有历史积累数据,需要从业务系统实时采集,那么可能会用到Kafaka, Flink, 或者Spark Streaming等流式数据采集和处理的框架,涉及到Java, Scala 或者Python语言。

 

有时候我们也需要从网络搜索和爬取一些公开数据,这个时候可以使用各种网页爬取工具和框架,比如Python语言下的beautifulsoup或者scrapy等工具。其他语言比如Java也有很多相应的工具和框架可以使用。

 

3)数据治理和处理

 

当需要处理的数据量比较小的时候,脚本语言,Excel VBA函数都是处理的简单快捷的方法。对于中等数据量,可以编写程序进行处理,比如Python,R,Matlab,Java 编程。Python和R语言进行复杂的数据处理非常具有优势,而且他们在单机的情况下处理数据的能力也很优秀。比如几百万行数据,python环境中,一般来说几秒钟时间就处理好了。

 

Python, R, Matlab 中都有很多优秀的软件包用来帮助进行常用的数据操作,比如Python中的pandas, R中的dplyr。Matlab处理数据也非常方便,但它与Python/R的区别在于,Matlab是收费软件。院校里面一般有免费的版本使用,但是工业界通常要购买license.

 

对于大量数据, 我们可以使用Hadoop MapReduce, Spark/Spark sql 等大数据平台和框架对数据进行并行化的处理。

 

4)模型选择和训练

 

模型的选择一方取决与需要解决的问题,另一方面也取决于数据量的大小。但是需要区别数据的总体数量和我们用来训练模型的数据量。比如,一个电商网站有所有用户过去很多年的行为数据,比如购买商品,购买次数,点击行为等。但是我们训练任何一个模型,没有必要用到所有的数据。可以通过抽样等方面选取具有代表性的数据来训练模型即可,没有必要使用全量数据。

 

如果数据量较少,比如不超过几百万到上千万的数据样本个数,通常可以在单机环境下进行模型训练。这个时候模型的选择面会比较广。如果数据量远超这个数量,就必须在集群的环境下,通过hadoop mapreduce 或者 spark 等环境进行分布式训练。这样的情况,可选择的模型算法范围也会变小,因为很多模型并没有对应的并行运算版本。

 

就具体模型算法选择而言,python或者R拥有较多的机器学习算法包可供选择,比如python环境中的scikitlearn 有很多传统的算法集成,可以处理少量到中等数据样本个数。对于深度学习框架,很多流行的框架都支持python等语言,比如TensorFlow 和Pytorch。 也有优秀的深度学习框架支持其他语言,比如Caffe是C++写的,但是它提供C++/python/matlab等多种调用方式。 Deeplearning4j框架则主要面向java开发者。

 

对于支持大数据算法训练的hadoop mapreduce 则主要支持java语言。 spark内核是由scala函数写的,所以用scala语言是最佳选择,但是spark编程也支持pyhon 和java语言。

 

可以看出有这样的趋势,比较流行的模型算法框架都试图提供面主流编程语言的调用方式,所以编程人员使用什么语言在模型训练这一层面可能没有以前那么重要。

 

5)模型测试

 

模型效果的验证和测试所用编程语言和模型训练保持一致。但是有一点区别就是,模型测试所需数据量通常远小于模型训练需求,尤其是在模型部署以后的长期监控中。这个时候模型测试的编程方法可能和模型训练不同,可依赖于模型测试人员所熟练的编程语言和工具而定。

 

 

6)模型生产化

 

模型的生产化和模型训练最大的不同在于单个数据样本的预测速度考虑。模型的训练绝大多数是一个线下的行为,使用的数据为批量数据。因此训练花费的时间可多可少,自由度比较大。业务和时间允许的情况下,模型花费一个月时间也没有问题。模型的生产化意味着对未来新的数据样本的一个即时的判断,需要系统在极短时间对数据样本做出一个判断,从而指导业务的下一步行动。总结来说,模型训练面对的是批量数据,是一个长时间行为。模型线上预测是面对的是单个数据,需要的响应时间极短。

 

Python语言不是预编译语言,因此执行速度和Java, C/C++相比会慢很多。简单的测试表明,同样的计算量,Python耗时可能比Java和C/C++高一个数量级。这就是说,如果Python预测一个数据样本需要花费100毫秒,Java和C/C++可能花费10毫秒左右。虽然在一般业务中,对于普通客户,10毫秒和100毫秒感知不明显,但是累计起来,服务同样的客户量,Python会消耗更多的计算资源。对于低频的客户访问量这并没有太大关系,但对于热门互联网网站和APP,后面的模型服务一定会追求更快的响应速度。因此这个时候,模型的生产化通常需要转化为C/C++代码。

 

C/C++是编程语言中的葵花宝典,开创了面向对象编程和多态性等先河,一直被其他语言所借鉴。但是因为其复杂的指针操作等特点,并不容易上手和被熟练掌握。虽然Python语言不需要预先编译,但很多Python环境下面使用的软件包都是C/C++预先编译的,因此调用速度会很快。这也是在考虑可操作性和性能之间的一种妥协。

 

把生产化的模型用C/C++语言或者Java重新实现也并非易事,这取决于模型训练使用语言或者模型的简易程度。一些简单的模型逻辑结果可以比较容易的被其他语言重新实现,比如决策数模型,逻辑回归模型等。而其他一些复杂的模型可能用新的语言重新实现较为困难。

 

7)模型部署

 

最终的生产化模型和服务的客户数量决定了模型的部署方式。客户调用不多的低频服务可以在一台服务器上部署即可。如果客户众多,需要考虑多台服务器以负载均衡的方式部署。这更多是工程领域的考虑,使用最多的也是Java语言和相关框架。如果一些复杂的模型需要GPU来加速,还需考虑服务器硬件条件是否能满足需求。

 

 

从上面的分析我们可以看出,数据工程的整个链条涉及到的编程语言和工具其实非常多。而且各个环节都需要略微不同的处理。这里涉及到的工作包含了数据到工程的各个层面,因此也为各个语言熟练掌握者提供了工作机会。大家在选择编程语言时候可以结合自己的优势和兴趣来决定。

 

发布了21 篇原创文章 · 获赞 2 · 访问量 4427

猜你喜欢

转载自blog.csdn.net/robot_learner/article/details/103320685