20万到100万年薪的算法工程师有什么区别?

2023-05-16

公元七世纪,在车迟国国家气象局组织的一次求雨活动中,虎力、鹿力、羊力三位大仙成功地祈下甘霖,救黎民于水火中。老国王虽然不明就里,却从此尊他们为国师,奉道教为圭臬。

本世纪,算法工程师们的境遇也差不多:早些年,信奉糙快猛主义的大佬们觉得他们饱食终日、无所用心,没工作只好在学校混博士,靠数据上的障眼法装神弄鬼。可是,随着去年 AlphaGo 大破李世石,大佬们在心底喊出“我操”的同时,慌不择路地把各种搞劫持、送外卖的生意包装成人工智能,并纷纷请来几位懂算法的国师加持。虽然他们对国师们所做的事智商上并不理解,却虔诚地希望他们快点儿求下雨来。

于是,算法工程师的身价也水涨船高了。各门派工程师不论过去练的是 Java、PHP 还是 Excel,都放弃了最好语言的争论,抄起了深度学习,发誓重新修炼成算法工程师。前些天,还有人在知乎上问我:20 万、50 万、100 万年薪的算法工程师,到底有什么区别?

这样充满铜臭味儿的问题,让我十分欣慰。虽说在北京,20 万已经基本不可能招到靠谱儿的算法工程师了,还是姑且用上面的数字做个参照,谈谈算法工程师的三个层次吧。(这里说的算法,并不是计算机系本科课程《算法与数据结构》里那个算法。那门课里讲的,是排序、查找这类“确定性算法”;而这里我们说的,是用统计方法对数据进行建模的“概率性算法”。)下文中会提到一些算法和模型,但不过是为了举例说明概念,无需深究,有兴趣钻研的朋友可以自己查阅资料。

第一层次“Operating”:会使用工具

这个层次的工程师,对常用的模型比较熟悉,来了数据以后,好歹能挑个合适的跑一下。

达到这个层次,其实门槛不高。早些年,您只要掌握了什么叫 LDA、哪叫 SVM,再玩过几次 libnear、mahout 等开源工具,就可以拿到数据后跑个结果出来。到了深度学习时代,这件事儿似乎就更简单了:管它什么问题,不都是拿神经网络往上堆嘛!最近,经常会遇到一些工程师,成功地跑通了 Tensorflow 的 demo 后,兴高采烈地欢呼:我学会深度学习了,我明天就统治人类了!

这事要真这么简单,我是茄子。任凭你十八般开源工具用的再熟,也不可能搞出个战胜柯洁的机器人来。这里要给大家狠狠浇上一盆冷水:进入这个领域的人,都要先了解一个“没有免费的午餐定理”,这个定理的数学表达过于晦涩,我们把它翻译成并不太准确的文艺语言:

如果有两个模型搞一次多回合的比武,每个回合用的数据集不同,而且数据集没什么偏向性,那么最后的结果,十有八九是双方打平。

管你是普通模型、文艺模型还是 2B 模型,谁也别瞧不起谁。考虑一种极端情况:有一个参赛模型是“随机猜测”,也就是无根据地胡乱给个答案,结果如何呢?对,还是打平!所以,请再也不要问“聚类用什么算法效果好”这样的傻问题了。

这就很尴尬了!因为掌握了一堆模型并且会跑,其实并没有什么卵用。当然,实际问题的数据分布,总是有一定特点的,比方说人脸识别,图中间怎么说都得有个大圆饼。因此,问“人脸识别用什么模型好”这样的问题,就有意义了。而算法工程师的真正价值,就是洞察问题的数据先验特点,把他们表达在模型中,而这个,就需要下一个层次的能力了。

会使用工具,在算法工程师中仅仅是入门水平,靠这两把刷子解决问题,就好比杀过两只鸡就想做腹腔手术一样,不靠谱儿程度相当高。如果不是在薪酬膨胀严重的互联网界,我觉得 20 万是个比较合理的价格。

第二层次“Optimization”:能改造模型

这个层次的工程师,能够根据具体问题的数据特点对模型进行改造,并采用相应合适的最优化算法,以追求最好的效果。

不论前人的模型怎么美妙,都是基于当时观察到的数据先验特点设计的。比如说 LDA,就是在语料质量不高的情况下,在 PLSA 基础上引入贝叶斯估计,以获得更加稳健的主题。虽说用 LDA 不会大错,但是要在你的具体问题上跑出最好的效果,根据数据特点做模型上的精准改造,是不可避免的。

互联网数据这一现象更加明显,因为没有哪两家公司拥有的数据是相似的。百度的点击率模型,有数十亿的特征,大规模的定制计算集群,独特的深度神经网络结构,你能抄么?抄过来也没用。用教科书上的模型不变应万变,结果只能是刻舟求剑。

改造模型的能力,就不是用几个开源工具那么简单了,这需要有两方面的素养:

一、深入了解机器学习的原理和组件。 机器学习领域,有很多看似不那么直接有用的基础原理和组件。比方说,正则化怎么做?什么时候应该选择什么样的基本分布?(如下表) 贝叶斯先验该怎么设?两个概率分布的距离怎么算?当你看到前辈高人把这些材料烹调在一起,变成 LDA、CNN 这些成品菜肴端上来的时候,也要想想如果自己下厨,是否了解食材,会不会选择和搭配。仅仅会吃几个菜,说出什么味道,离好厨师差的还远着呢。

enter image description here

二、熟练掌握最优化方法。 机器学习从业者不懂最优化,相当于武术家只会耍套路。这就跟雷公太极和闫芳大师一样,实战起来一定是鼻青脸肿。管你设计了一个多牛逼的模型,如果无法在有限的计算资源下找出最优解,那么不过是个花瓶罢了。

最优化,是机器学习最、最、最重要的基础。你要知道,在目标函数及其导数的各种情形下,应该如何选择优化方法;各种方法的时间空间复杂度、收敛性如何;还要知道怎样构造目标函数,才便于用凸优化或其他框架来求解。而这些方面的训练,要比机器学习的模型还要扎实才行。

enter image description here

拿大家以为“以不变应万变”的深度学习举个例子。用神经网络处理语音识别、自然语言处理这种时间序列数据的建模,RNN(见上图)是个自然的选择。不过在实践中,大家发现由于“梯度消失”现象的存在,RNN 很难对长程的上下文依赖建模。而在自然语言中,例如决定下面的 be 动词是“is”还是“are”这样的问题,有可能往前翻好多词才能找到起决定作用的主语。怎么办呢?天才的 J. Schmidhuber 设计了带有门结构的 LSTM 模型(见下图),让数据自行决定哪些信息要保留,那些要忘掉。如此以来,自然语言的建模效果,就大大提高了。大家初看下面两张 RNN 与 LSTM 的结构对比,面对凭空多出来的几个门结构可能一头雾水,唯有洞彻其中的方法论,并且有扎实的机器学习和最优化基础,才能逐渐理解和学习这种思路。

enter image description here

当然,LSTM 这个模型是神来之笔,我等对此可望不可及。不过,在这个例子里展现出来的关键能力:根据问题特点调整模型,并解决优化上的障碍,是一名合格的算法工程师应该追求的能力。年薪 50 万能找到这样的人,是物有所值的。

第三层次“Objective”:擅定义问题

这个层次的工程师(哦,似乎叫工程师不太合适了),扔给他一个新的实际问题,可以给出量化的目标函数。

当年,福特公司请人检修电机,斯泰因梅茨(编者注:Steinmetz,Charles Proteus 德国-美国电机工程师,对交流电系统的发展作出巨大贡献。)在电机外壳画了一条线,让工作人员在此处打开电机迅速排除了故障。结账时,斯坦门茨要 1 万美元,还开了个清单:画一条线,1 美元;知道在哪儿画线,9999 美元。

同样的道理,在算法领域,最难的也是知道在哪里画线,这就是对一个新问题构建目标函数的过程。而有明确的量化目标函数,正是科学方法区别于玄学方法、神学方法的重要标志。

目标函数,有时能用一个解析形式(Analytical form)写出来,有时则不能。比方说网页搜索这个问题,有两种目标函数:一种是 nDCG,这是一个在标注好的数据集上可以明确计算出来的指标;另一种则是人工看 badcase 的比例,显然这个没法用公式计算,但是其结果也是定量的,也可以作为目标函数。

定义目标函数,初听起来并没有那么困难,不就是制定个 KPI 么?其实不然,要做好这件事,在意识和技术上都有很高的门槛。

一、要建立“万般皆下品、唯有目标高”的意识。 一个团队也好、一个项目也好,只要确立了正确的、可衡量的目标,那么达到这个目标就只是时间和成本的问题。假设 nDCG 是搜索的正确目标函数,那么微软也好、Yahoo! 也好,迟早也能追上 Google,遗憾的是,nDCG 这个目标是有点儿问题的,所以后来这两家被越拉越远。

所谓“本立而道生”:一个项目开始时,总是应该先做两件事:一是讨论定义清楚量化的目标函数;二是搭建一个能够对目标函数做线上 A/B 测试的实验框架。而收集什么数据、采用什么模型,倒都在其次了。

二、能够构造准确(信)、可解(达)、优雅(雅)的目标函数。
目标函数要尽可能反应实际业务目标,同时又有可行的优化方法。一般来说,优化目标与评测目标是有所不同的。比如说在语音识别中,评测目标是“词错误率”,但这个不可导所以没法直接优化;因此,我们还要找一个“代理目标”,比如似然值或者后验概率,用于求解模型参数。评测目标的定义往往比较直觉,但是要把它转化成一个高度相关,又便于求解的优化目标,是需要相当的经验与功力的。在语音建模里,即便是计算似然值,也需要涉及 Baum-Welch 等比较复杂的算法,要定义清楚不是简单的事儿。

优雅,是个更高层次的要求;可是在遇到重大问题时,优雅却往往是不二法门。因为,往往只有漂亮的框架才更接近问题的本质。 关于这点,必须要提一下近年来最让人醍醐灌顶的大作——生成对抗网络(GAN)。

GAN 要解决的,是让机器根据数据学会画画、写文章等创作性问题。机器画画的目标函数怎么定?听起来是一头雾水。我们早年做类似的语音合成问题时,也没什么好办法,只能找人一句句听来打分。令人拍案叫绝的是,Ian GoodFellow 在定义这个问题时,采取了下图的巧妙框架:

enter image description here

既然靠人打分费时费力,又不客观,那就干脆让机器打分把!好在让机器认一幅特定语义的图画,比如说人脸,在深度学习中已经基本解决了。好,假设我们已经有一个能打分的机器 D,现在要训练一个能画画的机器 G,那就让 G 不断地画,D 不断地打分,什么时候 G 的作品在 D 那里得分高了,就算是学成了。同时,D 在此过程中也因为大量接触仿品而提升了鉴赏能力,可以把 G 训练得更好。有了这样定性的思考还不够,这样一个巧妙设计的二人零和博弈过程,还可以表示成下面的数学问题:

enter image description here

这样一个目标,优雅得象个哲学问题,却又实实在在可以追寻。当我看到这个式子时,顿时觉得教会机器画画是个不远的时间问题了。如果你也能对这样的问题描述感到心旷神怡,就能体会为什么这才是最难的一步。

一个团队的定海神针,就是能把问题转化成目标函数的那个人——哪怕他连开源工具都不会用。100 万找到这样的人,可真是捡了个大便宜。

在机器学习领域,算法工程师脚下的进阶之路是清晰的:当你掌握了工具、会改造模型,进而可以驾驭新问题的建模,就能成长为最优秀的人才。沿着这条路踏踏实实走下去,100 万并不是什么问题。什么?您说还有 300 万的呢?这个不用眼热,人家只不过把你写代码的时间都用来跳槽了而已。

@北冥乘海生 2018.9

——————
推荐阅读:
《The Coder》9 月刊聚焦程序员的职场江湖

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

20万到100万年薪的算法工程师有什么区别? 的相关文章

  • 【杭电100题】2073 无限的路

    题目链接 xff1a http acm hdu edu cn showproblem php pid 61 2073 xff08 c语言的double类型printf lf 显示0 00000问题 xff09 xff1a https blo
  • 100个不能错过的实用JS自定义函数

    1 原生JavaScript实现字符串长度截取 代码如下 span class token keyword function span span class token function cutstr span span class tok
  • 请计算1到100之内的所有质数

    请计算1到100之内的所有质数 JavaScript function hm3 var sum 61 0 得到一个数 for var i 61 2 i lt 61 100 i 43 43 var j 61 0 for var j 61 2
  • 输出1-100的循环

    以下是在 Python 中输出 1 100 的循环代码 xff1a span class hljs keyword for span span class hljs selector tag i span span class hljs k
  • Python求1+2+3+...+100的值,计算平方根的两个代码程序

    目录 前言 一 求1 43 2 43 3 43 43 100的值 1 实现的功能 2 代码程序 3 运行截图 二 计算平方根 1 实现的功能 2 代码程序 3 运行截图 前言 1 因多重原因 xff0c 本博文由两个程序代码部分组成 xff
  • Python求1+2+3+...+100的值,计算自然数的立方和的两个程序代码

    目录 前言 一 求1 43 2 43 3 43 43 100的值 1 实现的功能 2 代码程序 3 运行截图 二 计算自然数的立方和的 1 实现的功能 2 代码程序 3 运行截图 前言 1 因多重原因 xff0c 本博文由两个程序代码部分组
  • Blazor入门100天 : 身份验证和授权 (3) - DB改Sqlite

    目录 建立默认带身份验证 Blazor 程序角色 组件 特性 过程逻辑DB 改 Sqlite将自定义字段添加到用户表脚手架拉取IDS文件 本地化资源freesql 生成实体类 freesql 管理ids数据表初始化 Roles freesq
  • C语言例题 4/100

    题目 xff1a 输入某年某月某日 xff0c 判断这一天是这一年的第几天 xff1f include lt stdio h gt int main int day month year sum leap printf 34 n请输入年 月
  • python数值运算m op n 100+10_【Python】数值运算

    描述 获得用户输入的一个字符串 xff0c 格式如下 xff1a M OP N 其中 xff0c M和N是任何数字 xff0c OP代表一种操作 xff0c 表示为如下四种 xff1a 43 加减乘除
  • 编写Python语言,求100到999之间的水仙花数

    for sum in range 100 1000 bai 61 sum 100 shi 61 sum 10 10 ge 61 sum 10 if bai 3 43 shi 3 43 ge 3 61 61 sum print sum 39
  • 【Python量化分析100例】Day1-使用Tushare获取数据

    1 背景 Tushare平台是目前使用python学习量化投资比较好用的而且是免费的一个数据获取平台 主要实现对金融数据从数据采集 清洗加工 到 数据存储的过程 xff0c 能够为金融分析人员提供快速 整洁 和多样的便于分析的数据 xff0
  • STM32入门100步

    目录 1 C8T6引脚图 2 电路基础 1 IO口静态特性 xff1a 2 上下拉电阻 3 STM32官网 xff1a 4 内核与存储器 5 时钟 复位和电源管理 6 低功耗和ADC 7 DMA和IO端口 8 调试模式和定时器 9 看门狗和
  • Atcoder Beginner Contest 100 - 题解

    A 原题 Happy Birthday 本题其实很水 只需要输入这两个整数 xff0c 如果中有一个大于 就输出 xff0c 否则输出 Yay include lt bits stdc 43 43 h gt using namespace
  • 最新的100个微信小程序-极乐Store

    1 团队日历 通过日历管理团队协同任务 在团队内指派 抄送和公开任务事项 xff0c 通过邮件或短信推送消息 到极乐小程序商店中搜索 团队日历 使用 2 同程旅游 同程小程序是一款无需下载安装 xff0c 只需扫描二维码即可 实现产品订购和
  • C语言经典面试题100道(校对详解版)

    题目非本人整理 xff0c 转载于https blog csdn net qq 42613510 article details 81225935 做了校对与详解 xff0c 方便大家参考 最后编程答案自己做的 xff0c 还没写完 xff
  • C++服务器开发100个知识要点C++RAII惯用法

    最初的写法 在笔者刚学习服务器开发的时候 xff0c 公司给笔者安排了一个练习 xff1a 在 Windows 系统上写一个 C 43 43 程序 xff0c 用该程序实现一个简单的服务 xff0c 在客户端连接上来时 xff0c 给客户端
  • 计算100以内的素数的个数

    以下代码是用来计算100以内的素数的个数 xff0c 请把相应的空填上 struct prime number node int prime number prime number node next int calc prime numb
  • (1/100) ros的plugin插件和动态参数配置dynamic_reconfigure

    写在前面 xff1a 实际机器人开发中 xff0c 往往会存在很多参数 xff0c 这些参数需要在实际的调试中得出 xff0c 为了更高效的开发与测试 xff0c 则选择使用动态的参数配置 而在机器人功能模块层面 xff0c 我们可能也需要
  • 【100%有效】解决AndroidStudio 控制台编译输出中文乱码,亲测解决!

    背景 在AndroidStudio中新建了一个Java Module xff0c 但是点击 Run app 之后 xff0c Build Output 控制台输出的中文都是乱码 xff0c 都是问号一样的字符 google了很多方法 xff
  • 100条经典C语言笔试题目

    100 条经典C语言笔试题目 题目来源 xff1a 1 中兴 华为 慧通 英华达 微软亚洲技术中心等中 外企业面试题目 xff1b 2 C 语言面试宝典 林锐 高质量编程第三版 说明 xff1a 1 部分C 语言面试题中可能会参杂部分和C

随机推荐

  • 传输层——TCP协议

    目录 一 初步认识 二 TCP协议格式 2 1 初识协议格式 2 2 序号与确认序号 2 3 16位窗口大小 2 4 六个标志位 三 确认应答机制 四 超时重传机制 五 连接管理机制 5 1 三次挥手 5 2 四次挥手 六 流量控制 七 滑
  • Android 8.1 App开机自启动、注册为无障碍服务、实现悬浮窗

    xff08 欢迎转载 xff0c 只需注明本文来源 xff1a https blog csdn net actionwind article details 103619688 xff09 以下各方法大多来自于网上诸多朋友的无私分享 xff
  • 安卓的ATV系统

    Android系统根据是否需要认证分为AOSP系统和ATV系统 AOSP Android开源系统 xff0c 全称为Android Open Source Project ATV 产品依照 Android TV 制式标准提供统一的操作体验
  • ubuntu18 为什么安装的时候选择自动登陆,但是还是不能自动登陆呢

    2019 03 12 16 16 1 点击右上角的向下三角形 2 在出现的对话框里面 xff0c 点击右下角的扳手图标 3 点击 隐私 gt 锁屏 4 自动锁屏 L xff0c 保持不变 5 黑屏至锁屏的等的时间 A 改为 30分钟 6 显
  • zabbix 5.4 添加监控主机

    现在我们已经有了一个客户端主机了 xff0c 接下来我们要在zabbix server管理页面添加这台主机 xff0c 让server对agent进行监控 登录zabbix server的管理页面 xff0c 点击左侧操作树的配置选项 xf
  • (转载)环形缓冲区的实现原理(ring buffer)

    环形缓冲区的实现原理 xff08 ring buffer xff09 在通信程序中 xff0c 经常使用环形缓冲区作为数据结构来存放通信中发送和接收的数据 环形缓冲区是一个先进先出的循环缓冲区 xff0c 可以向通信程序提供对缓冲区的互斥访
  • 力扣295. 数据流的中位数

    中位数是有序列表中间的数 如果列表长度是偶数 xff0c 中位数则是中间两个数的平均值 例如 xff0c 2 3 4 的中位数是 3 2 3 的中位数是 2 43 3 2 61 2 5 设计一个支持以下两种操作的数据结构 xff1a voi
  • virt-manager cannot open display问题

    1 首先查看本机sshd是否开启X11转发 grep X11Forwarding etc ssh sshd config X11Forwarding yes X11Forwarding no 2 检查xorg x11是否安装 rpm qa
  • 2023RSAC创新沙盒大赛十强公布,软件供应链与开源软件安全再成焦点

    近日 xff0c 2023RSAC大会公布了第18届RSAC创新沙盒竞赛的决赛 十强企业 软件安全企业Endor Labs成功入围 xff0c 软件供应链安全和开源安全问题再次成为国际焦点 Endor Labs提供了一个可依赖的生命周期管理
  • 如何找到现有研发体系的「内耗问题」?| 谈效风生

    第3期 xff1a 如何找到现有研发体系的 内耗问题 xff1f 在上一期 谈到提升效能 xff0c 我们应该如何下手 xff1f 我们聊到开始做研发效能的四个要点 xff1a 评估现有流程 引入自动化工具 建立度量指标 持续改进 本期就围
  • 「自动化」聊起来简单,做起来难 | 谈效风生

    第4期 xff1a 自动化 聊起来简单 xff0c 做起来难 在上一期 如何找到现有研发体系的 内耗问题 中 xff0c 我们聊了评估现有研发体系 xff0c 正确的找到 体系内耗问题 xff0c 是改变研发体系的第一步 本期我们继续聊下一
  • GitChat·前端 | 从软件工程角度看大前端技术栈

    GitChat 作者 xff1a 韩亦乐 前言 我们都知道 xff0c 大学几乎是没有 Web 前端课的 以我所在的大学为例 xff0c 唯一引导我们了解 JavaScript 的也只是 人机界面 和 Web应用开发 选修课 再者 xff0
  • 当我说要做大数据工程师时他们都笑我,直到三个月后……

    作者 xff1a Fickr孫啟誠 原文 xff1a 三个月大数据研发学习计划实战解析 关注微信公众号 xff1a GitChat 技术杂谈 一本正经的讲技术 不要错过文末彩蛋 申明 xff1a 本文旨在为普通程序员 xff08 Java程
  • 带你从零开始,快速学会 Matlab GUI

    本文来自作者 木木小迷哥 在 GitChat 上分享 Matlab GUI 零基础学员快速入门 xff0c 阅读原文 查看交流实录 文末高能 编辑 洛肯 Matlab广泛地应用于数学分析 计算 自动控制 系统仿真 数字信号处理 图像处理 数
  • 修改订单金额!?0.01 元购买 iPhoneX?| Web谈逻辑漏洞

    本文来自作者 肖志华 在 GitChat 上分享 Web 安全恩仇录 xff1a 再谈逻辑漏洞 xff0c 阅读原文 查看交流实录 文末高能 编辑 哈比 Web 漏洞里有 SQL 注入 XSS 等漏洞 xff0c 但是逻辑漏洞等问题也是一个
  • zabbix 5.4 配置Email报警媒介

    我们使用zabbix主要的目标就是实现运维的自动化 xff0c 当被监控的系统出现问题时zabbix能够自动的提示我们 xff0c 要实现这个功能就必需设置报警媒介 本文带领大家配置一个Email报警媒介 我们使用zabbix主要的目标就是
  • 如何开发一款游戏:游戏开发流程及所需工具

    本文来自作者 goto先生 在 GitChat 上分享 如何开发一款游戏 xff1a 游戏开发流程及所需工具 编辑 哈比 游戏作为娱乐生活的一个方面 xff0c 参与其中的人越来越多 xff0c 而大部分参与其中的人都是以玩家的身份 他们热
  • 如何用 Python 做自动化测试

    本文来自作者 Vant 在 GitChat 上分享 如何用 Python 做自动化测试 编辑 哈比 一 Selenium 环境部署 1 window 环境部署 1 1 当前环境 Win10 64 位系统 xff1b Python3 6 2
  • 我真的要做一辈子的程序员吗?

    本文来自作者 王鹏 在 GitChat 上分享 程序员跳槽时 xff0c 如何正确做好职业规划 xff1f 阅读原文 查看交流实录 编辑 贝吉塔 经常听一些同学说 xff1a 不知道下一份工作该去哪类公司做些什么 xff0c 我的职场人际一
  • 20万到100万年薪的算法工程师有什么区别?

    公元七世纪 xff0c 在车迟国国家气象局组织的一次求雨活动中 xff0c 虎力 鹿力 羊力三位大仙成功地祈下甘霖 xff0c 救黎民于水火中 老国王虽然不明就里 xff0c 却从此尊他们为国师 xff0c 奉道教为圭臬 本世纪 xff0c