【思维与学习方法总结】面试

关于行动

最近在读《代码整洁之道》中,关于写程序的方法,说道每次写修改代码或者阅读代码,都会问自己为什么要这么做。作者会写下为什么这么做的清单。

由此,我觉得人生中一些行动也需要写下自己为什么做的理由,由此才能明确目标。总结出人生之路该怎么走。

做项目、写代码

动手之前,能想得越详细、越好。写之前最好在大脑中有一套思路。

比如面试过程中做coding题目:
要有如下三个步骤:
1 先借助纸笔等工具,在脑海中勾勒题目的解法,代码框架、函数定义框架
2 编码
3 测试

学习方法

学习方法

  • 费曼学习法

学习路径

  • 不要从基础学起,要直奔大师

工作方法

2、番茄工作法

3、个人观点:
需要知道这件事的起源,目前这个东西解决的是它的那个问题,具体是怎么解决的? 未来的发展方向是什么?

比如学习xgboost

发展起源:
需要至少从gradient boost ,说起,说出它的缺点。

xgboost的改进:

2、
未来发展:
lightgbm是xgboost的进一步改进,或者干脆是使用深度学习取代它。


适用的场景:

表达、沟通技巧

结构化表达:

  • 过去、现在、未来三段式
  • 提出问题-解决方案-预期收益
  • what、so what、now what
    先说问题是什么,再说问题多重要、最后说接下来会发生什么?

李沐的读博五年总结

前言

12年8月提着一个行李箱降落在匹兹堡机场。没找住的地方,也不知道CMU应该怎么去。对未来一片迷茫,但充满乐观。现在,刚完成了博士期间最后的一场报告,在同样的机场,不过是在等待离开的航班。

回想过去的五年,是折腾的五年,也是自我感悟和提升的五年。这里我尝试记录这五年主要做过的事情和其中的感想,希望对大家有所启发。

第0年:3/11-8/12

我第一次申请美国的博士是在11年,但拿到的offer并没有特别合适的导师,于是就北上投奔文渊去了。我当时在百度商务搜索部门做广告的点击预估。具体是使用机器学习来预测一个广告是不是会被用户点击。这时候离“大数据”这个词流行还有两年,但百度那时候的数据即使现在来看仍然是大的。我的任务是如何高效的利用数百台机器快速的在数十T的数据上训练出模型。

当时产品用的算法基于LBFGS,我于是想是不是可以换个收敛更快的算法。没几天就找到个不错 。但实现上发现了各种问题,包括性能,收敛,和稳定性。而且那时有的就是一个裸的Linux和很老版本的GCC,什么都是需要从头开始写。花了大量时间做系统优化,算法改动,和线上实验,最后一年后在整个广告流量上上了线。

现在再回顾会觉得整个一年时间都在打磨各种细节上,有时候为了5%的性能提升花上上千行代码。这些都导致算法过于复杂,有过度设计之嫌。但深入各个细节对个人能力提升很大,而且很多遇到的问题成为了之后研究方向的来源。一些算法上的思考曾写在这里,当时候深度学习刚刚出来,冥冥中觉得这个应该是大规模机器学习的未来,不过真正开始跟进是好几年以后了。

11年12月中的时候突然心血来潮随手把材料重新寄了一遍,就选了CMU和MIT,结果意外收到了CMU的offer。有天在百度食堂同凯哥(余凯)和潼哥(张潼)吃饭,我说收了CMU offer,在纠结去不去。他们立马说去跟Alex Smola啊,他要要加入CMU了,我们给你引荐下。

记得是离开的前一天才开始打包行李,早上去公司开完会,中午离职,跟小伙伴打招呼说出个国,然后就奔机场了。那天北京天气特别好,完全不记得前一天雾霾刚爆了表。

第一年:9/12-8/13

第一年的主要事情是熟悉环境和上课。CMU课程比较重,博士需要学8门课,每门课工作量巨大。而且要求做两门课助教,做助教比上课更累。

这一年上的课中对我最有用的是“高级分布式系统”。之前在上交ACM班的时候已经学过很多质量都还不错课,纯知识性的课程一般对我帮助不大。但这门课主要是读论文,然后大家讨论。不仅仅是关于知识,很多是对设计理念的领悟。大家知道对于系统而言,设计是一门艺术而不是科学,这是设计者审美和哲学理念的体现。同时系统界历史也是由一波又一波的潮流组成,了解历史的发展以及其中不断重复的规律非常有意义。

那年这门课上课老师是Hui Zhang(神人之一,20多岁就在CMU任教了,学生包括了Ion Stoica,他是Spark作者Matei的导师),他有非常好的大局观,对于“Why”这个问题阐述非常到位。我是通过这门课才对分布式系统有了比较清晰的认识。两年之后我偶然发现我的一篇论文也在这门课的阅读列表里了,算是小成就达成 。

除了上课,更重要是做研究。我去CMU的时候Alex那时还在Google,而且没经费,所以把我丢给了 Dave Andersen。于是我有了两个导师,一个做机器学习,一个做分布式系统。

前面半年都是在相互熟悉的过程。我们每周会一起聊一个小时。前半年因为Alex不在,所以我们只能视频。Alex那边信号经常不好,而且他有德国和澳大利亚口音,外加思维跳跃,经常我听不懂他说啥只能卖萌傻笑。还是靠着Dave不断的打字告诉我Alex说了什么才度过了前几次的会。

两个导师风格迥异。Alex是属于反应特别快,通常你说一点,他已经想好了接下来十点,要跟上他节奏很难。一般抛出问题的时候他就想好了好几个解决方法。这时候要证明自己的想法比他的更好不容易,需要大量的沟通和实验数据支撑。我想我大概是花了两年证明了在某些方向上我的方案一般更好,所以这时候他就不那么hands-on了。

Dave不会给很多想法,但会帮助把一个东西理解透,然后讲得很清楚。因为我研究方向主要是机器学习上,基本上前两年基本都是我在教Dave什么叫机器学习,而且是尽量不用公式那种教法。

我的第一个研究工作是关于如果划分数据和计算使得减少机器学习求解中的网络通讯量。Alex体现了他的强项,几分钟就把问题归纳成了一个优化问题,然后我们三各自提出一个解法。我做了做实验发现Dave的算法更好。接下来两个月把算法做了很多优化,然后又做了点理论分析就把论文写了。

可惜这个想法似乎有点超前,虽然我们一遍又一遍的改进写作,但投了好几个会审稿人就是不理解,或者觉得这个问题不重要。那个时候学术界已经开始吹嘘“大数据”,但我觉得其实大部分人是不懂的,或者他们的“大数据”仍然是几个GB的规模,烤U盘需要十来分钟的那种。

这是我在CMU的一个工作,我觉得挺有用,但却是唯一没能发表的。

当时跟我坐同一个办公室的是Richard Peng,他做的是理论研究。我经常跟他讨论问题,然后有了些想法合作了一个工作。大体思想是把图压缩的快速算法做到矩阵的低秩近似上。这个工作写了三十页公式但没有任何实验,我主要当做写代码间隙的悠闲娱乐,不过运气很好的中了FOCS。

坦白说我不是特别喜欢纯理论这种,例如在bound的证明中很多大量的项直接丢掉了,导致我觉得bound特别的近似。对于做系统的人来说,最后拼的是常数。这个工作中这种大开大合的做法我觉得很不踏实。所以我觉得以后还是应该做更实在点的东西。

在CMU回到了去百度前的一周七天工作无休的节奏。每周至少80个小时花在学校。如果累了就去健身房,我一般晚上12点去。不仅是我一个人,大家都很努力,例如凌晨的健身房,早3点的办公室,四处都可以见到中国或者印度学生。我那时候的室友田渊栋花在学校的时候比我多很多。

那一阵子有读了很多关于优化的文章。其中对我启发最大的是Bertsekas写于80年代末的那本关于分布式计算的书。此书可以认为是MIT控制领域黄金一代研究成果总结,换到现在仍然不过时。

受启发我转去研究异步算法,就是分布式下不保证数据的及时性来提升系统性能。我基于在百度期间做的算法,做了一些改进和理论分析,然后投了NIPS。

投完NIPS就动身去了Google Research实习。那时候Google Brain成立不久,在“宇宙的答案”42楼,包括Jeff Dean,Geoffrey Hinton,Prabhakar Raghavan好些大牛挤在一起,加起来论文引用率能超80万。

Alex跟我说,你去读读Jure Leskovec的文章,学学人家怎么讲故事。我在Google也尝试用了些用户GPS数据来对用户行为建模。可是写文章的时候怎么也写不出Jure的那种故事感,发现自己不是那块料。这篇文章因为用了用户数据,恰逢Snowden让大家意识到隐私的重要性,历经艰辛删了一半结果Google才允许发出来。有些累觉不爱。

不过在Google期间我主要时间花在研究内部代码和文档上。Google的基础架构很好,文档也很健全。虽然没有直接学到了什么,但至少是开了眼界。

第二年:9/13-8/14

这学期上了Tuomas Sandholm的机制设计,此乃另一大神,例如最近德州扑克赢了专业选手,之前开公司也卖了上亿。不过这门课我是完完全全没学懂,连承诺的课程大作业都没怎么做出来。之后的两年里我一遇到Tuomas他都会问下有什么进展没。我只能远远看见他就绕开。

NIPS被拒了,发现审稿人不懂线程和进程的区别,有点沮丧。隔壁实验室一篇想法类似但简单很多的论文倒是中了oral,所以那阵子压力很大。Alex安慰说这种事情常有发生,看淡点,然后举了很多自己的例子。

之后想了想,一篇好文章自然需要有足够多的“干货”,或者说信息量, 但一篇能被接受的文章需要满足下面这个公式:

文章的信息量 / 文章的易读性 < 审稿人水平 * 审稿人花的时间
对于机器学习会议,因为投稿量大,所以审稿人很多自然平均水平就会下降。而且很多审稿人就花半个小时到一个小时来读文章,所以公式右边数值通常是很小,而且不是我们能控制。

如果文章的信息量不大,例如是改进前面工作或者一些简单的新想法,那么公式成立的概率很大。而对于信息量大的文章,就需要努力提升易读性,包括清晰的问题设定,足够的上下文解释等等。而前面投的那篇NIPS,以及更早的那个被拒工作,就是因为我们假设了审稿人有足够多的相关专业知识,而我们塞进了太多干货使得大家都读糊涂了。

即使对于已经发表的文章,上面那个公式同样可以用来衡量一篇论文的引用率。例如经常见到干货很多的文章没有什么人引用,而同时期的某些工作就是考虑了其中简单特殊情况结果被大引特引。

接下来的半年我主要在做一个通用的分布式机器学习框架,是想以后做实验方便些。名字就叫parameter server,沿用了Alex 10年论文提出的名字。花了很多时间在接口设计上,做了好几个版本实现,也跑了些工业界级别的大规模的实验。

不过真正花了我大量时间的是在写论文上。目标是把这个工作投到OSDI上,OSDI是系统界两大会之一。我们预计审稿人跟Dave两年前状态差不多,不会有太多机器学习和数学背景,所以需要尽量的少用公式。整整一个月就花在写论文上,14页的文章满满都是文字和示意图。不过努力没有白费,最终论文被接受了。随后又花了好几周准备大会报告上。相对于平时花一周写论文,两三天准备报告,这次在写作和报告水平上有了很大的提升。没有放进去的公式和定理投了接下来的NIPS,这次运气很好的中了。

有了文章后稍微心安了点可以更自由的做些事情。

寒假回了趟国,跑去百度找了凯哥和潼哥。潼哥说他最近有个想法,于是快糙猛的把实验做了然后写了篇论文投了KDD。同时期Alex一个学生也把他一个一直想让我做但我觉得这个小trick不值得我花时间的想法投了KDD,结果中了最佳论文。作报告那天我在的会场稀稀疏疏几个人,他们隔壁会场人山人海。这个使得好长一段时间我都在琢磨是不是还是要跟着导师走比较好。

那时凯哥在百度搞少帅计划,觉得蛮合适就加入了。这时凯哥正带着一大帮兄弟轰轰烈烈的搞深度学习,我自然也是跳坑了。试过好几个想法后,我觉得做做分布式的深度学习框架比较对胃口。我挑了CXXNet作为起点,主要是因为跟天奇比较熟。同时也慢慢上手跑一些Alexnet之类的实验。

我是因为少帅计划才开始开始做深度学习相关项目,凯哥也很支持我做开源开发回馈社会而不是只做公司内部的产品。但在少帅期间并没有做出什么对公司有帮助的事,很是惭愧。

第三年:9/14-8/15

回CMU后Alex看见深度学习这么火,说我们也去买点GPU玩玩。但我们比较穷,只能去newegg上掏点便宜货。这个开启了轰轰烈烈的机器折腾之旅。整个一年我觉得我都在买买买装装装上。最终我们可能就花了小几万刀攒出了一个有80块GPU的集群。现在想想时间上花费不值得,而且为了图便宜买了各种型号的硬件导致维护成本高。但当时候乐在其中。具体细节可以看这篇blog

这一年写了很多parameter server代码,同时花了很时间帮助用户使用这些代码。很难说做得很成功,现在想想有几个原因。写代码时我会优先考虑性能和支持最多的机器学习算法。但正如前面的错误,忽略了代码的易读性,从而导致只有少部分人能理解代码从而做一些开发。例如我尝试让Alex组的学生来使用这些代码,但其中的各种异步和callback让他们觉得很是难懂。其次是没有人能一起审核代码接口,导致这些接口有浓浓的个人味道,很难做到对所有人都简单明了。

不过幸运的是找到一帮志同道合的小伙伴。最早是我发现天奇在写xgboost的分布式启动脚本,我看了看发现挺好用,就跟他聊了聊。聊下的发现有很多基础部件例如启动脚本,文件读取应该是可以多个项目共同使用,而不是每个项目都造一个轮子。于是跟天奇在Github上创建了一个叫DMLC的组织,用来加强合作和沟通。第一个项目是dmlc-core,放置了启动和数据读取代码。

DMLC的第二个新项目叫wormhole。想法是提供一系列分布式机器学习算法,他们使用差不多相同的配置参数来统一用户体验。我把parameter server里面的机器学习相关算法移植了过来,天奇移植了xgboost。Parameter server原有的系统代码简化到了ps-lite。

中途我听百度同学说factorization machine(FM)在广告数据上效果不错,所以在wormhole上实现了下。针对分布式做了一些优化,然后投了WSDM。前后没有花到一个月,但神奇的竟然拿了最佳论文提名。

在wormhole的开发中发现一个问题,就是各个算法还是挺不一样,他们可以共用一些代码,但又有各自的特点,需要特别的优化来保证性能。这样导致维护有些困难,例如对共用代码的改动导致所有项目都要检查下。总结下来觉得一个项目最好只做一件事情。所以天奇把xgboost代码放回原来项目,我也把FM独立出来一个项目叫difacto。

通过一系列的项目,我学到的一点是,以目前的水平和人力,做一个通用而且高效的分布式机器学习框架是很难的一件事情。比较可行的是针对一类相似的机器学习算法做针对性的项目。这个项目的接口必须是符合这类算法结构,所以做算法开发的同学也能容易理解,而不是过多暴露底层系统细节。

真正的让DMLC社区壮大的项目是第三个,叫做MXNet。当时的背景是CXXNet达到了一定的成熟度,但它的灵活性有局限性。用户只能通过一个配置项来定义模型,而不是交互式的编程。另外一个项目是zz和敏捷他们做的Minerva,是一个类似numpy的交互式编程接口,但这个灵活的接口对稳定性和性能优化带来很多挑战。我当时候同时给两个项目做分布式的扩展,所有都有一定的了解。然后一个自然的想法是,把两个项目合并起来取长补短岂不是很好。

召集了两个项目的开发人员讨论了几次,有了大致的眉目。新项目取名MXNet,可以叫做mixed-net,是前面两个名字(Minerva和CXXNet)的组合。放弃开发了几年的项目不是容易的决定,但幸运的是小伙伴都愿意最求更好,所以 MXNet进展挺顺利。很快就有了可以跑的第一个版本。

第四年:9/15-8/16

前半年为difacto和MXNet写了很多代码。其实一开始的时候我觉得difacto更重要些,毕竟它对于线性算法的提升非常显著而且额外的计算开销并不大,这对广告预估之类的应用会有非常大的提升。但有次遇到Andrew Ng,我跟他说我同时在做这两个项目,他立即告诉我我应该全部精力放在MXNet上,这个的未来空间会大很多。我一直很佩服Andrew的眼光,所以听了他的建议。

11月的时候MXNet就有了很高的完成度。写了个小论文投去了NIPS的workshop也算是歇了口气。但随后就听到了TensorFlow(TF)开源的消息。由 Jeff Dean领导大量全职工程师开发,Google庞大的宣传机器支持,不出意料迅速成为最流行的深度学习平台。TF对我们压力还是蛮大,我们有核心开发者转去用了TF。不过TF的存在让我领悟到一点,与其过分关心和担忧对手,不如把精力集中在把自己的做得更好。

NIPS的时候MXNet的小伙伴聚了一次,有好几个我其实是第一次见面。随后Nvidia的GTC邀请我们去做报告。在这两次之间大家爆发了一把,做了很多地方的改进。同时用户也在稳步增长。我们一直觉得MXNet是小开发团队所以做新东西快这是一个优势,但随着用户增加,收到抱怨说开发太快导致很多模块兼容性有问题。有段时间也在反思要在新技术开发速度和稳定性之间做一些权衡。

这时一夜之间大数据不再流行,大家都在谈深度学习了。

我也花了很多力气在宣传MXNet和争取开发者上。包括微博知乎上吼一吼,四处给报告。在大量的点赞声中有些陶醉,但很多中肯的批评也让我意识到重要的一点,就是应该真诚的分享而不是简单的吹嘘。

因为大量的媒体介入,整个深度学习有娱乐化的趋势。娱乐化的报道很多都只是一些简单信息,(有偏见)的观点,而没有太多干货。不仅对别人没营养,对自己来说也就是满足虚荣心。与其写这些简单的水文,不如静下心做一些有深度的分享,包括技术细节,设计思路,和其中的体会。

此类分享一个容易陷入的误区是只关注自己做了什么,结果多么好。这些确实能证明个人能力,对于想重复这个工作的人来说会有很大帮助。但更多的人更关心的是适用范围在哪里,就是什么情况下效果会减弱;为什么结果会那么好;insight是什么。这个需要更多深入的理解和思考,而不是简单的展示结果。

这个对写论文也是如此。只说自己的结果比基线好多少只能说明这是不错的工作,但结果再好并不能意味这个工作有深度。

深度学习的火热导致了各种巨资收购初创司不断。Alex也有点按耐不住, 结果是他,Dave,Ash(曾经是YahooCTO)和我合伙弄了一家公司,拿了几十万的天使投资就开工了。Alex写爬虫,Dave写框架,我跑模型,风风火火干了好一阵子。可惜中途Dave跑路去跟Jeff做TF了。后来这个公司卖给了一个小上市公司。再后来我们觉得这个公司不靠谱也就没考虑跟他们干了。

第一次创业不能说很成功,从中学到几点:一是跟教授开公司一定要注意有太多想法但没死死的掐住一个做,二是找一堆兼职的博士生来干活不是特别靠谱,尤其是产品不明确的时候,三是即使要卖公司也一定要做一个产品出来。我们卖的时候给很多人的感觉是团队人太强但产品太弱,所以他们只想要人而已。四是试图想要通过技术去改变一个非技术公司是很难的事情,尤其是过于新的技术。

然后我们就奔去折腾下一个公司。Ash早财务自由所以想做一个大的想法,但这时Alex刚在湾区买了个房,有还贷压力,他选择去了Amazon。于是算是胎死腹中。

随后收到Jeff的邮件说有没有兴趣加入Google,自然这是一个很诱人的机会。同时我觉得小的创业技术性强的公司是不错的选择。但从MXNet的发展上来书,去Amazon是最好选择之一。自己挖的坑,总是要自己填的。所以我以兼职的身份去了Amazon,领着一帮小弟做些MXNet开发和AWS上深度学习的应用。

第五年:9/16-2/17

早在15年初Alex就表示我可以毕业了,但作为拖延晚期患者,迟迟没开始准备。这时候感觉不能再拖了,于是窝在湾区写毕业论文。Alex觉得毕业论文应该好好写,但我对把前面都做完的东西再捣鼓写写实在是没兴趣,尤其是加州太阳那么好,大部分时间我都是躺在后院晒太阳。此时B站已经完全被小学生占领,这边买书也不方便,无聊之余刷了很多起点。然后还写了篇炼丹文。

CMU要求答辩委员会需要有三个CMU老师和一个学校外的。除了两个导师外,我找了Jeff Dean和刚加入CMU的Ruslan Salakhutdinov. 结果Russ随后就加入了Apple,整个委员会的人都在湾区了。Jeff开玩笑说可以来Google答辩。可惜跟CMU争吵了好多次,还是不允许在校外答辩,而且必须要三个人委员会成员在场。这些限制导致答辩一拖再拖,而且临时加了Barnabas Poczos来凑人数。最后是Jeff的助理快刀斩乱麻的协调好了时间把所有东西定好了。没有她估计我还可以拖几个月。

答辩的时候是一个比较奇异的状态,委员会里有Google, Amazon, Apple的AI负责人,剩下两个和我又分别在这三家公司兼职。这个反应了当下AI领域学术界纷纷跑去工业界的趋势。

不过答辩这个事情倒是挺简单,跟平常做个报告没什么太多区别。一片祥和,即使Russ问了MXNet和TensorFlow哪家强这个问题也没有打起来。

答辩后我问委员会说,我在考虑找个学术界的工作,有什么建议没。大家介绍了一大堆经验,不过大家都强调的一个重点是:学术界好忙好忙,而且好穷好穷,工业界的薪水(就差指自己脸了)分分钟秒掉CMU校长。你要好好想。

总结

答辩前一天的晚上,我想了两个问题,一个是“博士收获最大的是什么”,另一个是“如果可以重来会怎么办”。对于第一个问题,这五年时间自然学到了很多东西,例如系统的学习了分布式系统,紧跟了机器学习这五年的发展,写文章做幻灯片做报告水平有提升,代码能力也加强了些。自信上有所提高,觉得既可以做一流的研究,也可以写跟大团队PK的代码。只要努力,对手没什么可怕的。

但更重要的是博士的五年的时间可以专注的把一些事情从技术上做到最好,做出新的突破,这个氛围没有其他地方能给予。

第二个问题的一个选项是当年留在国内会怎么样?当年百度的伙伴们多数现在都做得很好,都在引领这一波AI的潮流,甚至有好几个创造了上亿价值的公司。所以从金钱或者影响力角度来看,一直在工业界也不差,说不定现在已经是土豪了。

不过我觉得还是会选择读博。赚钱以后还有大把时间可以,但是能花几年时间在某个领域从入门到精通甚至到推动这个领域发展的机会就一次。站在这个领域的高点会发现世界虽然很大,但其实其他领域也使用差不多的技术,有着同样的发展规律。博士期间领悟到的学习的方法可以在各个方向上都会大有作为。

更重要的是理想和情怀。人一生要工作五十年,为什么不花五年来追求下理想和情怀呢?

研究思维

科研:
https://zhuanlan.zhihu.com/p/90772282

pipeline:
1、收集文献

2、做对比、类比分析

3、

第一,好好总结一下在当前这个场景下,我们要解决的是什么问题,也就是针对要研究的问题进行建模归纳。回到刚才所提的电商推荐的例子,我们需要解决的问题是把类似的相机过滤掉?还是要推荐买了相机后其他的附件?还是要推荐相机的替代品?或者是要从根本上理解这样的情况是怎么产生的,消费者的心理预期是什么样的?你可以看到,即便是尝试解决同一个问题,我们也可以有好多不同的切入点。所以,最重要的第一步就是找准一个切入点。

第二,了解前人的工作,查找和学习相关文献。相信我,即便你认为找到了一个貌似完全新的问题或者领域,认真查找了相关文献之后,有很大可能你会发现其实已经有人做了一些类似的工作。甚至,你还可能发现你设想的某种方法已经有人尝试过了。

了解前人工作这个步骤,初学者或者是完全在工业界的工程师,往往容易忽略。这一步的核心,其实就是看前人在你设想的问题中是如何寻找方案的,和你设想的思路是不是完全一致。通常情况下,你会发现一定的差异性。于是,基于这些差异性,你可以提出一些“进阶性”(Incremental)的创新思路。这也就是我们常说的“站在巨人的肩膀上”。

另外,多了解前人的工作,我们不会把自己的思想和整个大的方法论孤立开来,能够更好地融入到研究的整个社群中去。

第三,选择一种测试数据集和一些“基线方法”(Baseline)来进行比较。无论是多么重要的新方法,也无论是什么样的新领域,如果我们不能通过一些标准的数据集,或者是构造一些可以值得信赖的数据集,而且和多种方法进行比较,那么这些创新也都无法通过检验。换句话说,我们提出的新方法、新思路再好,必须有一个相对的比较者,最好这个比较者是之前提出的,已经使用了的,这样,我们才能够更清楚地说明新的方法究竟好在哪里。

研究工作,特别是“了解前人工作”和“进行基线比较”这两点,是和一般的技术分享有区分的重要标志。这其实也是我们在上一次的分享中讲到的,有的技术分享其实只是描述做了一件事情,或者是描述了一个系统,我们无法真正知道这个系统的设计和整体的思路在社群中的位置,也不知道这个系统是否和类似系统进行过比较,这其实也给我们的技术选择设置了挑战。通过今天的内容,我们了解了研究工作的思路,把用研究的思路应用在工作中,会让我们平时的技术选择更加严谨。

博士与民科的区别:

  • 问题比较基础,突破它对其他问题也能解决

简历与晋升答辩
1、目标:需要给没做过相关项目的人也能讲清楚,体现项目难点,这个项目没有你不行的点

策略:给没做过的人看ppt或者简历,看他能不能看懂

比较业界的一些做法,你相比它的优缺点

社招

https://www.nowcoder.com/discuss/689718?source_id=discuss_experience_nctrack&channel=-1

问题范围

激活函数
参数初始化
优化器
transformer

项目
项目可能会比较细问整个推荐系统的细节:
可以参考:https://www.zhihu.com/question/339135205/answer/2069343040

作者:如雪
链接:https://www.zhihu.com/question/339135205/answer/2069343040
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

推荐系统有哪些bias以及该怎么样进行debias? 可参考:bias and debias in recommendation system: a survey and future directionsonline learning是什么?

为什么要用online learning?有哪些方法?

explore & exploit算法有哪几个?主要算法原理是什么?

推荐系统解决冷启动都有哪些方法?

有什么办法评估特征有效性?线上线下不一致问题碰到过吗?什么原因引起的?怎么解决的?

transformer为什么要引入位置编码?你的场景为什么transformer建模是有效的?transformer的attention结构在你那里是引入了什么新的信息?Q,K,V表示什么含义?为什么attention计算要scaled?

cvr模型中,物品曝光之后可能过一段时间用户才会发生转化行为,那么cvr样本的正例就会有延迟。那么这个转化延迟问题该怎样解决?

训练样本是怎样构造的?有什么采样方法,以及为什么要做采样?如果做了负例采样,那么ctr要怎样进行校正?

深度学习都有哪些optimizer?都有啥好处?可以参考:An overview of gradient descent optimization algorithms评价指标相关。auc是什么?为什么离线要用auc进行模型评估?auc是怎么计算的,写一个代码计算?其他一些排序指标比如ndcg也了解下。L1为什么具有稀疏性?L0.5和L1.5有没有稀疏性?为什么?L1和L2正则有什么区别?对最新的模型是否了解,比如mmoe,序列建模(din,tarnsformer这种)。比如对mmoe,推荐系统都有哪些多任务学习的方法?mmoe的loss是怎么设计的?怎样相互平衡不同loss?为什么多任务学习在推荐/广告场景下是有效的?经典排序模型是否了解,如fm,deepFM,wide&deep,dcn,afm,din,mmoe等。不如现场写一个mmoe?经典召回模型是否了解,如:ann,局部敏感哈希,双塔召回?attention机制是什么?都有哪些模型?为什么这个会在推荐/广告有效?对推荐系统整体认识,推荐系统都有哪些部分,每个部分都做什么?广告的话,则同样对广告系统整体的认识,广告系统都有哪些部分,每个部分都做什么,都有哪些机制策略?梯度爆炸、梯度消失等问题怎样解决?

推荐系统为什么要考虑多样性?多样性策略有哪些?怎么做?

线上模型serving该怎么做,比如tf-serving是怎么对推荐/广告模型serving的?如果是一个很大的模型该怎么serving,分布式机器学习该怎么做?最后,贴一个整理的推荐/广告论文梳理,涵盖各个阶段、大部分公司都在使用的经典模型。

2021年社招记录

三线公司
蘑菇街、小红书、知乎、b站、微博、爱奇艺、mobvista、soul、搜狐、米哈游、汽车之家、得到、理想汽车、蘑菇街

二线公司
快手:社科推荐算法
小米:
pdd(推荐三组是坑)、搜索二组比搜索一组好

一线
阿里:uc视频推荐
字节:tiktok推荐算法
百度:meg推荐算法
美团:
腾讯Teg、idg都有广告业务,teg广告不做模型、cdg广告搞模型
shopeee:

问题:
对于创业公司
1 你们公司的业务
2 第几轮了,由谁投资、期权有吗

探探
一面挂,项目太简单,直接问transformer的细节
为什么用transformer,不用RNN

0719
陌陌,面试直接没拒

投递记录
0926 搜狐广告,早上投递,打电话过来问薪资待遇问题。说能给到35,薪资不满意,直接拒

1105
汽车之家
主要问题:

向量化召回:
创新点
对用户行为比较稀疏数据的处理
怎么解决user和item不能交叉的问题,后面问了下他们怎么处理的。他们说用图解决这个问题
self-attention为什么能用来处理 用户浏览序列

没有问强化学习的问题

MMOE怎么用的,有什么经验

算法:
幂函数不用乘法计算

拼多多

搜索一组

2021-1226
自我介绍

问:京东站外一天的流量?点击、转化多少

怎么衡量京东站外的价值?
说了下一天的消耗,一个点击多少钱、转化率多少

比较有亮点的项目
详细说怎么采样、正样本、负样本都如何采样? 还是想听亮点
sample softmax函数是啥样子

说一下eUV怎么做的?
一顿说了euv的做法,以及总结的经验

coding:
最长公共子串

你还有什么问我?
1 京东搜索与pdd搜索怎么看?
回答:京东搜索更简单,只包含京东自营的商品,多多业务更复杂

2 代码题怎么样
回答:作为参考

0109
Q1: 简单自我介绍

Q2: 介绍一下你做的东西
A:介绍了下eUV和促排优选怎么做的,并说了下自己的思考

Q3: 介绍了下双塔模型和样本的采样、训练方法后,说有没有继续改进的?
回答了通过对比学习,学习cid3相同或者其他数据真强方法,让emb分布更均匀

Q4: 还有没有改进方法?
A:用ESSM多任务学习,效果不是很好

Q5: 如何改进ESSM训练方式?
A:loss 加权 + PLE这种结构调整

Q6: 从其他角度解决ESSM的问题?,可以训练cvr任务,然后ctrcvr任务当作辅助任务?

反问:
Q: 面试官为什么从百度搜索去pdd?
A:看中电商行业发展

三面想问问题:
1 进去后具体做什么业务?

2 组有多少人?

3 离职率多高?

HR想问:
1 搜索和推荐流量占比?

三面 leader面
Q1: 简单自我介绍

Q2:讲一下你们组所负责的业务?
考察业务理解能力,
做站外是为了啥? 怎么考核?

Q2:讲一下你做的东西?
考察解决问题能力?
先说了

2022 - 0410
搜索二组
概率题:
n个人,每一时刻每人以p概率进电梯,一个时刻只能进一个人,求t时刻,电梯人数的期望
(这道题刚开始题目理解又问题,做了10来分钟,后面又做了20多分钟)

项目介绍
介绍了项目背景
Q:SENET怎么看有效
A:看输出的分布也会看加还是不加后的效果指标

Q:怎么优化召回或者排序?
A:对于排序,分特征和模型两部分,特征部分是加新特征或者优化特征处理,模型

Q:写logloss公式、logloss的优点?
A:

Q:知道哪些召回模型?
A:词表、协同过滤、dssm、多兴趣、mind、深度树模型、视觉召回等

Q:树模型怎么做的,能说一下吗、训练样本是怎么样的?
A:树模型由于看的时间比较长,记得不是很清楚了。

Q:做召回的,有哪些检索算法?
A:树的k-means

Q: k-means的优化?

loss 函数

lazada:

0305
Q:站外广告的价值怎么衡量,如果让你做站外广告,你怎么设计

算法题:word break

小米-zili团队

一面
2022-04-01

二面
2022-04-06
上来说算法功底是一个程序员的核心,来了两道题:

算法题1:
twosum

算法题2
二叉树的层次遍历

项目:

  • 讲一些mmoe
  • 推荐系统的模块

Q: 看到简历上有冷启动,说一下怎么用图解决冷启动?
A:冷启动分为用户冷启动、item冷启动,根据用户属性计算top相似的用户将他们连起来构图,item侧也是这么处理

Q:那item的直不连续怎么办?
A:使用cos相似度进行计算

后面就是反问环节,问我有什么想问他的吗

三面:
算法题:
1 项目介绍
Q:用户debias怎么做?
A:不同用户数据不一样,简单点可以根据用户数据的数量进行loss加权,后面可以用ppnet这种对每个用户进行千人千模

乘积最大的连续子数组 (代码有点问题,调试了半天,有点丢分)

反问

soul

一面
2022-04-06

链表奇数升序,偶数降序,将链表升序排列

算法题-30分钟

问题:
这个面试官比较偏技术,问了一些技术问题
1 多任务学习
1.1 share-bottom 升级到mmoe讲一下
A: 介绍了一下项目的背景
说要预估一个ctr、cvr分数,然后采用的是ESSM这种架构,自己说了下这里面主要的难点
一个是gate门输入,另一个是essm,修改损失函数,防止。

1.2 gate门没有用全部特征吧?
A: 用了一些跟任务相关性比较大的特征

1.3 你这个是做了数据分析了吧?
A: 没有,主要是根据经验选择了一些特征

1.4 为什么设计成多个专家的形式
A: 类似机器学习的bagging

1.5 怎么看每个专家学习了不同的知识?
A:看每个gate输出的分布,准确应该是看每个专家输出的分布

2 dssm

2.1 dssm 温度的参数是怎么调的?经验还是人工?
A:经验是小于1比较好, 给温度设置小一点,然后再用启发式调参,进行搜索

2.2 dssm用norm了吗,用norm好,还是不用norm好?
A: 用norm好

3 对比学习
3.1 对比学习怎么做的?
回答用dropout一些特征,然后增加一个辅助损失函数,计算dropout后的item与原item的相似度,这个dropout怎么做的?
回答随机挑一个特征

3.2 上面的方法,对于两个特征比较相似的情况会不会有问题?怎么解决?
比如两个统计特征,一个是7天点赞数,另一个是3天点赞数。dropout一个后,另一个还在发挥作用
A:这种随机掉一个,也能学习到一些东西,如果这个问题很严重,应该用精排一样,把特征筛一下

4 用户行为建模
4.1 我看你说了mind,说一下mind
介绍了一下mind的原理,说了他是根据聚类进行用户兴趣分离,分离线和线上如何把多个emb召回聚合

4.2 怎么建模短、中、长期用户行为序列?
A:用sim提取用户长期序列,然后用mind进行建模

4.3 sim消耗得比较多,怎么做一些工程上的优化?
A:用用户兴趣中心,把一写可以提前算得算好

5 精排
5.1 简历上的dcn介绍一下?
简单说了一些精排的历史,dcn对bite 维度进行交叉

二面
Q:介绍下你在那边的工作
A:介绍了下dssm召回

我说了下我们采样(batch 内负采样)
Q:你这有个问题,就是batch 内负采样会采出当前的正样本啊
A: 能采到样本,说明比较热门,使用pair wise的sampled softmax 损失函数,可以降低热门

Q:但是你这样只能说缓解,还没有真正解决这个问题
A:有个sampled softmax的采样公式。按那个采样。

Q:具体怎么采
A:忘了。

问题2:
Q:双塔对用户行为少的用户怎么处理?
A: 用GNN构图处理

Q:这样还是会存在节点的边比较少的情况,怎么处理?

A:加入用户行为长度的特征,做attention

问题3:
Q:双塔的底层的全连接能不能用来做召回?
A:

用户行为序列怎么建模的
Q:用户行为怎么建模?
A:使用self.attention,还可以做多兴趣建模?

Q:讲一些多兴趣模型
A:讲了mind

Q:用户兴趣个数怎么决定?
A:根据用户行为长度进行控制

Q:还可以怎么建模用户行为?

三面

反问环节:
1 soul推荐负责哪些场景
一个是广场(图文、视频、音乐都有)、匹配、直播间

2 对员工有什么期待?
2.1 希望、包容团队的多元性
2.2 希望成员做事之前有相关的数据分析,对结果有预期
2.3 最后还是会看成员的产出

字节

一面 2022-04-07 下午 14:00
上面没有自我介绍,直接问项目

Q:京东站外广告是干什么的?
A:讲了站外广告是干什么的

Q:说一下DSSM向量化召回
A:说了一下背景

Q:这个多任务学习怎么做的?
A:有四个塔,ctr、cvr分别进行serving,ctr、cvr交替进行训练

Q:用双塔还用了mmoe吗?
A:没用了

Q:为什么交替?
A:互相干扰,交替训练能减缓干扰

Q:(估计是没做过召回)dssm向量化召回怎么做的?
A:写了一下损失函数

Q:这个效果和根据人群标签扩展对比过吗?
A:(面试官怀疑这个和通投没啥区别),这个是和dmp进行对比过的

Q:做个ctr吗?比如特征或者模型一方面(应该是嫌项目技术比较简单了)
A:说了一下我的ctr笔记,说到了online learning

Q:online learning中有label 数据延迟怎么处理?
A:说了预估延迟的lable,比如给label分段成一小时、一小时-一天

Q:算出来的分数怎么用到ecmp中?
A:直接加起来

Q:怎么实现,用多任务学习吗?
A:对

算法题:
合并两个升序链表(很快写出)

oppo

2022-04-08 早上 11:00
一面
自我介绍

Q: 说一些基于dssm的召回
A: 讲了下项目的背景,智能定向的长期发展方向

Q:dmp召回和智能定向召回怎么合并的?
A:xxx

总体面试官比较关系整个链路的逻辑

Q:你的这个对比的base是啥?
A:回答跟以前的一些分支的base进行对比,计算的单元正向率

Q:单元正向率咋定义
A:回答了,后面得物app面试官告诉可能很多人不知道单元、dmp是啥意思

Q:GMV为啥涨了这么多?
A:(字节、小红书的面试官都问过这个问题,说明这个指标优化还是很明显)展现涨得不多,但是GMV涨了很多

Q:cvr涨了吗?
A:没看

Q:跟单逻辑怎么算的?
A:说了一下跟单逻辑

Q:说一下智能出价
A: 我这个比较简单,要不先说我现在怎么做的,然后说总结

Q:直接说总结吧
A:说了一堆总结的

给我介绍了用户增长:
用户增长分为拉新、老用户促活、活跃用户促消费
coding:
d = [[1, 2, 3], [2, 4, 5], [2, 3, 4]] , 笛卡尔积的个数

二面
Q:说一下智能出价?做了哪些比较有用的改进?
A:出价公式、cvr模型优化、ratio优化

Q:预算控制怎么做的?
A:预算控制按前一天的预算进行分配,然后平均到24小时

Q:有没有实时的预算控制,因为你按昨天的预算控制进行控制,今天的流量可能有变化
A:目前还没有做这个,因为主要还是靠调控那个ratio控制达成率
竞胜率 = 召回后,单元保留下来的概率
5分钟更新,一个广告单元,

一个小时100, 5:00-5:33 花了70, 前30加权pacing rate。
新一个小时分配:

根据历史消耗预估当前小时消耗, 根据前几个小时,5分钟竞胜率,反算净胜率, 预算反推竞胜率,

bid_riao小时级别调整

Q:大促的策略?
A:tcpa大促的策略? 大促有一套大促专门的调控策略

ratio优化:

三种控制:
预算
流量
bid_ration

超成本赔付调节标准:
2 跑了三天,8单。

得物

2022-04-08
一面
讲了召回后,

二面
面试官没

B站

一面:
代码题:编辑距离

二面:
两个数组排序数组中位数

小荷健康

一面
Q:挑一个你认为比较好的项目讲?
A:讲了dssm召回的背景

Q: 你这个是迭代几个版本?
A:还在做多兴趣的召回。解决多兴趣问题

Q:
A:

Q:不同分支队列长度怎么分的?
A:

Q:如何分析实验结果不符合预期,比如展现涨了、点击降了
A:看队列长度,看召回case

Q:那怎么解决?
A:加特征、损失函数、改模型
Q:如何判断该加特征还是改加损失函数,还是该改模型?

Q:为什么用DSSM?
A:有点是快、缺点是缺少item和user交叉

Q:双塔不能交叉,有什么解决思路吗?
A:使用图神经网络还有就是美团有篇论文尝试解决这个问题

Q:用户debias可以怎么做?
A:

代码题:
1 两个栈实现一个队列

2 编辑距离

Q:碰到过拟合和欠拟合吗?
A:碰到过
Q:怎么判断?
A:
Q:如何处理过拟合?
A:

Q:加数据怎么加,是无脑加吗?
A:根据实际的业务情况,假如一些更复杂的不同数据

二面:
coding:

  • 二叉搜索树搜索一个节点
1、 问题描述:已知一个词在网页中的m个有序位置信息(vector<int>),给定网页的n个顺序互斥的分段段落(vector<paragraph>),每个段落包含起始和结束信息,求这个词在分段段落的命中位置信息。​
2、 数据示例:​
a)      m个网页命中信息:[1,3 ,5 ,7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29] ​
b)     n个段落的起止信息:[[3,10] , [13,20] , [21,30] , [40, 50]]​
c)      输出:[3 5 7 9] [13 15 17 19] [21 23 25 27 29] []​
3、 要求:给出最优算法,并分析时间和空间复杂度,代码实现
  • m个有序数组查找top k(说思路)

YY直播

三面:
Q:dssm召回的策略为什么放在召回侧?
A:需要考虑这个问题

Q: 碰到的case? 召回排不上去怎么办?
A: boost 直接插到精排后

Q:boost会下掉嘛
A:积累数据后,精排能识别后,进行下线

滴答出行

2022-04-25

一面
Q:介绍一些你们组的业务,以及你在你们中的位置?
A:

其他都是比较常规的问题

有一个点,面试官想问,你用了LR模型,用了哪些特征,特征怎么处理的(特征工程能力)

我说这块做的比较浅跳过去了。

Q:强化学习怎么做的?
A:

Q:我看DSSM召回,这块做的也比较经典,你有什么心得嘛?
A:损失函数的选择、数据的选择

Q:损失函数怎么选择?
A:point wise、pair wise

Q:用户有哪些偏差?以及怎么消除这些偏差?

Q:你们那图怎么做的?
A:构图、然后使用graphsage进行训练,线上还是进行

coding:
编辑距离

bigo商业化

2022-04-25

一面:

Q:项目介绍
A:

Q:一些冷启动的单元怎么处理,可能我们希望冷启动的单元出去
A:使用EE模块,对冷启动单元进行探索,这块的话需要和粗排、精排、重排进行联合处理

其他:
博弈论 ABCD四个人分钱,A B C D轮流提议,提按需要半数以上人通过,没通过则提议的人会被杀掉。请问怎么分100块钱

反问:
Q:bigo站外广告商业化起步
A:去年起步

Q:bigo主要做啥业务
A: ai mei社交平台有2亿 日活,likee类似抖音, 千万日货、 bigo live直播业务

汇量科技

一面:
算法题:打印 1- n的 1的个数

二面
Q:介绍项目
Q:模型结构?
Q:用到的特征
A:性别、年龄、省份、城市、用户会员等级、用户购买力、用户行为序列
Q:这些特征都比较通用

Q:上线遇到什么困难?
A:emb比较集中,用损失函数解决

Q:强化学习怎么建模的seq
A:目前还没有考虑seq建模

强化学习这块需要改进一下简历

hr面
Q:你复盘后,觉得前几面有哪些面得好的,面的不好的

Q:你觉得入职京东后,觉得怎么样?

Q:学到了啥?

Q:是否单身?结婚?

Q:有哪些offer?汇量科技在你心目中的排序?

DI:
广告算法工程师
职级: 1 2 3 4
2-2,职业3个
base 34 * 15 = 51W

6月试用期,试用期不打折 公积金是12%

季度奖金 3W。

晋升:
一年两次

领导电话沟通:
Q:组内有哪些方向?哪些业务?
总部广州,mobivia、Mintegral
游戏类、工具类安装
流量来源全球,美国、日本

流量筛选、召回、粗排、精排

分工:召回、精排模型、机制策略、创意特征(视频特征) 新垂类(双垂类)

Q:物料库有多少?
A:盘子200W美金

Q:我进去做什么?
A:

Q:上下班时间?
10-8:30、双休 管3顿饭 10点。中午12 晚6点半

Q:入职时间

忘了问了:
团队有培训,日常分享嘛?

metaApp

Q:对比学习怎么做到的增加多样性?
A:这块需要改一下简历

Q:怎么分层?

一点资讯

Q:使用过分布式训练?

Q: 将项目,遇到的困难?

Q: coding
删除节点后,剩余树的个数

微博

一面

Q:过拟合怎么处理? L1和L2正则化为什么能处理过拟合?

Q: LR、SVM、决策树哪个对量纲不敏感

Q:BN参数有多少个,BN放在前面也可以,比如sigmiod函数放在之前,也能防止梯度消失
L1 和 L2 讲一下?通 BN放在前后,怎么选择的,sigmoid?
比如 输入100 * 5 , 输出100 , BN训练参数个数

Q

Q:基础知识

逆序对个数

二面
Q:你们预算没有一键平滑、一键消耗这个按钮嘛

Q:怎么做曝光量的预估?

合并两个有序链表

陈兆基:
先介绍背景

召回 精排 策略 画像 内容理解 10 10 10 10 10

微博老大问:
Q:组内有哪些组?具体多少人?最近招人是解决什么业务规划?目前召回基线是啥?

Q:领导风格?考核节奏?
A:

Q:您对员工成长支持有哪些举措?

Q:物料库有多少?

yeahmobi

一面

二面
Q: 精排和召回不一样的点?

Q:mome ctr训练数据多,cvr数据比较少,模型都被ctr数据主导,怎么处理的?

reward怎么定义 消耗不出去? BN 用过没有? 1 公司 受众扩展、ctr预估、cvr预估, 出价 2 国内的广告

试用期 80%,
960 北京260人

海外大媒体
游戏平台

要38k * 15

一些公司

微软,头条,美团,阿里,亚马逊,虾皮,hulu,快手,华为,百度,smartnews,newsbreak,freewheel,小红书,oppo,vivo,滴滴,微博,360

项目介绍

一定要把别人说清楚

梳理已经完成的项目,挖掘项目中自己的成长点&项目的亮点&难点,理清项目的背景、意义,待优化点。并完成第一版简历。

经验帖:
https://www.nowcoder.com/discuss/689718?source_id=discuss_experience_nctrack&channel=-1

阿里

本地生活二面
技术面

hr面:
1 你觉得入职京东,对你的影响有哪些?

2 你觉得生活或者技术上,你有没有特别喜欢的东西?

汽车之家

38 * 16 智能数据中心 商业智能部 (搜索 30 算法、工程 、广告、中台、()、)

亚马逊

oa: online assement

JD工作总结

写代码的逻辑
1、理解需求
2、写代码
3、如何测试我的代码?
4、代码上线后功能和非功能实现观察

如何调研一个新方向?
1 在谷歌上进行关键词搜索
2 知乎、微信上进行关键次搜索

论文阅读方法:
如SDM
• 任务是什么? 推荐召回任务,从几十亿商品中召回top-N个商品
• 输入输出是什么?user profile info,item sequence,item id,shop id,brand id etc
• 有什么限制场景?暂无
• 是否是新问题?
○ 是的话,问题价值背景意义是什么?
○ 不是的话,本文的motivation是什么?
本篇文章是CIKM2019,作者argue当前推荐召回模型都是基于item CF,这种静态兴趣表征不足以表达用户动态兴趣,因此考虑引入用户长期历史行为序列。

关于晋升述职:
1、说清楚事情的背景、难点、解决了什么问题

描述好问题,业界很通用的问题,把评委带入情景,描述好问题的难度
把评委想到的方法和没想到的放大

描述好目标

怎么做的

结果
数字上的效果

  • 29
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值