• 两年美团算法大佬的个人总结与学*建议


    640?wx_fmt=jpeg

    来源 | 小小挖掘机

    作者 | 石晓文

    01


    2017.08.14,结束了两周的等待,如愿以偿开始了自己的美团实*生活,本来抱着三五个月走人,争取下一份实*的心态,没想到一直到转为暑期实*生、到通过留用面试、再到年后继续实*,直到今天,我已经在美团度过了615个日夜。这里的人,这里的事,一切都十分美好。


    写本文的目的,是想通过自身的实*经历,来总结下一名算法工程师所需要具备的基本的能力,当然,这仅仅是从我本人经历出发,如果你已经对这个岗位有了深刻的认识,那么你可以点击退出;如果你仍然处于迷茫阶段,那么我希望本文能够对你起到一定的帮助。


    从我在美团这两年的实*中的所做所见,作为一名应届算法工程师,我认为应该具备下面的几种能力,当然,这种能力针对那些偏业务的算法工程师,而非纯研究型的。


    1、算法的基本认识


    一名算法工程师,最基本的算法能力还是必须具备的。不过,随着深度学*的发展,传统的方法如 SVM 等算法在实际应用中已经很少使用,至少这两年间我是没有用过的,模型一般使用的是 Xgboost 和 LightGBM 作为 Base,随后使用深度学*方法或者强化学*方法进行提升。当然,推荐领域的 LR 和 FM 等方法仍然有所使用。所以,树模型是一定要牢固掌握的,然后针对你不同的求职方向,学*一些相关的深度学*模型,以及深度学*模型中一些小 trick,如 dropout、正则、Batch-Norm 等。关于数学,个人感觉深度学*的发展已经开始弱化对于数学的要求,不过基本的梯度下降、反向传播、树模型的推导、LR 的推导、FM 的推导等,还是必须要掌握的。


    2、过硬的代码能力


    一名算法工程师,Python 无疑是最适合我们的语言,但是是不是只有 Python 就足够了呢?当然不是,算法工程师,包含算法和工程两个方面。Python 可以帮我们实现算法,还需要学*一门语言帮助我们的算法能够应用到线上。在美团,我们使用的是 Java 语言,作为一名实*生,我还没有机会接触到能够上线的代码,不过在未来,一定是需要负责线上代码的,所以 Java 语言也是需要熟练掌握的。


    需要提醒大家的是,尽管你可能觉得一些数据结构的知识,对于一名算法工程师来说仅仅是用来应付面试,在实际工作中并不重要,这么想,其实是大错特错了。我们很可能在不经意间,就会需要用到数据结构的知识,比如这两年我用到最多的就是 Trie 树。掌握好数据结构,无论是对面试还是将来的工作,都是十分重要的。


    3、数据处理和分析能力


    一名偏业务的算法工程师,数据处理和分析的能力是必备的。首先,一般我们都会为自己设定一个业务目标,比如整体的转化率,那么我们通常会将此分为各个阶段,并观察每个阶段的情况。比如分析外卖的整体转化率,可以划分为曝光、用户进入商家页、用户进入提交订单页,到最后完成支付等几个阶段分别观察效果,一旦哪个环节出现问题,我们可以快速定位解决。其次,数据和特征决定了机器学*的上限,而模型和算法只是逼*这个上限而已。在使用机器学*或者深度学*模型时,我们必须从大数据中提取我们的训练数据,计算相应的特征,并分析特征与我们的目标之间可能存在的关系。


    在刚去美团的两个月,基本没有接触到模型相关的东西,主要负责的是建立一整套产品的数据指标框架,比如漏斗模型、留存率等等。尽管在当时觉得很枯燥,但是现在想想对自己的提升还是十分重要的。


    说了这么多,数据敏感度是可以通过与数据打交道不断培养的,但是基本的工具我们可以提前掌握。在美团,我使用最多的是 spark sql 和 hive,这大概会占据我 70% 的时间。关于 hive,掌握一些常用的函数的使用方法,如concat_ws,row_number,case..when,if,get_json_object等等。


    对于 spark sql,掌握其运行的基本原理,以及一些常见问题的处理方法。首先,学会如何处理数据倾斜,有时候因为一个数据倾斜问题,一整天都浪费在调试一个 spark 代码中了,其次,学*如何尽量减少 spark 任务的空间占用,同时加速 spark 任务运行速度,spark 作业在线上调用时,会占用公共资源,你的任务占用的资源越多,别人占用的资源就越少,同时,如果你的任务运行的快,也可以给别人的任务更多的空间。

    spark 可以通过很多语言来实现,不过我建议还是学*一下 scala 吧,毕竟可以和 Java 无缝衔接。除了 spark 和 hive,掌握一定的 excel 知识也是必要的。


    4、模型的积累和迁移能力


    在工作中,模型的积累同样是必要的,现在模型五花八门,如Transformer、Bert、DIEN 等都是这几年才提出的新模型,对这些模型,我们需要不断跟进积累。同时,光了解这些模型怎么做的还不行,关键是了解这些模型为什么要这么做。但是,光积累这些模型是不够的,还需要与自己的业务相结合,针对一个业务问题,如果你能快速想到一个可行的解决方案,那么说明你的积累还算凑合,如果你无法想到一个合适的模型,那说明你还差得很远。同时,对于你新学*的模型,学会反思能不能将其部分的思想应用于你的业务问题,并对现有的模型进行改进。


    好了,说了这么多,我们怎么能从繁忙的工作生活中,了解到最新的论文信息呢?对于我个人来说,主要有以下几个渠道吧:PaperWeekly 公众号 ,原创号主从个人看来,许多热门公众号的内容大同小异、送书、送资料、互推这种活动,使得公众号商业化了,这些公众号尽管关注人多,但我并不认为它能带来更多的价值。仅个人观点,也许是我看的少,嘻嘻。


    学*交流群名词积累


    在我自己的学*交流群,大家在交流的时候会说出一些自己不懂得模型,比如前几天的深度树匹配模型,如果你不懂,把它记下来,回头再详细理解。


    分享交流会


    在美团,一些交流会是十分有价值的,比如张俊林老师的推荐系统分享、王仲远师兄的知识图谱分享等。如果你没有机会参与这些公司内部的交流活动,那么如DataFun社区提供的免费讲座,可以多报名参加。



    5、产品能力


    好吧,人人都是产品经理,我们 RD 有时候也是可以翻身做主人的,不一定在任何情况下都听产品经理的需求,我们需要对这些产品需求有自身的一个认识。不得不说,我在这方面还是有所欠缺的。并不是每个人都具备天生的产品思维,但只要你多看,多想,多问,相信你的产品能力一定可以有所提升,重在积累。


    6、软实力


    软实力包括思维能力、沟通能力、表达能力、文化修养、学*能力、团队协作能力等等,上面这些是在工作中大家需要注重培养的。


    02


    好了,以上是我在美团实**两年来对于算法工程师这一职位的一点基本的认识。接下来,如果你已经取得了比较好的 offer,那么到此你可以退出了,但是如果你还在准备今年或者明年的校招面试,我希望你可以继续看下去,我会和你分享一下去年校招过程中自己的一些经验:


    1、笔试


    提前批的公司有的是免笔试,而有的是免简历筛选,笔试题型主要有几种:


    1 选择题


    选择题涵盖的内容还是很多的,基础编程知识如 C++ 和 Java、概率论、机器学*基础、深度学*基础、数据结构等等。


    2 编程题


    一般是 leetcode 中等难度 


    3 简答题


    简答题主要是手推公式和业务理解。


    2 面试


    我在去年校招参加了十几家公司的面试,收获了 10 个左右的offer,总体感觉是:公司对于算法工程师的要求越来越高。面试主要考察的点有以下几个方面:

    1 实*、论文、比赛


    面试官一般会让你先进行自我介绍,然后会根据你简历上写的实*经历、论文、比赛经历进行展开。所以简历上的东西一定要是你亲身经历过的,可以按照STAR法则进行讲解。在这过程中,面试官会从算法理解、业务理解等多个方面考察你。

    2 深度学*/机器学*基础


    在聊完简历项目之后,往往会考察一些算法的基础。常考的是过拟合的解决、正则项、boosting 模型等等,这一块需要你对深度学*/机器学*基础有所了解,同时对常见的模型有深入的认识和理解。对于简单的公式也需要理解和掌握推导(LR、普通神经网络反向传播、RNN 和 LSTM 的前向传播、SVM、XGBoost等等)。

    3 手撕代码


    手撕代码题各公司的难度不一样,不过一般 leetcode 的中等难度的题就可以。石晓文建议,大家一定要把数组、链表、二叉树和动态规划的题目掌握好。

    4、智力题


    常考的就是概率计算问题。

    5 业务理解


    这一块小编觉得是非常难的,一般会给你一个场景,让你设计一套算法流程,或者问你对于当前你的项目,后续的工作方向等等。

    6 其他


    其他的面试官可能会考察一些工程上的问题如多进程、多线程等、spark/hive等等。

    3、面经分享


    阿里(四面未通过)


    https://www.jianshu.com/p/304e1023c4cb


    百度核心搜索部(三面未通过)


    https://www.jianshu.com/p/02d931d5c1c8


    知乎(三面未通过)


    https://www.jianshu.com/p/40259bb05357


    ThoughtWorks(初试+sp加试 通过)


    https://www.jianshu.com/p/0b5514908683


    美团留用面试(共一面,通过)


    https://www.jianshu.com/p/bbe21ff40724


    便利蜂(共三面,通过)


    https://www.jianshu.com/p/51e2d16f16a5


    贝壳(三面+sp假面,通过)


    https://www.jianshu.com/p/cd0a809cf198


    一点资讯(共三面,通过)


    https://www.jianshu.com/p/fffc15c9d31d


    百度Feed(二面未通过)


    https://www.jianshu.com/p/65032f77f903


    猫眼(三面未通过)


    https://www.jianshu.com/p/c32787be3dc8


    搜狗(共三面,通过)


    https://www.jianshu.com/p/8a116eb7fd32


    小米(共两面,通过)


    https://www.jianshu.com/p/e34ebebae15f


    滴滴(共三面,通过)


    https://www.jianshu.com/p/bc9d5f8206a0


    拼多多(共两面,通过)


    https://www.jianshu.com/p/a15bc7d0686a


    爱奇艺(共三面,通过)


    https://www.jianshu.com/p/4ceb5de29c76


    头条(共三面,通过)


    https://www.jianshu.com/p/5bc533d1bf62


    可以看到,个人感觉自身还是有很多不足之处的,总结几次面试失败的原因,主要有两点,首先在于数据机构题掌握的不佳,没有学会举一反三,比如百度的面试、知乎的面试;其次在于对于业务的理解不够深入,还停留在领导派活,埋头苦干的地步,自己对于业务的思考不足导致面试失败的,比如阿里和猫眼的面试。


    4、资料推荐


    下面推荐一些资料帮你更好的进行复*吧:


    1《统计学*方法》


    经典中的经典,建议至少读两遍!


    2《百面机器学*》


    对一些面试常见问题进行了总结和梳理


    3 深度学*500问


    https://github.com/scutan90/DeepLearning-500-questions/


    4 SVM


    http://blog.pluskid.org/?page_id=683


    5 李宏毅深度学*课

    https://www.bilibili.com/video/av9770302?from=search&seid=9066694202064136038


    6 李宏毅强化学*课

    https://www.bilibili.com/video/av24724071?from=search&seid=11841282802558935758


    7 李宏毅机器学*课


    https://www.bilibili.com/video/av35932863?from=search&seid=7464664329294734466


    8 线性代数的本质

    https://www.bilibili.com/video/av44855426?from=search&seid=15873340646320697328


    写在最后


    640?wx_fmt=jpeg


    说了这么多,最后希望你在今年的秋天或者未来的某个秋天,能够顺利拿到自己心仪的 offer,同时希望你能够不忘初心,砥砺前行!加油!



    推荐阅读

    拜托,面试官别问我「布隆」了

    数据结构与算法:三十张图弄懂「图的两种遍历方式」

    昨天,终于拿到了腾讯 offer

    几道和「二叉树」有关的算法面试题

    几道和散列(哈希)表有关的面试题

    一道看完答案你会觉得很沙雕的「动态规划算法题」

    几道和「堆栈、队列」有关的面试算法题

    链表算法面试问题?看我就够了!


    640?wx_fmt=jpeg

    欢迎关注640?wx_fmt=png

  • 相关阅读:
    Windows下编译TensorFlow1.3 C++ library及创建一个简单的TensorFlow C++程序
    flask自动重启与配置文件导入,路由重定向(8)
    go(4)字符串的应用
    go(3)变量的应用与数据类型
    go(2)输出,转义,字符接收
    go(1)
    tornado集成wtforms
    HTML5笔记007
    HTML5笔记006
    HTML5笔记005
  • 原文地址:https://www.cnblogs.com/csnd/p/16675420.html
Copyright © 2020-2023  润新知