Author: haoransun
WeChat: SHR—97
知识点来源:B站
前言
很多刚入行或者还在读研的小伙伴的目标一直局限在算法上,总是觉得做出了一个机器学习模型是重中之重,觉得企业就应该等自己加入,然后提供一个巨牛逼的算法,把你的模型放进现有公司的系统当中,然后就能带领公司的业绩一路飞黄腾达,今儿呢给大家来一碗毒鸡汤。
对于一个刚入行的同学来说,跳出算法好好的当一个工程师比什么都重要。机器学习AI的落地过程中,有许多至关重要的工作都是在算法之外的。先是一个工程师,你才是一个算法工程师。我更倾向于目标是算法岗的同学们,把自己的成长目标换成是具备机器学习理论和工具使用经验的后端工程师。
机器学习的落地远远不止是一个fit,然后predict,然后就完了。从数据采集到最后的模型部署,有许多许多环节,甚至在一个完整的机器学习项目当中,离线训练甚至都不是最重要的,他对最后的产出影响也不是最大的。
假设你还没有毕业或没有参加过工作,我简单列举一下一个通用的机器学习落地项目当中会涉及到的几个重要的组成部分。咱们来一个一个来。
1. 业务数据采集
首先是业务数据的采集,那么数据一定是存放在不同的地方的,采集的来源也有可能是不同的。那我们最常见的搜索推荐这个业务来说,我们一定要捕捉到用户的反馈才行。
比如说我给用户推荐文章:用户有没有看?用户的浏览时长?用户有没有把这篇文章拖到底?用户有没有分享?有没有收藏??? 假如我现在给用户推荐音乐,那么这个用户有没有点击?有没有加红心?有没有单曲循环?有没有把这首歌加入自己的某一个收藏列表?有没有把这首歌分享给自己的某一个女同学?或者分享给某个女老师?最后采集的数据是不是正确,采集的是否全面?
比如说能不能采集到用户的手机或者浏览器的型号,我能不能采集到用户当前的网络环境,究竟是在用移动网络还是在用无线网络?从算法角度来说,我觉得它们都有可能成为推荐的影响因素。
比如说我现在需不需要因为网络环境的原因,给用户推荐一些更短的视频或者文章,比如说我们发现他当前处于一个移动网络,我会猜测他是不是在地铁上或者是正在等公交车。
2. 业务数据存储
如果是小公司,那么业务数据很有可能是直接放进结构化的数据库中,比如常见的MySQL或者是PostgreSQL这样的关系型数据库。这些数据逻辑比较简单,尤其是单机的情况,那么它对算法岗来说做实验是非常友好的,天然的就可以以表格的形式来进行存储和读取。但也正是因为它本身要求的强一致性,要求能随机访问,要求能够支持SQL语言,所以在大数据的场景下,问题会很多。
接下来有了非结构化数据,从早年的NFS、AFS,一直到后来被誉为Google三驾马车之一的GFS。MapReduce、GFS和BigTable(大表)。大表和MapReduce这两篇文章是发在OSDI上的,GFS是发在SOSP上的,这些都是System领域的顶级会议,GFS的开源实现大家都很熟悉,就是HDFS,也就是Hadoop用的文件系统,它里程碑式的作用就是支持了更强的容错和错误恢复,即fault tolerance和fault recovery,简单来说就是把你看过的爱情动作片的记录分别存放在不同的机器上,假如说一台机器的存储出现了问题,那我们可以很快就能恢复,毕竟你的数据丢了,我们就没有办法给你推荐你喜欢的电影了,虽然它不支持像结构化的数据,天然的随机访问,但它存了很多,能用成千上百台机器存储,非常适合存放海量的日志数据。
为了解决非结构化的数据已有的随机访问的问题,出现了一种半结构化的数据,举例来说就是常见的NoSQL,通常设计成KeyValue Store,在结构化数据有随机访问的性能和非结构化数据的可扩展性中间做了一个很好的权衡。前面提到的Google的BigTable以及Hadoop生态圈的HBase都是这类实现。
随后我们对存储的读取要求越来越高,速度↑,内存成本↓,如何榨干内存就是大家的目标,于是有了这种in-memory的存储,即通过内存来存储,比如这个memcached,Redis等等都属于这类实现。
这些都是属于存储方面,总之业务数据采集完之后,一定会涉及到数据存储,不同类型的数据一定会放到不同的地方,不同的地方自然就会带来不同的读取性能以及读取方式的变化。之后数据预处理的过程和方式自然也会有所不同,必然会对接下来的机器学习模型提出各种各样不同的要求。终于来到了机器学习这一块。
3. 机器学习
机器学习可以简单把它理解成一个黑盒,有数据输入之后,总之一定会有数据输出。那么到此为止事情是不是就完成了呢?很明显不是。demo级别的单进程推断问题非常大,绝大多数情况下是不能独立上线使用的。数据太大的时候,单机没有办法训练,那么该如何去考虑并行呢?是数据并行还是模型并行呢?那我们是使用这种参数服务器还是这种 ring all-reduce,如果是ring all-reduce,那么模型的参数假设比较大,机器之间如何去同步模型呢?有可能同步模型花的时间比一个batch 训练的时间还要久,该怎么办?
因为很明显,有的时候机器之间的网络带宽收到网卡的限制,再比如我们并行的时候能不能使用SIMD,SSE和AVX,你的服务器支持哪种指令集?除此之外,我们如何利用多核并行的优势,你是使用openmp还是自己造了一个什么轮子?如果并行度数够了,我们发现这个数据集还是太大,一次没有办法把它全部独进内存,(这个非常常见)那我们怎么用一点数据,再从磁盘读一点数据,这种实现磁盘的异步读取该怎么做呢? 假如上述问题都解决了,最后模型终于得到了输出,那么根据任务类型的不同,比如你是二分类问题给出来可能是0或者1,如果是回归问题,给出来的可能是一个具体的数字。如果是图像分割,给出来的可能是每一个物体具体的坐标。那么如何选择合适的评估标准,这里说的是评估标准,不是损失函数的loss,这两者之间可能会有一个非常大的gap,而且有的时候是不能完全对应的,比如说你的算法loss 非常低,但是数据评估一看用户留存下降,那么这类问题该如何解释呢?是否是算法的问题?如果不是,那是什么情况导致的呢?如说是,那么中间的gap该如何消除?
最要命的是,这个不同阶段的业务指标可能是不同的,比如说一个新产品上线,那么老板可能会更关心新用户的留存,注册量等等。如果是一个存量的产品,那么老板显然会更关心已有用户的付费意愿和付出的钱。显然对于一个算法来说,不同时期的loss(损失函数)是不变的,那么怎么想办法用不同的评估标准来试用这种不同时期的gap。
4. 尾声
到这儿,基本上一个相对完整的机器学习问题就落地了。整个过程没有提到任何关于算法的东西吧,没有提到贝叶斯估计,梯度下降,没有提到神经网络,深度学习,没有提到拟合,最优化;所有的都是一个机器学习应用落地项目中不可或缺的部分。他们都是会对整个项目的最终结果产生影响,很多时候他们会比算法的改动带来的影响更多更大,有的时候产生的影响甚至是非常致命的。如果你只关注算法,那么带来的优化显然是非常局部的,是很有局限性的。只有你关注整个系统带来的优化才可能是全局的。
有很多刚刚开始学习机器学习的朋友都会抱有research梦想,希望通过自己的天赋和勤奋,成为某个领域的专家,想做一些非常顶尖的研究,想更多的在理论上有所建树,在各种顶会上去发paper。有这种想法没什么错,本身也非常值得赞扬和福利。这些理想和愿望很多时候就是我们刚开始从事这个岗位的原始动力之一。这些研究领域金字塔顶端的人总是那么的引人注目,也让人崇拜。但是你要明白,这种研究领域的工作,其实在我们真正的AI落地项目当中只是其中的一环。就算在一家大公司当中,数据的采集、存储、计算框架这些部分虽然是有,但确实是由不同 的团队去完成的,但是希望你仍然要去了解他们是怎么做。因为从结果的角度来说,闷头改模型带来的收益可能甚至不如:多采集一个特征,或者多想想如何让模型更新迭代的更快(带来的收益更大),跳出自己的工作范围,从一个更高的角度去思考和看待问题,往往带来的收益会更高。就算是退一步来说,假如你是真正的需要去做研究的人,那么在现有的机器学习项目中去了解落地场景中的一些限制,也会对你的研究方向具备很强的指导意义。比如工业界现在缺的是什么,什么是一个非常棘手的问题,然后学术界去研究,这是一个顺理成章的事情。
做算法工程师,首先成为一名合格的工程师,掌握扎实的编程功底,写出过硬的代码,了解足够的后端基础知识,再想着如何去把机器学习、数学落地。不下水永远学不会游泳,不进厨房永远学不会做菜。不扎扎实实的写代码,造轮子,就学不会机器学习。
5. 谈天说地
幸运观众A: 说的很棒,哪怕是在国内top大厂里,很多业务做得很棒的BU,其实主管,组长,总监都只关心刷一些商业指标的事情,然后吃了业务红利上去了,其实很多基础的知识都没那么熟悉,内部管理混乱,文档缺失,各种东西口口相传。目前实习深有体会,很多人知识积累上参差不齐,再加上内部中台化,甚至模型部署这类都只用点点界面了,很多老员工有着不相匹配的工程能力。假如BU没有强行要求执行公司内部的规范,可以看见各种只会在入门学习人身上看到的很多项目管理措施,代码/表名命名规范。新人上手这些旧业务简直就是天坑里仰望星空。
幸运观众B: 大部分技术创新带来的效益远比不上业务创新…
幸运观众C: 不能局限于技术或者技术相关工作。要学商科,要知道经济原理、要学博弈论、要学战略规划、要学经融,死钻技术就是死路一条。读研、刚工作觉得难的技术,几年以后就会觉得很简单,什么大数据、运营、算法,内核其实是一致的,不要自以为是什么工程师,什么mapreduce就是技术细节,绝大多数人不应该专门学习!不要鄙视人文社科,不要鄙视管理岗,要眼界开阔!要跨学科!千万不要只把自己定位成纯粹的工具人!!!
幸运观众D: 一个刚入门深度学习的萌新在实习一个多月后真的非常能体会到题主讲的这些。刚入门的同学都会想着怎么样做一个特别nb的模型。但实际在公司不会让你去从头研究一个模型出来,大部分都是在开源的模型基础上fine-tune。最重要的还是落地能力,如何做并行,如何搭建服务都是非常重要的能力。在公司不能把模型应用到产品上那就跟没有一样。
幸运观众E: 现在想找个会搞采集的人都难,现在的人工智能算法架构搞多少年也是个人工智障,本身就有一个致命的缺陷。还是脚踏实地一点吧,说多少重造轮子浪费时间,看看这些所谓的轮子,开源的一堆残缺品,国内还用得真香,唉,这开源真是双刃剑,砍容易的东西是快了,砍难的东西更难。人的技术由于开源并不见提高多少,反倒把企业养成不肯搞科研和基建,也养了不少伸手党。现在有技术的大部分是75至85的这一批人,这批过后估计要凉凉了吧,没什么新人的能把技术接下去。
幸运观众F: 其实说白了就是对业务的理解能力和整个流程不同部门的工作交接啥的。公司里面科学家真的是少数,百分之九十的工程师和分析师都是在想办法让自己的模型合理、可解释、结果让客户或者上司满意——一个数据挖掘团队实习生的感悟
幸运观众G: 有个腾讯的师兄在当部门总监,说中国现在机器学习领域不缺顶尖算法研究员,也不缺项目代码熟练程序员,缺的是懂点机器学习算法又能写项目代码的工程实操者。
幸运观众H: 我觉得最大的问题并不是了解自己的工程能力,而是说现在太多的分享都是模型级别的,背后的落地以及各种trick 作者不会说!!!