原文链接
非常感谢李烨老师!
认真研读此文,发现自己当前的定位是做工程,很多知识还是需要从底层拾起来的,理应具备一个程序员的基本素养!
入行 AI,选个脚踏实地的岗位
工业界直接应用AI技术的人员,大致可以分为三个不同角色:算法、工程,和数据
- 做算法
1.1 日常工作
所有人都想做算法,那么,说到底,在工业界做算法倒是干什么?
真正的算法工程师(也有公司叫科学家),最基本的日常工作其实是:读论文&实现之——确认最新论文中的阐述是否真实可重现,进一步确认是否可应用于本企业的产品,进而将其应用到实践中提升产品质量。
1.2 必备能力
既然日常工作首先是读别人论文。那么,必不可少,作为算法工程师得具备快速、大量阅读英语论文的能力。
1.4 学术实践能力
如果,碰巧你喜欢读论文,或者就算不喜欢也有足够强大的意志力、专注力压迫自己去强行阅读论文。那么恭喜你,你已经跨上了通往算法山门的第一级台阶。
下面一级是:读懂论文。
既然要读论文,读最新论文,而且阅读的目的是指导实践,那么自然要读懂。拿起一篇论文就达到懂的程度,至少需要下面这三种能力:
1.4.1 回溯学习能力
一篇论文拿来一看,一大堆名词术语不懂,它们互相之间是什么关系也不知道。怎么办?去读参考文献,去网上搜索,去书籍中查找……总之,动用一切资源和手段,搞清不明概念的含义和联系。
这种能力是学术研究的最基础能力之一,一般而言,有学术背景的人这一点不在话下。
如果现在没有,也可以去主动培养,那么可能首先需要学习一下学术研究方法论。
1.4.2 数学能力
如果只是本着学习的目的读经典老论文,那么只要清楚文中图表含义,看公式推导明白一头一尾(最开始公式成立的物理意义,以及结束推导后最终形式所具备的基本性质)也就可以了。
但读最新论文就不同。因其新,必然未经时光检验,因此也就没人预先替你验证的它的正确性。在这种情况下,看公式就得看看推导了。否则,外一是数学推导有错,导致了过于喜人的结果,却无法在实践中重现,岂不空耗时力?
如果目前数学能力不够,当然也可以学。但就与后面要说的做工程用到什么学什么的碎片化学习不同,做算法,需要系统学习数学。
微积分、线性代数、概率统计,是无法回避的。如果在这方面有所缺乏,那还是先从计算机系的本科数学课开始吧,个人推荐北师大教材。
1.4.3 理论联系实际,将学术论述与产品、业务结合的能力
一般来说,在大企业里做到真正的算法工程师/科学家,也就不需要自己去动手开发产品了。但做demo/prototype还是不能避免的。
算法工程师,可不是用别人写好的工具填几个参数去运行就可以的,需要负责实际业务问题到数学模型的抽象,并能够将他人最新成果(敲黑板——那些论文!!!)应用到业务数据上去。
说得更通俗一点,就算是用别人写的工具或框架,做算法的,也得是i)第一拨、最前沿那批试用者,或者ii)工具最新玩法的发明者。
1.5 创新型人才
算法工程师,即使自己不发明新的算法,不提出新的算法优化方法,也得去尝试最新算法的使用或者把已有算法用出新花样来。
毋庸置疑,这是一个有着必然创新性的角色。因此,这个角色必然不适合绝大多数人!
- 做工程
2.1 日常工作
相对于算法的创新和尖端,做工程要平实得多。
这一角色比较有代表性的一种岗位就是:机器学习工程师(或戏称调参工程师)——他们使用别人开发的框架和工具,运行已有算法,训练业务数据,获得工作模型。
其间可能需要一些处理数据、选取特征或者调节参数的手段,不过一般都有据可循,并不需要自己去发明一个XXXX。
做工程也得读论文,不过和做算法不同,做工程读论文的一般目的不是尝试最新方法,而是用已知有效的方法来解决实际问题。
这就导致了,做工程的,读的经常是“旧”论文,或者相对学术含量低一些(不那么硬)的论文。而且在阅读时,主要是为了直接找到某个问题的处理方法,因此,可以跳读。对于其中的数学公式,能够读懂头尾也就可以了。论文阅读频率和学术深度的要求,都比做算法低得多。
2.3 程序员的基本素质
既然是程序员,首先就不能丢掉程序员的基本素质:编码能力,和基础算法能力(不是前面说的那种算法,而是链、树、图的构建、删除、遍历、查找、排序等数据结构里讲的那种算法),是最起码要求。
其实,在AI成为潮流的今天,只要能找到一个在AI方面相对比较前沿的企业,进去做一名普通程序员。那么即使本来开发的产品不属于AI范畴,未来通过在旧产品上应用新的AI技术,或者在公司内部transfer到做AI产品的team,都可能获得入行的机会。甚至具体知识的掌握,都可以在入职后慢慢积累——对于大多数AI工程人员,这可能才是一条自然的入行之路。
但这一切的前提是:此人首先得是一个合格的程序员!而不是本末倒置,虽然花功夫学了几个模型、算法,却连最基本的编程面试题都做不对。
2.4 做工程,「机器学习」学到多深够用
当然,既然是有领域的程序员,在专业上达到一定深度也是必要的。
虽然做工程一般要使用现成技术框架,但并不是说,直接把算法当黑盒用就可以做一名合格的“调参”工程师了。
把算法当黑盒用的问题在于:黑盒能够解决问题的时候,使用方便,而一旦不能解决问题,或者对质量有所要求,就会感觉无所适从。
作为程序员、工程人员,想用机器学习算法解决实际问题,就得对算法有一定程度的掌握,此外对于数据处理和模型验证,也需具备相应知识。
2.4.1算法
仅从使用角度而言,掌握算法,大致可分为如下由浅入深的几步:
【1】简单使用:了解某个算法基本原理,应用领域,功能和局限。
a) 该算法的应用问题域是什么?(e.g. 分类、回归、聚类……)
b) 该算法的应用目标是什么?(e.g. 判别算法、生成算法……)
c) 该算法适合应用在怎样的数据集,它能对数据造成怎样的影响?(e.g. 适用少量高维稀疏数据……)
d) 能够主动获取该算法的函数库,调用该算法生成模型。
【2】模型调优:对所采用算法和对应模型的数学公式有所了解。
a) 知道调用函数中各个参数的意义(e.g. 迭代次数,对应到公式中参数的含义……),能够通过调节这些参数达到优化结果的目的。
b) 能够通过加约束条件(e.g. L0, L1, L2 ……)来优化算法。
c) 了解在当前问题域,目标和输入数据确定的情况下,还可以用哪些其他模型可替换现有模型,并进行尝试。
d) 能够将多个弱模型加权组成强模型(e.g. adaboost)。
【3】运行效率优化:对模型本身的数学推导过程和模型最优化方法有所掌握,对于各种最优化方法的特点、资源占用及消耗情况有所了解。
a) 了解算法在当前数据集上的运行效率(e.g. 需要进行哪些运算,是否易于被分布式等)。
b) 了解在其他语言、平台、框架的工具包中有否同等或近似功能但在当前应用场景下效率更高的算法。
c) 能够针对具体场景,通过转换模型的最优化方法(optimizer)来改进运行效率。
2.4.2 数据
仅仅只有算法,并不能解决问题。算法和数据结合,才能获得有效的模型。
对于数据,需要从:i). 具有业务含义的信息,和ii).用于运算的数字,这两个角度来对其进行理解和掌握。
【1】特征选取:从业务角度区分输入数据包含的特征,并认识到这些特征对结果的贡献。
a) 对数据本身和其对应的业务领域有所了解。
b) 能够根据需要标注数据。
c) 知道如何从全集中通过划分特征子集、加减特征等方法选取有效特征集。
【2】向量空间模型(VSM)构建:了解如何将自然语言、图片等人类日常使用的信息转化成算法可以运算的数据。
a) 能够把文字、语音、图像等输入转化成算法所需输入格式(一般为实数空间的矩阵或向量)。
b) 能够根据信息熵等指标选取有效特征。
【3】数据清洗和处理:对直接的业务数据进行筛选并转换为模型可处理形式。
a) 能够运用统计学方法等ETL手段清洗输入数据。
b) 能够对数据进行归一化(normalization), 正则化(regularization)等标准化操作。
c) 能够采用bootstrap等采样方法处理有限的训练/测试数据,以达到更好的运算效果。
2.4.3 模型验证
算法+数据就能够得到模型。但是,
这个模型的质量如何?
这个模型和那个模型比较,哪个更适合解决当前问题?
在做了如此这般的优化之后得出了一个新的模型,怎么能够确认它比旧的模型好?
为了解答这些问题,就需要掌握度量模型质量的方法。为此,需要做到:
i) 了解bias,overfitting等基本概念,及针对这些情况的基本改进方法。
ii) 了解各种模型度量指标(e.g. Accuracy, Precision,Recall, F1Score……)的计算方法和含义,及其对模型质量的影响。
iii) 能够构建训练集、测试集,并进行交叉验证。
iv) 能够运用多种不同的验证方法(e.g. 2-Fold cross-validation,K-Fold cross-validation, Leave-One-Out cross-validation……)来适应不同的数据集。
- 做数据
此处说得做数据并非数据的清洗和处理——大家可以看到做工程的岗位,有一部分工作内容就是ETL和处理数据。此处说的做数据是指数据标注。 - 认清形势,脚踏实地
近来一段时间,能明显感到,想入行AI的人越来越多,而且增幅越来越大。
为什么这么多人想入行AI呢?真的是对计算机科学研究或者扩展人类智能抱着无限的热忱吗?说白了,大多数人是为了高薪。
人们为了获得更高的回报而做出选择、努力工作,原本是非常正当的事情。关键在于,找对路径。
寻求入行的人虽多,能真的认清市场当前的需求,了解不同层次人才定位,并结合自己实际寻找一条可行之路的人太少。
人人都想“做算法”,却不想想:大公司里的研究院养着一群高端科学家,有得是读了十几二十年论文始终站在AI潮头的资深研究人员。想要与他们为伍做算法,须有可以与之并列的成就:要么有足够分量的学术成果,要么解决过大用户量产品的实际业务问题——你占哪一条呢?
仅仅是学过课程,做过练习或实习性质的小项目,是不足以去做算法的。
谁在自己的想象世界里不是屠龙的剑客?但现实当中能屠龙的人又有几个?留给人去屠的龙又有几条?养猪虽然没那么高大上,有猪肉吃是实实在在的。
好高骛远只会虚掷光阴,脚踏实地才能实现理想——这也是笔者写作此文的初衷。