system design prep:
最开始刷了 grokking the system design interview, 面了一两轮后觉得这个教程真是扯淡, 花了一周时间看了 Design data intensive application, 非常有启发。在大佬指点下看了很多公司的blog和tech talk, e.g, datadog, uber, airbnb… 收获也很大
system design 里面也有很多经典问题, 比如 twitter time line, whatsapp, kv store. etc, 有很多教程上都写的比较完善了, 剩下的就是结合面经看 company specific system design,这些可以看相关公司的tech blog 或者 medium:
比如 Uber, Lyft 常见的
在这一轮,你80%会被问到设计一个推荐系统,剩下的20%如果你熟读ML课本不会有问题(如果你申的职位是research或者特别精专的Deep Learning岗另说), 推荐系统的雏形是Netflix Recommender System competition,
不了解的可以搜一下,基本这个问题可以抽象为你有很多user,很多item,一定的历史数据(user买item后的rating),现在你要决定推荐哪些新的东西给每个user
具体到你被问的问题,可能会有一定的变种,举几个例子
这里我希望可以factor out这些问题相同的因子,你会发现每道题除了微妙的不同以外,其它基本可以按照一个套路来
首先对design轮,本来问题就 supposed to be vague,你会发现很多东西没有定义,而面试官也会希望你来导向整个流程
所以切记一定要 be organized !!(划重点)
我们给面试官的印象不仅仅是technical competency,同样作为一个人,我们的思想是make sense的(划重点)。
这个面试,我的建议是,稳妥起见,从基础模型开始,解决问题优先(划重点),适度go deeper,如果不必要不要秀fancy模型
我一般是分成四个部分
如果你被问到的问题就是 现在给你一个spotify,请给我设计一个音乐推荐系统, period.
你一定说巧妇难为无米之炊,我首先需要历史数据。
基本上最能用的历史数据可以被再细分为三个主要的table
之前把这两个分开的原因是面试官可能会分别问这两个的问题
但实际上,你的feature engineering一定是要为model服务的
这里给出我经常会使用的几种简单的推荐系统模型
我个人最喜欢的,而且觉得比较稳妥的是(0)+(1),说的好是绝对没问题的
至于(2)(3)(4)网上有大把的资料,但你不能看一篇paper或者video就上了,一定要谨慎想好可能遇到的问题,比如
对于(0)来说,作为一个base model有提到的价值,在处理cold start的时候是很有用的,但不可恋战一定尽快带过, rule无外乎根据两个heuristic:
重点是(1),这里依然拿spotify music 推荐当例子那么如果转化成一个binary classification问题,我们就要拿出所有的music listening history log, 即tuple of (user, item, context),
比如(berserker888, Titanium, 2019-01-01:12:00:00)当做我们的positive case,即y值为1
那我听了这一首歌,就没有听剩下的所有歌,那我在这个context下所有没听的歌理论上都是negative case, 这里要知道unbalanced data的危害以及一种random sample negative case的逻辑。
同样可以把问题转化成regression问题,就像之前说的,我看了没有听,我听了,和我压根没看的东西代表着3种preference level.
下面简短启发一下feature的展开,user, item, context都是需要vectorize化的
最简单的就是直接join user, item dimension table拿到metadata。
但有的时候比如item是视频图像或者自然语言,就需要我们通过一些方法,比如pretrained deep learning model take bottleneck layer,请大家自行搜索word embedding和image embedding
稍微tricky一点的是contextual feature,这里可能需要aggregate log来达到目的,我建议大家提前想好一些feature,给一个例子:has user_i listened to item_j's category in the past week at night?
一定要区分statistical metric和business metric
前者是你训练模型时候定义的metric,主要用来tune hyperparameter的,比如accuracy, F1-score…
后者定义你的模型是否有意义的metric,比如推荐歌单平均听的时长
一般后者意义更大,更会被问。因为是无法直接直接optimize的,只能通过ab testing才测试,所以也有可能会被问到一点点experiment design的知识
写在最后的话:
Machine Learning是一个积累的过程,在上述流程的任何一个部分,面试官都可以插入问题来看面试者的水平,所以还是要多看多做多学
话说我也只是一个没几年经验的MLE,站在一个peer的角度,为还没进门的人提供点信息,还请各路大神轻踩.
面试就是要在有限的时间里,尽量把自己懂的东西都让面试官看到。你懂那么多模型理论,怎么才能让面试官也觉得你很懂呢?要有策略,有重点。什么样的策略好用呢?
抓住核心,兼顾深度和广度。
ML design的核心,万变不离其宗,本质都是train一个model来实现某个task,比如prediction/ranking/classification。有经验的人都知道,实际上给定一个问题,好用/常用的solution基本上只有很少的几种。所以想要显得你懂很多,不仅要从深度上要cover这几种solution,更要从广度上显示你有end-to-end的experience。具体怎么实行呢?
有前后逻辑关系的work flow最能展示你思维的广度。
为什么我用“讨论”这个词?因为能seriously被考到design的人,都不是entry level。对于更senior的人来说,面试的最好氛围不是你问我答,而是我把我知道的都讲给你听,你看看还有什么想听的。所以你讲的过程中要和面试官互动。要看ta的反应,哪里皱眉了,哪里表情不轻松了,你就要停下来,问他Is there anywhere that you want me to talk more? 这给面试官一个机会表达自己,也帮助你更好的address面试官的考点。
有时候面试官会告诉你ta想用的model,你就按照ta的来,你也可以在讲解完几个model的优劣后,根据经验自己决定一个model。
到此,这轮面试的核心你都cover住了,可以得到60分。Step 5和step 6 是能区别ML**和ML老手的部分。如果你做了,答的一般可以再拿20分,答的好可以再拿40分。有ML经验的人在这两个部分,一定要把握。
不讲data的ML design是没有灵魂的。
最后再说几个加分项:
The last but not the least: 每一步都尽快和面试官确认,move on,不耽误时间。想要在45分钟之内把面试官讲的心服口服,这么多个component,每个只有很少的时间。
结构化表达:
通过结构化的表达来让答案显得很有逻辑。结构化表达,针对一个问题,一般讲三点答案,逻辑上依次有递进的关系,这样就会显得你逻辑清楚。超过三点,听的人容易lost,所以也没必要。
比如被问了一个design的问题,答案比较复杂,有很多部分。回答的时候,第一句话先说,这个问题可以从2(数字)方面来考虑:用户和系统。用户这方面有2(数字)个solution,系统这方面有3(数字)个solution。因为面试官不知道你想讲什么,在讲细节之前,先把框架说出来,这样有助于面试官follow 你的逻辑,即使中间在细节上仔细询问你,他也知道你后面还有内容要讲,会配合让你讲完。
讲自己做过的项目,怎么讲?
讲自己的项目时,主题最好和这个组的方向相关,技术越新越厉害,越好。出于NDA,最好避开自己在当前公司的工作。雷区:这样可能会导致只能讲好几年前的工作和技术。怎么解决呢?在报告的结尾,给一个rethink,讲两部分。
It is your opportunity to shin! 你会被要求讲自己的经历,可能很多次,面试官根据你的经历来问问题。在讲经历的时候,突出哪些关键字和技术?一是和对方相关,二是新技术,三是显得你水平高的内容。当然一定要是你熟悉的,如果你被问到什么,答不上来,会特别减分。
讲到使用哪个model的时候,列举2-3个相关的model,答案的重点是讲一下各自的优缺点,以及当前问题的特质,基于这些比较,从而决定选哪一个。
Lead conversation,主动推进谈话。比如讲完一段话或者回答了一个问题,主动询问:Does it make sense to you?比如讲一个复杂的系统之前,先告知对方:I’m going to talk about a few components. If you feel interested in some particular ones, you can point out and we’ll discuss more over them.
会沟通。有些问题问的非常模糊,可能是面试官故意的,也可能是面试官的表达能力差。这种时候,通过rephrase问题 + make concrete example,来主动probe面试官,去除面试官自己的误差,clarify需求。
会接话,能听出面试官的concern,不要等面试官停下来就接过话题,address面试官的concern。有的面试官在交谈中,不是每个问题都会explicitly的问,然后停下来,然后等你答。你要能在交谈中,听出弦外之音的问题,立刻想答案,然后看准时机,当机立断的接过面试官的话题,给出让人满意的答案。
Stress test。碰到面试官很不友善的时候,没法develop一个很好的答案,要坚持the principle of problem solving: Break down problem to solvable subtasks. 比如被问到这个问题“你deliver了一个ML的产品/系统,用户使用以后,汇报系统的accuracy 远低于你自己test 的accuracy,哪些方面可能出问题了?要求不能看log。” 从problem solving的角度来看,整个系统有两个element:你的ML系统,用户的application。每个element都可能出问题。那么把大问题break down成两个element自己的问题+element之间衔接的问题,就是一个很好的答案。两个element自己的问题包括:产品的问题(overfitting,training data coverage,etc),用户的application的问题(使用产品的domain和develop 产品的domain不一致, 使用方数据的distribution和training data不一致,etc),用户的问题(没有按照设计的方式来使用系统,measure的方法不对,使用了和开发方不一样的metrics,etc)。