本文经原作者授权整理发布

算法工程师到底有什么特别之处?这个岗位真的比普通工程师高一等吗?同为工程师,算法工程师为啥工资高几倍?从普通工程师转为算法工程师,会有多困难?算法真的那么难搞吗?

不知道各位程序员朋友平时有没有想过这些问题,不知道各位是怎么看待这些问题的,如果你心里对算法工程师也有着各种疑惑,你一定不能错过今天的文章,本文的作者从两个角度来解答了这些疑问。

在他看来:算法工程师首先要是个工程师,但是,算法工程师又不只是工程师。

是不是听上去有些绕,但是又仿佛很有道理?先别忙着下结论,看完内容再评论。

上篇:论算法工程师首先是个工程师

引子

最近校招面试到吐,算法岗位有点太热了,简直心力憔悴。我们的面试分两个部分,先是做一两道编码题,然后才是考察机器学习的知识。很多同学不理解,在网上 diss 我们,说什么机器学习基本没有问。这种情况,一般是代码做的太烂了,面试官都没有兴趣去了解机器学习部分。

机器学习算法岗位,很容易让大家有个误解,认为平时工作就是推推公式,调调参数。鉴于此,本文借用下我们团队最近的一个重要项目:深度学习在搜索、推荐中的应用,来描述下平时我们是怎么干活的,看完之后,大家应该很容易理解为何我们要求有编码能力。

其实,我们的编码题真的很简单,不用刷题也能做出来,看看其他公司出的题,已经有点类似面试造原子弹,进来卖茶叶蛋的蜜汁感觉。当然,他们有资本,可以通过这种方式选到很聪明的候选人。

回到正题,我们从去年年底开始探索深度学习在搜索、推荐中的应用,包括排序和召回。以前我们常常用和工程同学合作,对系统的理解,比如推荐引擎、搜索引擎来表达编码能力的重要性,可能对于应届生来讲,有点模糊。这次的项目经历可能更好一些。

先总结下指导思想

这大半年,我们踩了很多坑,特别是痴迷论文中的各种 fancy 结构,寄希望于换换模型拿到收益。最终都纷纷被打脸,反而是回归到开始,从使用更多的样本数据,改善样本清洗、构造的逻辑,谨慎选择经典的模型结构,对优化算法保持敬畏等等,拿到了不错的收益。先来几点务虚的鸡汤,大概有以下几点:

对比传统模型,深度学习更需要大量的数据去学习,样本数据的增加能明显的改善模型的结果。

在初期,请忘记 paper 里面各式各样的奇技淫巧。

一套有效的方案,其效果是多和少的问题,不是有和无的问题。

好好调参,比乱试各种论文 idea 有效。

深度学习真的可以自称调参炼丹师,所以比别人试的更快,是炼丹师的核心竞争力。

Embedding 太神奇,请把主要精力花在这里,深度模型对 id 的理解可以震惊到你。

关心你的模型的计算效率,最终还是要上线的,绕不过去的性能问题。

训练中的工程能力篇,就是各种踩坑各种填坑

样本规模的问题

一开始,我们把现有基线的特征数据喂到了深度模型中,试过 dnn、dfm、lstm 等等,发现效果比 lr 还差。当时为了快速尝试,将所有的数据 load 到了内存,限制了数据规模,而且有部分数据预处理的工作也是在 python 中处理,导致计算在 cpu 和 gpu 之间频繁切换,gpu 利用率抖动很厉害。基于 tf 提供的性能工具,做了点分析后,判断是特征预处理这部分移太耗时了。另外,模型的参数很大,但是样本数不够,急需增加样本量。我们用 spark 将样本数据构造成 tfrecord 的格式,整个构建过程对比原来基于 hive sql,再从 hdfs 拉到本地,快了近 10 倍,而且能用的样本数据量大了很多,发现模型效果好了很多。

embedding id 量级过大的问题

深度学习是在图像、语音等场景起家,经常在 nlp 的论文中,将几十万的 word 做 embedding 称为大规模。工业界做 user 和 item embedding 的同学应该笑了。userid 和 itemid 非常容易过百万、千万的量级,导致生成 embedding lookup oom。可以参考我上篇文章:https://zhuanlan.zhihu.com/p/39774203。

Wide 模型带来的稀疏模型训练问题

大部分的 wide & deep 代码实现,其实用的 tensor 都是 dense 的。tf 基于 PS 做的模型训练,当你的特征规模在亿级别时,网络通信是个灾难,加上 grpc 的垃圾性能,网卡利用率上不去,训练的时间大部分都耗在通信上了。

但如果花点心思看看 tf 的源码,解决方法其实很简单,采用一些 sparse 的 op 就行。比如用 sparse_gather,就能解决网络传输的问题。但这个不是彻底的解决方案,tf 在计算的时候又会把 sparse 的 tensor 转成 dense 做。继续看看源码,会发现 tf 自身实现的 embedding_lookup_sparse。换个角度来理解,天然就能支持 sparse 的 wide 模型训练。把 sparse 的 wide 模型理解成 embedding size 为 1 的情况,上层接个 pooling 做 sum,就是我们要的 wide 的 output 结果,方案很优雅。

分布式下训练速度不能随着 batch size 增加变快

这个问题,单纯看性能分析还不好发现。还是去看下 TF 的代码实现,其实是 TF 默认有个 dimension 压缩的优化带来的。TF 为了节省存储,会对一个 batch 内的相同的 feature 做 hash 压缩,这里会有个 distinct 的操作,在 batch size 大的时候,性能损耗很明显。改下参数,就可以取消该操作,不好的地方是浪费点内存。

还有两个核心问题:TF 不支持 sparse 模型和分布式下 work 的 checkpoint 问题,这里不展开了。

线上性能篇

真实线上场景与 batch size 的训练的差异

真实排序的时候,一个用户过来,需要精排的候选集可能有几千。而我们在训练的时候,基于 batchsize 方式组织的 predict 代码。会将用户侧的 feature 复制几千次,变成一个矩阵输入到模型中。如果给 tf 自己做,这里就会有几千次的 embedding lookup,非常的耗时。如果我们选择在请求的一开始,就把用户侧的 lookup 做掉,然后去做点内存复制,就能大大减少 rt。

另外一个耗时大头是 attention,这个解决方案也很多,比如用查表近似就可以。

还有一些是模型实现的细节不好导致性能很差,比如 DCN 的 cross 实现,一个简单的交换律能带来巨大的性能提升,参考:https://zhuanlan.zhihu.com/p/43364598

扯淡开始

上面很多工作,都是算法工程师和工程同学一起深入到代码细节中去扣出来的,特别是算法工程师要给出可能的问题点。做性能 profile,工程的同学比我们在行,但是模型中可能的性能问题,我们比他们了解的多。当然也有很多同学 diss,上面这些都是工程没有做好啊,工程好了不需要关心。但是,真正的突破必然是打破现有的体系,需要你冲锋陷阵的时候自己不能上,别人凭什么听你的,跟你干。大概率就是在后面维护点边缘业务了。

难道机器学习理论不重要吗

当然不是,这篇已经写得太长了,只讲两个点。

python算法工程师需要会写什么_算法工程师到底在干嘛相关推荐

  1. Python徒手实现识别手写数字—图像识别算法(K最近邻)

    Python徒手实现识别手写数字-图像识别算法(K最近邻) 写在前面 这一段的内容可以说是最难的一部分之一了,因为是识别图像,所以涉及到的算法会相比之前的来说比较困难,所以我尽量会讲得清楚一点. 而且 ...

  2. sq工程师是做什么的_算法工程师为什么成天做数据,都做哪些数据?

    大家好,前几天群里有小伙伴说希望看到更多的算法工程师的日常.其实对于算法工程师而言,最大的日常就是做数据了,所以给大家分享一下做数据的那些事. 为什么很少做模型 在大家想象当中,可能算法工程师做的事情 ...

  3. python软件开发工程师的职位薪点_软件工程师各职位任职资格

    软件工程师各职位任职资格 目 录 公司一: .............................................................................. ...

  4. python算法详解张玲玲电子版_算法之路该如何学习?

    安利一本算法书~ 一位从1998年就开始讲课的老教授Jeff Erickson,把他20年来在UIUC讲课的内容整理成了一本算法书,名字简单粗暴,就叫<算法>(Algorithms). 这 ...

  5. python手写板,机器语言之手写识别_源码时代Python公开课|Python培训

    课程介绍 当我们在手写设备(例如我们输入法中的手写模式),使用手写的文字,我们计算机是如何快速准确的识别出来的?每个人,甚至是同一个人,每次手写的字都不是完全一样,计算机不是人,它是怎么做到的呢?难道 ...

  6. python爬虫工程师面试自我介绍范文_计算机工程师面试自我介绍范文五篇

    自我介绍在面试中是必然要过的一关,自我介绍得好不好也直接影响到面试的效果,那么该如何做到与众不同又精彩呢?下面是小编给大家搜集的范文五篇,希望有帮助到大家. 计算机工程师面试自我介绍(一) 面试官您好 ...

  7. python跟易语言那个写辅助_易语言写练练看辅助

    .版本 2 .支持库 BmpOperate .支持库 shellEx .支持库 dp1 .程序集 窗口程序集1 .程序集变量 方块数据, 方块数据, , "19,11" .程序集变 ...

  8. python如何求列表中的众数_算法(LeetCode)六种方法求数组中的绝对众数

    原题来自:LEETCODE. 感谢:http://t.cn/R61A67j 定义:绝对众数就是一个数在一组数中个数超过1/2的数. 比如给你一个长度为N的整形数组: [13,12,53,12,23,3 ...

  9. python 向已有excel写数据_将数据写入已有的excel文件并制作汇总页签

    我必须将一些数据写入现有的xls文件中.(我应该说,我在unix上工作,不能使用windows) 我更喜欢使用python,并尝试过xlwt.openpyxl.xlutils等库.在 它不工作,因为在 ...

最新文章

  1. PostgreSQL中的大容量空间探索时间序列数据存储
  2. C++实现学生成绩管理系统
  3. 机器学习之用Python从零实现贝叶斯分类器
  4. 边开飞机边换引擎?我们造了个新功能保障业务流量无损迁移
  5. vivado环境下用Verilog语言实现编码器
  6. 网络共享服务Samba和NFS配置
  7. 一步步学习SPD2010--词汇表
  8. GoogLeNet结构
  9. python numpy安装windows_windows 下python+numpy安装实用教程
  10. realme真我GT大师版来了:继续由深泽直人操刀
  11. Visual Studio 2019 16.6 Preview 2 发布
  12. 从事三年java开发后, 我打算转人工智能
  13. 安卓开发之ListView优化方案
  14. 惠普台式计算机怎么拆外壳,hp台式电脑cpu风扇怎么拆图解
  15. 怎么恢复电脑的无线网服务器,电脑搜不到无线网络怎么恢复|电脑搜不到无线网络的恢复方法...
  16. 【UE5】使用快捷键切换编辑器中英文设置
  17. 随手笔记--为对象增加新的属性,拼接多个对象
  18. Pikachu靶场全关详细教学(一)
  19. Cobalt Strike 插件CrossC2(小白教程)
  20. 什么是函数指针?(理解及使用)

热门文章

  1. OpenGL入门北斗星点绘制
  2. 开发新设备设计时使用低温探针台的 8425 型直流霍尔系统
  3. Python之心算练习程序
  4. 畅聊微信支付遇到的坑
  5. 老司机 iOS 周报 #65 | 2019-04-29
  6. 疫情下的企业应对之道:企业如何降本提质增效
  7. oracle常用笔记(二)
  8. Android实例开发中登录注册界面的框架实现(android studio)
  9. epub书籍中关于.ncx的解析
  10. VS2008与Office2007冲突解决办法