在学校时,除了每天宅在实验室,其实周末的我是这样的!
但是毕业时,每天重复着读论文—>写论文—>改论文—>改论文—>改论文...(大概也就是"最终版.doc"慢慢变成“最终最终绝不修改版v99.doc”)而已,然后我就变成了这样!
从学校毕业之后,工作的日常节奏就变得紧凑了许多。先说下日常节奏吧,每天大概9点半到公司,到公司的第一件事情,就是查看一遍自己的线上作业是否正常,如果有作业挂掉、或者数据不正确的话,那...debug的一天开始了....运气好的重启一下,一上午就过去了....运气不好的话,一天就过去了...
ok,如果没有异常,那就查看一下邮件,接着写写今天的机会,有时也读读论文、开开早会。
中午午休的时候,我经常会找个安静的地方,发发呆...然后下午两点就开始一天的coding....
晚上的话,根据自己的工作排期进度,日常会在9点左右下班吧。最近看到了PDD姑娘的事情......让我开始了懂得了惜命....跑题了跑题了....
首先,个人习惯是做事情之前要理解自己在做一件什么事情,很多业务背景上的限制,会决定后续整个算法建模的方向或者优化方向,所以做好提前的沟通是必不可少的!
其次,整体思路和架构有了之后,数据上的麻烦事情就来了,和数据竞赛中的数据集不一样,生产环境的数据可谓是“脏乱差”,数据埋点的不规范、采集系统的bug、业务系统的问题、数据作业的延迟等等都会给训练样本的生产带来极大数据清洗难度。让我从一个淑女变得经常想说F开头的那个word....
最后,又回到了每天检查和监控稳定的轮回里....
SQL:离线数据、实时数据的提数工具,没这个基本什么都做不了...
Spark:一些离线数据的复杂逻辑处理,需要他来处理。
TensorFlow:不用介绍来吧,codeing的主要框架,当然还有Pytorch。
Docker:线上模型部署,模型服务的载体,dockerfile了解一下呀~
Pandas:接口和函数特别多,遇到问题百度一下,比自己重写好得多的~
....
工作后,变得和学生时代不同了,不会想着去逛街了!
周末的早上偶尔偷个懒,早上10点起床,然后开始了自己“深圳女孩”的一天!
在人工智能算法这个领域,技术迭代是非常快的,你在学校学到的,其实是学习的能力,而不是某行代码怎么写,所以不断的跟随前沿和掌握新的技术,是很重要的。不要老想着摸鱼,虽然摸鱼一时爽,一直摸鱼一直爽...我见过好多算法工程师的混子,他们的一天用两个字就可以概况了....
目前笔者已经在互联网行业从事机器学习方向三年有余,经常也被问到做机器学习算法工程师是一个什么样的体验,同时也常常在其他平台上看到其他人问类似的问题。于是提笔写下此文,供有志投身于这个行业的人参考。
读数学博士的时候,通常的日子是这样的:
在互联网公司做机器学习的时候,通常的日子是这样的:
根据行业的PPT或者业务中的某些痛点来提出技术方案->然后开始收集数据,不仅要问遍组内,还要去其他组收集各种各样的需求->根据之前的技术方案来进行数据的预处理->撰写特征工程->训练模型->调参->调参->重新收集数据->数据的预处理->收集更多数据->调参->调参->调参->…->放弃。。。。
就做机器学习的经验来看,通常来说在做业务之前,一定要清楚的弄明白项目的业务需求是什么,弄清楚这个问题是什么比一开始就写代码重要得多。意思就是在回答问题之前,一定要把问题的内容弄清楚。有的时候,虽然看上去是一个很大的需求,但是实际操作起来的时候使用一些简单的办法也能够达到项目指标。有的时候,虽然看上去很简单,但是实际操作起来并不是一件容易的事情。从之前做理论数学的经验来看,通常数学里面的一些问题是是非题,不能够添加条件的。在PDE等方程领域,定理的条件越多,表示定理越不值钱。不过在工作中,这些条条框框会相对减少很多,只要能够达成项目目标,无论是添加样本,添加特征,添加服务器数量其实都是可以的,并且要把机器学习模型和业务指标有机结合才能够达到最终的项目指标。
一般搞数学科研的时候都是单打独斗,通常来说都是自己干自己的事情,别人也没办法帮自己。但是在工作中是不一样的,工作中除了干好自己的事情之外,周边的很多资源其实是可以在一个合理的范围内去争取的。无论是人员的数量,还是人员的种类,只要最终能够达成项目目标即可。无论是算法人员,还是开发人员,产品经理,最终都是要为一个项目的结果负责的。之前听过一句经典的话“失败的项目里没有成功的个人”,因此,无论怎么做,最终都要保证项目尽量成功。
而在机器学习算法工程师的日常生活中,除了上面的小段子之外,其实最重要的是样本层和特征层的处理工作。在学术界,都是使用开源的数据,别人都已经完全标记好了,学术圈的人通常来说只需要在这些数据的基础上提出更好的模型,更创新的算法即可。但是在工业界就完全不一样了,不要说有人帮你标记数据了,有的时候连数据在哪里都不知道,数据的质量如何也不知道,因此更多的时候是进行数据的处理和清洗工作。之前做一个项目的时候,准确率和召回率始终上不去,但是等把样本里面的脏数据清理掉之后,模型的效果瞬间提升了一个档次。在脏数据面前,再好的模型都是没有用的,在训练模型之前,一定要先看一下数据层的问题。
除了数据的问题,通常来说在一些场景下,样本的数量并没有那么大,因此深度学习等方案不一定特别适合。在这种情况下,一般就会使用传统的机器学习方法,并且会使用一些基于业务的特征工程。这种时候就需要机器学习从业者对业务有一个精准的理解,只要业务理解得好,有的时候写一些简单的规则就可以解决问题。特征工程也是机器学习里面的一个重要问题。
如果是在工业界的话,编程能力是非常重要的。因为从事算法的人通常来说会有一些算法上的优化,工程上的改进,数据分析之类的工作。在这种情况下,首先需要有一定的业务直觉。而业务的经验积累需要通过各种各样的基础数据提取,在海量的数据分析工作中逐渐积累的。在这种情况下,提取数据的工具就是必须要掌握的,例如SQL等。其次,分析数据的工作也是必须要具备的,无论是使用SQL来进行分析,还是使用Python来做数据分析,都是自行编程解决的。再次,在从事机器学习方向的时候,不可避免的就会进行算法的效果对比。而在这种情况下,算法的效果对比是需要机器学习从业者通过写程序来实现的。最后,工业界的算法通常来说都强调上线,如果能够自行把离线,上线,效果验证,ABTest都做完,其实是最好的状况。在这种情况下,通常Python就不太够了,需要使用C++或者Java等其他编程语言。因此,熟练使用多种编程语言也是一个算法工程师的能力。
在互联网公司里面笔者用过的机器学习工具大概有这几个:
勇于接受新的挑战。公司里面除了已有的项目之外,通常来说都会开启各种各样的新项目,在这种情况下,如果有机会做新的项目,也就是别人没有做过的项目。这种机会已经要把握住,因为对于新人来说,能够接触全新的项目肯定是好过维护已有的项目的。但是几乎所有的人都是从维护旧的项目开始的,只有旧的项目做好了,才有机会拿到新的项目。
不要永远抱着已有的方向不放手。在公司里面,业务方向总会或多或少的发生变化,随着部门的调整,方向的变化,所做的内容总会发生一些变化。在工作的时候,最好不要抱着我就是来做这个方向的,除了这个方向之外其他的内容我一概不想做。因为当时的工作岗位未必能够提供你想做的方向,但是说不定能够提供其他的研究方向。有的时候,在公司里面,根据方向的变化来调整自己的工作内容也是一个必要的技能。而且,在公司的时候,一定要多做一些有挑战的项目,只有通过这些项目,才能够让自己的技术壁垒更加深厚。当然,在求职的时候,每个人都有着自己的想法和选择,所以,在求职的时候,是可以选择一个自己喜欢的方向来做的。
通常来说,在干了两三年算法工程师之后:(以下是从其他地方看到的小段子,出处忘记了~~~)
如果要具体统计每类工作的占比,大概这样划分:
文档占比15%。记录工作是一方面,有时要进行向上汇报,主要是写一些文档和PPT,是考验画图能力的时刻。进了大公司之后,尤其觉得自己的画图能力有所提升,尤其是模型图,要多fancy有多fancy,以至于每次自己看到都不由得发出赞美。