发布时间:2023-02-06 08:30
AI 原本是一个专业领域,没什么特别的。作为码农一枚,笔者的工作内容正好在这个领域。
近来这一年左右时间里,连续发生了多件事情,使得笔者不得不抬起原本一直低着敲代码的头,看看这个为 AI 狂欢的世界。
【Case 1】 居然在一个月里碰到两位在相对传统行业创业的亲友,来打听将 AI 技术应用到他们所在行业上的问题,例如:聊天机器人是否可以代替人工客服?
两位亲友居然都动了雇佣一位算法工程师的念头。其中一位真的已经开始物色了。颇费周折找到一位某非985院校专业对口的博士,友人有点动心想要聘用,奈何人家开口就要100万年薪。创业企业虽然已经拿了两轮融资,还是不敢烧钱作死,故而多方打听“算法”这东西的用处。
【Case 2】 笔者所在公司今年的校园招聘,本人照例作为 interviewer 参加,面试了几个来自不同985院校的学生(明年毕业)。顺便又和几位今年刚入职的应届生聊了聊。
结果发现,所有 interviewee(至少是我碰到的),全都是人工智能或机器学习方向的学生,所有交流过的新同事,在学校里做的也全部都是机器学习 or 深度学习算法。而且,每一个人对于入职后工作的期望都是做算法。
人工智能,已经跌入到两三年前大数据风口上,全民皆“数据科学家”的套路里了。
到底做什么,算是入行 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】简单使用:了解某个算法基本原理,应用领域,功能和局限。