本帖最后由 fc013 于 2018-7-7 19:06 编辑
问题导读:
1.在工业界做算法是干什么? 2.机器学习工程师做哪些工作? 3.数据标注岗位需要做什么?
引言
AI原本是一个专业领域,没什么特别的。作为码农一枚,笔者的工作内容正好在这个领域。
近来这一年左右时间里,连续发生了多件事情,使得笔者不得不抬起原本一直低着敲代码的头,看看这个为AI狂欢的世界。
人工智能,已经跌入到两三年前大数据风口上,全民皆“数据科学家”的套路里了。
到底做什么,算是入行AI?
这个话题其实在笔者之前的几个chat里面已经反复提到过了,在此再说一遍:工业界直接应用AI技术的人员,大致可以分为三个不同角色:算法、工程,和数据。
现在各种媒体上,包括 GitChat 中有大量的文章教大家怎么入行AI,怎么成为具体某个领域的工程师,告诉大家要在某领域内发展需要掌握的技术栈是什么,等等……
我们不说怎么能够成为XXX,我们先来看看成为XXX之后要做什么事情,而做这些事情,需要什么样的能力,在拥有了这些能力、做上了这件事情之后,又能向什么方向发展。
换言之,本文中,我们将从直观的角度,管窥承担不同角色工作所需要具备的素质,日常工作的状态,和职业发展路径。
做算法
1.1 日常工作
所有人都想做算法,那么,说到底,在工业界做算法倒是干什么?
真正的算法工程师(也有公司叫科学家),最基本的日常工作其实是:读论文&实现之——确认最新论文中的阐述是否真实可重现,进一步确认是否可应用于本企业的产品,进而将其应用到实践中提升产品质量。
1.2 必备能力
既然日常工作首先是读别人论文。那么,必不可少,作为算法工程师得具备快速、大量阅读英语论文的能力。
有一个网站,所有有志于算法的同学必须要知道:https://arxiv.org ——这里有多个学科(包括computer science)大量的最新论文。
现在许多科学家、学者、研究人员和博士生在论文刚刚完成,尚未在正式期刊会议上发表时就先将论文发布在此处,为的是在尽量短的时间延误下对外传播自己的成果。
传统的正规渠道,从论文完成到正式发表之间存在短则三四个月,长则一年半载的延迟。这对一些传统学科,还勉强可以接受。
但计算机科学,尤其是人工智能、机器学习、深度学习这几个当今世界最热门的主题,大家都在争分夺秒地抢占制高点,几个月的耽搁根本不能容忍。
因此,对于AI的学术性文献而言,arxiv.org 实际上已经成为了当前的集大成之地。
如果要做算法,平均而言,大致要保持每周读一篇最新论文的频率。
也许这就是为什么,到目前为止,笔者所听闻和见过的算法工程师都是名校相关专业博士的原因。
经过几年强化学术研究训练,这些博士们,就算英语综合水平不过 CET-4,也能读得进去一篇篇硬骨头似的英语论文!
1.3 自测“算法力”
但当然不能说硕士、学士或者其他专业的有志之士就做不成算法了。人都不是生而知之,不会可以学嘛。
但是到底能不能学会,其实也并不需要三年五载的时间,花费几万十几万金钱在各种培训或者付费阅读上才能够知道。
有个很简单的验证方法:现在就去https://arxiv.org找一篇论文(比如这篇:Dynamic Routing Between Capsules),从头到尾读一遍。
现在不懂没关系,至少先试试在不懂的情况下能不能把它从头到尾一字不漏的读完,有不认识的字查字典。
如果这都做不到,还是当机立断和“算法”分手吧。既然注定无缘,何必一味纠缠?
1.4 学术实践能力
如果,碰巧你喜欢读论文,或者就算不喜欢也有足够强大的意志力、专注力压迫自己去强行阅读论文。那么恭喜你,你已经跨上了通往算法山门的第一级台阶。
下面一级是:读懂论文。
既然要读论文,读最新论文,而且阅读的目的是指导实践,那么自然要读懂。拿起一篇论文就达到懂的程度,至少需要下面这三种能力:
1.4.1 回溯学习能力
一篇论文拿来一看,一大堆名词术语不懂,它们互相之间是什么关系也不知道。怎么办?去读参考文献,去网上搜索,去书籍中查找……总之,动用一切资源和手段,搞清不明概念的含义和联系。
这种能力是学术研究的最基础能力之一,一般而言,有学术背景的人这一点不在话下。
如果现在没有,也可以去主动培养,那么可能首先需要学习一下学术研究方法论。
1.4.2 数学能力
如果只是本着学习的目的读经典老论文,那么只要清楚文中图表含义,看公式推导明白一头一尾(最开始公式成立的物理意义,以及结束推导后最终形式所具备的基本性质)也就可以了。
但读最新论文就不同。因其新,必然未经时光检验,因此也就没人预先替你验证的它的正确性。
在这种情况下,看公式就得看看推导了。否则,外一是数学推导有错,导致了过于喜人的结果,却无法在实践中重现,岂不空耗时力?
如果目前数学能力不够,当然也可以学。但就与后面要说的做工程用到什么学什么的碎片化学习不同,做算法,需要系统学习数学。
微积分、线性代数、概率统计,是无法回避的。如果在这方面有所缺乏,那还是先从计算机系的本科数学课开始吧,个人推荐北师大教材。
1.4.3 理论联系实际,将学术论述与产品、业务结合的能力
一般来说,在大企业里做到真正的算法工程师/科学家,也就不需要自己去动手开发产品了。但做 demo/prototype 还是不能避免的。
算法工程师,可不是用别人写好的工具填几个参数去运行就可以的,需要负责实际业务问题到数学模型的抽象,并能够将他人最新成果(敲黑板——那些论文!!!)应用到业务数据上去。
说得更通俗一点,就算是用别人写的工具或框架,做算法的,也得是i)第一拨、最前沿那批试用者,或者ii)工具最新玩法的发明者。
1.5 创新型人才
算法工程师,即使自己不发明新的算法,不提出新的算法优化方法,也得去尝试最新算法的使用或者把已有算法用出新花样来。
毋庸置疑,这是一个有着必然创新性的角色。因此,这个角色必然不适合绝大多数人!
做工程
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】简单使用:了解某个算法基本原理,应用领域,功能和局限。
- 该算法的应用问题域是什么?(e.g. 分类、回归、聚类……)
- 该算法的应用目标是什么?(e.g. 判别算法、生成算法……)
- 该算法适合应用在怎样的数据集,它能对数据造成怎样的影响?(e.g. 适用少量高维稀疏数据……)
- 能够主动获取该算法的函数库,调用该算法生成模型。
【2】模型调优:对所采用算法和对应模型的数学公式有所了解。
- 知道调用函数中各个参数的意义(e.g. 迭代次数,对应到公式中参数的含义……),能够通过调节这些参数达到优化结果的目的。
- 能够通过加约束条件(e.g. L0, L1, L2 ……)来优化算法。
- 了解在当前问题域,目标和输入数据确定的情况下,还可以用哪些其他模型可替换现有模型,并进行尝试。
- 能够将多个弱模型加权组成强模型(e.g. adaboost)。
【3】运行效率优化:对模型本身的数学推导过程和模型最优化方法有所掌握,对于各种最优化方法的特点、资源占用及消耗情况有所了解。
- 了解算法在当前数据集上的运行效率(e.g. 需要进行哪些运算,是否易于被分布式等)。
- 了解在其他语言、平台、框架的工具包中有否同等或近似功能但在当前应用场景下效率更高的算法。
- 能够针对具体场景,通过转换模型的最优化方法(optimizer)来改进运行效率。
2.4.2 数据
仅仅只有算法,并不能解决问题。算法和数据结合,才能获得有效的模型。
对于数据,需要从:i). 具有业务含义的信息,和ii).用于运算的数字,这两个角度来对其进行理解和掌握。
【1】特征选取:从业务角度区分输入数据包含的特征,并认识到这些特征对结果的贡献。
- 对数据本身和其对应的业务领域有所了解。
- 能够根据需要标注数据。
- 知道如何从全集中通过划分特征子集、加减特征等方法选取有效特征集。
【2】向量空间模型(VSM)构建:了解如何将自然语言、图片等人类日常使用的信息转化成算法可以运算的数据。
- 能够把文字、语音、图像等输入转化成算法所需输入格式(一般为实数空间的矩阵或向量)。
- 能够根据信息熵等指标选取有效特征。
【3】数据清洗和处理:对直接的业务数据进行筛选并转换为模型可处理形式。
- 能够运用统计学方法等ETL手段清洗输入数据。
- 能够对数据进行归一化(normalization), 正则化(regularization)等标准化操作。
- 能够采用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 和处理数据。此处说的做数据是指数据标注。
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技术,算法工程师不是刚需,而数据标注这个人工智能领域的“勤行”,人工智能蓝领,一定是刚需!
一切标注工作的难点和潜藏的风险,也就是这项工作的潜力和从事这项工作未来职业发展的可能性所在。
认清形势,脚踏实地
近来一段时间,能明显感到,想入行AI的人越来越多,而且增幅越来越大。
为什么这么多人想入行AI呢?真的是对计算机科学研究或者扩展人类智能抱着无限的热忱吗?说白了,大多数人是为了高薪。
人们为了获得更高的回报而做出选择、努力工作,原本是非常正当的事情。关键在于,找对路径。
寻求入行的人虽多,能真的认清市场当前的需求,了解不同层次人才定位,并结合自己实际寻找一条可行之路的人太少。
人人都想“做算法”,却不想想:大公司里的研究院养着一群高端科学家,有得是读了十几二十年论文始终站在AI潮头的资深研究人员。
想要与他们为伍做算法,须有可以与之并列的成就:要么有足够分量的学术成果,要么解决过大用户量产品的实际业务问题——你占哪一条呢?
仅仅是学过课程,做过练习或实习性质的小项目,是不足以去做算法的。
谁在自己的想象世界里不是屠龙的剑客?但现实当中能屠龙的人又有几个?留给人去屠的龙又有几条?养猪虽然没那么高大上,有猪肉吃是实实在在的。
好高骛远只会虚掷光阴,脚踏实地才能实现理想——这也是笔者写作此文的初衷。
入门 AI,先吃透「机器学习」
首先,我们来看一下当前机器学习领域招聘市场的行情。
上面表格中所有带有“算法”、“人工智能”、“数据挖掘”、“视觉”字样的职位,都需要懂机器学习。
在产品和服务中应用机器学习模型,已经逐步成为了互联网行业的通行方法。甚至很多传统软件企业,也开始尝试应用机器学习。
说得更直接一点,人工智能正处在炙手可热的风口浪尖上,作为程序员不会机器学习都不好意思去找工作了。
很多技术开发者迫切希望快速进入人工智能领域,从事工程或者算法等相关工作。
从「模型」入手
针对机器学习初学者,我们可以从机器学习、深度学习最基本的原理及学习意义入手,以模型为驱动,吃透几大最经典的机器学习模型——学习其原理、数学推导、训练过程和优化方法。
以【机器学习极简入门】为例的设置:
有监督学习:详细讲解有监督学习中经典的线性回归、朴素贝叶斯、逻辑回归、决策树、支持向量机、支持向量回归、隐马尔科夫和条件随机场模型。 无监督学习:重在详细讲解无监督学习中的聚类、高斯混合及主成分分析等模型。 从机器学习到深度学习:讲解深度学习基本原理、深度学习与机器学习的关联与衔接、以及深度学习目前的应用领域,为「深度学习」的进阶奠定基础。
配合精心设计的极小数据量的「极简版」实例,方便读者从直观上了解模型的运行原理,利用实例大家还可将自己变身为「人肉计算机」,通过口算/笔算每一步的推导,模拟算法全过程,进而彻底理解每个模型的运作方式。
从【机器学习极简入门】可以收获什么?
(1)AI 技术岗位求职知识储备
如果大家真的有意投身到人工智能领域做技术性工作,那么经过技术笔试、面试是必要条件。
在面试中被要求从头解释某一个机器学习模型的运行原理、推导过程和优化方法,是目前非常常见的一种测试方法。
机器学习模型虽然很多,但是经典、常用的很有限。如果能把这个课程中讲解的经典模型都学会,用来挑战面试题相信是足够了。
(2)触类旁通各大模型与算法
各种机器学习模型的具体形式和推导过程虽然有很大差别,但却在更基础的层面有许多共性。
掌握共性之后,再去学新的模型、算法,就会高效得多。虽然本课的第二部分集中描述了部分一般性共同点,但真要理解个中含义,却还要以若干具体模型为载体,经由学习其从问题发源,到解决方案,再到解决方案的数学抽象,以及后续数学模型求解的全过程,来了解体味。这也就是本课以模型为驱动的出发点。
(3)极简版实例体验实际应用
运用到实践中去,是我们学习一切知识的目的。机器学习本身更是一种实操性很强的技术,学习它,原本就是为了应用。反之,应用也能够促进知识的深化理解和吸收。 本课虽然以原理为核心,但也同样介绍了:划分数据集;从源数据中提取特征;模型训练过程;模型的测试和评估等方法和工具。
(4)配套数据+代码快速实操上手
本课程中各个实例的 Python 代码及相应数据,大家可以下载、运行、改写、参考。
除了上述几点,我希望本课的读者在知识和技巧的掌握之外,能够将学习到的基本规律运用到日常生活中,更加理性地看待世界。
再遇到“人工智能产品”,能够根据自己的知识,去推导:How it works——
它背后有没有用到机器学习模型? 如果有的话是有监督的还是无监督的模型? 是分类模型还是回归模型? 选取的特征会是哪些? 如果由你来解决这个问题,有没有更好的方法? ……
|