学习软件编程未来可以从事哪些岗位

AI原本是一个专业领域没什么特別的。作为码农一枚笔者的工作内容正好在这个领域。

近来这一年左右时间里连续发生了多件事情,使得笔者不得不抬起原本一直低著敲代码的头看看这个为AI狂欢的世界。

【Case 1】 居然在一个月里碰到两位在相对传统行业创业的亲友来打听将AI技术应用到他们所在行业上嘚问题,例如:是聊天机器人是否可以代替人工客服 两位亲友居然都动了雇佣一位算法工程师的念头。其中一位真的已经开始物色了 頗费周折找到一位某非 985 院校专业对口的博士,友人有点动心想要聘用奈何人家开口就要100万年薪。 创业企业虽然已经拿了两轮融资还是鈈敢烧钱作死,故而多方打听“算法”这东西的用处 【Case 2】 笔者所在公司今年的校园招聘,本人照例作为 interviewer 参加面试了几个来自不同985院校嘚学生(明年毕业)。顺便又和几位今年刚入职的应届生聊了聊 结果发现,所有 interviewee(至少是我碰到的)全都是人工智能或机器学习方向嘚学生,所有交流过的新同事在学校里做的也全部都是机器学习 or 深度学习算法。 而且每一个人对于入职后工作的期望都是做算法

人笁智能已经跌入到两三年前大数据风口上,全民皆“数据科学家”的套路里了

到底做什么,算是入行AI

这个话题其实在笔者之前的几個chat里面已经反复提到过了,在此再说一遍:工业界直接应用AI技术的人员大致可以分为三个不同角色:算法、工程,数据

现在各种媒體上,包括 GitChat 中有大量的文章教大家怎么入行AI怎么成为具体某个领域的工程师,告诉大家要在某领域内发展需要掌握的技术栈是什么等等……

我们不说怎么能够成为XXX,我们先来看看成为XXX之后要做什么事情而做这些事情,需要什么样的能力在拥有了这些能力、做上了这件事情之后,又能向什么方向发展

换言之,本文中我们将从直观的角度管窥承担不同角色工作所需要具备的素质日常工作的状态,和职业发展路径

真正的算法工程师(也有公司叫科学家),最基本嘚日常工作其实是:读论文&实现之——确认最新论文中的阐述是否真实可重现进一步确认是否可应用于本企业的产品,进而将其应用到實践中提升产品质量

既然日常工作首先是读别人论文。那么必不可少,作为算法工程师得具备快速、大量阅读英语论文的能力

有一個网站,所有有志于算法的同学必须要知道:https://arxiv.org ——这里有多个学科(包括computer science)大量的最新论文

现在许多科学家、学者、研究人员和博士生茬论文刚刚完成,尚未在正式期刊会议上发表时就先将论文发布在此处为的是在尽量短的时间延误下对外传播自己的成果。

传统的正规渠道从论文完成到正式发表之间存在短则三四个月,长则一年半载的延迟这对一些传统学科,还勉强可以接受

但计算机科学,尤其昰人工智能、机器学习、深度学习这几个当今世界最热门的主题大家都在争分夺秒地抢占制高点,几个月的耽搁根本不能容忍

因此,對于AI的学术性文献而言arxiv.org 实际上已经成为了当前的集大成之地。

如果要做算法平均而言,大致要保持每周读一篇最新论文的频率

也许這就是为什么,到目前为止笔者所听闻和见过的算法工程师都是名校相关专业博士的原因。

经过几年强化学术研究训练这些博士们,僦算英语综合水平不过 CET-4也能读得进去一篇篇硬骨头似的英语论文!

1.3 自测“算法力”

但当然不能说硕士、学士或者其他专业的有志之士就莋不成算法了。人都不是生而知之不会可以学嘛。

但是到底能不能学会其实也并不需要三年五载的时间,花费几万十几万金钱在各种培训或者付费阅读上才能够知道

现在不懂没关系,至少先试试在不懂的情况下能不能把它从头到尾一字不漏的读完有不认识的字查字典。

如果这都做不到还是当机立断和“算法”分手吧。既然注定无缘何必一味纠缠?

如果碰巧你喜欢读论文,或者就算不喜欢也有足够强大的意志力、专注力压迫自己去强行阅读论文那么恭喜你,你已经跨上了通往算法山门的第一级台阶

下面一级是:读懂论文。

既然要读论文读最新论文,而且阅读的目的是指导实践那么自然要读懂。拿起一篇论文就达到*懂*的程度至少需要下面这三种能力:

┅篇论文拿来一看,一大堆名词术语不懂它们互相之间是什么关系也不知道。怎么办去读参考文献,去网上搜索去书籍中查找……總之,动用一切资源和手段搞清不明概念的含义和联系。

这种能力是学术研究的最基础能力之一一般而言,有学术背景的人这一点不茬话下

如果现在没有,也可以去主动培养那么可能首先需要学习一下学术研究方法论。

如果只是本着学习的目的读经典老论文那么呮要清楚文中图表含义,看公式推导明白一头一尾(最开始公式成立的物理意义以及结束推导后最终形式所具备的基本性质)也就可以叻。

但读最新论文就不同因其新,必然未经时光检验因此也就没人预先替你验证的它的正确性。

在这种情况下看公式就得看看推导叻。否则外一是数学推导有错,导致了过于喜人的结果却无法在实践中重现,岂不空耗时力

如果目前数学能力不够,当然也可以学但就与后面要说的做工程用到什么学什么的碎片化学习不同,做算法需要系统学习数学。

微积分、线性代数、概率统计是无法回避嘚。如果在这方面有所缺乏那还是先从计算机系的本科数学课开始吧,个人推荐北师大教材

1.4.3 理论联系实际,将学术论述与产品、业务結合的能力

一般来说在大企业里做到真正的算法工程师/科学家,也就不需要自己去动手开发产品了但做 demo/prototype 还是不能避免的。

算法工程师可不是用别人写好的工具填几个参数去运行就可以的,需要负责实际业务问题到数学模型的抽象并能够将他人最新成果(敲黑板——那些论文!!!)应用到业务数据上去。

说得更通俗一点就算是用别人写的工具或框架,做算法的也得是i)第一拨、最前沿那批试用鍺,或者ii)工具最新玩法的发明者

算法工程师,即使自己不发明新的算法不提出新的算法优化方法,也得去尝试最新算法的使用或者紦已有算法用出新花样来

毋庸置疑,这是一个有着必然创新性的角色因此,这个角色必然不适合绝大多数人!

相对于算法的创新和尖端做工程要平实得多。

这一角色比较有代表性的一种岗位就是:机器学习工程师(或戏称调参工程师)——他们使用别人开发的框架和笁具运行已有算法,训练业务数据获得工作模型。

其间可能需要一些处理数据、选取特征或者调节参数的手段不过一般都有据可循,并不需要自己去发明一个XXXX

做工程也得读论文,不过和做算法不同做工程读论文的一般目的不是尝试最新方法,而是用已知有效的方法来解决实际问题

这就导致了,做工程的读的经常是“旧”论文,或者相对学术含量低一些(不那么硬)的论文

而且在阅读时,主偠是为了直接找到某个问题的处理方法因此,可以跳读

对于其中的数学公式,能够读懂头尾也就可以了论文阅读频率和学术深度的偠求,都比做算法低得多

TIP:很多title写的是“人工智能/机器学习/深度学习算法工程师”的招聘岗位,其实招的是做工程的人不要执着于辞藻,看清楚具体职责和工作内容

2.2 软件工程师的分支

说到底,机器学习工程师是广义的软件工程师(或云程序员)的一个分支。AI产品开發是广义软件开发的一个领域。

说起来每一个程序员都有一个领域。不过不同领域在不同时期热度不同,发展趋势不同

若干年前,做*底层*的程序员在程序界睥睨群雄写协议栈的、开发驱动的、实现各种系统接口的程序员,站在鄙视链的最顶端

如今,风水轮流转昨日黄花已谢,轮到AI封神了

但说到底,开发人工智能产品的程序员也还是程序员。不过是需要懂一定程度的领域内理论知识而已囷以前开发 PCI 协议栈要懂 PCI 协议,写网卡 driver 要懂 TCP/IP 的道理是一样的

2.3 程序员的基本素质

既然是程序员,首先就不能丢掉 程序员的基本素质:编码能仂和基础算法能力(不是前面说的那种算法,而是链、树、图的构建、删除、遍历、查找、排序等数据结构里讲的那种算法)是最起碼要求。

其实在AI成为潮流的今天,只要能找到一个在AI方面相对比较前沿的企业进去做一名普通程序员。

那么即使本来开发的产品不属於AI范畴未来通过在旧产品上应用新的AI技术,或者在公司内部 transfer 到做 AI 产品的 team都可能获得入行的机会。

甚至具体知识的掌握都可以在入职後慢慢积累——对于大多数AI工程人员,这可能才是一条自然的入行之路

但这一切的前提是:此人首先得是一个合格的程序员

而不是本末倒置,虽然花功夫学了几个模型、算法却连最基本的编程面试题都做不对。

2.4 做工程「机器学习」学到多深够用

当然,既然是有领域嘚程序员在专业上达到一定深度也是必要的。

虽然做工程一般要使用现成技术框架但并不是说,直接把算法当黑盒用就可以做一名合格的“调参”工程师了

把算法当黑盒用的问题在于:黑盒能够解决问题的时候,使用方便而一旦不能解决问题,或者对质量有所要求就会感觉无所适从。

作为程序员、工程人员想用机器学习算法解决实际问题,就得对算法有一定程度的掌握此外对于数据处理和模型验证,也需具备相应知识

仅从使用角度而言,掌握算法大致可分为如下由浅入深的几步:

【1】简单使用:了解某个算法基本原理,應用领域功能和局限。

  • a) 该算法的应用问题域是什么(e.g. 分类、回归、聚类……)
  • b) 该算法的应用目标是什么?(e.g. 判别算法、生成算法……)
  • c) 该算法适合应用在怎样的数据集它能对数据造成怎样的影响?(e.g. 适用少量高维稀疏数据……)
  • d) 能够主动获取该算法的函数库调用该算法生成模型。

【2】模型调优:对所采用算法和对应模型的数学公式有所了解

  • a) 知道调用函数中各个参数的意义(e.g. 迭代次数,对应到公式Φ参数的含义……)能够通过调节这些参数达到优化结果的目的。
  • c) 了解在当前问题域目标和输入数据确定的情况下,还可以用哪些其怹模型可替换现有模型并进行尝试。
  • d) 能够将多个弱模型加权组成强模型(e.g. adaboost)

【3】运行效率优化:对模型本身的数学推导过程和模型最優化方法有所掌握,对于各种最优化方法的特点、资源占用及消耗情况有所了解

  • a) 了解算法在当前数据集上的运行效率(e.g. 需要进行哪些运算,是否易于被分布式等)
  • b) 了解在其他语言、平台、框架的工具包中有否同等或近似功能但在当前应用场景下效率更高的算法。
  • c) 能够针對具体场景通过转换模型的最优化方法(optimizer)来改进运行效率。

仅仅只有算法并不能解决问题。算法和数据结合才能获得有效的模型。

对于数据需要从:i). 具有业务含义的信息,和ii).用于运算的数字这两个角度来对其进行理解和掌握。

【1】特征选取:从业务角度区汾输入数据包含的特征并认识到这些特征对结果的贡献。

  • a) 对数据本身和其对应的业务领域有所了解
  • b) 能够根据需要标注数据。
  • c) 知道如何從全集中通过划分特征子集、加减特征等方法选取有效特征集

【2】向量空间模型(VSM)构建:了解如何将自然语言、图片等人类日常使用嘚信息转化成算法可以运算的数据。

  • a) 能够把文字、语音、图像等输入转化成算法所需输入格式(一般为实数空间的矩阵或向量)
  • b) 能够根據信息熵等指标选取有效特征。

【3】数据清洗和处理:对直接的业务数据进行筛选并转换为模型可处理形式

  • a) 能够运用统计学方法等ETL手段清洗输入数据。
  • c) 能够采用bootstrap等采样方法处理有限的训练/测试数据以达到更好的运算效果。

算法+数据就能够得到模型但是,

  • 这个模型和那個模型比较哪个更适合解决当前问题?
  • 在做了如此这般的优化之后得出了一个新的模型怎么能够确认它比旧的模型好?

为了解答这些問题就需要掌握度量模型质量的方法。为此需要做到:

  • i) 了解 bias,overfitting 等基本概念及针对这些情况的基本改进方法。
  • iii) 能够构建训练集、测試集并进行交叉验证。

3.1 标注数据的重要性

虽然机器学习中有无监督学习,但在实践领域被证明有直接作用的基本上还都是有监督模型。

近年来深度学习在很多应用上取得了巨大的成功,而深度学习的成功无论是图像、语音、NLP、自动翻译还是AlphaGo,恰恰依赖于海量的标注数据

无论是做ML还是DL的工程师(算法&工程),后者有甚都共同确认一个事实:现阶段而言,数据远比算法重要

3.2 数据人工标注的必要性

其实,之所以有这样的结果恰恰是因为 Zero 利用围棋严格完备而明晰的规则,自己制造出了巨大量的标注数据——这些标注数据的数量远超其前辈 AlphaGo 的输入而且可以随时造出更多。

圍棋是一个人为定义的在19x19点阵范围内按完备无二义性规则运行的游戏,因此计算机程序才能依据规则自动产生标注数据

真实人类世界嘚事情,基本没有完全按矩而行无意外的情况因此,对人类真正有用的模型还是需要人工标注的训练数据。

固然目前有多种技术用鉯在标注的过程中辅助人工,以减小工作量及降低人工标注比例但至今没有能在应用领域完全自动化标注的技术出现。

换言之在看得見的未来之内,人工标注数据仍然是AI落地的必要和主流

3.3 人工智能的“勤行”

举个很简单的例子说明一下什么是数据标注:

开发聊天机器人的时候,我们需要训练意图判定和实体识别模型因此也就需要标注用户问题的意图和出现的实体。 这是用户问题原始数据:“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先吃透「机器学习」

首先,我们来看一下当前机器学习领域招聘市场嘚行情

上面表格中所有带有“算法”、“人工智能”、“数据挖掘”、“视觉”字样的职位,都需要懂机器学习

在产品和服务中应用機器学习模型,已经逐步成为了互联网行业的通行方法甚至很多传统软件企业,也开始尝试应用机器学习

说得更直接一点,人工智能囸处在炙手可热的风口浪尖上作为程序员不会机器学习都不好意思去找工作了。

很多技术开发者迫切希望快速进入人工智能领域从事笁程或者算法等相关工作。

针对机器学习初学者我们可以从机器学习、深度学习最基本的原理及学习意义入手,以模型为驱动吃透几夶最经典的机器学习模型——学习其原理、数学推导、训练过程和优化方法。

狭义:可以利用任何一种计算机軟件的任何一功能为可能用到它的人提供一定的服务。

广义:对各种软件的 各种功能/设置属性 有足够的了解和应用能力可以在各种情況下驾驭计算机高效率的为不同人群提供他们所需要的各种服务。 总之凡是利用计算机软件,为需要或者可能需要它的人提供服务的技術就是计算机应用技术。

就业方向: 计算机软件开发、计算机及其网络管理维护、互联网站建设维护等职业岗位群

初级会写基本的代码就行,等於会语言本身就行;

中级需要学习常用的类库使用至少会操作一个数据库,维护别人写好的代码;

我觉得想做软件开发至少需要达到仩面两个层级,再学习一些未来要从事工作的行业知识

高级得会需求分析,设计架构线程等等,最后编写代码实现功能

高手,对计算机、网络的理解需要很清楚C/C++,网络知识硬件知识,操作系统知识方方面面都要学习最后会融会贯通,灵活应用

你对这个回答的評价是?

下载百度知道APP抢鲜体验

使用百度知道APP,立即抢鲜体验你的手机镜头里或许有别人想知道的答案。

我要回帖

 

随机推荐