【管理】产品与技术的相爱相杀

先打个广告: 团队长期招p6~p9数据,工程,算法; 业务发展快。 感兴趣的同学可直接关注以下公众号获取岗位信息:

引言

各位研发同学,大家有没有这样一种感觉:就是在工作中, 你经常会有如下感叹:

  1. 为什么我们的产品需求如此多? 就不能想清楚再做吗?
  2. 为什么我们的产品居然给算法提了个效果翻5倍这样愚蠢而不可能完成的增长要求
  3. 产品抱个脑袋想出一个需求,研发就要吭哧吭哧搞半天,那产品平常都在搞啥?


总体来说研发同学有这样的想法是很常见的, 也是很正常的。 而且以我的经验,无论是大厂,初创公司,或者中型公司,都会存在这样的情况,无论是以工程师文化著称的百度,还是以强势业务导向的阿里, 或者其他一些小公司都不会例外。

下边我就来分析下研发为啥会有这样的想法, 以及站在产品的角度, 又会看到那些不一样的东西。

公司里最大的理,就是对业务的发展有利

在这里先抛一个基本原则, 无论你的角色是产品还是研发, 无论你看你对应的产品, 或者技术再怎么不顺眼, 这些都是有主观立场有屁股的看法, 而且是信息不完全的看法;每个人都会以自己的角度,自己的经验去看问题。
这样就会出现我经常和下属讲的:二元世界理论:同样一个事,从不同的角度看,会得到不同的结论,并且都是对的。

公司里边最大的理,就是要对业务的发展有利。其他的诸如研发觉得产品是不是需求提太多, 是不是需求不合理, 是不是在压研发的排期, 甚至是不是在找事儿, 这些都是有屁股, 有偏见的主观的看法,不是理

产品与技术的相爱相杀

前两年听淘宝一个研发负责人分享,末了一个听众问了个问题,大抵是问研发在业务需求非常多的时候,如何平衡技术长期建设和短期业务需求的关系。 当时那个研发负责人提到,‘产品和技术的关系,是相爱相杀的关系’,产品和技术都会有自己想做的, 自己认为重要的的事, 那如何去决定什么事重要, 优先级如何, 其实就会涉及到优先级的PK, 或者是较多的平衡。

产品与技术的目标一致吗?

可能这里有研发的小伙伴会问: 不是一直说产品和研发的目标是一致的吗? 那还需要平衡什么?
但你认真想想,产品和技术, 目标真的一致吗?
我个人的观点是: 产品和技术的目标, 是不一致的, 或者说是不完全一致的。否则从公司组织机制上,就不用专门分出来产品和技术两个工种了 。

那为什么说是不完全一致的?简单想想:产品会考虑稳定性吗? 会考虑实现如何具有可扩展性吗? 似乎不太会吧。
但技术需要考虑这些。 虽然有些技术小伙伴接需求接麻木了, 需求挡又挡不回去, 就干脆需求来了后就糙快猛把需求怼上去,产品说啥就是啥吧, 但最后系统越来越复杂,越来越慢,直到某天迭代不动了, 影响到了业务发展, 这是谁的问题? 其实还是技术的问题!

所以,大家的业务目标是一致的,但当业务需求提过来的时候,技术同学有必要,也有义务从技术的角度,审视需求的合理性,并需要结合长短期的技术发展,确定合理的方案
而且很多时候,以我的经验,技术的长短期方案的权衡,以及必要的技术投入, 其实都是可以和产品同学一起聊, 一起沟通的。 至少我打过交道的产品同学, 虽然他们更多从产品的视角来看问题,但你讲你的技术长期考虑,长短期如何权衡和他们沟通后, 都还是可以得到理解或者支持的。 如果确实有些需求是有很大的业务压力,必须要糙快猛地搞,大家至少在信息上是可以拉平的。 当然, 如果资源上实在无法拉齐,至少信息拉齐了,可以上升到老板来决策。 前提是研发需要有自己的判断。

产品业务同学的压力

很多时候技术同学觉得自己比较辛苦, 压力比较大,还被产品同学PUSH得不行,甚至心里委屈有气, 其实在和产品充分沟通后,换位思考一下, 其实产品,业务的压力更大。
为什么更大? 业务,包括产品都是需要背业务指标的,收入一年翻5倍, 核心指标翻3倍。。。 可能都是老板直接就拍下来了。
技术同学可能还会根据各种数据,指标估一个合理的可能的增长,但业务一般不是这样,都是先拍KPI,再想达成的手段,这样在KPI拆解的过程中, 就会导致很多理智的逻辑性很强的研发同学觉得产品对技术的要求高的可笑,觉得产品同学不靠谱,但其实这正是产品同学的压力所在。
很多问题其实就是个屁股问题, 换个角度看, 就能理解了。

开头的3个问题

对于开始的3个问题,读了上文后,应该就有答案了:

  1. 为什么我们的产品需求如此多? 就不能想清楚再做吗?
    答:很难,没有人能预知未来,换你,也只能快速地去试,只能做到Fail Fast。 因为从‘肯尼芬框架’的角度来看,产品所处的象限是‘复杂’的象限, 技术所处的角度为‘繁杂’ 甚至是‘简单’的象限。
  2. 为什么我们的产品居然给算法提了个效果翻5倍这样愚蠢而不可能完成的增长要求
    答:因为老板拍目标的时候,就是按照更高的要求拍下来的,产品也没地方说理(且不说很多时候高目标也能够实现)
  3. 产品抱个脑袋想出一个需求,研发就要吭哧吭哧搞半天,那产品平常都在搞啥?
    答:产品涉及各种上下游拉通,好好想想就知道了, 其实真的很操心


图:肯尼芬框架简图,产品业务一般处于‘复杂’区间,技术处于‘繁杂’或‘清晰’区间

但有一点是肯定的,产品在整个价值链路上处于中枢的角色,对全局的信息更加了解,而技术则处在底层,信息比较局部,仅是‘重要的环节’, 所以遇到问题,多和产品沟通,多了解下更加全局的信息,这样对整个业务的了解会更加全面和透彻。 在整个过程中不要有情绪,和产品同学的合作不要有偏见,这些都是主观的。 一定要记住:公司里边最大的理,就是要对业务的发展有利

P.S. 在公司里,一定不要因为不爽而和产品对抗,考虑问题多考虑上边提到的公司最大的。另外产品同学更接近业务,是需要对公司发展,或者说挣钱负责的, 技术固然重要,但更多是公司运作的单一环节。 二者如果竞争,这就像一个6维空间的文明, 和3维空间的文明对抗一样, 维度不一样,结果可想而知。

阿里工业级LBS DMP设计思路

先打个广告: 团队长期招p6~p9数据,工程,算法; 业务发展快。 感兴趣的同学可直接关注以下公众号获取岗位信息:

前言

通过阅读本文, 可以有两方面的收获:

  1. 我们针对LBS 场景的DMP建设, 定义了新的基于底层人地关系原子能力的范式,避免了传统DMP用户数据生产过程中, 标签建设代价过大,无法迅速扩展的缺陷
  2. 展示了分层DMP建设的框架

个人隐私相关的行业背景

最近国家密集出台史无前例的互联网个人隐私管控的法律,以及算法管控备案的条纹, 例如:《互联网个人信息保护法》中明确对互联网APP个人信息收集,利用做了非常严格的限制。

对于各种设备级ID的使用, 例如原来imei, idfa, androidid等都有较为严格的限定,对于类似于轨迹,定位数据也做了较为严格限定。

从系统分发的角度, 《互联网信息服务推荐算法管理规定》也对算法的分发提出了较多要求, 对于个性化, 大数据杀熟等国家也在加强备案和管控。

在这样的行业背景下, 互联网的大数据使用会逐渐趋于规范和精细化。 这里需要明确的是, 国家不是限定大数据的发展,而是限定原有不规范,粗放式的数据使用。

例如早些年我的确听说有些公司对外提供DMP服务,按照请求次数收费,各种个人隐私数据不管应用方的类似随便使用, 这样的确是很恐怖的情况。 因为现在每个人在手机上产生的数据太丰富: 包括家庭住址,信息获取偏好, 购物, 所在位置等。

挑战

在这样的大背景下, 在构建工业级的LBS DMP体系的时候, 就会面临两大类挑战:

  1. 传统的技术挑战, 更多是技术问题, 包括如何更高效,实时地处理海量数据; 如何从数据中,对业务的LBS 能力进行原子能力的抽象; 基于原子能力如何对数据资产沉淀, 以及如何更通用化, 更高效地对外提供数据能力的支持。 每一个点均能衍生出较多非常多的技术挑战点需要攻克。
  2. 新的隐私数据安全, 包括哪些隐私数据我们能够收集, 哪些能够使用, 应该如何使用, 提升个性化效果以及触及个人隐私的边界在什么地方,这些都需要在数据使用,系统设计实现的时候充分考虑。 毕竟我们在社会主义的红旗下,需要做遵纪守法的产品研发,打造合法的系统。

同时,在大数据时代,我们也不可能就因为个人隐私风险而放弃对数据的建设, 毕竟互联网快速发展了20多年,基于数据算法的个性化被证明是提升系统效果的利器, 过去工业界,学术界的算法得核心也是数据驱动的个性化精准分发, 同时以后随着数字化的发展, 更多IOT设备的加入导致更多的信息需要处理都需要我们有更加强大的数据处理能力。

所以各个公司, 特别是阿里,腾讯,字节等大厂, 更是会在这一块工作上持续投入。 都会构建自己工业级的LBS DMP,以便在各种搜广推的分发应用中,提升分发的效率。

下边就为大家介绍我们LBS DMP建设的思路。

设计


图:LBS DMP架构分层图

工程实现

从具体设计实现的角度,高德的LBS DMP从工程的角度和业界是比较类似的,从底层数据到上层应用,主要分成以下四层:

  1. 底层原始数据数仓,该层主要包括原始的数据收集,数仓ETL建设,以及对应的实时计算。具体的数据包括超级APP端内的搜点规划导航等LBS数据和用户行为数据的处理,以及高德开放平台数据。这两类数据一个最大的区别就是APP端内数据可以对应到具体的用户,但开放平台的一部分数据,我们是对应不到具体的用户的,拿不到体用户ID的数据,这些数据可以用来做热力相关的应用。具体实现层面,该层我们会基于ODPS和Blink来进行数据处理。
  2. 第二层是我们的人地关系算法层,该层更多的是基于我们的原始数据做进一步的深加工,包括对应的数据挖掘以及实时的算法处理。该层的算法挖掘质量会决定最终DMP效果。在实现层面,我们会用到非常多的深度学习,以及推荐类似的算法,所以也需要算法架构的支持,这次我们就基于AI OS去打造我们的数据挖掘和匹配逻辑算法。但是我们会给我们的应用场景去抽象,我们极少的原子能力,不求多,但求精。
  3. 第三层是我们的数据资产沉淀层,我们需要基于第二层打造出来的核心原子能力,进行灵活的拼装,组成上层应用,包括实时或离线的特征和标签,这些特征和标签既有表征用户长期兴趣特点的类型,又有实时用户的状态,行为的类型,例如,用户长期的类别偏好,兴趣偏好,这些都是用户长期的数据积累下来的,并且是在一定时间之内,不太会改变的用户的固有属性,这种就是长期的兴趣标签数据,另外,类型是跟永辉相关的事实,实的会很快改变的,需要快速补充的类型,例如,当前用户的需求是不是在饭店需要吃饭?是不是在外地需要订酒店?甚至细化到最近30分钟是不是有酒店需求这样的动态标签,这些都是实时类型。 从我的角度,我们对标签的定义进行了扩展:这些都是标签,只是长期兴趣标签总体来说没有时效性,相对稳定而短期实时标签具有动态性和时效性。
  4. 第四层就是服务层,例如,以什么样的方式对外提供数据服务,构建什么样的中台,什么样的通用的数据方式去提供通用的数据解决方案。这层我们会基于阿里的 AIOS,并且配合我们的数据管理平台,对外提供通用化的数据伏。

算法

从算法的角度,最重要的就是我们如何去抽象我们的LBS场景问题,将众多的数据以及对应的应用抽象为可数的几个核心原子能力

原子能力
这里先解释一下什么是原子能力:原子能力就是基于最底层的抽象,不能再分割的能力,而上层的更复杂的业务能力,都是由底层的可数的原子能力拼装组合并演绎而出。

之前在听美团的干嘉伟的一个分享的时,他提到所有的问题都可以进行拆解,再打碎为原子能力后重构,而对LBS场景所有的问题都可以根据时间,空间去进行拆解,所以我们在这样的拆解框架之下,只要我们的原子能力从时间和空间的角度分成点线面(空间)*过去现在未来(时间)的模式:


图:LBS 时空原子能力拆解

我们在建设上层特征及标签的时候,不再遵循传统的方式对标签进行一对一的深加工定制,因为这样是有一个扩展性的限制的,扩展性标签的代价是线性的,当标签非常多的时候,代价是不可承受的。不可能无限的扩展。

例如,在之前的系统中,我们建设了400多个标签,但之后就无法再高效准确的维护对应标签的数据质量,所以后来我们转变思路:所有标签都是基于我们的原则能力,在上层,进行组合加工得到最终的标签,底层的原则能力会持续地不断深化,

对于原子能力,我们在单点上进行深化建设,底层的原子能力,我们使用了非常多的深度学习及图关系的算法,讲原子能力做的足够准确,相反上层的组合做的足够简单,并且可解释,当然,底层的原则能力都需要配合debug分析平台来提升数据质量。

这一部分其实是这个算法的核心,因为算法会涉及到比较多和业务相关的数据能力,数据算法能力,所以此处主要就说一下思路更多的时间此处就不展开了。

这里也有一个比较有意思的现象,就是无论线上的搜广推还是离线的LBS标签建设,在实现的时候都是使用相同的思路。

例如,我们在线上搜光腿检索轮实现的时候,经常会进行召回排序机制将各个环节分开进行;比较有意思的是,在离线进行数据处理标签建设的时候,也会使用类似的思路,都是先招呼一个大集合,然后再去做排序,最后再进行挑选。像我们在识别一个用户,他的家庭住址的时候,也会先挑出来这个用户候选的家庭住址,然后再去做打分排序,最后再选TOP N。

或者在进行路线规划的时候,也是先选择一部分的候选路线,再进行排序。整个过程从框架思路上没有本质区别。所以这应该也是搞互联网技术的人比较倾向于招搜广推经验丰富的候选人,因为搜广推比较有经验的话,这些技术迁移到其他的领域也会比较方便。

从本质上来说,这些操作都是信息处理过程,都是user和item的匹配,这可能是这些技术比较相近最本质的原因。

成果

和公司相关的业务此处就不再展开。此处人地关系的通用原子能力,我们也发表了对应的论文,会在后续的文章中介绍。具体参见《learning the continuous context-aware temporal knowledge graph representation for user and poi understanding》

Reference

  • Learning the Continuous Context-aware Temporal Knowledge Graph Representation for User and POI Understanding
  • 阿里巴巴 AIOS

计费系统&超投控制

背景

在整个广告系统中, 计费是处在和钱最相关的环节:检索端把结果展现给用户,如果用户感兴趣,并且产生点击之后,这些点击就需要通过计费系统进行流转,对广告主的费用进行扣费。

因为计费系统和钱完全相关,所以任何问题都是钱的问题,而钱的问题在广告系统里边都是最受到重视的所以在各个广告平台当中,都会有专人对计费系统进行升级,维护和监控。
想象一下出了问题之后,要么是广告平台的钱受到损失,要么是广告主的钱受到损失,计费系统如果有问题,要么广告主直接跳出来找你,要么就公司收入受损失,所以一般做计费系统的同学的压力都是比较大的。
例如在大厂(比如腾讯,阿里巴巴,字节),如果一天的广告收入是一亿,在高峰时段,出了故障半小时就损失大几百万,而且有一些事故的收入是回补不回来的,这个收入是回补不回来的这个还是挺恐怖的。

下面就给大家介绍一下积分系统的实现逻辑。

图:计费系统系统位置

在用户看到检索端呈现的结果之后,如果用户感兴趣,就会发生接下来的点击和转化,此时,这些信息就流转到计费系统去进行计费。

计费数据链路


图: 计费数据链路图

广告计费平台涉及以下内容:资金管理,实时计费,投放控制,日终结算等和钱相关的工作,重要性非常高。

上图中的几个组件功能如下:

  1. 资金管理平台, 主要是对用户的账户资金进行管理,包括交易,结算,充值等。
  2. BP,主要对投放进行管理, 包括投放计划/单元的设置,投放预算的设置。
  3. 计费平台,为本文的核心部分,主要和广告投放引擎,资金管理平台进行协同进行计费,同时进行投放的控制和结算。

计费系统的挑战很多,主要体现在以下几方面:

  • 实效性非常高, 否则会造成较多超投,或者少投,相当于是资损。
  • 涉及金额较大, 广告平台涉及到的所有的钱都会通过该系统链路
  • 线上‘钱’的链路的最后一环, 需要对上游系统错误进行容错,最大程度避免钱的损失。

超投控制方案

超投: 超过广告主余额,计划预算的投放流量是不能找广告主收钱的,该种情况就是超投。 超投不可避免,但可以尽量降低超投或者少投,这就是一种开源节流

为什么超投不能避免?
原因很简单,以CPC为例(CPA等其他模式会更加严重,因为转化路径和转化延迟更为严重),广告平台的展现,到用户的点击是有时间差的,如果广告展现的时候还有预算,但用户点击时预算花完,该点击就不能向广告主收费,就会出现超投。

另外系统的数据链路本身也会有延迟。 所以超投不可避免。

图:计划撞线

如何降低超投?
控制超投的思路, 就只有一个, 就是在预期计划可能超投的情况下, 进行投放的减速

具体来说,就是**降速在消耗接近预算/余额前,进行降速,以期望在预算为0时,正好停止投放。 思路就类似于预算/余额接近0的时候开始刹车。

在具体实施的时候,可以使用以下方法进行刹车控制:

  1. 根据预算/余额直接进行计算是否开始踩刹车。参见图:刹车控制超投
  2. 根据剩余点击数,根据预算/余额,以及最近的N条点击的花费,计算出剩余的点击数进行控制
  3. 根据剩余预算/余额/点击分段进行控制, 这是更精细化的方式,越接近刹车终点,速率越慢。
  4. 缓升控制, 该方法不仅考虑预算控制的刹车的方法,还需要考虑计划投放启动的速率,主要是避免有些预算较少的单元,因为一开始投放较多, 直接就控制不住超投。参见图:缓升控制超投。


图:刹车控制超投


图:缓升控制超投

计费收益优化

排序

为了实现平台的收益最大化, 以及统计口径的统一, 在计费日志遍历的过程中,需要对排序逻辑进行优化, 排序优化分为以下4个阶段:

  1. 按日志的自然顺序计费,该计费的方式优点比较直接, 就是计费逻辑比较简单,同时能够保证计费结果的一致性;但缺点也很明显: 该方式对平台不利,很容易出现较多的超投。
  2. 引入贪心算法, 即大价格在前,该方式对于自然顺序有一定优化。
  3. 引入改价策略,即排序的时候进行计费日志改价,这样就能够保证最后一条日志能够计费。
  4. 引入排序稳定性改价, 多次重跑,保证结果一致。

最后,大量招人,算法,工程,数据P6~P9,具体岗位参见: 招聘信息

基于blink DataStream的实时数据配置平台

背景

随着移动互联网的普及, 以及各种超级APP的出现, 每个公司都对数据收集以及充分挖掘数据的价值非常看重,并几乎不计成本地投入。 在每个公司, 无论是实时的BI报表统计分析, 通过实时数据的异常监控, 还是根据用户的实时反馈进行算法效果模型预估,在各个公司都有非常多的应用,并对公司业务效果的保障有着巨大的影响和贡献。

当然, 随着近些年各种开源软件,平台的出现, 特别是以hadoop为起点的开源组件,使得各公司都能够基于这些组件,以及各大厂的云计算快速搭建自己的大数据平台,包括实时数据处理系统。

这里八卦下自己的看法, 个人觉得这些年百度相比于阿里,百度的技术其实是在退步的(虽然我在百度工作了很多年,百度是我的老东家), 我觉得一个主要的原因就是百度的系统太封闭。这在早些年, 在开源社区还不活跃, 大家都需要自己封闭造轮子的时代,这个时代就比拼各个公司自己的技术能力,彼时以工程师为主导的文化, 的确让百度技术领先阿里一大截。 记得10年前,我们都特看不起阿里的技术,就觉得阿里没有技术, 就业务好。 甚至业界还没提云计算的时候, 我们在百度内部, 大家的开发机就已经是以虚拟账号的方式分配资源了。相当于内部已经开始某种意义上上云了。
但后来随着开源社区的兴起, 百度这样连STL都自己重新写一套的模式就慢慢跟不上节奏了: 开源社区结合了各路神仙的才智,对各种大数据组件进行打磨,这也是开放带来的牛逼之处。

通过近两年对老东家百度出来的同学的面试深深由此感觉, 百度甚至内部跑数据还在自己写各种MR,感觉跟我2013年还在百度的时候没啥区别。。。。

扯了那么多,就是想说各种中间件的大数据处理组件,还是需要开放生态,才能有竞争力。国家都需要开放,更别说公司技术。

此处就为大家介绍我们团队为了降低实时数据计算的成本, 构建的‘基于Blink DataStream的实时数据配置平台’,从思路上介绍我们是如何满足各种纷繁多样的基于LBS的实时数据计算需求的。希望对大家有借鉴作用。

同时打个广告: 团队长期招p6~p9数据,工程,算法; 业务发展快。 感兴趣的同学可直接关注以下公众号获取岗位信息:

解决问题

移动互联网目前已经发展到近乎巅峰状态,各个大厂都有自己主打的超级APP,头条各种基于内容的kill time app,腾讯, 阿里淘宝,包括高德都是DAU过亿的超级应用。 这些应用也时刻在产生海量的用户数据。 很多场景都需要对这些数据进行实时处理, 包括:

  1. 用户行为反馈后,进行BI实时报表计算&分析&财务结算
  2. 系统监控,包括业务效果的监控。
  3. 实时特征生成供模型实时使用,例如搜推广的ctr,cvr,实时反作弊等

这个过程中, 实时计算就是一个绕不开的话题, 而且每个场景都会有非常多的定制化需求。


图:广告系统业务端到检索端的基准+实时增量数据同步


图:实时反作弊,需要实时对用户点击反馈进行反作弊计算。

以上两个广告的例子,广告系统业务端到检索端数据同步,以及实时反作弊,都会涉及到较多的实时计算。

挑战 & 实现

在我们的场景, 对实时计算有以下要求:

  1. 实时性: 实时计算的延迟很多场景需要缩短到毫秒级别,才能在很多场景满足用户需求。例如:广告实时性能力建设 《风向标逻辑》
  2. 极低的接入成本:理想情况希望业务方的工程OR算法就能通过平台操作攒出满足自己需求的实时数据计算,满足自己的需求。

基于以上两个要求, 我们定制了基于Blink Data Streaming的实时计算配置平台。
Why Blink? 很简单,flink在实时计算很有优势,流批一体, 且Blink基于flink,是阿里的。
Why Data Streaming:Data Streaming更底层,可以做更深层次的定制和性能优化。


图:基于Blink Data Streaming的实时数据平台架构

在具体实现的时候。 我们将系统抽象成以下几层:

数据层
其功能是对各种来源的数据,按照规范进行数据的normalizing, 因为高德是LBS场景, 所以所有的原始数据实时进入系统的时候, 都会被规范化为<time, location, userid, object, event>, 也就是时间地点人物事件,以及事件处理到的对象。
此处的userid及object并没有带维度属性,维度属性由离线batch逻辑生成。 并在引擎层进行id和维度属性的自动关联。

引擎
此处的引擎主要有两个作用:

  1. 定义算子: 我们使用blink 的data streaming api开发并优化了常用的实时数据算子, 以便引擎能够将各种算子攒成任务, 此处的算子可以灵活定义并根据需求开发, 类似于一个faas平台。
  2. 任务调度: 单个算子仅进行实时数据的一步原子计算, 需要引擎层中的任务调度, 根据上对层平台计算任务配置的解析, 组合成完成整个实时计算逻辑的task任务。 此处比较像tensorflow在运行时, 将各个operator按照有向无环图编排任务进行计算的过程。

服务层
服务层的两个作用:

  1. 任务配置: 负责给平台使用者提供UI,以便用户进行任务的配置。目前开源有很多这样的配置管理组件可以使用, 我们内部使用Diamond平台
  2. 资源状态管理: 从系统的角度对任务进行调度, 资源分配。

效果

目前我们团队开发的实时计算平台已经在各个业务中使用, 初步实现了配置化实时任务的生成, 启动,管理, 监控。 连写blink sql都免了, 用主要负责开发的同学的话说: '该平台再完善完善, 写blink sql的同学也可以失业了。。'

如果你对我们的工作感兴趣, 可以联系我们, 需要更多同学进行类似平台的建设和完善。

参考文献

  1. 广告实时性能力建设
  2. 在高德吃喝玩乐!LBS信息的AI技术应用

广告预估校准机制介绍

背景

说搜推广的时候,我们会用到很多的模型来对效果进行预估,包括ctr的模型和cvr模型。这就会涉及到使用对应的指标,对模型的效果进行衡量。

一般情况下,我们使用最多的指标就是auc,因为auc可以来评判排序的效果好坏。很多时候我们也会使用auc来评判广告中的ctr或者cvr模型的好坏。而且一般我们在特定的场景也会有一个auc和线上效果的大致转化关系。例如,我们会有这样的经验:线下auc提升一个点,线上的收入提升n个点。不同的广告平台会有很大差异。

但是随着广告效果的精细化,以及引入了更多的机制,这样的模式就会存在明显问题。例如对于cpc产品我们的rpm的预估收入公式是:ecpm=ctr*bid。这就要求我们不仅要保证预估ctr的排序正确,同时需要保证ctr预估的值也足够的准确。

这就是搜索推荐与广告在对于ctr预估的准确度上的区别:搜索推荐只考虑排序的正确性,但广告需要考虑ctr预估的准确性

解决广告ctr预估准确性的手段主要就是两种,第一就是让模型足够准确,狂怼模型预估能力;第二就是增加合理的校准逻辑。

这个地方再详细展开说一下,为什么广告中对于预估的准确性那么重要,主要由以下几个原因:

  1. 只有ctr足够准收入,收入预估才足够准, 如上 ecpm=ctr*bid
  2. 还是ecpm=ctr*bid,因为本质上广告主关注的还是效果,roi,所以如果转化率预估的足够准,我们是可以对好的流量进行提价的,也就是增加bid,同样可以提升收入。 具体参见:CVR优化的重要性
  3. 现在很多广告平台都同时支持cpc广告和ocpc广告混排,这就需要将不同模式的广告效果进行拉齐排序,也要求预估足够的准确,否则变现效果不可比.
  4. 自然结果和广告需要进行混排,而且很多时候收入和自然结果的体验会有对应的量化折算关系,也要求预估足够准确。具体参见:多目标广告混排机制在超级APP中的技术

具体如何让ctr预估模型更加准确,可以参见:推荐系统,变现系统CTR&CVR预估算法演进-模型,更多的是介绍如何让校准更加准确。

校准的要求

一般情况下,校准是在预估打分之后,机制之前进行的。因为线上的计算逻辑较重,所以一般都希望校准能够相对简单,并且可解释。同时,最好校准逻辑不要跟有业务逻辑绑定,需要通用。


图:预估校准阶段,在排序机制4(预估)之后,5(机制逻辑)之前

正所谓没法衡量,就不存在优化,所以和所有的算法逻辑一样,校准也有对应的标准来进行效果的衡量。目前经常使用的衡量指标有如下三种:

PCOC:该指标的基本思想就是平均预估值/统计真实值;该指标逻辑相对简单,但是不能反映分布的差异。

CAL-N:该思路对PCOC进行分桶统计,不同桶上的误差会累计,相当于一定程度上体现了分布的值。具体的计算逻辑为:

$CAL-N=\sqrt{\frac{\sum_{i=1}^N error_i^2}{N}}$

其物理含义,就是单独计算分桶的PCOC(或error), 然后求平均误差。

GC-N:该指标就更进一步,针对某一个特定的维度去进行加权,毕竟什么事物都有个优先级重要性。例如在广告中根据单元或者计划的pv或者收入去进行加权。具体计算逻辑为:

$GC-N=\frac{\sum_{j=1}^m w_j Cal-Nj}{\sum{j=1}^m w_j}$

其物理含义, 就是分某个维度后, 在维度上计算CAL-N,然后再进行加权汇总。 例如在广告系统中, 此处的维度可以是广告计划维度, 权重为该计划的PV或者消费。

具体实现

知乎上《阿里妈妈展示广告预估校准技术演进之路》 中介绍的已经非常详细,写的非常赞。我们团队也是借鉴了阿里妈妈的技术,所以这个地方就不详细展开,大家可以上知乎看看同学的文章写得非常详尽。 此处仅介绍传统的方法和我们团队借鉴的SIR方法。

传统校准方法

主要有以下3种:

Platt's Method
该方法的思路是对预估的值在使用实际的label进行一次参数化的映射,使用LR方式进行参数化学习。 校准函数为:

$f(x)=\frac{1}{1+e^{ax+b}}$

其中a,b为学习出来的参数。该方式优点是比较简单,且是学习出来的结果, 缺点是对于假设空间有过强的假设(认为是sigmoid函数)

Isotonic Regression
该方式的思路是使用一个单调函数来最小化预估值和label之间的square error,对结果进行保序的校准。 该方式隐含的假设, 是预估值至少能够保证预估顺序的正确性。 该方式的缺点,是处理不好预估值在突变的情况

Binning Method
该方式的思路, 是将预估值进行排序后分桶,然后统计正样本占比。


图:Smoothed Isotonic Regression(SIR)方法

具体的计算逻辑为:

  1. line 1-3进行排序分桶
  2. line 4-9对每个桶,计算预估样本上下界,以及正样本概率
  3. line 11-23构建每个分桶的线性插值函数。
    之后,对于任意x,使用x所落在的空间,使用该区间的线性差值函数即可进行预估数值的校准。

该方式可以按天分小时进行计算,以便体现时间上的ctr值得差异, 特别是在LBS场景, 中午餐饮行业, 下午晚上的休闲娱乐酒店的分布还是有较大差异的。

线上效果

进行SIR校准后, 在我们的场景, 效果有5%左右的相对提升, 另外理论上该机制也能够更好地平衡CPC & OCPC广告的混拍。 所以先不管提升是多少, 就是一个需要去做的正确的工作 。

末了附上一句阿里土话:if not now, when? if not me, who? -- 此时此刻,非你莫属

CVR优化的重要性

还是先插个招聘信息: 急招推荐,搜索,语音算法,数据挖掘,工程人才,阿里P5~P9,欢迎推荐和自荐,微信扫码关注以下二维码了解详细信息

背景

在广告这个领域,CTR的优化有较为悠久的历史, 这些年也出现了较多系统性的优化方法, 包括样本如何选取, 各种模型的出现和创新,在整个领域都有较深的研究沉淀。 从事这个行业的同学也都较为了解。

但当CTR优化达到较高的水平,因为预估的ecpm=ctr*bid,收入的优化会逐渐达到瓶颈,此时如果要继续优化广告的效果,就需要加入其他更多的优化链路和环节,从更多的维度,更高的视角去进行整个系统的优化,其中非常重要的一个环节, 就是CVR的优化。


图:广告cvr在检索端位置

CVR优化的重要性

那CVR优化为什么重要?

下面就详细说下这个问题。
先补充个背景:我们可以认为, 广告和搜索&推荐这样的自然信息分发有本质区别的地方: 搜索&推荐这样的自然信息分发的主体是平台,平台完全自主决定了分发的机制; 但广告不一样,广告的主体是广告主,广告主会对自己的广告,也就是广告平台分发的内容增加约束(例如出价,定向条件,时段等),而各个广告主的约束总体又形成了带约束的竞争环境。
这些约束条件,就是广告分发和搜索&推荐分发的本质区别。

而从广告平台的角度,传统上我们认为平台能够调整的因素, 主要是CTR, 因为 :

$ecpm = Q * Bid$

而且一般情况下,Q就是CTR,而Bid是广告主设定的,原则上Bid是广告主设定的,是不能改变的, 这就导致了广告平台能够直接影响的因素, 就是优化好CTR(其实也可以影响Bid,这个待会会介绍),将CTR预估做这也是为什么之前很长时间,大家提到搜推广,第一反应就是CTR预估。

但从本质上来说,广告平台的主体是广告主,广告平台需要满足广告主的目标诉求和约束, 广告主最终的目标还是转化和ROI(不同的投放任务可能还细微不同),而不是固定的出价, 所以近些年出现的各种智能出价,包括OCPC,OCPM,就开始考虑广告主的转化了: 如果认为对于广告主这个流量价值比较高,是可以动态调整Bid的,而流量价值如何判断,就依赖于准确的CVR预估。考虑了CVR后,流量的价值可以拆分为:

$ecpm=ctr\cdot cvr \cdot abid$

此处abid为广告主对一次转化的出价。

而CVR预估做准后有两个比较大的好处:

  1. 就是能够进行动态调价,调Bid,直接增加单次流量的收益
  2. 广告主转化/ROI得到保障后,会有更多预算的投入,让广告平台的整个竞争环境更加充分,有利于广告平台生态的良性循环

以上就是CVR预估为什么重要的原因。

CVR优化和CTR优化的异和同

相同点:都是标准的预估任务, 按照样本,特征,模型的思路死磕预估效果。 各种创新机制都可以搞。具体可以参见:推荐系统,变现系统CTR&CVR预估算法演进-模型

不同点:转化很多时候都不是立即发生的,都会有延迟,例如APP应用下载安装的归因,可能是7天,甚至更长; 淘宝的下单,也可能会有数天的延迟, 这就存在延迟归因的问题。 另外就是转化的数据一般都会比较稀疏,这就衍生出来不一样的建模方式, 例如阿里妈妈的

而对于延迟归因,主要的解决思路又是‘样本回补’策略,通过重要性采样(importance sampling)技术来进行样本的纠偏, 具体可参见老文章:移动端转化延迟相关CPI转化率模型建模方法,同时还有很多其他的方法来对转化样本进行纠偏。

参考文献

  1. 移动端转化延迟相关CPI转化率模型建模方法
  2. 推荐系统,变现系统CTR&CVR预估算法演进-模型
  3. Ma X, Zhao L, Huang G, et al. Entire space multi-task model: An effective approach for estimating post-click conversion rate[C]//The 41st International ACM SIGIR Conference on Research & Development in Information Retrieval. 2018: 1137-1140.
  4. http://semocean.com

移动端转化延迟相关CPI转化率模型建模方法

介绍

很久没买美股了。昨天打开雪球扫了一眼结果惊呆了, 猎豹移动(CMCM)一天居然跌了40%, 其市值几乎和其现金等价物一致。于是搜了下新闻看到底发生了什么。后来了解到原来是Kochava(第三方监控公司)曝光猎豹旗下数款工具APP存在恶意欺诈行为,主要是大点击和安装劫持。做过移动广告的人应该都知道这两种模式,且这两种模式在行业内已经是不公开的秘密。之所以这两种恶意欺诈能够成功,主要还是因为现在移动应用市场归因机制的天然缺陷导致的。

目前国外应用市场相对比国内规范:国内各种应用市场,包括手机厂商自己的应用市场,以及BAT等巨头。而国外几乎只有两家,苹果的App Store和GooglePlay。但两种方式均存在安装归因缺陷。目前的方式是第三方监控公司(类似于Appsflyer, Adjust, Kochava等)监控来自某个应用或publisher的Impression或者click,之后在手机客户端产生app安装激活后,根据之前记录的来自该手机的impression和click,判定该安装应该归因给哪个publisher。该机制貌似合理,但存在很多问题:

  1. 归因时间过长,很多时候归因时间窗口能达到7天
  2. 第三方无法监控impression,click是否真实发生(可能是欺诈服务器自己构造的)
  3. 恶意抢归因:例如在用户没有看到,点击广告的情况下模拟impression和click, 让后来用户自然安装的应用被归因为广告的效果,或者直接监控手机用户的app下载,在检测到用户正在下载的时候发送该app的impression或者click强占该归因。可以认为和拦路抢劫比较类似

这些机制的存在都会导致整个移动互联网广告市场的混乱,大家不再专心做效果,而是将更多的心思和研发资源投入到如何构造更高明能绕过反作弊的机制。而辛苦做效果的广告公司却因为收益被抢而难于存活,形成劣币逐良币的恶性循环。

相关的欺诈反欺诈技术,不是一两篇文章能够描述透彻,也不是今天要讨论的内容。本文主要关注的点,主要还是讨论如何使用技术的问题,来对延迟归因进行建模。

图:CPI广告示例,流量测以cpm和publisher进行结算,广告主侧以cpi进行结算

之所以存在这个问题,是因为刚才提到,移动CPI(按安装付费)广告的归因窗口可以长达7天,甚至到30天:即广告在被展示后,点击后,最终的归因,例如移动CPI广告的安装激活可能在用户展示点击后的7天才会发生,这和传统的CTR预估问题不一样, 传统的CTR预估,可以认为在向用户展现广告后我们马上就能知道用户有没有点击,而手机移动端则可能需要7天甚至更长时间。这样在训练模型时,就会带来以下几个挑战:

  1. 数据量:对于CPI广告,安装毕竟是少数,如果仅使用有点击的训练样本进行训练,会导致训练样本较少,学习出来的模型能力较差
  2. 训练样本的选取有偏:即使是CPI广告,在线上进行预估的时候,也是有impression(甚至是有request)的时候就需要去预估CPI,而如果我们仅挑选有点击的展示作为样本进行训练,会导致和线上真实面对的分布不一致
  3. 如何选择训练样本? 传统方式下有以下几种方案:
    1. 因为新的广告不断出现,故需要模型及时更新避免效果损失,但如果在模型训练的时候,将暂时还没有转化的样本视为负样本,则可能将后续潜在的正样本也当做负样本进行训练,效果不会理想
    2. 收集满7天数据后进行训练。此时是否为真实正样本已经确定,但该方式的缺点是模型会滞后7天才能训练出来
    3. unlabeled的样本(还暂时没有conversion的样本随机作为负样本),相当于半监督学习,该方式的缺点是:线上click后产生conversion的分布并不是随机的,而是离点击时间越长,转化的概率越小

所以以上传统的3中方法都不太可取。而既然click后产生conversion的分布不是随机,而是离点击时间越长,转化概率越小,那能否将该信息建模到模型中。本文参考医学中的survival time analysis方法,根据click到conversion之间的时间差,对样本是否为真实正样本的概率进行建模。

图:impression->click->conversion的样本空间差异,如果仅用有click的样本训练pcvr,则会导致和线上impression的空间不一致

图:click->conversion用户安装,中间的时间间隔可以达到7天,导致7天内很多样本都是unlabel状态,因为并不能确定没有conversion的样本后续就不会有转化

问题定义

线上的目标是准确预估ecpm,即千次展现的花费。而ecpm可以进行如下拆解:

其中1)项我们可以认为是传统的pctr模型,2)为pctcvr模型,即在有impression,click的情况下产生conversion的概率

故可以对问题进行一下定义:

此处我们根据线上数据,能观察到的数据如下:

  1. xi:即特征
  2. yi:截止到现在,是否已经发生conversion
  3. ei:从点击到当前时间的时间差
  4. di:如果yi=1,则从click发生到conversion发生的时间差

以上定义存在以下约束关系:

  1. Y=0-->C=0 or E<D 还未观察到转化,则可能该样本为负样本永远不会转化;或者E<D,即后续会产生conversion只是现在暂时还未发生
  2. Y=1-->C=1
  3. P(C,D|X,E) = P(C,D|X) 即样本的固有属性,不会应为观察时间而改变

有了以上定义和约束关系后, 即可对问题进行重新建模,将问题建模为以下两个子模型:

  1. P(C|X):即传统的pcvr模型
  2. P(D|C=1,X):即给定样本特征后,且假设该样本为正样本的情况下,conversion发生的时间

再具体到具体模型的实现,P(C|X)为经典的pcvr预估模型,故可以使用传统的LR模型,或者更为复杂的模型。此处假设使用LR模型,即:

P(C|X) = 1/(1+exp(-w_lr*x))

而P(D|C=1,X)则使用指数分布进行建模,即:

P(D|C=1,X) = lambda(x)*exp(-lambda(x)*d),其中lambda(x)=exp(w_lambda*x)为hazard函数,此处借鉴了survial time analysis的思路。故最终建模中,需要学习的参数有两组:w_lr和w_lambda。

损失函数

对观察到的数据,分为两类:

  • P(Y=1,D=di|X=xi,E=ei),即已经观察到存在转化,为C=1的情况推理公式如下:
  • P(Y=0|X=xi,E=ei),即距点击已经过去了时间ei,但还未观察到conversion,推理公式如下:

在Y=0 and Y=1的情况都公式化后,根据我们能够拿到的数据<xi, yi, ei, di>,根据最大似然估计构建损失函数:

之后使用梯度下降法求解w_lr和w_lambda即可完成建模。

总结

  • 该方法适用于用户行为存在较长流量漏斗, g. 移动端request -> impression->click->conversion,且click->conversion存在较大延迟的场景
  • 该方法能够使用impression对应的数据进行建模,且建模的过程中引入了对click后产生conversion的时间观察,更符合样本的内在天然属性
  • 该方法不仅适用于移动端cpi广告,同时对电商类似的具有较长流量,交易漏斗的场景同样适用。

参考文献:

  1. <Mobvista海外移动变现系统核心技术>
  2. <变革:从运营驱动到数据驱动>
  3. Chapelle O. Modeling delayed feedback in display advertising[C]//Proceedings of the 20th ACM SIGKDD international conference on Knowledge discovery and data mining. ACM, 2014: 1097-1105

 

管理者如何做好团队规划

之前看过一篇文章,讲述的是孙正义如何设定目标及如何达成目标, 具体的原话忘了, 大概的思路是: 先设想自己10年后想达成的状态和目标,之后再分析要达到这个目标, 在第8年的时候需要哪些资源, 需要达成怎样的状态, 之后不断倒推, 直到当前;当然, 这么牛叉的目标设定方法, 不是每个人都能掌控的。。。

以前也曾经听一个Google资深产品经理的讲座,介绍Google的产品设计理念时,也提到Google一开始会将产品设想得比较宏大, 之后从某一个小点入手推进该产品,直到将该产品越做越大, 直到影响几乎全人类。。。

进行团队规划时,也是如此。下边就来介绍下在团队中, 一般我们是怎么做团队规划的吧。

简单来说,团队规划,是不断回答完善以下一系列问题的过程,这些问题需要在工作推进的过程中定期review和调整:

  1. 希望你的团队成为怎样的团队
  2. 现在离理想状态还有多远
  3. 分几个阶段每个阶段如何做才可以做到
  4. 需要哪些资源才能做到这样的团队

希望你的团队成为怎样的团队

这个问题,解决的是目标问题, 我们经常说‘指哪打哪’, 这个问题就是回答‘指哪? 以及是否指对’  的问题。 这个过程相当于为团队明确定位, 例如需要明确团队的职责, 理想的团队梯队和组织架构, 团队的意识和价值体系, 理想的团队氛围, 团队能够对更大范围产生的影响和输出价值。

明确团队的职责和定位: 这个相当于是限定了团队所要做的工作的范围以及价值, 例如之前我们对位团队负责百度搜索变现流量的挖掘,以便提升公司搜索变现效率。 这就是团队的职责,符合该职责的工作, 都需要考虑是否去做。 在这样的目标设定下,首先可以选择一些当前认为重要的, 且可以做到的事去做,量力而行,逐步推进。 之后可以设定设定一些未来看起来有希望的能够做到的重点工作作为中期目标进行推进。在设定中期目标的时候,一定要抓住重点,例如以前我的老大就跟我说过: 抓住最重要的3件事,避免大而全。

团队一般还会有其他的一些目标,但这些目标一定是围绕着团队的职责来设定的,例如组织架构是为了更高效地完成团队的职责,而且好的组织架构可以用一张清晰的图就能表述清楚;团队的价值体系也是使用简单明了的话就能进行介绍; 最好还能够形成几句比较好记,琅琅上口的团队口号, 这样能够让团队,员工更有凝聚力, 这个很重要。 例如经常说百度的使命是:‘让人们更便捷地获取信息,找到所求’, 我们团队会经常类比, 说我们的职责是:‘让广告主更高效准确地覆盖适合他的流量’, 简单地一句话就能概括团队的职责。

如何确定团队职责和定位是正确的:这个可以从多个角度来验证,例如和自己的上级, 下级, 平级的同事讨论。这个非常重要,团队的职责很多时候只有得到老大的认可这是必须的,如果老大都不认可这样的定位, 那后续的工作几乎能难开展(或者从某种程度上也没必要开展: 毕竟谁出钱谁拍板!),也很协调到资源来做。 与下级讨论的主要目的有两方面, 一方面下级对团队也会有自己的看法, 可以让管理者从另外一个角度来看团队定位职责是否正确, 因为有些资深员工还是会有自己非常独到的看法,从技术的角度来对这个问题进行审视; 另外一个主要的作用,就是可以看下下级对团队职责定位的认可程度, 毕竟他们是这些职责定位的落实者, 他们具体做事,只有他们认可,后续的工作才能顺畅开展(当然即使某人不认可, 也可以通过多次沟通进行说服)

另外需要注意,这个阶段更主要的是确定近期目标, 例如半年或一年目标, 所以需要确定的事既要比较实际,又要有所拔高; 同时也需要往前看一两年, 心里边要有一个大致的谱: 一两年后,自己的团队会走到哪里。

现在离理想状态有多远

分析团队现状:在指定这些目标的时候, 非常重要的一点,就是需要分析团队的现状: 例如团队现在的梯队,组织架构, 氛围, 相当于我们设定目标的时候是从当前的实际情况去做拔高,这个非常重要,如果起点很低,而将目标设定的非常高,也不是说不能实现,但有可能会出现目标过高导致不可能实现(具体设多少,是个技术问题,有时像又是个艺术问题)

例如11年团队调整的时候, 当时关键词搜索推荐团队分为工程, 策略团队(当时的现状), 后来考虑到这种组织架构会导致策略调研和策略上线之间存在断层(分析‘现状’), 出于提高团队策略迭代速度的考虑, 后来就将工程团队和策略团队进行合并, 且重新制定开发流程, 即后续很多项目, 都是从策略调研, 开发, 到最终推上线小流量乃至全流量都是由唯一负责人负责, 这样就避免了原来策略团队策略调研完毕后, 工程开发同学还要向策略同学了解具体策略考虑的代价, 同时工程同学也不会再觉得自己就是个外包, 避免了那种帮别人实现算法的失落感。 当架构有非常大的调整时, 才会引入外部纯工程团队, 一起合作推进架构的重构。

规划时,排除干扰因素:在很多公司我们都会说: 拥抱变化, 或是说: 世界上唯一没变的, 就是变化。 的确很多时候我们在做规划的时候, 都是在一个动态发展的节点对未来进行预见,会有很多变数。 例如13年就碰到两次大的团队调整, 而且第二次调整时, 团队调整方案已经定下来了, 而且已经和团队成员沟通了团队调整方案后, 突然接到老大通知, 调整方案有变, 整个团队会很快被划到另外一个部门, 后来不得不重新进行规划。 在这样变化的环境中, 会有很多的干扰因素, 但规划的时候, 其实可以在一定程度上先排除这些干扰, 否则考虑太多这种干扰因素, 会导致规划无法进行。

分几个阶段达到理想状态每个阶段如何做才能做到

分几个阶段做: 每次做年度规划的时候, 都觉得第一季度的事是相对比较明确的,第二季度的也还基本可以预知,但第三,第四季度的就很难把握了, 而前面也提到, 指定规划后, 需要定期review和调整, 所以每个阶段,最好不要超过一个季度,否则可能出现有些方向走偏但没有意识到的情况。每个阶段进行review,之后根据当前的进度进行目标的调整。 如果有些目标的达成需要太长时间, 则可以将这个目标达成再进行分解,避免某个节点持续时间过长。

需要哪些资源才能达到这样的团队水平

设定了上述预见的远景外, 就可以分析, 要达到该远景,需要哪些资源了。

资源可以从几个维度去区分:自己团队需要那些人, 需要上级的哪些支持, 需要兄弟团队的哪些支持,需要更大环境的哪些支持。

例如, 我们在进行百度关键词搜索推荐引擎团队规划时,认为后续需要在机器学习上进行加强, 于是开始联系HR,让其帮忙招聘更多机器学习方面的同事,同时开始联系擅长机器学习的团队, 一方面希望从兄弟团队引入对我们的项目感兴趣的同学,另一方面也了解他们团队中的机器学习工具和技术。

再比如之前团队调整过程中, 觉得关键词搜索推荐应该加强与百度检索投放系统的联动,所以后来与老大讨论后, 将底层涉及基础技术的topic model 方向划到了关键词搜索推荐小组。 这就是需要上级支持的典型。

还有一个大原则, 就是上述的规划,并不是一经制定后就是一成不变的,我们经常说计划赶不上变化,那为什么还要做规划?   规划的更大的作用是能让我们能将这些事在现阶段想清楚, 就类似于说拿破仑虽然每次战争都不是按照作战计划进行, 但每次战前他都会制定周密的作战计划。 所以, 我们要对规划怀着开放的心态,做好调整的准备。

百度关键词工具介绍参见:http://support.baidu.com/product/fc/4.html?castk=24b18bi7062c720d0d596

也可关注我的微博:  weibo.com/dustinsea

或是直接访问: http://semocean.com

关键词推荐工具中的用户引导机制之二:suggestion架构

在《关键词推荐工具中的用户引导机制之一》 我们分析了用户用到机制对搜索引擎/关键词工具的重要性,同时也提到按照用户在搜索引擎/或者关键词工具上交互的阶段,可以按交互前,交互中和交互后为用户分别提供种子query,suggestion和相关搜索词对用户进行引导。 种子query是比较经典的推荐问题, 对于‘相关搜索’,后续会有博文专门介绍, 该文以下内容主要介绍如何构造高效的suggestion服务。包括架构及内部检索逻辑。
suggestion到底有多大作用呢, 在很多搜索引擎中, 一方面,从自然搜索结果的角度,suggestion能够引导客户将输入表现的更利于搜索引擎理解用户的意图,得到更优质的搜索结果; 另一方面, 从商业变现的角度看, 大的suggestion策略的上线, 往往能够带来搜索引擎几个点cpm的提升, 这可是非常了不起的贡献。 所以对于搜索引擎, 和关键词推荐工具这样的基于搜索的系统, suggestion的作用就至关重要。
图: 百度suggestion效果
图:关键词推荐系统suggestion
基本概念
要了解suggestion的设计细节,需要先定义以下名词:
  • Query片段:特指query的前缀,例如用户输入的query为“鲜花快递”,其全部query片段为‘鲜’,‘鲜花’,‘鲜花快’,‘鲜花快递’。
  • 拼音片段:本文中特指query片段对应的拼音片段,例如用户输入query为‘鲜花’,则全部拼音片段为‘x’,‘xi’,‘xia’,‘xian’,‘xianh’,‘xianhu’,‘xianhua’。
  • 候选query:指挖掘出的候选种子query。
  • wcode:建立suggestion 索引时,为每个候选query的编号,该编号值表示对应字面在数组结构中的下标位置,为无符号整型。
  • 个性化suggestion:根据客户帐户信息进行推荐的query suggestion。
  • 通用suggestion:与个性化suggesion对应,所有客户都适用的query suggestion。
解决方案的权衡
索引方式
suggestion可以做得比较简单, 也可以比较复杂,例如在搜索引擎搜索框中, 可以输入汉字, 拼音, 或者输入几个汉字后,又将输入法切换为拼音进行输入, 或是正好反过来。 这样对于suggestion,就需要考虑是只对汉字输入query提供suggestion结果, 还是需要对混合输入(拼音+汉字)query提供结果。 不同的功能会导致实现不一样。
 
图:全拼音模式suggestion
图:汉字+拼音混合模式suggestion
经过统计,候选query平均长度为13.9字节(约7汉字),其对应的拼音平均22.1个字母。如果仅对汉字建立索引,则可假设每个候选query对应7个query片段索引片段,而如果要对汉字+拼音建立索引,则每个候选query需要对应约30个索引片段(7+22=29)。但建立拼音片段能够支持用户拼音输入,或是中英文混合的情况,所以要达到较好的用户体验, 最好是实现: 索引结构支持拼音+汉字方式
性能
作为引导机制,suggestion的性能必须足够快, 应该做到迅雷不及掩耳的速度,否则在用户灵活的手指配上高效的输入法下出现任何一顿一顿的感觉, 都会异常影响用户体验, 所以在内存允许的情况下, 所有数据常驻单机内存,是比较理想的情况, 如果单机内存存放不下, 那么可能的选择是使用资源定位系统,将数据进行水平拆分(最简单的方式, 按照query签名作为key,然后取模)
P.S. 对于如何对数据进行扩展, 推荐大家仔细揣摩《ebay网站架构原则》, 每一条原则都值得细心思考体会。
图: 水平拆分,例如按照key签名取模
使用该方式, 请求可轻松达到1w+/s
结果merge及rank
suggestion返回结果由个性化suggestion(针对每个用户单独挖掘)与通用suggestion结果组成,个性化结果在前,通用结果在后的方式,当个性化结果不足时由通用结果补足。
其中,不管个性化结果,还是通用结果,由两部分组成:原始query片段索引结果与拼音query片段索引结果。对于二者的merge方式存在两种思路:
  • 原始query片段索引结果与拼音query片段索引结果merge,按权重从高到低排序,返回前N个结果。
  • 优先返回原始query片段索引结果,数量不足时由高权重的拼音query片段索引结果补充。
从用户体验与效率考虑,原始query片段索引结果与拼音query片段索引结果的merge方式采用思路2。
思路2还有一个问题需要考虑,原始query片段索引结果数量不足时,进行字音转换成拼音串后,存在拼音串片段检索结果与用户输入query的汉字串前缀不一致的情况。例如:query为“鲜花”,转换成拼音串“xianhua”后的检索结果可能有“鲜花”,“仙花”,“闲话”,这时候的检索结果可能包含“仙花”,“闲话”同音但不同字的suggestion结果。从检索逻辑复杂性、效率、数量量考虑,针对纯汉字串片段索引结果数量不足时,不进行字音转换后的拼音片段索引检索。
针对非纯汉字串,原始query片段索引结果数量不足时,通过字音转换成拼音串片段进行检索。在检索过程中,考虑最大汉字前缀匹配的方式。例如:query为“鲜hua”,转换成拼音串“xianhua”后的检索结果可能有“鲜花”,“仙花”,“闲话”。在此例子中,会使用汉字前缀“鲜”去与候选query进行匹配,最终得到候选query“鲜花”。
使用上述方式, 可以在保证结果个性化(个性化结果需要在离线进行挖掘)的同时,保持suggestion应有的高效。
内存数据结构
在决定了使用全内存的存储方式后, 就需要考虑内部数据结构的设计了。 要想让效率最高,最快的方式就是直接使用hash进行query片段签名查找。
图: hash方式进行倒排查找。
索引中主要包括以下结构:
片段索引字典:存储片段签名到片段推荐词倒排的偏移地址。使用bsl::hashmap存储
片段至推荐词倒排索引:存储每个片段到候选关键词wcode的倒排索引。使用hashmap存储。通用拉链与个性化拉链倒排拉链合并存储,区别在于个性化拉链不仅包含关键词wcode,还包含关键词的个性化weight。两种结构根据标志位flag进行区分。为了提高在线服务时,合并字面返回的效率,针对每个索引的拉链会有序(weight从大到小)存储。
字面队列:存储具体wcode字面与字面权重,使用bsl::deque存储,片段至推荐词倒排索引中的wcode值即为该队列索引下标。
在线检索流程
当用户在搜索框进行suggestion请求时,会经过对片段进行归一化,查找汉字索引片段,查找拼音片段及merge结果阶段,结果merge及rank主要的原则是汉字片段结果排在拼音结果前, 各类结果内部按照线下挖掘的权值进行rank。 线下挖掘在业界及学术界的方法参见后续博文。 附上一个流程图, 类似的画法是在工作中逐渐形成的习惯, 其中将function和data structure单独分开表示, 虚线表示数据依赖, 实现表示处理逻辑依赖。  该方式自己觉得比较清晰, 特别是对照着文档写代码的过程中:)
更多内容可参见:
《eBay网站的架构原则》 : 网上都有,每一条扩展原则都值得细心揣摩及体会,各大搜索引擎大数据的支持原则异曲同工
也可关注我的微博:  weibo.com/dustinsea
或是直接访问: http://semocean.com