白话搜索广告平台与技术
搜索广告,英文名叫paid search或者sponsored search。理解成pay for search或者sponsor of search会更明了,就是给你的搜索买单的人。我们知道大家用百度搜东西,百度是不收我们钱的。那百度要花钱买机器啊,要招人搞研发啊,况且百度自己还要赚钱的。那这钱哪儿来呢?答案就在搜索广告里。当我们在搜索框里输入一个查询词(query)并按回车触发查询后,搜索引擎会给我们返回查询结果,这个结果是由两部分构成的,一部分叫自然结果,另一部分就叫搜索广告。所谓自然结果就是搜索引擎为了伺候好你,让你常光顾,从全世界的网页中找到你最想要的,展示给你。而搜索广告则是广告主花钱让搜索引擎把他们的广告展示给你。不但展示给你,还展示在最显眼的地方。鉴于很多人分不清什么是广告,什么是自然结果,下面上一张图:

有上面这张图,相信大部分用户可以区分什么是广告什么是自然结果了。接下来我们看搜索引擎,广告主和用户是怎么相互勾结把钱给赚了的。首先,搜索引擎的收费模式叫做按点击收费(CPC, cost per click)。搜索引擎帮广告主展示广告给用户,当展示的广告被用户点击后,广告主就会给搜索引擎付费,这就叫点击付费。这里面第一层勾结就是搜索引擎和广告主之间。广告主希望自己的产品被关注,所以花钱雇搜索引擎帮忙展示。什么算被关注呢,双方约定被用户点击了就算被关注。接下来是搜索引擎和用户的苟且。搜索引擎希望给用户展示广告并得到点击,用户希望从搜索引擎高效获得自己想要的信息,所以搜索引擎把广告和自然结果合到一起给用户,用户爱点哪儿点哪儿,deal! 广告平台就是广告主,搜索引擎和用户三方博弈的平台。
一则搜索广告是怎么诞生的呢?首先广告主找到搜索引擎(或者搜索引擎找到广告主)谈好什么样的查询词来了以后出什么样的广告,付多少钱。完了以后这则广告就进入搜索引擎的广告库等着触发它的那个查询了。这个库可能会非常大,数以亿计。格式嘛,就是 <广告,触发条件,价格> 这样的三元组。比如 <'淘宝网--淘!我喜欢‘, 当查询词是’京东官网‘时触发, 点一次1元> 。触发条件里的那个词通常叫作关键词(bidding keyword)。当用户输入一个查询以后,搜索引擎赶紧用它去匹配自己的广告库,找出来所有满足触发条件的广告。这里就是广告平台的第一个关键技术,叫做广告选取或者广告触发(Ads Selection)。这样选出来的广告会非常多,其中很多都不靠谱。不靠谱一方面是由于广告主设置的触发条件不准确,比如上面的例子,淘宝可以买京东的关键词;另一方面一些高级的触发策略会带来一些不相关的广告,后面我们会讲。所以为了砍掉这些不相关的广告,就需要另一个关键的模块叫广告相关性(Ads Relevance),这个模块做的事情就是过滤掉不相关的广告。有的同学可能会问,广告不就是为赚钱吗,管它相关不相关,毕竟央视播放女性卫生用品的广告时也不管我是男的还是女的。对这个问题的答案,说好听点是因为搜索广告是一种精准广告,直达所需,为用户量身定制,为广告主把好钢用在刀刃上。当然搜索引擎也有自己的小算盘,给用户展示不靠谱的广告,会损害用户体验,搞不好要流失用户,相当于杀鸡还不一定取得到卵。过滤完不相关的,剩下的就都被认为是可投放的,但是广告位有限,一般只有顶部最多三四条和侧边最多七八条的位置,而通过相关性过滤后剩下的广告要远远超过这个数,那么选哪些出来以及选出的广告怎么排列(不同的广告位重要性不同)就是整个广告系统最为核心的问题,这就涉及到广告系统最核心的技术——点击率预估(Click Prediction)。排序的细节之后细讲,总之可以认为经过点击预估后就可以对广告进行排序,然后顺次放到从上到下,先顶部后侧边的位置。就这样,一页搜索广告新鲜出炉,配着若干自然结果呈现在用户面前。如果用户点了广告,搜索引擎就会跳转到广告登陆页(Landing Page),并且用小本本记录这次点击,回头好和广告主要钱。这就是搜索广告平台的简单流程。接下来介绍平台中的几项核心技术。
按着上面讲的流程,咱们先介绍广告触发。首先广告平台允许广告主自己设置关键词,当查询精确匹配关键词时,就出和这个关键词对应的广告。这种选取方式叫做精确匹配(Exact Match)。但实际上,很多广告主哪儿知道该设置什么关键词啊,所以广告平台还有另一个小技术叫关键词推荐,根据广告推荐一堆关键词给广告主。不管怎么说,精确匹配虽然质量高,但是触发比例比较低。比如你设置的关键词叫“可口可乐”,那万一有个用户搜“可乐”,也是可以展示一下的嘛,但精确匹配却做!不!到!为了解决这个问题,又设计了很多高级匹配方法。比如当搜索词是关键词的字串或反之搜索词包含关键词,也都可以触发。另一类非常重要的匹配,叫智能匹配(Smart Match),就是说广告平台根据一定的算法认为搜索词和广告相关,那么就可以触发。比如用户搜 “爱上火喝什么?”,我们可以给他展示王老吉或者加多宝的广告。广告触发的核心是对查询的理解和对广告的理解,并把他们匹配起来。很多自然语言处理,信息检索,数据挖掘和人工智能的技术都会涉及到。主要有三类比较流行的触发方法。首先是基于关键词理解的方法。这类方法就是对查询和关键词隔离审查,分头料理,取出核心信息,然后建立匹配。比如关键词叫 “山东蓝翔职业技术学校”,我们提取核心词 “蓝翔”, 然后对查询 “谁来讲讲蓝翔技校怎么样?" 我们也提取核心词 ”蓝翔“,这样他们就可以匹配了。那么这核心词怎么提取,这就看技术积累了,不光要能从“蓝翔技校”中提出“蓝翔”,还要能从“挖掘机技术哪家强?”中提出“蓝翔”。这方面的技术细节非常多,比如协同过滤,session挖掘,同义词替换,co-click挖掘等等,不展开。第二类方法是基于检索的方法,对广告分词建立倒排索引,然后用分词后的查询去查倒排表,得到召回的广告。检索方法的缺点首先是容易召回badcase,假设我们用unigram建索引,我们给 “新东方学英语”的查询召回“新东方厨师学校” 的广告还算好的,甚至会召回 “东方红,太阳升” 的广告。所以要有好的质量控制机制。另外,检索系统只有当查询和广告有至少一个共同的词时才可以召回。第三类方法是基于词向量的方法。微软的CDSSM模型和谷歌的word2vec模型,已及一堆DNN,RNN的模型都可以很好地把文本映射成K维空间的向量,使得语义相似的文本对应的向量离得比较近。这样我们先把查询和广告变成向量,然后在向量空间找出与查询相近的广告。这种方法即使广告和查询没有任何重叠的词,只要语义相关,便可以召回,这是一种更加鲁棒的方法。
接下来讲一下广告的相关性。上面我们截图的广告叫广告拷贝(Ad Copy),是广告主编辑的广告展示样式,一般由标题,正文和展示URL组成。当我们点击广告时,会跳转到广告登陆页。由此可见,广告的相关性可以分为两块,一个是查询和广告拷贝的相关性;另一个是查询和广告登陆页的相关性。大部分广告拷贝和广告登陆页主题是一致的,所以当广告拷贝和查询相关时,登陆页往往也相关。但是也有挂羊头卖狗肉的广告主,明明广告拷贝说的是性感超模,打开一看广告登陆页居然是买家秀,这种情况也很多。所以广告相关性要综合考虑广告拷贝和广告登陆页,但通常广告拷贝的相关性要优先考虑,毕竟广告登陆页不是所有人都会看到的嘛,而且大部分情况下广告拷贝相关性做好了,广告登陆页也就随着做好了。和搜索相关性类似,广告相关性也通常采用机器学习+规则的方法。机器学习的数据是经人工标注的<查询,广告>对,模型一般选择GBDT。这个模型的美妙之处在于你可以把一些规则放进模型里,使得机器学习和规则完美融合。特征通常包括BM25,term overlap,number of occurance等文本特征,甚至一些子模型的输出。我们的系统中,排第一的feature是一个LR的子模型的输出;排第二的是semantic vector的consine距离。
下面聊一下广告的点击率预估。为什么要预估点击率呢,先要讲一下广告的排序策略。广告是为了赚钱的,但是广告要点击之后才能收钱,所以要预估展示这条广告能赚多少钱,就要先预估一下这个广告有多大可能被点击,这就是点击预估做的事情。通常来讲,对于广告,rankscore=bid*pClick, 其中bid就是广告主愿意为一次点击付多少钱,而pClick就是预估的广告点击率。明眼人一看应该知道,其实这个式子就是期望收益。广告排序的目标就是期望收益最大化!由此可见,点击率预估准确与否直接决定了实际收益是否符合期望,所以它是整个广告系统最为核心和困难的工作。点击预估通常采用大规模机器学习的方法。最流行的模型是逻辑回归(Logistic Regression, LR),这个模型非常简单,而且易于训练,所以能够使用非常大规模的feature和海量的训练数据。一般来说feature维度会达到十亿级别,训练数据则会上百亿。早期普遍做法是基于LBFGS的离线学习,就是离线用所有数据训练个模型放上去。这样的模型有个缺点,就是随着时间推移,模型的性能会下降。因为模型的特征大多是binary feature,随着时间推移,很多feature失效了,新的feature没有有效补充进来,性能自然会下降。比如有一组feature叫user_id,是用来判断每个用户的点击偏好的。那模型训练时数据里面有三个用户“张三”,“李四”,“王五”,过了一段时间又来了一个“赵六”,模型现在并不知道“赵六”是否爱点击广告,当然无法准确预估了。还有个原因是即使这个feature没有失效,但feature对应的行为可能会变化。譬如“王五”以前不喜欢点击广告,然后最近突然发财了,喜欢网购,可能会转向喜欢点击某些广告,那这个时候模型就会变的不准确。所以LR的模型一定要频繁地更新。最粗暴的更新就是定期补充最新的数据重新训练模型。这样很麻烦,因为那么多的feature,那么大的训练数据,训练一次比较费劲的。一个替代方法是增量式学习,隔段时间用新的数据更新已经训练好的模型。或者干脆用两个模型,一个模型是用大数据训练的,更新周期略长,再加一个小模型,永远用最新的相对较少的数据训练,频繁更新。然后线上把这两个模型的输出做个线性组合输出最终的分值。再到后来发展成了在线学习,就是online一边用这个模型预估,一边用反馈回来的数据修正这个模型,模型在不停地更新当中。代表性的算法就是G公司发表的FTRL,有兴趣的同学可以看看他们家发表的论文。当然也有用人工神经网络(Neural Network, NN)甚至是现在很火的深度神经网络(Deep Neural Network, DNN)来做点击预估模型的。NN类方法的好处是可以学到feature之间的交互作用。譬如我们有两组feature,一组是用户性别,另一组是广告类别,NN类模型可以学到当性别为女,广告类别是化妆品时,提高点击预估;当性别为男,广告类别是蕾丝裙时,降低点击预估。上面讲到的LR模型则做不到,LR模型的前提是假设feature之间是完全独立的。LR模型想学这种关系,要显式地把这两组feature做个笛卡儿积作为新的feature加进去,这样会导致feature的规模显著地增加。但是NN类模型也有自己的缺点,那就是训练复杂,不能支持非常大规模的特征数量和训练数据。现在被证实比较有效的是多模型Hybrid。先单独训练一些简单模型,然后把他们的输出作为GBDT或者NN乃至DNN的feature重新训练。点击预估的模型是一个偏记忆的模型,最重要的是在海量数据中学习各个维度下的点击行为,所以尽可能去用大规模的feature和大量的数据吧!
最后想花点时间说一下广告系统其他一些比较重要的点。一个是广告系统的评价指标,系统中的不同技术和策略,如何评价哪一种好呢?最重要的指标是千次搜索的广告收益,叫做RPM(Revenue Per Thousand Impression),就是说不管怎么玩,涨收入是第一位的。当然收入也不是唯一的指标,上面已经讲了,广告平台是搜索引擎、广告主和用户的三角恋,亏待了谁都玩不转。缺陷率(Defect Rate)也是个重要的指标,就是说展示的广告当中,多少比例是和用户不相干的,是缺陷的,缺陷率越低越好,这个指标是为了保护用户体验的。归一化的点击率(Click Through Rate, CTR)是另外一个非常重要的指标。它一方面反映了用户对广告的满意度,另一方面反映了广告平台的效率。如果点击率很低,说明这广告平台光是展示广告,没人点击,用户不满意,而且也赚不到钱,赚钱效率低。这里需要注意的是,要看归一化的CTR,不能看CTR的绝对值。因为CTR的绝对值是受展示量的影响的。你展示少而精的广告,CTR肯定高,但是赚钱少。展示越多广告,CTR越低,靠走量来赚钱。但太多了容易引起用户反感,说到底还是搜索引擎而不是广告引擎,所以展示多少要平衡好。所谓归一化的CTR就是放到同样规模展示水平上的CTR,是广告平台健康状况的重要指示。还有一个指标是平均每次点击的价格CPC,CPC太高广告主不乐意,所以如果可能,尽量通过提高点击次数来赚钱,不要通过提高CPC来赚钱。讲到这里顺便说一下CPC和Bid的关系。上面讲了,Bid是用户设定的愿意为一次点击付的钱。而CPC是点击以后实际收取的钱。事实上我们并不是按Bid收钱的,搜索引擎的收费模式叫做泛化的第二价位价格(Generalized Second Price, GSP),所谓第二位价格,就是说拍卖的时候,你拍赢了,并不会真正收你出的价,而是收你的下一位出的价,也就是收取第二位的出价。在广告里面,那就是点击一条广告,收取这条广告下一个位置的广告的出价。那么问题来了,下一个位置可能出价比我的出价还高,因为广告排序不光看Bid,还看pClick,这我肯定不干啊。所以要泛化一下。怎么泛化呢?计下一位的Bid为Bid_2, 下一位的pClick为pClick_2,你的pClick为pClick_1, 你的Bid为Bid_1,那么,收你的钱=Bid_2*pClick_2/pClick_1,这样可以保证收你的钱不超过你的出价,因为Bid_1*pClick_1>Bid_2*pClick_2。另外,这种模式下,你的广告pClick越高,被点了以后收的钱越少,也可以激励广告主去优化自己的广告,用户也可以看到高质量的广告,可谓三方都受益。
好了,零零碎碎就写到这里了,整个广告系统是非常复杂的,其中的每个技术点都可以讲很多论文,所以没法写的太仔细。这是篇科普性的文章,我尽量用少的术语和数学公式,希望对想了解广告技术的同学有帮助。

浙公网安备 33010602011771号