成为算法工程师——张相於

人工智能 专栏收录该内容
19 篇文章 1 订阅

作者:张相於,现任 Growing IO 机器学习总监,毕业于中国人民大学,曾担任多家著名电商公司推荐系统和机器学习系统技术负责人,在机器学习和推荐系统相关领域有丰富经验和深厚积累。

引言

成为一名合格的开发工程师不是一件简单的事情,需要掌握从开发到调试优化等一系列能力,而掌握这些能力中的任一项,都需要付出足够的努力,以及足够多的经验。要成为一名合格的机器学习算法工程师(以下简称算法工程师)更是难上加难。

因为,在掌握工程师的通用技能之外,还需掌握一张不算小的机器学习算法知识网络。下面我们就将这些技能进行拆分,一起来看究竟要掌握什么才能成为一名合格的算法工程师。

基础开发能力

所谓算法工程师,前提得是一名工程师。那么,开发工程师会的技能你都要掌握。有些同学对于这点存在误解,认为所谓算法工程师就只需要思考和设计算法,不用在乎算法怎样实现,况且,还会有人帮你来实现你提出的算法方案。这种思想是错误的,在大多数企业的大多数职位中,算法工程师需要负责从算法设计——实现——上线的整个流程工作。

我曾经见过一些企业实行设计与实现相分离的组织架构,在这种架构下,说不清楚谁应该为算法效果负责,设计者和开发者都有一肚子的苦水。所以大家要记住,基础开发是所有算法工程师都要掌握的技能。我建议所有打算从事该行业的同学,对于基础开发能力和算法知识要给予同等的重视程度,这样能让你走得更稳,更远。

去年谷歌发布的 Rule of ML 中也提到过,机器学习应用中的问题很大一部分是工程问题,所以没有足够扎实的工程基础,是啃不动真正的硬骨头的。除了一些硬性代码技能,一些代码软技能也是不可或缺,推荐《代码整洁之道》(Clean Code)这本书给大家。

基础开发所涉及到的技能非常的多,这里挑选两个比较重要的点来做阐述。

一、单元测试

在企业应用中,一个问题的完整解决方案通常包括很多的流程,这其中每个环节都需要反复的迭代优化调试。如何能够将复杂任务进行模块划分,并且保证整体流程的正确性?最实用的方法就是单元测试。

单元测试并不只是简单的一种测试技能,它首先是一种设计能力,并不是每份代码都可以做单元测试,能做单元测试的前提是代码可以划分为多个单元——也就是模块。在把项目拆解成可独立开发和测试的模块之后,再加上对每个模块独立的、可重复的单元测试,就可以保证每个模块的正确性,如果每个模块的正确性都可以保证,那么整体流程的正确性就可以得到保证。

对于算法开发这种流程变动频繁的开发活动来讲,做好模块设计和单元测试是不给自己和他人挖坑的重要保证。也是能让自己放心地对代码做各种改动优化的重要前提。

二、逻辑抽象复用

逻辑的抽象复用可以说是所有软件开发活动中最为重要的一条原则,衡量一个程序员代码水平的重要原则之一就是看他代码中重复代码和相似代码的比例。大量重复代码或相似代码背后反映的是工程师思维的懒惰, 因为他觉得复制粘贴或者直接照着抄是最省事的做法。这样做不仅看上去非常丑陋,而且也非常容易出错,更不用说维护的难度。

算法开发的项目中经常会有很多类似逻辑出现,例如,对多个特征使用类似的处理方法,还有原始数据 ETL 中的很多类似处理方法。如果不对重复逻辑做好抽象,全是一行行的重复代码,无论是阅读还是维护都会非常麻烦。

三、概率和统计基础

概率和统计可以说是机器学习领域的基石之一,从某个角度来看,机器学习可以看做是建立在概率思维之上的一种对不确定世界的系统性思考和认知方式。学会用概率的视角看待问题,用概率的语言描述问题,是深入理解和熟练运用机器学习技术的最重要基础之一。

概率论内容很多,但都是以一个个分布为具体表现载体体现出来的,所以学好常用的概率分布及其各种性质对于学好概率非常重要。对于离散数据,伯努利分布、二项分布、多项分布、Beta 分布、狄里克莱分布以及泊松分布都是需要理解掌握的内容;对于离线数据,高斯分布和指数分布族是比较重要的分布。这些分布贯穿着机器学习的各种模型之中,也存在于互联网和真实世界的各种数据之中,理解了数据的分布,才能知道该对它们做什么样的处理。

此外,假设检验和置信区间等相关理论也需要掌握,这样才能具备分辨数据结论真伪的能力。例如两组数据是否真的存在差异,上线一个策略之后指标是否真的有提升等。这种问题在实际工作中非常常见,不掌握相关能力的话相当于大数据时代的睁眼瞎。

在统计方面,一些常用的参数估计方法也需要掌握,典型的比如,最大似然估计、最大后验估计、EM 算法等。这些理论和最优化理论一样,都是可以应用于所有模型的理论,是基础中的基础。概率统计方面我推荐 All of Statistics,这本书简明扼要地介绍了概率统计中常用的概念,适合入门看,也适合作为参考手册经常翻阅。

四、开发语言和开发工具

掌握了足够的理论知识,还需要足够的工具来将这些理论落地,这部分我们介绍一些常用的语言和工具。

1. 开发语言

近年来 Python 可以说是数据科学和算法领域最火的语言,主要原因是它使用门槛低,上手容易,同时具有着完备的工具生态圈,各种平台对其支持也比较好。所以 Python 方面我就不再赘述。但是在学习 Python 以外,我建议大家可以再学习一下 R 语言,主要原因有以下几点:

R 语言具有最完备的统计学工具链。 我们在上面介绍了概率和统计的重要性,R 语言在这方面提供的支持是最全面的,日常的一些统计方面的需求,用 R 来做可能要比用 Python 来做还要更快。Python 的统计科学工具虽然也在不断完善,但是 R 仍然是统计科学最大最活跃的社区。

向量化、矩阵化和表格化思维的培养。 R 中的所有数据类型都是向量化的,一个整形的变量本质上是一个长度为一的一维向量。在此基础上 R 语言构建了高效的矩阵和(DataFrame)数据类型,并且在上面支持了非常复杂而又直观的操作方法。这套数据类型和思考方式也被很多更加现代化的语言和工具所采纳,例如 Numpy 中的 ndarray,以及 Spark 最新版本中引入的 DataFrame,可以说都是直接或间接从 R 语言得到的灵感,定义在上面的数据操作也和 R 中对 DataFrame 和向量的操作如出一辙。就像学编程都要从 C 语言学起一样,学数据科学和算法开发我建议大家都学一下 R,学的既是它的语言本身,更是它的内涵思想,对大家掌握和理解现代化工具都大有裨益。

除了 R 以外,Scala 也是一门值得学习的语言。 原因在于它是目前将面向对象和函数式两种编程范式结合得比较好的一种语言,因为它不强求你一定要用函数式去写代码,同时还可以在能够利用函数式的地方给予足够的支持。这使得它的使用门槛并不高,但是随着经验和知识的不断积累,你可以用它写出越来越高级、优雅的代码。

2. 开发工具

开发工具方面,Python 系的工具无疑是实用性最高的,具体来说,Numpy、Scipy、Sklearn、Pandas、Matplotlib 组成的套件可以满足单机上绝大多数的分析和训练工作。但是在模型训练方面,有一些更加专注的工具可以给出更好的训练精度和性能,典型的如 LIBSVM、LIBLINEAR、XGBoost 等。

大数据工具方面,目前离线计算的主流工具仍然是 Hadoop 和 Spark,实时计算方面 Spark Streaming 和 Storm 也是比较主流的选择。近年来兴起的新平台也比较多,例如 Flink 和 Tensorflow 都是值得关注的。值得一提的是,对于 Hadoop 和 Spark 的掌握,不仅要掌握其编码技术,同时还要对其运行原理有一定理解,例如 Map-Reduce 的流程在 Hadoop 上是如何实现的,Spark 上什么操作比较耗时,AggregateByKey 和 GroupByKey 在运行原理上有什么差异等。只有掌握了这些,才能对这些大数据平台运用自如,否则很容易出现程序耗时过长、跑不动、内存爆掉等问题。

五、架构设计

最后,谈一下机器学习系统的架构设计。所谓机器学习系统的架构,指的是一套能够支持机器学习训练、预测、服务稳定高效运行的整体系统以及他们之间的关系。在业务规模和复杂度发展到一定程度的时候,机器学习一定会走向系统化、平台化这个方向。 这个时候就需要根据业务特点以及机器学习本身的特点来设计一套整体架构,这里面包括上游数据仓库和数据流的架构设计,以及模型训练的架构,还有线上服务的架构等等。

这一套架构的学习就不像前面的内容那么简单了,没有太多现成教材可以学习,更多的是在大量实践的基础上进行抽象总结,对当前系统不断进行演化和改进。但这无疑是算法工程师职业道路上最值得为之奋斗的工作。在这里的建议就是 多实践,多总结,多抽象,多迭代。

六、机器学习算法工程师领域现状

现在就是机器学习算法工程师最好的时代,各行各业对这类人才的需求都非常旺盛。我们列举一些典型的细分行业:

推荐系统。 推荐系统解决的是海量数据场景下信息高效匹配分发的问题,在这个过程中,无论是候选集召回,还是结果排序,以及用户画像等方面,机器学习都起着重要的作用。

广告系统。 广告系统和推荐系统有很多类似的地方,但也有着很显著的差异,需要在考虑平台和用户之外同时考虑广告主的利益,两方变成了三方,使得一些问题变复杂了很多。它在对机器学习的利用方面也和推荐类似。

搜索系统。 搜索系统的很多基础建设和上层排序方面都大量使用了机器学习技术,而且在很多网站和 App 中,搜索都是非常重要的流量入口,机器学习对搜索系统的优化会直接影响到整个网站的效率。

风控系统。 风控,尤其是互联网金融风控是近年来兴起的机器学习的又一重要战场。不夸张地说,运用机器学习的能力可以很大程度上决定一家互联网金融企业的风控能力,而风控能力本身又是这些企业业务保障的核心竞争力,这其中的关系大家可以感受一下。

但是所谓“工资越高,责任越大”,企业对于算法工程师的要求也在逐渐提高。整体来说,一名高级别的算法工程师应该能够处理“数据获取 -> 数据分析 -> 模型训练调优 -> 模型上线”这一完整流程,并不断对流程中的各种环节做优化。一名工程师入门时可能会从上面流程中的某一个环节做起,不断扩大自己的能力范围。

除了上面列出的领域以外,还有很多传统行业也在不断尝试和挖掘用机器学习来解决问题。长远来看,机器学习的未来发展空间可谓潜力巨大。

alt text

  • 4
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值