美团网站的数æ®æœç´¢æŽ’åºè§£å†³æ–¹æ¡ˆç²¾åŽåˆ†äº«
一ã€çº¿ä¸Šç¯‡
  éšç€ä¸šåŠ¡çš„å‘展,美团的商家和团è´æ•°æ£åœ¨é£žé€Ÿå¢žé•¿ã€‚这一背景下,æœç´¢æŽ’åºçš„é‡è¦æ€§æ˜¾å¾—æ›´åŠ çªå‡ºï¼šæŽ’åºçš„优化能帮助用户更便æ·åœ°æ‰¾åˆ°æ»¡è¶³å…¶éœ€æ±‚的商家和团è´ï¼Œæ”¹è¿›ç”¨æˆ·ä½“验,æå‡è½¬åŒ–效果。
ã€€ã€€å’Œä¼ ç»Ÿç½‘é¡µæœç´¢é—®é¢˜ç›¸æ¯”,美团的æœç´¢æŽ’åºæœ‰è‡ªèº«çš„特点——90%的交易å‘生在移动端。一方é¢ï¼Œè¿™å¯¹æŽ’åºçš„个性化æ出了更高的è¦æ±‚,例如在“ç« é”…”查询下,北京五é“å£çš„ç«é”…店A,对在五é“å£çš„用户U1æ¥è¯´æ˜¯å¥½çš„结果,对在望京的用户U2æ¥è®²ä¸ä¸€å®šæ˜¯å¥½çš„结果;å¦ä¸€æ–¹é¢ï¼Œæˆ‘们由æ¤ç§¯ç´¯äº†ç”¨æˆ·åœ¨å®¢æˆ· 端上丰富准确的行为,ç»åˆ†æžèŽ·å¾—用户的地ç†ä½ç½®ã€å“ç±»å’Œä»·æ ¼ç‰å好,进而指导个性化排åºã€‚
  针对美团的O2O业务特点,我们实现了一套æœç´¢æŽ’åºæŠ€æœ¯æ–¹æ¡ˆï¼Œç›¸æ¯”规则排åºæœ‰ç™¾åˆ†ä¹‹å‡ åçš„æå‡ã€‚基于这一方案,我们åˆæŠ½è±¡äº†ä¸€å¥—通用的O2O排 åºè§£å†³æ–¹æ¡ˆï¼Œåªéœ€1-2天就å¯ä»¥å¿«é€Ÿåœ°éƒ¨ç½²åˆ°å…¶ä»–产å“å’Œå行业ä¸ï¼Œç›®å‰åœ¨çƒè¯ã€Suggestionã€é…’店ã€KTVç‰å¤šä¸ªäº§å“å’Œå行业ä¸åº”用。
  我们将按线上和线下两部分分别介ç»è¿™ä¸€é€šç”¨O2O排åºè§£å†³æ–¹æ¡ˆï¼Œæœ¬æ–‡æ˜¯çº¿ä¸Šç¯‡ï¼Œä¸»è¦ä»‹ç»åœ¨çº¿æœåŠ¡æ¡†æž¶ã€ç‰¹å¾åŠ è½½ã€åœ¨çº¿é¢„ä¼°ç‰æ¨¡å—,下篇将会ç€é‡ä»‹ç»ç¦»çº¿æµç¨‹ã€‚
  排åºç³»ç»Ÿ
  为了快速有效的进行æœç´¢ç®—法的è¿ä»£ï¼ŒæŽ’åºç³»ç»Ÿè®¾è®¡ä¸Šæ”¯æŒçµæ´»çš„A/B测试,满足准确效果追踪的需求。
  美团æœç´¢æŽ’åºç³»ç»Ÿå¦‚上图所示,主è¦åŒ…括离线数æ®å¤„ç†ã€çº¿ä¸ŠæœåŠ¡å’Œåœ¨çº¿æ•°æ®å¤„ç†ä¸‰ä¸ªæ¨¡å—。
  离线数æ®å¤„ç†
  HDFS/Hive上å˜å‚¨äº†æœç´¢å±•ç¤ºã€ç‚¹å‡»ã€ä¸‹å•å’Œæ”¯ä»˜ç‰æ—¥å¿—。离线数æ®æµç¨‹æŒ‰å¤©è°ƒåº¦å¤šä¸ªMap Reduce任务分æžæ—¥å¿—,相关任务包括:
  离线特å¾æŒ–掘
  产出Deal(团è´å•)/POI(商家)ã€ç”¨æˆ·å’ŒQueryç‰ç»´åº¦çš„特å¾ä¾›æŽ’åºæ¨¡åž‹ä½¿ç”¨ã€‚
  数æ®æ¸…æ´—æ ‡æ³¨ & 模型è®ç»ƒ
  数æ®æ¸…洗去掉爬虫ã€ä½œå¼Šç‰å¼•å…¥çš„è„æ•°æ®;清洗完的数æ®ç»è¿‡æ ‡æ³¨åŽç”¨ä½œæ¨¡åž‹è®ç»ƒã€‚
  效果报表生æˆ
  统计生æˆç®—æ³•æ•ˆæžœæŒ‡æ ‡ï¼ŒæŒ‡å¯¼æŽ’åºæ”¹è¿›ã€‚
  特å¾ç›‘控
  特å¾ä½œä¸ºæŽ’åºæ¨¡åž‹çš„输入是排åºç³»ç»Ÿçš„基础。特å¾çš„错误异常å˜åŠ¨ä¼šç›´æŽ¥å½±å“排åºçš„效果。特å¾ç›‘控主è¦ç›‘控特å¾è¦†ç›–率和å–值分布,帮我们åŠæ—¶å‘现相关问题。
  在线数æ®å¤„ç†
  和离线æµç¨‹ç›¸å¯¹åº”,在线æµç¨‹é€šè¿‡Storm/Spark Streamingç‰å·¥å…·å¯¹å®žæ—¶æ—¥å¿—æµè¿›è¡Œåˆ†æžå¤„ç†ï¼Œäº§å‡ºå®žæ—¶ç‰¹å¾ã€å®žæ—¶æŠ¥è¡¨å’Œç›‘控数æ®ï¼Œæ›´æ–°åœ¨çº¿æŽ’åºæ¨¡åž‹ã€‚
  在线æœåŠ¡(Rank Service)
  Rank Service接到æœç´¢è¯·æ±‚åŽï¼Œä¼šè°ƒç”¨å¬å›žæœåŠ¡èŽ·å–候选POI/Deal集åˆï¼Œæ ¹æ®A/B测试é…置为用户分é…排åºç–ç•¥/模型,应用ç–ç•¥/模型对候选集åˆè¿›è¡ŒæŽ’åºã€‚
  下图是Rank Service内部的排åºæµç¨‹ã€‚
  L1 粗粒度排åº(快速)
  使用较少的特å¾ã€ç®€å•çš„模型或规则对候选集进行粗粒度排åºã€‚
  L2 细粒度排åº(较慢)
  对L1排åºç»“果的å‰N个进行细粒度排åºã€‚这一层会从特å¾åº“åŠ è½½ç‰¹å¾(通过FeatureLoader),应用模型(A/B测试é…置分é…)进行排åºã€‚
  L3 业务规则干预
  在L2排åºçš„基础上,应用业务规则/人工干预对排åºè¿›è¡Œé€‚当调整。
  Rank Service会将展示日志记录到日志收集系统,供在线/离线处ç†ã€‚
  A/B测试
  A/B测试的æµé‡åˆ‡åˆ†æ˜¯åœ¨Rank Server端完æˆçš„ã€‚æˆ‘ä»¬æ ¹æ®UUID(ç”¨æˆ·æ ‡è¯†)å°†æµé‡åˆ‡åˆ†ä¸ºå¤šä¸ªæ¡¶(Bucket),æ¯ä¸ªæ¡¶å¯¹åº”一ç§æŽ’åºç–略,桶内æµé‡å°†ä½¿ç”¨ç›¸åº”çš„ç–略进行排åºã€‚使用UUID进行æµé‡åˆ‡åˆ†ï¼Œæ˜¯ä¸ºäº†ä¿è¯ç”¨æˆ·ä½“验的一致性。
  下é¢æ˜¯A/B测试é…置的一个简å•ç¤ºä¾‹ã€‚
  代ç 如下:
  {
  "search": {
  "NumberOfBuckets": 100,
  "DefaultStrategy": "Base",
  "Segments": [
  {
  "BeginBucket": 0,
  "EndBucket": 24,
  "WhiteList": [123],
  "Strategy": "Algo-1"
  },
  {
  "BeginBucket": 25,
  "EndBucket": 49,
  "WhiteList": [],
  "Strategy": "Algo-2"
  }
  ]
  }
  }
  对于ä¸åˆæ³•çš„UUID,æ¯æ¬¡è¯·æ±‚会éšæœºåˆ†é…一个桶,以ä¿è¯æ•ˆæžœå¯¹æ¯”ä¸å—å½±å“。白åå•(White List)机制能ä¿è¯é…置用户使用给定的ç–略,以辅助相关的测试。
  除了A/B测试之外,我们还应用了Interleaving[7]方法,用于比较两ç§æŽ’åºç®—法。相较于A/B测试,Interleavingæ–¹ 法对排åºç®—法更çµæ•ï¼Œèƒ½é€šè¿‡æ›´å°‘çš„æ ·æœ¬æ¥æ¯”较两ç§æŽ’åºç®—法之间的优劣。Interleaving方法使用较å°æµé‡å¸®åŠ©æˆ‘们快速淘汰较差算法,æ高ç–ç•¥è¿ä»£ 效率。
  特å¾åŠ è½½
  æœç´¢æŽ’åºæœåŠ¡æ¶‰åŠå¤šç§ç±»åž‹çš„特å¾ï¼Œç‰¹å¾èŽ·å–和计算是Rank Serviceå“应速度的瓶颈。我们设计了FeatureLoader模å—ï¼Œæ ¹æ®ç‰¹å¾ä¾èµ–关系,并行地获å–和计算特å¾ï¼Œæœ‰æ•ˆåœ°å‡å°‘了特å¾åŠ 载时间。实际业 务ä¸ï¼Œå¹¶è¡Œç‰¹å¾åŠ 载平å‡å“应时间比串行特å¾åŠ 载快约20毫秒。
  FeatureLoader的实现ä¸æˆ‘们使用了Akka[8]。如上图所示,特å¾èŽ·å–和计算的被抽象和å°è£…为了若干个Akka actor,由Akka调度ã€å¹¶è¡Œæ‰§è¡Œã€‚
  特å¾å’Œæ¨¡åž‹
  美团从2013å¹´9月开始在æœç´¢æŽ’åºä¸Šåº”用机器å¦ä¹ 方法(Learning to Rank),并且å–得很大的收益。这得益于准确的数æ®æ ‡æ³¨ï¼šç”¨æˆ·çš„点击下å•æ”¯ä»˜ç‰è¡Œä¸ºèƒ½æœ‰æ•ˆåœ°åæ˜ å…¶å好。通过在特å¾æŒ–掘和模型优化两方é¢çš„å·¥ä½œï¼Œæˆ‘ä»¬ä¸ æ–地优化æœç´¢æŽ’åºã€‚下é¢å°†ä»‹ç»æˆ‘们在特å¾ä½¿ç”¨ã€æ•°æ®æ ‡æ³¨ã€æŽ’åºç®—法ã€Position Bias处ç†å’Œå†·å¯åŠ¨é—®é¢˜ç¼“解ç‰æ–¹é¢çš„工作。
  特å¾
  从美团业务出å‘,特å¾é€‰å–ç€çœ¼äºŽç”¨æˆ·ã€Queryã€Deal/POIå’Œæœç´¢ä¸Šä¸‹æ–‡å››ä¸ªç»´åº¦ã€‚
  用户维度
  包括挖掘得到的å“ç±»å好ã€æ¶ˆè´¹æ°´å¹³å’Œåœ°ç†ä½ç½®ç‰ã€‚
  Query维度
  包括Query长度ã€åŽ†å²ç‚¹å‡»çŽ‡ã€è½¬åŒ–率和类型(商家è¯/å“ç±»è¯/åœ°æ ‡è¯)ç‰ã€‚
  Deal/POI维度
  包括Deal/POI销é‡ã€ä»·æ ¼ã€è¯„ä»·ã€æŠ˜æ‰£çŽ‡ã€å“类和历å²è½¬åŒ–率ç‰ã€‚
  上下文维度
  包括时间ã€æœç´¢å…¥å£ç‰ã€‚
  æ¤å¤–,有的特å¾æ¥è‡ªäºŽå‡ 个维度之间的相互关系:用户对Deal/POI的点击和下å•ç‰è¡Œä¸ºã€ç”¨æˆ·ä¸ŽPOIçš„è·ç¦»ç‰æ˜¯å†³å®šæŽ’åºçš„é‡è¦å› ç´ ;Queryå’ŒDeal/POI的文本相关性和è¯ä¹‰ç›¸å…³æ€§æ˜¯æ¨¡åž‹çš„关键特å¾ã€‚
  模型
  Learning to Rank应用ä¸ï¼Œæˆ‘们主è¦é‡‡ç”¨äº†Pointwise方法。采用用户的点击ã€ä¸‹å•å’Œæ”¯ä»˜ç‰è¡Œä¸ºæ¥è¿›è¡Œæ£æ ·æœ¬çš„æ ‡æ³¨ã€‚ä»Žç»Ÿè®¡ä¸Šçœ‹ï¼Œç‚¹å‡»ã€ä¸‹å•å’Œæ”¯ä»˜ç‰è¡Œä¸ºåˆ†åˆ« å¯¹åº”äº†è¯¥æ ·æœ¬å¯¹ç”¨æˆ·éœ€æ±‚çš„ä¸åŒçš„匹é…ç¨‹åº¦ï¼Œå› æ¤å¯¹åº”çš„æ ·æœ¬ä¼šè¢«å½“åšæ£æ ·æœ¬ï¼Œä¸”赋予ä¸æ–增大的æƒé‡ã€‚
  线上è¿è¡Œç€å¤šç§ä¸åŒç±»åž‹æ¨¡åž‹ï¼Œä¸»è¦åŒ…括:
  Gradient boosting decision/regression tree(GBDT/GBRT)
  GBDT是LTRä¸åº”用较多的éžçº¿æ€§æ¨¡åž‹ã€‚我们开å‘了基于Sparkçš„GBDTå·¥å…·ï¼Œæ ‘æ‹Ÿåˆæ¢¯åº¦çš„时候è¿ç”¨äº†å¹¶è¡Œæ–¹æ³•ï¼Œç¼©çŸè®ç»ƒæ—¶é—´ã€‚GBDTçš„æ ‘è¢«è®¾è®¡ä¸ºä¸‰å‰æ ‘,作为一ç§å¤„ç†ç‰¹å¾ç¼ºå¤±çš„方法。
  选择ä¸åŒçš„æŸå¤±å‡½æ•°ï¼Œboosting tree方法å¯ä»¥å¤„ç†å›žå½’问题和分类问题。应用ä¸ï¼Œæˆ‘们选用了效果更好的logistic likelihood loss,将问题建模为二分类问题。
  Logistic Regression(LR)
  å‚考Facebookçš„paper[3],我们利用GBDT进行部分LR特å¾çš„构建。用FTRL算法æ¥åœ¨çº¿è®ç»ƒLR模型。
  对模型的评估分为离线和线上两部分。离线部分我们通过AUC(Area Under the ROC Curve)å’ŒMAP(Mean Average Precision)æ¥è¯„价模型,线上则通过A/B测试æ¥æ£€éªŒæ¨¡åž‹çš„实际效果,两项手段支撑ç€ç®—法ä¸æ–çš„è¿ä»£ä¼˜åŒ–。
  冷å¯åŠ¨
  在我们的æœç´¢æŽ’åºç³»ç»Ÿä¸ï¼Œå†·å¯åŠ¨é—®é¢˜è¡¨çŽ°ä¸ºå½“新的商家ã€æ–°çš„团è´å•å½•å…¥æˆ–新的用户使用美团时,我们没有足够的数æ®ç”¨æ¥æŽ¨æµ‹ç”¨æˆ·å¯¹äº§å“的喜好。商 家冷å¯åŠ¨æ˜¯ä¸»è¦é—®é¢˜ï¼Œæˆ‘们通过两方é¢æ‰‹æ®µæ¥è¿›è¡Œç¼“解。一方é¢ï¼Œåœ¨æ¨¡åž‹ä¸å¼•å…¥äº†æ–‡æœ¬ç›¸å…³æ€§ã€å“类相似度ã€è·ç¦»å’Œå“类属性ç‰ç‰¹å¾ï¼Œç¡®ä¿åœ¨æ²¡æœ‰è¶³å¤Ÿå±•ç¤ºå’Œå馈的 å‰æ下能较为准确地预测;å¦ä¸€æ–¹é¢ï¼Œæˆ‘们引入了Explore&Exploit机制,对新商家和团å•ç»™äºˆé€‚度的æ›å…‰æœºä¼šï¼Œä»¥æ”¶é›†å馈数æ®å¹¶æ”¹å–„预 测。
  Position Bias
  在手机端,æœç´¢ç»“果的展现形å¼æ˜¯åˆ—表页,结果的展示ä½ç½®ä¼šå¯¹ç”¨æˆ·è¡Œä¸ºäº§ç”Ÿå¾ˆå¤§çš„å½±å“。在特å¾æŒ–掘和è®ç»ƒæ•°æ®æ ‡æ³¨å½“ä¸ï¼Œæˆ‘们考虑了展示ä½ç½®å› ç´ å¼• 入的å差。例如CTR(click-through-rate)的统计ä¸ï¼Œæˆ‘们基于Examination Model,去除展示ä½ç½®å¸¦æ¥çš„å½±å“。
  线上篇总结
  线上篇主è¦ä»‹ç»äº†ç¾Žå›¢æœç´¢æŽ’åºç³»ç»Ÿçº¿ä¸Šéƒ¨åˆ†çš„结构ã€ç®—法和主è¦æ¨¡å—。在åŽç»æ–‡ç« 里,我们会ç€é‡ä»‹ç»æŽ’åºç³»ç»Ÿç¦»çº¿éƒ¨åˆ†çš„工作。
  一个完善的线上线下系统是排åºä¼˜åŒ–得以æŒç»è¿›è¡Œçš„基础。基于业务对数æ®å’Œæ¨¡åž‹ä¸Šçš„ä¸æ–挖掘是排åºæŒç»æ”¹å–„的动力。我们ä»åœ¨æŽ¢ç´¢ã€‚
最后编辑: 郝聪 编辑于2016/07/08 10:40