大半年没写东西了,写写前段时间在滴滴AI Labs实习的一些感想吧。去年十一月初入职,今年三月底离职,时间不短但是具体的体验经历用八个字便足以概括,见本文标题。
期间都做了哪些项目?
接触了三个项目,逐个说吧。
第一个项目——Dayone,进组的第一周就开始做的项目,终极目标是提高用户的留存率,思路是找到乘客和司机活跃度下降的原因,然后针对性地采取措施去解决问题。一开始做的时候一脸懵逼,根本不知道自己在干什么,后来才逐渐意识到,这本质上是在做精细化运营。滴滴平台上的乘客和司机千千万万,行为模式和习惯偏好各不相同,不能一概而论,要做精细化自然免不了要去聚类,即用户分层。要做聚类,首先需要回答两个问题——用什么特征来聚类;用什么算法来聚类。
针对后一个问题,我们用的一直是NMF(非负矩阵分解)算法。针对前一个问题,起初用的是业界常见的RFM模型,本质上是用原数据生成hand-craft的特征,通过定义recency/ frequency/ monetary三个概念来从用户的时间序列数据里依照最大值、最小值和平均值来生成特征。在后期发现这种做法提取出来的信息过于粗糙,于是决定使用无监督的Autoencoder来自动提取特征,因为处理的数据具有时间序列属性,所以encoder和decoder的部分采用的都是LSTM模型。从这个项目起我意识到,多数项目的思路其实都是「发现问题 >>> 采用业务抓手解决问题」。
第二个项目——CPO看板,主要目的是降低CPO(cost per order)。滴滴平台每天完成几千万订单,交易完成后有纠纷是非常正常的事情,可能是乘客投诉司机,可能是司机投诉乘客,也有可能是乘客司机对平台不满直接投诉滴滴客服,而人工处理这些投诉的成本是非常高的。针对这个问题,CPO看板项目的思路有两点:尽可能减少投诉的发生;尽可能地使用自动化的方式处理投诉而不必转接人工服务。
要做这件事情,首先得对所有的投诉工单进行梳理和分类,进行根因分析,然后针对每个场景下的投诉去找到相关的订单特征表,最后用这些特征来预测每个订单产生投诉的可能性。这个工作量是很大的,一方面是工单涉及的场景很多很杂(下面简单列举了一些),另一方面是很难找到针对特定场景下的订单特征(如果实在找不到就得从客服的聊天记录里靠文本挖掘技术来提取),即便找到了也可能因为各业务线之间的数据表没有打通而使用不了。
第三个项目——招行排班系统,这个和滴滴的业务没什么关系,是招商银行的人花钱请我们组去设计一个智能的排班系统,其中的一个任务是预测未来的业务流量大小。抛开业务逻辑不说,这是一个单变量时间序列预测问题,需要使用当前的数据去一次性预测未来一个月内每隔半小时的流量,典型的multi-step forecasting。
这任务的难点有两个,一是这个时间序列的波动非常剧烈,在每个交易结算时间点都能明显看到曲线的激增,二是模型可以使用的特征只有一个,虽然可以加入是否为周末这样的变量,但对于性能提升帮助不大。我和隔壁组同事一块做这个项目,他主要用Facebook的Prophet模型,我主要用TensorFlow写seq2seq LSTM。两个人都挺辛苦的,有一次半夜两点多我给他发去消息“你觉得这拟合得怎么样?”,以为他已经睡了,没想到对方秒回,“我觉得还行”。。
我参与的这三个项目都没能做到有始有终,第一个项目是因为业务方的同学把精力放到了其他项目上,就把设计实验做AB test给搁置了(不做实验看反馈效果的话那我对数据进行根因分析有啥意义??);第二个是因为项目没有正式立项(说服公司高管这件事情值得做),并且当时滴滴正在大规模裁员,大家都没什么心情好好做事;第三个是因为我要回学校准备毕业论文了就没有再跟下去。总的来说很遗憾,实习结束后,没有一项完整的成果可以拿出手,也没法说我给公司创造了多大多大的价值(收益评估是一件很重要但也很困难的事情)。
「人工智能实验室」听起来好像很厉害?
追赶潮流而已。滴滴AI Labs是去年一月份成立的,这些年AI很火,BATJ联想华为科大都有自己的AI实验室,滴滴不成立个名字里带有AI的部门真是说不过去。其实滴滴从诞生的那天起就天然地是一家人工智能公司,乘客发单前的预测目的地和推荐上车点,发单后的智能派单、预估到达时间和路径规划,都大量地使用了人工智能技术,只不过以前没有专门起AI这个名字罢了。
我粗略的理解是,人工智能约等于深度学习加强化学习。Python语言的易学以及各种好用的开源框架的推出,让人工智能的准入门槛变得很低,让包括我在内的大批人涌入到这个行业里,不过最终一个人能够走得多远,还是得看综合实力。
滴滴的资源怎么样?
- 数据资源。「数据驱动」一直是滴滴的信条,数据是滴滴最重要的资源,公司的数据仓库和数据平台建设得很完善,仓库里大概存了十万张Hive表,覆盖专车快车豪华车企业级代驾公交等各个业务线,订单表、工单表、轨迹表、乘客表、司机表等各种各样的表建立起庞大的上下游依赖关系,多数Hive表以日作为分区每天更新。所以现在关键的问题便是,怎么从这海量的数据里挖掘出价值?
- 计算资源。这可能是我离开滴滴之后最想念的东西了。滴滴的服务器集群非常庞大,我们组人均配备一台20核CPU/ 256G内存/ NVIDIA Tesla P40显卡的高性能机器,有特别需求的话还可以申请4显卡环境,每天在这样优越的物理环境里处理数据好不快活,20G的CSV表用pandas一口气读进来毫不费劲,在GPU上跑TensorFlow快得飞起。离职以后便一贫如洗,自己只剩得一台笔记本,拿来跑深度学习可以说是白日做梦了。
- 讲座分享。滴滴学院每隔一段时间就会请业界和学界的大咖来做专题分享,上班的时候大家常见的反应是“啊?今天又有讲座啊?我前两天才听了一场”。印象中我参加了四场,听深度学习三巨头之一的Yoshua Bengio(上个月刚拿了图灵奖)讲意识、认知和因果,听亚马逊AWS的工程师讲大规模计算机视觉的应用,听南加大的教授讲带可解释性的前馈神经网络,听滴滴地图部的算法工程师同学讲强化学习。我觉得听讲座倒不是为了学到什么干货硬知识(不如自己看书),而是为了看看前沿领域都在做些什么、在思考些什么,听听行业资深人士的观点和他们的趣闻轶事,以及调节放松一下自己,找找灵感,还有便是为了在未来的某一天里突然想起“噢这玩意儿我以前听过接触过,我有印象”。
团队成员怎么样?
我在统计学习组,同级的有数据挖掘组、认知架构组和强化学习组,都是统计认知组下的分组。绝大多数员工都是硕士以上学历,博士很常见,专业大多是CS和统计,我是为数不多的本科生(除我之外只知道还有一个清华数学系的妹子),经济学这个专业也不太对口,所以能进组里全凭运气好。。
我们组总共十个人,4个full-time和6个intern(3北大+2港科大+我)。老板在美国念了十年书,拿了数学和统计两个PhD,是个很有人格魅力的人,聪明谦逊、风趣幽默,表达能力奇好,能从一堆乱七八糟的结果里很快地看出规律并给出一个合理的解释,懂得和各类人群交流,对技术同事讲各种模型的原理应用,对非技术同事便讲浅显易懂的大白话,厉害又好相处,和老板下属打成一片。
有一次在小组分享的时候,他用几行公式把PCA, SVD, NMF, Dictionary Learning和Auto-encoder这些概念和模型都给串联起来,逻辑之顺畅,链条之完备,令人赞叹。问他怎么做到的,答道“等你以后接触得多了,你会发现这些东西其实都是一回事儿”,这让我想起了张无忌在练成了九阳神功和乾坤大挪移之后说的,“天下武功,本是一家,分门别派,乃是人为”,越是厉害的人越能看到事物的共性。
我一直在自学数据科学,有很多的盲区和死角。我老板算是我的第二位职业导师(第一位是学校里教我《数据挖掘》的马老师),倒不是教给了我很多的知识,而是指出我的不足和改进调整的方向,提供方法论。他常说看到我像是看到了当年的自己,转专业,底子薄,但是很好学,“你和我之间就差十年时间”。不过十年后我究竟能进步到什么程度,谁知道呢。
除了老板之外,同级里最厉害的应该是隔壁组郑嘉小哥哥和我们组宋歌小姐姐。对于嘉哥,我一直有三个疑惑,“他哪儿来的时间??他哪儿来的精力??他怎么什么都会??”。同时参与四个项目,每周的产出量很大,写代码速度极快且整洁漂亮,工程实现能力很强以至于其他组同事有工程上的问题都需要来拜托他帮忙;思维敏捷,基本上你刚提完一个问题他就能够回应好几种可行的解决方案。当然最让我印象深刻的还是他的工作状态,永远兴奋而不知疲倦,永远热情地和别人交流讨论,用组里同事安澜的话来说就是,“感觉嘉哥每天都磕了药来上班”。
每个同事都有值得学习的地方,就不一一说了。组里有时候会有下面这样的对话,
小邓 (北大统计科学中心妹子):你怎么不来北大学数学呀?
陈岭 (清华数学系妹子):我也想去,可是我考不上耶。
我 (某知名211大学汉子):你们住嘴…
能不能做到边上班边学习?
勉勉强强,做得不好。基础不牢,地动山摇。学到了一些东西,比方说入职第一周学了Linux的基本操作,懂得在隔离环境里用命令行操作机器了,对鼠标的使用越来越少;比方说TensorFlow和Keras的熟练程度提高了,对RNN的了解也比以前深了不少;比方说对做聚类和降维更有经验了。但是总的来说还是学得不够。
工作很繁琐,可支配的学习时间其实并不多,学习的效率也并不高。因为我在大学里学的数学和统计已经丢了大半了,代码功夫也处于初学者的水平,所以有非常多的知识盲点。我觉得要想做到边工作边学习,至少应该掌握足够的基础知识才行,自己的知识体系得是完整的,哪怕很小很窄,也至少得是自恰的、逻辑完备的,而我目前空有一个破败的框架,没有东西在里面。
每天下班之后都很累(这很奇怪,明明这一天工作也没干多少内容),好几次在班车上睡着,回到家就是搞留学申请,所以也就没有再接着学了。是谁说的鸡汤来着,“人和人之间的差距是从下班之后开始的”,反正我是做不到。
为什么说是在小打小闹沾沾自喜?
因为我非常轻易就感到满足。写出一个完整的小模型就能够嘚瑟好一阵子,其实在旁人看来都是非常简单幼稚的东西;读完了一篇,正得意,一扭头看到了坐在身旁的小邓起码已经读了50篇paper,上面都是密密麻麻的笔记;部门里另外一个组的实习生,甚至已经发了篇顶会paper:
这感觉就像是,我作为一个门外汉对某个精致的东西说“哇,这个好厉害呀”,而身旁的人淡淡说了句“这个玩意儿太差劲了,我做了个更好的”。我在浅水里扑腾了太久,根本不知道外面的世界都发生了些什么。
对于很多概念和模型都只有非常浅的认知:survival analysis,我不会;graph convolutional network,我连傅里叶变换都不懂怎么可能会这个;deep reinforcement learning,每周都会有同学去做pre,而我连基本的数据怎么simulate都不会;recommendation system,大老板花了一星期梳理了这一领域里最重要的文献,而我没有学;Spark/ Hadoop,周围人每天都在反复地提及,我不会;text mining/ topic model,除了知道要估计一个主题矩阵A以外我一无所知。again,基础不牢,地动山摇。
浸泡在一个整日都能听到各种高大上的技术概念的环境里,让我有了种莫名其妙的优越感,但其实这都是虚的。只有自己踏踏实实地把技能给掌握了以后才是真正属于自己的,到那个时候才有资格有底气和别人谈笑风生。
对这份实习有什么遗憾或者对自己/对公司有什么不满意的地方?
有很多很多。
- 没有和PM、设计师们多进行交流合作,自己一个人沉浸在模型算法的世界里,变得很偏激和狭隘,以为技术至上,实际上是在自以为是。
- 没怎么读paper,有问题都是直接Google查文档和博客,然后东拼西凑地找出解决办法,对问题没有很深层次的认识了解。
- 实习期间正好是出国申请季,太忙碌了,要到处搜索信息去了解每个专业每个项目,改文书改推荐信改简历,整体工作量很大(1月15日有六个项目同时deadline于是自己通宵到下午两点这种苦逼经历就不多说了。。),所以没有一门心思地放到实习上,还是兼顾不过来吧。
- 工作模式是我来之前没想到的,原以为会是团队成员团结协作一块儿忙一个项目,但实际上是每个人负责一个项目,大家项目各不相同,所以日常是大家的交流并不多,各干各的。当然可以简单地聊聊项目进度,用了什么方法和思路之类的,可是,参加过kaggle的都知道,The devil is in the details,机器学习相关的项目大体上都是「定义问题与指标>>获取数据>>特征工程>>构建模型>>评估」这样的思路,只聊框架上的问题并没有太大的帮助,真正重要的是在亲身参与项目进行实践时所遇到的细节问题,这些都是书上看不来的,正是打磨细节才使得这份经历变得宝贵。我在公司里感到最快乐的时刻,从来都是和别人讨论的时候,但这样的时刻并不太多。
- 上面说了,做的项目都没能有始有终,没有实际的能带来收益的产出。
- 学会的东西太少,进步太慢...
以后还会回滴滴工作吗?
会考虑,但不是优先,主要还是想多体验体验不同的公司和工作环境。如果有机会回滴滴的话,希望能够去地图事业部、智能出行部、交易引擎部这样的核心部门,在北京这种常住人口超过2000万的特大城市里进行平台运算处理,乘客发起订单后怎么和司机匹配,怎么让更多的人更快地打到车,怎么预测每个区域未来几个小时内的供需情况,怎么规划行驶路径,怎么应对海量的数据和复杂的路网,都是很有挑战的任务。想起大老板朱老师的话:
只有challenging的东西才能够让我兴奋起来。
实习还有哪些收获和感想?
- 定义指标很困难,一个明确的问题永远比一个模糊的问题好解决,比如说Dayone项目想要找出用户活跃度下降的原因,可实际上我们花了很多很多的时间在纠结和讨论“到底该怎么定义用户活跃度?”。
- 要尽可能地做一个问题导向的人,时刻牢记自己当前要解决的问题是什么,想要实现什么样的效果,不要把重心都放在自己将使用的模型和算法上,避免陷入到工具主义里。
- 对于任何一个问题,我们都没法事先知道究竟什么模型才是有效的,尽管丰富的从业经验能够告诉你哪一类模型很有可能管用,但你终究还是需要把各式各样的模型都给试一遍,所以老板常说“要尽可能多地去学习掌握模型”。
- 写文档很重要。开会不做会议纪要等于没开;做项目不写文档既不利于其他人参与分析,又不利于自己的梳理总结。
- 表达能力极其重要,不管你是做RD还是做PM。
- 最困难的事情,同时也是一个人的核心竞争力,我认为是multi-task的能力。这个世界上只有少数内容是你无论如何努力和付出都无法理解和掌握的,而绝大多数的内容,都是只要你肯花时间愿意投入精力,便能够摸着门道。那么问题来了,你能学会,别人也能学会,差距在哪儿呢?差距便在于在相同的时间内谁能够掌握更多的内容。认为别人一天有24小时,我也有24小时,其实是一种错觉,在高效率的加持和对暗时间的开发下,别人一天的有效时间完全有可能是我的几倍,总产出也因此远多于我。所以,表达能力要练,业务嗅觉要练,技术能力也要练,能够都练出来的人,自然能走得很远。
后记
在滴滴实习了很长一段时间,要说实力有大幅度提升倒也没有,主要还是在体验生活,提前感受未来的工作状态,确认这是不是自己真正喜欢做的事情。很多东西都像是播下了一粒粒的种子,等着在未来的某一天里生根发芽。