成为一名机器学习算法工程师,你需要这些必备技能!

成为一名合格的开发工程师不是一件简单的事情,需要掌握从开发到调试到优化等一系列能力,这些能力中的每一项掌握起来都需要足够的努力和经验。而要成为一名合格的机器学习算法工程师(以下简称算法工程师)更是难上加难,因为在掌握工程师的通用技能以外,还需要掌握一张不算小的机器学习算法知识网络。

下面我们就将成为一名合格的算法工程师所需的技能进行拆分,一起来看一下究竟需要掌握哪些技能才能算是一名合格的算法工程师。

成为一名机器学习算法工程师,你需要这些必备技能!
图1 机器学习算法工程师技能树

基础开发能力

所谓算法工程师,首先需要是一名工程师,那么就要掌握所有开发工程师都需要掌握的一些能力。有些同学对于这一点存在一些误解,认为所谓算法工程师就只需要思考和设计算法,不用在乎这些算法如何实现,而且会有人帮你来实现你想出来的算法方案。这种思想是错误的,在大多数企业的大多数职位中,算法工程师需要负责从算法设计到算法实现再到算法上线这一个全流程的工作。笔者曾经见过一些企业实行过算法设计与算法实现相分离的组织架构,但是在这种架构下,说不清楚谁该为算法效果负责,算法设计者和算法开发者都有一肚子的苦水,具体原因不在本文的讨论范畴中,但希望大家记住的是,基础的开发技能是所有算法工程师都需要掌握的。

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

单元测试

在企业应用中,一个问题的完整解决方案通常包括很多的流程,这其中每个环节都需要反复迭代优化调试,如何能够将复杂任务进行模块划分,并且保证整体流程的正确性呢?最实用的方法就是单元测试。单元测试并不只是简单的一种测试技能,它首先是一种设计能力。并不是每份代码都可以做单元测试,能做单元测试的前提是代码首先是可以划分为多个单元——也就是模块的。在把项目拆解成可独立开发和测试的模块之后,再加上对每个模块的独立的、可重复的单元测试,就可以保证每个模块的正确性,如果每个模块的正确性都可以保证,那么整体流程的正确性就可以得到保证。

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

逻辑抽象复用

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

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

概率和统计基础

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

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

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

在统计方面,一些常用的参数估计方法也需要掌握,典型的如最大似然估计、最大后验估计、EM算法等。这些理论和最优化理论一样,都是可以应用于所有模型的理论,是基础中的基础。

机器学习理论

虽然现在开箱即用的开源工具包越来越多,但并不意味着算法工程师就可以忽略机器学习基础理论的学习和掌握。这样做主要有两方面的意义:

掌握理论才能对各种工具、技巧灵活应用,而不是只会照搬套用。只有在这个基础上才能够真正具备搭建一套机器学习系统的能力,并对其进行持续优化。否则只能算是机器学习搬砖工人,算不得合格的工程师。出了问题也不会解决,更谈不上对系统做优化。

学习机器学习的基础理论的目的不仅仅是学会如何构建机器学习系统,更重要的是,这些基础理论里面体现的是一套思想和思维模式,其内涵包括概率性思维、矩阵化思维、最优化思维等多个子领域,这一套思维模式对于在当今这个大数据时代做数据的处理、分析和建模是非常有帮助的。如果你脑子里没有这套思维,面对大数据环境还在用老一套非概率的、标量式的思维去思考问题,那么思考的效率和深度都会非常受限。

机器学习的理论内涵和外延非常之广,绝非一篇文章可以穷尽,所以在这里我列举了一些比较核心,同时对于实际工作比较有帮助的内容进行介绍,大家可在掌握了这些基础内容之后,再不断探索学习。

基础理论

所谓基础理论,指的是不涉及任何具体模型,而只关注“学习”这件事本身的一些理论。以下是一些比较有用的基础概念:

VC维。 VC维是一个很有趣的概念,它的主体是一类函数,描述的是这类函数能够把多少个样本的所有组合都划分开来。VC维的意义在哪里呢?它在于当你选定了一个模型以及它对应的特征之后,你是大概可以知道这组模型和特征的选择能够对多大的数据集进行分类的。此外,一类函数的VC维的大小,还可以反应出这类函数过拟合的可能性。

信息论。从某种角度来讲,机器学习和信息论是同一个问题的两个侧面,机器学习模型的优化过程同时也可以看作是最小化数据集中信息量的过程。对信息论中基本概念的了解,对于机器学习理论的学习是大有裨益的。例如决策树中用来做分裂决策依据的信息增益,衡量数据信息量的信息熵等等,这些概念的理解对于机器学习问题神本的理解都很有帮助。这部分内容可参考《Elements of Information Theory》这本书。

正则化和bias-variance tradeoff。如果说现阶段我国的主要矛盾是“人民日益增长的美好生活需要和不平衡不充分的发展之间的矛盾”,那么机器学习中的主要矛盾就是模型要尽量拟合数据和模型不能过度拟合数据之间的矛盾。而化解这一矛盾的核心技术之一就是正则化。正则化的具体方法不在此讨论,但需要理解的,是各种正则化方法背后透露出的思想:bias-variance tradoff。在不同利益点之间的平衡与取舍是各种算法之间的重要差异,理解这一点对于理解不同算法之间的核心差异有着非常重要的作用。

最优化理论。绝大多数机器学习问题的解决,都可以划分为