入行 AI,如何选个脚踏实地的岗位
本文来自作者 李烨 在 GitChat 上分享「入行 AI,选个脚踏实地的岗位」,「阅读原文」查看交流实录
「文末高能」
编辑 | 嘉仔
0. 引子
AI原本是一个专业领域,没什么特别的。作为码农一枚,笔者的工作内容正好在这个领域。
近来这一年左右时间里,连续发生了多件事情,使得笔者不得不抬起原本一直低着敲代码的头,看看这个为AI狂欢的世界。
【Case 1】 居然在一个月里碰到两位在相对传统行业创业的亲友,来打听将AI技术应用到他们所在行业上的问题,例如:是聊天机器人是否可以代替人工客服。
两位亲友居然都动了雇佣一位算法工程师的念头。其中一位真的已经开始物色了。
颇费周折找到一位某非 985 院校专业对口的博士,友人有点动心想要聘用,奈何人家开口就要100万年薪。
创业企业虽然已经拿了两轮融资,还是不敢烧钱作死,故而多方打听“算法”这东西的用处。
【Case 2】 笔者所在公司今年的校园招聘,本人照例作为 interviewer 参加,面试了几个来自不同985院校的学生(明年毕业)。顺便又和几位今年刚入职的应届生聊了聊。
结果发现,所有 interviewee(至少是我碰到的),全都是人工智能或机器学习方向的学生,所有交流过的新同事,在学校里做的也全部都是机器学习 or 深度学习算法。
而且,每一个人对于入职后工作的期望都是做算法。
人工智能,已经跌入到两三年前大数据风口上,全民皆“数据科学家”的套路里了。
到底做什么,算是入行AI?
这个话题其实在笔者之前的几个chat里面已经反复提到过了,在此再说一遍:工业界直接应用AI技术的人员,大致可以分为三个不同角色:算法、工程,和数据。
现在各种媒体上,包括gitchat中有大量的文章教大家怎么入行AI,怎么成为具体某个领域的工程师,告诉大家要在某领域内发展需要掌握的技术栈是什么,等等……对此本文不再赘述。
我们不说怎么能够成为XXX,我们先来看看成为XXX之后要做什么事情,而做这些事情,需要什么样的能力,在拥有了这些能力、做上了这件事情之后,又能向什么方向发展。
换言之,本文中,我们将从直观的角度,管窥承担不同角色工作所需要具备的素质,日常工作的状态,和职业发展路径。
1. 做算法
1.1 日常工作
所有人都想做算法,那么,说到底,在工业界做算法倒是干什么?
真正的算法工程师(也有公司叫科学家),最基本的日常工作其实是:读论文&实现之——确认最新论文中的阐述是否真实可重现,进一步确认是否可应用于本企业的产品,进而将其应用到实践中提升产品质量。
1.2 必备能力
既然日常工作首先是读别人论文。那么,必不可少,作为算法工程师得具备快速、大量阅读英语论文的能力。
有一个网站,所有有志于算法的同学必须要知道:https://arxiv.org ——这里有多个学科(包括computer science)大量的最新 34 43862 34 15232 0 0 4003 0 0:00:10 0:00:03 0:00:07 4003论文。
现在许多科学家、学者、研究人员和博士生在论文刚刚完成,尚未在正式期刊会议上发表时就先将论文发布在此处,为的是在尽量短的时间延误下对外传播自己的成果。
传统的正规渠道,从论文完成到正式发表之间存在短则三四个月,长则一年半载的延迟。这对一些传统学科,还勉强可以接受。
但计算机科学,尤其是人工智能、机器学习、深度学习这几个当今世界最热门的主题,大家都在争分夺秒地抢占制高点,几个月的耽搁根本不能容忍。
因此,对于AI的学术性文献而言,arxiv.org 实际上已经成为了当前的集大成之地。
如果要做算法,平均而言,大致要保持每周读一篇最新论文的频率。
也许这就是为什么,到目前为止,笔者所听闻和见过的算法工程师都是名校相关专业博士的原因。
经过几年强化学术研究训练,这些博士们,就算英语综合水平不过 CET-4,也能读得进去一篇篇硬骨头似的英语论文!
1.3 自测“算法力”
但当然不能说硕士、学士或者其他专业的有志之士就做不成算法了。人都不是生而知之,不会可以学嘛。
但是到底能不能学会,其实也并不需要三年五载的时间,花费几万十几万金钱在各种培训或者付费阅读上才能够知道。
有个很简单的验证方法:现在就去https://arxiv.org找一篇论文(比如这篇:[Dynamic Routing Between Capsules](https://arxiv.org/pdf/1710.09829.pdf)),从头到尾读一遍。
现在不懂没关系,至少先试试在不懂的情况下能不能把它从头到尾一字不漏的读完,有不认识的字查字典。
如果这都做不到,还是当机立断和“算法”分手吧。既然注定无缘,何必一味纠缠?
1.4 学术实践能力
如果,碰巧你喜欢读论文,或者就算不喜欢也有足够强大的意志力、专注力压迫自己去强行阅读论文。那么恭喜你,你已经跨上了通往算法山门的第一级台阶。
下面一级是:读懂论文。
既然要读论文,读最新论文,而且阅读的目的是指导实践,那么自然要读懂。拿起一篇论文就达到*懂*的程度,至少需要下面这三种能力:
1.4.1 回溯学习能力
一篇论文拿来一看,一大堆名词术语不懂,它们互相之间是什么关系也不知道。怎么办?去读参考文献,去网上搜索,去书籍中查找……总之,动用一切资源和手段,搞清不明概念的含义和联系。
这种能力是学术研究的最基础能力之一,一般而言,有学术背景的人这一点不在话下。
如果现在没有,也可以去主动培养,那么可能首先需要学习一下学术研究方法论。
1.4.2 数学能力
如果只是本着学习的目的读经典老论文,那么只要清楚文中图表含义,看公式推导明白一头一尾(最开始公式成立的物理意义,以及结束推导后最终形式所具备的基本性质)也就可以了。
但读最新论文就不同。因其新,必然未经时光检验,因此也就没人预先替你验证的它的正确性。
在这种情况下,看公式就得看看推导了。否则,外一是数学推导有错,导致了过于喜人的结果,却无法在实践中重现,岂不空耗时力?
如果目前数学能力不够,当然也可以学。但就与后面要说的做工程用到什么学什么的碎片化学习不同,做算法,需要系统学习数学。
微积分、线性代数、概率统计,是无法回避的。如果在这方面有所缺乏,那还是先从计算机系的本科数学课开始吧,个人推荐北师大教材。
1.4.3 理论联系实际,将学术论述与产品、业务结合的能力
一般来说,在大企业里做到真正的算法工程师/科学家,也就不需要自己去动手开发产品了。但做 demo/prototype 还是不能避免的。
算法工程师,可不是用别人写好的工具填几个参数去运行就可以的,需要负责实际业务问题到数学模型的抽象,并能够将他人最新成果(敲黑板——那些论文!!!)应用到业务数据上去。
说得更通俗一点,就算是用别人写的工具或框架,做算法的,也得是i)第一拨、最前沿那批试用者,或者ii)工具最新玩法的发明者。
1.5 创新型人才
算法工程师,即使自己不发明新的算法,不提出新的算法优化方法,也得去尝试最新算法的使用或者把已有算法用出新花样来。
毋庸置疑,这是一个有着必然创新性的角色。因此,这个角色必然不适合绝大多数人!
2. 做工程
2.1 日常工作
相对于算法的创新和尖端,做工程要平实得多。
这一角色比较有代表性的一种岗位就是:机器学习工程师(或戏称调参工程师)——他们使用别人开发的框架和工具,运行已有算法,训练业务数据,获得工作模型。
其间可能需要一些处理数据、选取特征或者调节参数的手段,不过一般都有据可循,并不需要自己去发明一个XXXX。
做工程也得读论文,不过和做算法不同,做工程读论文的一般目的不是尝试最新方法,而是用已知有效的方法来解决实际问题。
这就导致了,做工程的,读的经常是“旧”论文,或者相对学术含量低一些(不那么硬)的论文。
而且在阅读时,主要是为了直接找到某个问题的处理方法,因此,可以跳读。
对于其中的数学公式,能够读懂头尾也就可以了。论文阅读频率和学术深度的要求,都比做算法低得多。
TIP:很多title写的是“人工智能/机器学习/深度学习算法工程师”的招聘岗位,其实招的是做工程的人。不要执着于辞藻,看清楚具体职责和工作内容。
2.2 软件工程师的分支
说到底,机器学习工程师,是广义的软件工程师(或云程序员)的一个分支。AI产品开发,是广义软件开发的一个领域。
说起来,每一个程序员都有一个领域。不过,不同领域在不同时期热度不同,发展趋势不同。
若干年前,做*底层*的程序员在程序界睥睨群雄。写协议栈的、开发驱动的、实现各种系统接口的程序员,站在鄙视链的最顶端。
如今,风水轮流转,昨日黄花已谢,轮到AI封神了。
但说到底,开发人工智能产品的程序员,也还是程序员。不过是需要懂一定程度的领域内理论知识而已,和以前开发 PCI 协议栈要懂 PCI 协议,写网卡 driver 要懂 TCP/IP 的道理是一样的。
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……)来适应不同的数据集。
3. 做数据
此处说得做数据并非数据的清洗和处理——大家可以看到做工程的岗位,有一部分工作内容就是ETL和处理数据。此处说的做数据是指数据标注。
3.1 标注数据的重要性
虽然机器学习中有无监督学习,但在实践领域被证明有直接作用的,基本上还都是有监督模型。
近年来,深度学习在很多应用上取得了巨大的成功,而深度学习的成功,无论是图像、语音、NLP、自动翻译还是AlphaGo,恰恰依赖于海量的标注数据。
无论是做ML还是DL的工程师(算法&工程),后者有甚,都共同确认一个事实:现阶段而言,数据远比算法重要。
3.2 数据人工标注的必要性
很多人误以为 AlphaGo Zero 100:0大胜 AlphaGo 是无监督学习的胜利。
其实,之所以有这样的结果,恰恰是因为 Zero 利用围棋严格完备而明晰的规则,自己制造出了巨大量的标注数据——这些标注数据的数量远超其前辈 AlphaGo 的输入,而且可以随时造出更多。
围棋是一个人为定义的在19x19点阵范围内,按完备无二义性规则运行的游戏,因此计算机程序才能依据规则自动产生标注数据。
真实人类世界的事情,基本没有完全按矩而行无意外的情况。因此,对人类真正有用的模型,还是需要人工标注的训练数据。
固然,目前有多种技术用以在标注的过程中辅助人工,以减小工作量及降低人工标注比例。但至今没有能在应用领域完全自动化标注的技术出现。
换言之,在看得见的未来之内,人工标注数据仍然是AI落地的必要和主流。
3.3 人工智能的“勤行”
3.3.1 什么叫做标注
举个很简单的例子说明一下什么是数据标注:
在开发聊天机器人的时候,我们需要训练意图判定和实体识别模型,因此也就需要标注用户问题的意图和出现的实体。
这是用户问题原始数据:“00183号商品快递到伊犁邮费多少?”
这样一句话,很显然问它的用户是想知道某一种商品发往某地的邮费。邮费是商品的一个属性,我们把所有查询商品属性的意图都定义为“商品查询”。
因此,这样一句话的意图是“商品查询”。其中有包含了几个实体,分别是商品Id,目的地和商品属性。
这句话被标注出来以后,就是下面这个样子:
[00183]<-{商品Id}号商品快递到[伊犁]<-{目的地}[邮费]<-{商品属性}多少?||商品查询
具体格式不必纠结。核心一点:标注就是将原始数据内全部或者部分内容,按照业务需求打上定义好的标签。
3.3.2 数据标注的日常工作
简单说:数据标注的日常工作就是给各种各样的数据(文本、图像、视频、音频等)打上标签。
【好消息】:数据标注工作几乎没有门槛。一般任何专业的大学毕业生,甚至更低学历,都能够胜任。上手不需要机器学习之类的专业知识。
【坏消息】:这样一份工作,是纯粹的“脏活累活”,一点都不cool,起薪也很低。
打个不太恰当的比喻:
做算法是屠龙,仗剑江湖,天外飞仙;
做工程是狩猎,跃马奔腾,纵酒狂歌;
做数据是养猪,每天拌猪食清猪粪,一脸土一身泥。
所以,虽然这是一件谁都能干的工作,但是恐怕,没几个人想干。
3.3.3 数据标注的难点
就单个任务而言,数据标注是一项很简单的工作。它的难点在于数据的整体一致性,以及与业务的集合。
【1】数据一致性是指:所有数据的标注原则都是一样的。
当数据很多的时候,一致性是相当难以保证的,尤其是在有精标需求的情况下。
如果一份 raw data 由多个人同时标注,就算是反复宣讲标注原则,每个人也都有自己的理解和侧重,很难保证一致,很可能一句话在某个人看来是“查询商品”,而在另一个人看来就是“要求售后”。(即使是将所有数据交给一个人,也可能在不同时间段理解不同。)
出于对数据标注工作的不重视(正好与对算法的过分重视相映成趣),很多公司外包了数据标注工作。
对于数据标注的不一致性,则采取一种暴力解决方案:让多个人(比如3个)同时标注同一份数据,一旦出现不一致,就采用简单多数法,取最多人一致认定的那种结果(比如:3个人中两个都选“查询商品“,则选定”查询商品“为最终 label)。
这种方案对于粗标数据还可以起到一定作用,但如果是精标,则往往连多数人一致的情况都难以出现。
如果三个人所标结果完全不一样,那么这条数据也就失去了标注价值。
在现实中,经常会出现同一份数据因为质量过低,被要求重复标注的情况出现,费时费力。
【2】与业务的集合是数据标注面对的另一个挑战。
这一点在目前还不是很明显。因为:目前人工智能的落地点还比较有限,真正的商业化领域也就是语音和图像处理的少数应用;
owner 都是大公司,有自己的标注团队,或者雇佣有长期合作关系的第三方标注公司,标注人员都相对有经验;
业务要求也相对稳定,所需数据标注又相对通用化,普通人都不难理解数据含义和标注原则。
一旦未来人工智能的落地点在各个领域全面铺开,很可能需要的是针对具体企业、具体业务,不断变更的标注需求。
标注这件事情看似容易,但是一旦标注原则有所改变,就要整个重新来过。以前的标注不但不是积累,反而是累赘。
如何应对快速变更的业务需求,同步更新标注结果,将是一个在AI真正服务于大众时全面爆发的问题。偏偏现阶段还未引起足够重视。
3.3.4 数据标注的潜力
就目前而言,数据对模型的影响远胜于算法。一群年薪百万起步的算法工程师耗费经年的成果,对于模型质量直接的影响甚至比不上一个靠谱标注团队一两个月的精心标注。对模型的影响尚且如此,更何况是商业价值。
此时此刻,AI 在风口浪尖,大公司、拿了巨额风投的独角兽 startup,一个个拿出千金市马骨的气概,将不可思议的高薪狠狠砸向 AI 领域的顶尖学者,顺便捧起了一批年轻的博士,也引来了世人的垂涎。
这种情形能维持多久?商业企业能承受多少年不挣钱只烧钱?待潮涌过后,行业回归理性,模型还是要用来挣钱的。
到了那个阶段,大小企业不会去算成本收益吗?他们会意识不到将资源投入数据和算法的不同产出比吗?
企业为了创造利润应用AI技术,算法工程师不是刚需,而数据标注这个人工智能领域的“勤行”,人工智能蓝领,一定是刚需!
一切标注工作的难点和潜藏的风险,也就是这项工作的潜力和从事这项工作未来职业发展的可能性所在。
3.3.5 数据标注的职业发展
如前所述,数据标注的难点在于:
如何根据业务设定标注原则
如何快速统一地实现标注原则
同时,和所有门槛低的工种一样,从事数据标注工作,要面临如何从极大量基数资质类似的人员中脱颖而出的问题。
还有就是如何与越来越多的自动化标注技术共处的问题。
因此,笔者个人建议的数据标注职业提升路径:经验+业务+管理。大致步骤为:
通过实践积累数据标注的工作经验
深入理解业务需求并将其体现到数据的标注结果中
管理标注团队达到高效的标注结果与业务变更align
未来也许会出现一个“数据经理”之类称谓的职位:其职责以负责提供高质量标注数据为基础,技术上衔接工程领域的 ETL 和数据处理,产品上对接业务,带领团队为公司产品或服务的 revenue 提供直接贡献。
4. 认清形势,脚踏实地
近来一段时间,能明显感到,想入行AI的人越来越多,而且增幅越来越大。
为什么这么多人想入行AI呢?真的是对计算机科学研究或者扩展人类智能抱着无限的热忱吗?说白了,大多数人是为了高薪。
人们为了获得更高的回报而做出选择、努力工作,原本是非常正当的事情。关键在于,找对路径。
寻求入行的人虽多,能真的认清市场当前的需求,了解不同层次人才定位,并结合自己实际寻找一条可行之路的人太少。
人人都想“做算法”,却不想想:大公司里的研究院养着一群高端科学家,有得是读了十几二十年论文始终站在AI潮头的资深研究人员。
想要与他们为伍做算法,须有可以与之并列的成就:要么有足够分量的学术成果,要么解决过大用户量产品的实际业务问题——你占哪一条呢?
仅仅是学过课程,做过练习或实习性质的小项目,是不足以去做算法的。
谁在自己的想象世界里不是屠龙的剑客?但现实当中能屠龙的人又有几个?留给人去屠的龙又有几条?养猪虽然没那么高大上,有猪肉吃是实实在在的。
好高骛远只会虚掷光阴,脚踏实地才能实现理想——这也是笔者写作此文的初衷。
5. 小公司的AI之路
有开头的Case 1,多说几句笔者通过个人观察和思考,对小企业应用AI提出的建议。
小公司没有那么多钱可烧,不可能像大公司那样,负担研究院、科学家。因此,真心不建议小公司以技术储备为目的雇佣做算法的人。
试想:真要是花费百万年薪聘请到一位博士毕业生,过了半年TA什么交付都没有,或者即使有几个看起来很炫酷的模型,却既不能增加流量,也无法吸引用户付费,对公司收入没有任何帮助,到时候,作为雇主,又如何判断是AI技术的发展还没有成熟到能在公司业务上落地,还是这个人尸位素餐呢?
当然,不是说小公司就不能聘用算法工程师,而是说,这种高成本的付出应该有的放矢,且公司原有成员具备评判交付成果质量的能力。
作为用人方,得知道招人进来做什么,有什么事情可以应用AI技术提高其质量或效率,而这种提升又可以用什么样的指标来衡量。换言之,就是:小公司用AI,先定好KPI再招人。
笔者个人意见:大部分小企业真的用不着算法工程师,完全可能通过:
业务数据 + ML/DL工具 => 工作模型
来实现应用AI技术的目的。
如此一来,小企业真正需要的是:
i)少量了解模型原理,能够直接应用现成框架、工具、算法库训练模型的程序员(2中所描述的做工程的人);
ii)针对业务提出模型应用需求并提供数据的人——不仅仅是数据标注,而是综合了业务、数据、技术的复合型人才。3中所述“数据经理”很可能首先批量地从小企业中涌现。
近期热文
GitChat 与 CSDN 联合推出
《GitChat 达人课:AI 工程师职业指南》
「阅读原文」看交流实录,你想知道的都在这里