从菜鸟到老鸟!学习算法的三个阶段
点击上方蓝字,关注并星标,和我一起学技术。
大家好,最近在知乎里看到了一个很不错的问题,叫做你的编程能力从什么时候开始突飞猛进的?正好最近很多同学咨询我关于算法方向的成长以及突破的问题,今天就和大家聊聊这个话题。
熟悉我的朋友们都知道,我没有读研,也没有相关的工作经验,算是半路出家转行从业。既然是转行从业,那么自然而然也有一个从零开始的过程。相比于很多科班出身(硕士)的从业者而言,由于没有人引领,几乎所有的成长和进步都是源于自己的思考。从业好几年,不敢说有多么厉害,但对于新手入门进阶突破的确有一些心得。盘算起来也算是迈过了几道关卡,容我来一一盘点盘点。
知其然
首先是知其然,也就是知道怎么做,准确地说是知道模型究竟在系统当中扮演一个怎样的角色,它又是如何与其他系统交互的。
这说的其实是理论和实践的巨大gap,举个最简单的例子,比如说我们在学习算法的时候,无论是选择kaggle还是天池或者是腾讯算法比赛来实践,它的数据都是现成的已经处理好的,我们直接拿过来用。并且我们用的过程当中也没有任何的限制,不需要考虑消耗的资源,也不需要考虑数据获取的方式,因为数据量不会很大,完全可以存在内存里,用pandas等工具库想怎么玩就怎么玩。正统出身的研究生在实验室里其实也差不太多,可能有些研究需要自己搜集数据、清理数据,但本质上还是只围绕着模型来玩。
但是在公司当中完全不是这样的,就拿数据来说好了,数据并不是你想要就可以有的。比如说你要搜集用户登录APP的信息,你需要前端、后端一系列团队给你配合,这些数据也不是放在一个文件里给你用的。必然要用到数仓,比如hadoop,既然用到了数仓,那么你就不能简单的用一个Python来读取或者是做处理,你显然需要使用数仓支持的工具,比如MapReduce、Hive、Spark等等。
另外公司里做模型不是为了拿个效果就结束了,还需要上线应用。这一上线又带来了许多问题,线上的服务怎么拿到这些特征呢?是全部存起来现用现查呢,还是临时生成?如果是临时运算,后端的服务往往都是Java等后端语言写的,无论是考虑语言本身的特性还是考虑性能,往往都不能用Python的库来直接处理,这个时候怎么办?
我们仔细往下挖还能挖出一大堆的问题,为什么说工业界和学术界脱节呢,原因就在这。工业应用有一系列的限制,非常的麻烦。如果以为只是理解了模型的原理,能够读懂论文、复现几个模型就可以做好算法,这无异于纸上谈兵。
但问题是现在大公司里分工非常细,很多算法工程师的日常工作可能就是做数据,训练模型,然后点一下发布。这背后有哪些机制,每一个步骤究竟是什么作用,线上线下这一系列背后的系统结构很多人是没有想过的。就盯着眼前的一亩三分地,盯着眼前的特征、数据、模型,看不到背后更深层次的系统。
所以这一层次的突破主要还是在于意识,不要满足于当前的日常工作,往更深处思考。
稳住心态、深挖细节
一般来说,只要有意识,突破第一个层次其实很快,体现在从小白变成了资深,对于系统的方方面面都有所了解,能够独当一面把老板安排的事情做好做出色。
但很多人会在这个时候陷入瓶颈,当下的工作已经可以很好胜任了,也有了一定的积累,但是更高层次的挑战还没有来。之后的路有一点不知道往哪里走了,很多人到这时候就想着要么慢慢熬着谋求晋升,要么跳槽获取更好的待遇了。这个阶段最大的问题就是心态膨胀、根基不稳,实力配不上野心。看似懂得很多,但是都只有一层皮毛,往下一问一知半解。
比如有些人在后端里写过一些功能插件就觉得自己懂系统了,算法、开发双修,但一问分布式、系统设计一窍不通。有些人用过一些前沿的模型,看过两篇论文就觉得自己站在行业尖端了,但是一问完全没有自己的思考,全是照搬来的。还有些人在大公司呆过两年,就以为自己可以指点江山了,但一问细节,全是糊涂账……
把工作当中手上的事情吃透,眼前的这个山头占领下来之后,不要膨胀,这只是刚刚开始。这个时候应该稳住心态,好好盘点一下自己会的东西,看看哪些是实心的,哪些是空中楼阁。空中楼阁不要紧,踏踏实实好好钻研,一点一点啃明白,其实也并不是一件很难的事情。我个人的一个建议是可以从细节入手,千万不能浮躁,魔鬼都藏在细节里。
比如好好读一读你用过好几十次的模型的代码,看看里面的实现和你想的是不是一样。再比如好好想一想你做过的一些数据的逻辑,还能不能再优化优化。再比如团队里、公司的那些技术文档,也可以翻开来看一看。在这个阶段最重要的就是稳住心态,尽可能地找到方式来提升自己。
知其所以然
很多老算法经常会挂在嘴上的一句话就是理解业务、理解业务、还是TMD理解业务。我之前每次听到的时候都很奇怪,业务有什么好理解的,不就是推荐商品给用户么?
直到后来,经历了一些事情之后才恍然大悟,理解业务其实不只是单纯理解业务场景,更是琢磨模型在场景下起作用的原因。
我是做推荐的,所以拿推荐举个例子。我在之前关于推荐系统的文章当中也曾经提到过,推荐领域的模型从FM起有一个很大的趋势就是从传统意义上的机器学习模型往深度学习模型发展,而这个发展最重要的核心就是Embedding。深度学习模型当中Embedding应用得越来越多,各种各样的Embedding应用方式,可以获得不同的效果。
那为什么Embedding的效果就要比传统模型要好呢?因为它可以用高维的向量表示一个标量,可以传递出更复杂的信息。比如性别,不再是一个0和1的量,更能反应一定的人群偏好。比如女性往往喜欢美妆,男性往往喜欢体育、游戏。正是因为向量可以传递更多的更高维的信息,而深度学习模型可以学到这些信息,所以在推荐领域,深度学习模型效果好。
上面这两段话全是我个人的理解,我迄今没有在任何一篇paper当中看到。倒不是说大牛们都想不到这一层,而是他们想到了也未必会告诉你,往往需要你自己体悟。我是如何get到这些信息的呢?首先需要深度了解原理,知道每一个模型的原理,知道模型迭代的方向。其次结合业务场景,比如推荐用到的多是用户和商品的特征,比如对特征的分析,什么样的特征效果比较好,什么样的特征没什么卵用。最后这些理解和思考碰撞在一起,才有了更深层次的结论。
如果只是单纯的看论文,单纯的做特征,不去做更深入的思考,去挖掘更底层的原理,显然是不可能有这些洞见的。这一层的突破在于思考,思考原理,思考背后的机制、逻辑,思考行业发展的潜在规律。
尾声
其实不仅是算法,其他行业、方向也都类似,成长途中也都有一个看山是山,看山不是山,看山还是山的过程。入门之前觉得算法好高大上,好有科技感。入门之后觉得不过如此,算法太虚了,是人是鬼都能来一下。有了一定的成长之后,又回到了从前,再一次觉得道阻且长,我辈仍需努力。
好了,就说这么多吧,感谢阅读,喜欢的话不要忘了三连。