桔厂人工智能实验室实习记——小打小闹,沾沾自喜

大半年没写东西了,写写前段时间在滴滴AI Labs实习的一些感想吧。去年十一月初入职,今年三月底离职,时间不短但是具体的体验经历用八个字便足以概括,见本文标题。

期间都做了哪些项目?

接触了三个项目,逐个说吧。

第一个项目——Dayone,进组的第一周就开始做的项目,终极目标是提高用户的留存率,思路是找到乘客和司机活跃度下降的原因,然后针对性地采取措施去解决问题。一开始做的时候一脸懵逼,根本不知道自己在干什么,后来才逐渐意识到,这本质上是在做精细化运营。滴滴平台上的乘客和司机千千万万,行为模式和习惯偏好各不相同,不能一概而论,要做精细化自然免不了要去聚类,即用户分层。要做聚类,首先需要回答两个问题——用什么特征来聚类;用什么算法来聚类。

针对后一个问题,我们用的一直是NMF(非负矩阵分解)算法。针对前一个问题,起初用的是业界常见的RFM模型,本质上是用原数据生成hand-craft的特征,通过定义recency/ frequency/ monetary三个概念来从用户的时间序列数据里依照最大值、最小值和平均值来生成特征。在后期发现这种做法提取出来的信息过于粗糙,于是决定使用无监督的Autoencoder来自动提取特征,因为处理的数据具有时间序列属性,所以encoder和decoder的部分采用的都是LSTM模型。从这个项目起我意识到,多数项目的思路其实都是「发现问题 >>> 采用业务抓手解决问题」。

第二个项目——CPO看板,主要目的是降低CPO(cost per order)。滴滴平台每天完成几千万订单,交易完成后有纠纷是非常正常的事情,可能是乘客投诉司机,可能是司机投诉乘客,也有可能是乘客司机对平台不满直接投诉滴滴客服,而人工处理这些投诉的成本是非常高的。针对这个问题,CPO看板项目的思路有两点:尽可能减少投诉的发生;尽可能地使用自动化的方式处理投诉而不必转接人工服务。

要做这件事情,首先得对所有的投诉工单进行梳理和分类,进行根因分析,然后针对每个场景下的投诉去找到相关的订单特征表,最后用这些特征来预测每个订单产生投诉的可能性。这个工作量是很大的,一方面是工单涉及的场景很多很杂(下面简单列举了一些),另一方面是很难找到针对特定场景下的订单特征(如果实在找不到就得从客服的聊天记录里靠文本挖掘技术来提取),即便找到了也可能因为各业务线之间的数据表没有打通而使用不了。

\begin{cases} 费用异议 \begin{cases} 多收附加费 \begin{cases} 订单实际产生附加费\\ 订单实际未产生附加费\end{cases} \\ 未及时结束计费\\ 提前开始计费 \begin{cases} 司机原因 \begin{cases} 行程未开始,未到达指定地点,提前开始计费\\ 接错客人,回头接客,超时提前开始计费 \end{cases} \\ 乘客原因 \begin{cases} 迟到超时,提前开始计费\\ 找不到定位位置,超时提前计费\end{cases} \\ \end{cases} \\ 天价订单\\...\\ \end{cases}\\ 司机绕路\\ 司机随意修改座位数\\ 乘客更改目的地\\ ...\\ \end{cases}

第三个项目——招行排班系统,这个和滴滴的业务没什么关系,是招商银行的人花钱请我们组去设计一个智能的排班系统,其中的一个任务是预测未来的业务流量大小。抛开业务逻辑不说,这是一个单变量时间序列预测问题,需要使用当前的数据去一次性预测未来一个月内每隔半小时的流量,典型的multi-step forecasting。

这任务的难点有两个,一是这个时间序列的波动非常剧烈,在每个交易结算时间点都能明显看到曲线的激增,二是模型可以使用的特征只有一个,虽然可以加入是否为周末这样的变量,但对于性能提升帮助不大。我和隔壁组同事一块做这个项目,他主要用Facebook的Prophet模型,我主要用TensorFlow写seq2seq LSTM。两个人都挺辛苦的,有一次半夜两点多我给他发去消息“你觉得这拟合得怎么样?”,以为他已经睡了,没想到对方秒回,“我觉得还行”。。

我参与的这三个项目都没能做到有始有终,第一个项目是因为业务方的同学把精力放到了其他项目上,就把设计实验做AB test给搁置了(不做实验看反馈效果的话那我对数据进行根因分析有啥意义??);第二个是因为项目没有正式立项(说服公司高管这件事情值得做),并且当时滴滴正在大规模裁员,大家都没什么心情好好做事;第三个是因为我要回学校准备毕业论文了就没有再跟下去。总的来说很遗憾,实习结束后,没有一项完整的成果可以拿出手,也没法说我给公司创造了多大多大的价值(收益评估是一件很重要但也很困难的事情)。

「人工智能实验室」听起来好像很厉害?

追赶潮流而已。滴滴AI Labs是去年一月份成立的,这些年AI很火,BATJ联想华为科大都有自己的AI实验室,滴滴不成立个名字里带有AI的部门真是说不过去。其实滴滴从诞生的那天起就天然地是一家人工智能公司,乘客发单前的预测目的地和推荐上车点,发单后的智能派单、预估到达时间和路径规划,都大量地使用了人工智能技术,只不过以前没有专门起AI这个名字罢了。

桔厂人工智能实验室实习记——小打小闹,沾沾自喜_第1张图片
AI Labs

我粗略的理解是,人工智能约等于深度学习加强化学习。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的了解也比以前深了不少;比方说对做聚类和降维更有经验了。但是总的来说还是学得不够。

工作很繁琐,可支配的学习时间其实并不多,学习的效率也并不高。因为我在大学里学的数学和统计已经丢了大半了,代码功夫也处于初学者的水平,所以有非常多的知识盲点。我觉得要想做到边工作边学习,至少应该掌握足够的基础知识才行,自己的知识体系得是完整的,哪怕很小很窄,也至少得是自恰的、逻辑完备的,而我目前空有一个破败的框架,没有东西在里面。

每天下班之后都很累(这很奇怪,明明这一天工作也没干多少内容),好几次在班车上睡着,回到家就是搞留学申请,所以也就没有再接着学了。是谁说的鸡汤来着,“人和人之间的差距是从下班之后开始的”,反正我是做不到。

为什么说是在小打小闹沾沾自喜?

因为我非常轻易就感到满足。写出一个完整的小模型就能够嘚瑟好一阵子,其实在旁人看来都是非常简单幼稚的东西;读完了一篇