千字长文Quora Machine Learning Engineer 电面新鲜面经

本来有点犹豫要发在这个版面还是发在[数科]面经版,但是考虑到投的这个职位严格意义上叫做software engineer, machine learning而且Quora也有单独的DS,就发到了这个版面。面之前也搜索了一下发现这个职位目前地里只有两篇面经,尽量回忆一下,算是回馈地里为后来人提供一些参考。

这个职位面试的流程大概是两个电面,一个不写CODE主要问machine learning的设计和知识点,另外一个是纯code,如果都过了的话会安排onsite,貌似也是一样一个加一轮behave。今天我刚刚面过的是第一个电面关于machine learning的。

面试官,流程等各方面感觉非常好,面试官一开城一口纯种的中文称呼我的中文名,感觉真的非常亲切。开场白没什么过多的胡扯,简单明了介绍了一下自己是Tom和team的基本情况。然后聊了一下我的背景就,直接开始题目,题目非常开放,基本上就是问我怎么设计一个给User推荐Question的系统。我个人感觉不像是问答,更像是discussion。基本上是我drive整个对话的topic,然后在某个具体的地方他来提问一些感兴趣的话题。我把大概的过程记录如下:

Part 1
Tom:请设计一个给user推荐问题的ML 系统
我:在high level有若干approach,1)基于已知question内容,推荐和用户兴趣相关 2)不关心内容,历史点击数据,用每个问题被点击的用户来做collaborative filter 3)一些Topic model的方法,按照topic tag分类
Tom:先从简单的开始,假设所有用户看到的都是同样的推荐问题
我:那么此时选用第一种approach,需要3个部分1)某一种embedding method去吧每个问题从document变成vector,典型的方法有bow 2)选择某种metrc 去计算特定个vector之间的距离,典型的有euclidean dist, cosine similarity 3)选择某种方法筛选出最相近的K个问题推荐给用户,最简单的是挨个计算distance,然后排序返还最相近的k个
Tom:你提到了两种不同的distance,那么你更prefer eucliden还是cosine similarity
我:(此时有点被问住,还是比较水没反应过来,所以生想了一个解释)prefer cosin similarity,因为两者如果使用过同样的词,similarity相近比较make sense,因为是bow embedding 高维空间上小的Euclidean dist并不意味这意思相近
Tom:这个算法complexity如何
我:假设已经有了embedding,每个similarity计算是点乘所以很快,要对每个vector挨个计算此时为O(N),计算后要进行排序所以有平均NLOG(N)。(不知道对不对纯属胡诌,大神请指正)
Tom:这个complext会不会有什么问题
我:(强行往好了说)当然不是最好的,但是nlogN应该属于可以接受的(真不要脸)
Tom:能否进行一些优化
我:可以分布式计算,例如10台计算机,每个分别找出k个最相近的,然后master node使用min heap 分路归并可以快速从10*K个最小的结果中找出最小的k个(不知道是不是一个合理的答案)
Tom:(简要重复了我的之前所有回答,确保他没有错误理解我的答案)

Part 2
Tom:那么这是你说的最简单的方法,如果想要优化一下模型,你能怎么improve
我:使用某种embedding和similarity,然后排序k个最相近的这个approach比较直观,简单,逻辑上也合理。所以这个基本的method可以保留,我会选择想办法优化更好的embeding和metric
Tom:请给出具体的例子
我:用word2Vec embedding去生成词的vector,因为word2Vec可以把语义融入向量中,(similarity measure开了个脑洞,隐约记得以前看了篇paper),构建一个matrix m,m(i,j)代表第一个问题ith词转换到第二个问题jth词的cost,这个cost使用两个对应词word2vec的Euclidean distance代表,然后对这些所有的cost做加权平均。
Tom:(因为这部分我叙述的setting和方法有点乱,所以Tom反复确认,最后我们都相互confirm理解了对方的意思)
Tom:假设有了两个不同的model,怎样评价那个推荐的更好
我:(我好久没有系统复习[Data Science],时候觉得可能需要答一些A/B testing, ROC什么的)可以用用户点击推荐内容的比例来比较,更细致一点的办法是统计用户在每个问题上花费的时间,然后根据问题答案的长度normalize,把这个时间作为score

Part 3
Tom:在最初提到了除了基于context还有别的approach,能否简单说一些如果不基于内容,你打算怎么做
我:构建一个行代表user,列代表question的矩阵,R(i,j)代表用户I对问题J的打分,这个打分可以是0,1代表有没有浏览,可以是花费的时间,也可以是星级称赞。然后用此matrix里的每一行作为对应问题的向量表示,带入上面类似的模型,计算dist,排序
Tom:确认了一下模型问,下一步怎么improve
我:(继续开始开脑洞。。。)想办法把content和collaborative filter结合起来,用一个stack denoise autoencode 去learn 问题的encoding,代表内容的信息,同时随机生成一个trainable的userembedding,把两个向量点乘和对应的rating做RMSE代表collaborative filtering的loss,同时把autoencode的loss 加在一起形成total loss,用SGD同时优化两个图模型
Tom:(可能我表述的不太清楚,这一部分花费了挺长时间反复确认相互理解对方的意思)

Part4:
Tom:多次提到了word2Vec模型,能不简要介绍这个model怎么运行的
我:(这个确实准备的时候没有复习到,完全凭借对NLP课上作业的记忆,基本上应该算大上来了)用一个词的one-hot encoding作为input,全连接到一个linear的hidden layer,然后直接输入去预测前后几个词的one-hot最后优化cross-entropy loss。训练完成后hidden layer的matrix就是结果,每一行对应了一个词的encoding。(应该大体没错,要是这个没对的话,感觉自己像个SB一样)
Tom:还有5分钟时间,有什么问题吗
我:BLABLABLA
TOM:BLABLABLA

结束,最后还忘记问email发thank you letter,感觉好久没面试这点礼节都miss了非常不好意思。本人毕业以后一直是码农,ML的很多知识确实还给老师了,基础很不扎实,才疏学浅,这篇记录中有不对或者不好的地方,烦请各路大神指正,欢迎讨论。希望这篇流水账能给面ML Engineer的同学一点点帮助。就我自己现在的水平来说,感觉发挥的还可以,不知道能不能达到quora的bar。如果过了的话下一步应该是coding 的电面,祝自己好运吧。手工码字不易,在此向各位兄弟姐妹求[]么么哒。

补充内容 (2018-11-17 12:33):
更新一下,Quora效率蜜汁高效,隔了一天第二天通知跪了

1 Like

您好,请问您是senior吗?面试挺复杂的感觉,给您加了五粒米~谢谢~

不是的不到两年SDE的经验,这个职位印象中没有要求具体工作年限,HR也说all level are welcome

请问lz得到update了吗,大概多久哈?

第二天通知的,跪了