我们当今身处一个被广告包围的时代,无论是走在马路上、收看电视剧、或者是玩手机游戏,都能看见形形色色的广告。随着时代和技术的发展,广告的形式呈现出多样化、立体化的趋势,从最早的纸媒广告发展到如今的网页的展示、搜索广告,广告的定位也从原先的“广而告之”发展成大数据时代的“精准营销”,相应地,人们对广告的态度也在悄然变化。这一切都得益于互联网技术的快速发展以及用户数据的爆炸式增长。作为IT从业者,自然想对广告产业背后的产品、技术一探究竟,正如刘鹏博士在其《计算广告》一书中所说的“不论你在做一款用户产品还是商业产品,不深入了解在线 广告,就不太可能全面地了解互联网业务”,
因此本文也希望能带领读者从产品、技术以及整个生态的角度深入浅出的了解计算广告。
首先,在深入了解计算广告之前, 有必要先对一些核心术语做简单的介绍。
-
广告主:
有广告需求的客户公司,也称为需求方
-
媒体:
可以是网站或者app,即有多余的广告位可以出售,也称为供给方
-
RTB(Real Time Bidding,实时竞价)
:综合利用算法、大数据技术在网站或移动应用上对在线的流量实时评估价值,然后出价的竞价技术
-
DSP(需求方平台)
:为各广告主或者代理商提供实时竞价投放平台,可以在该平台上管理广告活动及其投放策略,并且通过技术和算法优化投放效果,从中获得收益
-
SSP(供应方平台)
:为各媒体提供一致、集成的广告位库存管理环境
-
DMP(数据管理平台)
:整合各方数据并提供数据分析,数据管理、数据调用等,用来指导广告主进行广告优化和投放决策
-
Ad Exchange
,简称Adx(广告交易平台):同时接入了大量的DSP和SSP,给双方提供一个“交易场所”,将SSP方的广告展示需求以拍卖的方式卖给DSP方。可以类比于股票交易中的证券大厅角色
-
CTR(点击率)
:广告点击与广告展现的比例,这是广告主、各大DSP厂商都非常重视的一个数字,从技术角度看,这一数字可以影响到广告的排序、出价等环节,从业务来看,这是运营人员的考核指标之一
-
CVR(转化率)
:转化(主要由广告主定义,可以是一次下单或是一次下载app等)次数与到达次数的比例
-
eCPM(千次展示期望收入)
:点击率 * 点击价值,这个数字在计算广告中是核心指标,涉及到对召回广告的排序策略,以及最终出价策略
-
CPM(Cost per mille)
:每千次展现收费,最常见的广告模式,即不考虑点击次数、转化次数,只要广告在网站上被展现给一千个人看到就收费,是大型网站变现的最有效的方式。对广告主来说,适合于注重推广品牌的广告,力求最快最广的触及大众
-
CPC(Cost per click)
:每次点击收费,无论广告被展现了多少次,只要没有产生点击就不收费。对于广告主来说选择 CPC 模式可以有助于提升点击量、发现潜在用户,进而可以真正做到精准营销;对于广大DSP厂商来说,这种收费模式也是获取利润的最有效来源之一
-
CPA(Cost per action)
:每次动作收费,此处的动作一般定义为转化,可以是注册、咨询、交易、下载、留言等等,按照转化的数量来收费。对于广告主来说,这是性价比较高的一种收费方式,但是对于DPS和媒体方来说,想要把这种收费做好,却是有相当的难度。因此,目前也只有大厂或者技术实力深厚的DSP厂商才有能力接这种单子
-
其他的还有CPT(按展现时间收费)、CPL(按潜在线索收费)、CPS(按成功销售收费)等模式,由于应用没有那么广泛,在此不一一介绍了
在RTB模式出现之后,我们发现展现的广告越来越精准了,好像网站知道用户是谁、用户在做什么、用户对什么感兴趣,因此,在了解了上述这些核心术语之后,接下来就以网站用户角度,从流程上解析RTB是如何做到精准展示广告的。
-
用户通过浏览器访问网站
-
浏览器发送广告请求给网站服务器,即SSP方
-
SSP将广告展示需求发送给Adx
-
Adx组织一次竞价,将本次的竞价请求通知给所有DSP方,并传输用户ID、用户IP以及广告位信息等等
-
各家DSP监听服务收到Adx发来的竞价请求后,根据发送来的当前用户的信息、上下文信息、代理的广告主信息对照投放需求,评估该请求
-
各家DSP将根据评估结果决定是否参与出价,若参与,则将出价结果通知Adx
-
Adx收到所有出价响应后根据出价排序,通知出价最高的DSP胜出,同时将胜者的竞价信息告知SSP
-
胜者DSP会收到Adx发送的竞价消息(WinNotice),表示该次展现已经竞价成功。DSP此时将广告物料传送至浏览器展示。至此,一次完整的竞价流程就完成了
有两点需要说明:
-
以上流程需在100毫秒之内完成,也就是一眨眼的功夫都不到,这样才能让访问网站的用户马上看到广告。
-
虽然竞价最后的胜者是出价最高的DSP,但其实际支付的价格是出价第二高的报价再加上一个最小值,
这就是著名的广义二阶拍卖(GSP)。
这种定价模式的好处主要是为了避免各家DSP在多次竞价中,下一次的出价只需比上一次的胜出价格高一点点即可,从而导致出价越来越低。在GSP模式下,每个胜者只需要支付次高出价的金额,这样各家DSP也就没有动力相互压价。GSP是一种稳定的竞价方式,可操作性很强,现阶段几乎所有的互联网广告平台都使用这一种竞价方式。
纵观计算广告的发展会发现,整个市场本质上是计算驱动的,而计算背后最大的推动力正是互联网以及大数据,而大数据的发展动力又来自于硬件和软件。
因此接下来,就来剖析下技术细节。
1.架构
一个典型的广告系统架构如下图:
结合上图,广告系统有以下几个重要组成部分:
(1)受众定向平台:
这部分一般为离线挖掘,是系统中最具算法挑战的部分,利用数据挖掘、机器学习等技术进行受众定向,点击率预估等工作。具体还可以细分为以下几个模块:
-
会话日志生成(Session loggeneration)
:从各个数据平台收集日志,并最终根据用户ID为主键汇集成一份统一存储格式的日志,从而为后续的数据分析、算法研发提供数据来源。
-
行为定向(Audience targeting)
:从会话日志中根据用户的行为,利用数据挖掘、机器学习等算法建模,从而可以刻画出用户的行为模式、兴趣点等,最终为用户打上结构化标签,以供广告定向投放使用。该模块在整个系统具有非常关键的作用。
-
点击率建模(Click modeling)
:利用大数据工具以及算法,从会话日志中提取预定义的特征,训练一个点击率模型,加载到缓存中以供线上投放系统决策时使用。
-
商业智能模块(BusinessIntelligence)
:包括ETL(Extract-Transform-Load)过程、Dashboard、cube。BI系统可以为决策者提供直观且即时的数据分析,而算法对决策者来说相当于黑盒,因此,设计一个良好的BI系统可以为决策提供有力的帮助。另外,在广告投放中,除了技术之外,运营是非常重要的角色。所以,这一模块也影响到了广告运营的策略运行以及调整。
(2)高并发的投送系统
:也就是在线的广告投放机(Ad server),主要任务是与各模块交互,将它们串联起来完成在线广告的投放决策。特点是高并发,要做到10ms级别的实时决策,百亿次/天的广告投放系统。具体可细分为以下几个模块:
-
广告检索(Ad retrieval)
:也称为广告召回,即根据用户属性以及页面上下文属性从广告索引(Ad index)中查找符合条件的广告候选。
-
广告排序(Ad ranking)
:主要功能是对广告检索模块送来的广告候选集计算eCPM,并按照值的大小倒排。eCPM的计算依赖于受众定向平台离线计算好的点击率。由于最终投放出的广告都是来自于排序的结果,因此这一模块也是至关重要,成为各种算法模型和策略大展身手的地方。
-
收益管理(Yield management)
:将局部广告排序的结果进一步优化,以做到全局最优收益。
(3)
数据高速公路:
联系在线与离线的部分,可以用开源工具实现。作用是准实时地将日志推送到其它平台上,目的一是快速地反馈到线上系统中,二是给BI人员快速看结果。它还可能收集其它平台的日志,比如搜索广告会收集搜索日志。
(4)流式计算平台:
主要功能是对在线数据的处理,做到准实时的挖掘和反馈,解决那些离线计算平台无法快速响应的计算问题。具体又可分为:
-
实时受众定向(Real-timetargeting)
和
实时点击反馈(Real-time click feedback)
:对用户的实时行为进行计算,如实时更新点击率模型、动态调整用户标签,进而更好的适应线上环境。实践表明,实时系统的作用对于最终效果提升明显大于离线系统,举个简单例子,当实时点击反馈模块发现当前用户的行为与其历史点击行为有较大差异时,可以反馈给其他模块并通知进行及时的更新,从而可以更好的满足用户变化的需求,最终提升效果。
-
计费(Billing)
:该模块掌管着广告系统的“钱袋子”,运行的准确性和稳定性直接影响了系统的收益。在广告投放过程中,经常会遇到投放预算用完的情况,这时计费模块必须及时反应,采取例如通知索引系统暂时将广告下线的办法,避免带来损失。
-
反作弊(Anti-spam)
:利用算法和人工规则等实时判断流量来源中是否有作弊流量,并将这部分流量从后续的计价和统计中去掉,是广告业务非常重要的部分。
2.
硬件
在以上介绍的架构图中,都离不开大数据工具的作用,其中大多来自开源社区,正所谓,工欲善其事,必先利其器。可以说,正是由于这些成熟的开源工具有力的保障了数据通信、数据传输、负载分配等底层架构的健康运行,才使得上层的广告算法和策略能快速发展。
(1)Hadoop:
一个由Apache基金会所开发的分布式系统基础架构,用户可以轻松地在Hadoop上开发和运行处理海量数据的应用程序,主要优点有:高可靠性、高扩展性、高容错、低成本。Hadoop框架最核心的设计就是:HDFS和MapReduce。
-
HDFS是一种易于横向扩展的分布式文件系统,是分布式计算中数据存储管理的基础,适合应用于流数据模式访问和处理超大文件的需求,不适合于要求低时间延迟数据访问的应用、存储大量的小文件、多用户写入。广告系统中用户生成的海量日志就是存在HDFS上,为各种离线计算提供服务。
-
MapReduce 是用于并行处理大数据集的软件框架。MapReduce的根源是函数性编程中的 map 和 reduce 函数。它由两个可能包含有许多实例(许多 Map 和 Reduce)的操作组成。Map函数接受一组数据并将其转换为一个键/值对列表,输入域中的每个元素对应一个键/值对。Reduce 函数接受 Map 函数生成的列表,然后根据它们的键(为每个键生成一个键/值对)缩小键/值对列表。在Spark出现之前,MapReduce是在大规模数据上计算点击率预估、挖掘用户行为、生成用户画像等的首选计算框架。
(2)Spark:
一个用来实现快速而通用的集群计算的平台,扩展了广泛使用的MapReduce计算模型,Spark的一个重要特点就是能够在内存中计算,因而更快,即使在磁盘上进行的复杂计算,Spark依然比MapReduce更加高效。举例来说,机器学习中很多算法都要迭代训练多次才能达到收敛,例如聚类算法K-Means,每次迭代需要将K个中心点的位置保存下来,以进行下次的更新,传统的MapReduce计算框架在Map阶段和Reduce阶段用硬盘进行数据交换,这就使得整个训练过程效率很低,而Spark的做法则是将数据加载到内存中,直接在内存中更新K个中心点的位置,大大加快了训练过程。Spark支持各种机器学习算法为代表的迭代型计算、流式实时计算、社交网络中常用的图计算、交互式即席查询等。
(3)Lucene:
用于全文检索和搜索的开源程式库,提供了一个简单却强大的应用程式接口,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构。目前大多数的计算广告采用的是检索加排序模式,为了加快检索的时间,可以对所有广告的关键字建立倒排索引(主键为关键字,值为文档ID),这样在广告召回时,便能快速地从规模巨大的广告库中返回结果。
(4)Storm:
广告系统中除了需要离线挖掘数据,同样还需要在线、准实时的处理数据,例如反作弊处理、实时点击反馈、实时查看某地区当前的广告投放情况等,业界常用的工具是Storm。利用Storm可以很容易做到可靠地处理无限的数据流,像Hadoop批量处理大数据一样,主要的特点有:
-
高性能:应用于需要对广告主的操作进行实时响应的场景.
-
可扩展: 随着业务发展,数据量和计算量越来越大,系统可水平扩展.
-
消息不丢失:能够保证每个消息都能得到处理.
-
编程容易:任务逻辑与MapReduce类似,熟悉MapReduce框架的开发人员可以快速上手
(5)ZooKeeper:
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Hadoop和Hbase的重要组件,为分布式应用提供一致性服务。分布式应用程序可以基于 ZooKeeper 实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master选举、配置维护等功能。简单来说ZooKeeper=文件系统+监听通知机制。在广告系统中,大量的广告投放机就是通过ZooKeeper进行管理,可以把所有机器的配置全部放到ZooKeeper上的某个目录节点中,所有相关应用程序对这个目录节点进行监听。当需要增加一台新的投放机时,配置信息发生了变化,应用程序就会收到 ZooKeeper 的通知,然后从 ZooKeeper 获取新的配置信息应用到系统中。
3.核心算法
介绍完了上述的硬件架构之后,接下来就要了解一下计算广告背后的核心算法和技术。
CTR(点击率)预估是所有广告系统、推荐系统中非常重要的一个指标,可以反映出一个系统是否做的精准,是各个广告系统的“必争之地“。点击率预估的目的是为了广告排序,排序的依据是eCPM,即点击率*点击单价,然后再根据其他策略进行后续处理。
目前业界的点击率预估方法,是利用系统中已有的大量用户行为日志、根据规则抽取特征、离线训练机器学习模型、将模型上线后对每一个请求计算其点击广告的概率值,值的范围为
。
这里既然用到了模型,就不得不提其背后的两个细节。
(1)特征:
在实际的广告系统中,其实有非常多的因素会决定广告的点击率,这些因素在模型中即称为特征,主要分为三大类:
-
广告主侧(Advertiser):比如广告创意、广告的表现形式、广告主行业等。
-
用户侧(User):如人群属性、年龄、性别、地域、手机型号、WiFi环境、兴趣等等。
-
上下文侧(Context):比如不同的广告位、投放时间、流量分配机制、频次控制策略等。
在有了用户日志后,就需要根据上述三类特征进行特征工程。特征工程对于机器学习来说非常重要,可以使特征更好地在算法上发挥作用,一般包括特征选择、特征提取、特征构造。
1.1 特征选择:
在实际拿到的数据中一般都有非常多的特征,但并非每一个都能拿来训练模型,可能有些特征有用,而另外一些特征就毫无作用,即冗余特征,特征选择的作用就是从已有的特征全集中选择出一部分的特征子集。
进行特征选择有两个重要的原因:
一、维数灾难。若对所有特征不加筛选而一股脑全扔进模型,比如,用户ID和设备ID交叉之后,特征的维度就会非常高,而其实这样的组合特征完全可以只用一个特征来代替,进行特征选择就会大大减少冗余特征,缓解维数灾难问题。
二、去除冗余特征可以减轻模型的学习难度,直观感受就是减少模型的训练时间。常见的特征选择方法主要有三种:过滤式、包裹式、嵌入式。
描述的是两个变量间线性相关强弱的程度,绝对值越大表明相关性越强。
的取值在-1
与+1
之间,若
,表明两个变量是正相关,即一个变量的值越大,另一个变量的值也会越大;若
,表明两个变量是负相关,即一个变量的值越大另一个变量的值反而会越小。
在上式求解过程中,最初的特征全集中只有对应于非零权重
的特征才会出现在最终模型中。这样,L1正则化就起到了特征筛选的作用,其特征选择过程与模型训练过程融为一体,同时完成。
1.2 特征提取:
将原始特征转换为一组具有明显物理意义(Gabor、几何特征角点、不变量、纹理LBP HOG)或者统计意义或核的特征,比如通过变换特征取值来减少原始数据中某个特征的取值个数等。常用的方法有:
-
PCA:
PCA的主要思想是将
维特征映射到
维上,这
维是全新的正交特征也被称为主成分,是在原有n
维特征的基础上重新构造出来的
维特征。其中,第一个新维度选择原始数据中方差最大的方向,第二个新维度选取与第一维正交的平面中方差最大的,第三个新维度是与第1、2维正交的平面中方差最大的,依次类推,可以得到n
个这样的维度,最终,大部分方差都包含在前面k
个维度中,而后面的维度所含的方差几乎为
。
-
ICA:
PCA是将原始数据降维,并提取不相关的部分;而ICA是将原始数据降维并提取出相互独立的属性;寻找一个线性变换,使得线性变换的各个分量间的独立性最大。ICA相比于PCA更能刻画变量的随机统计特性。
-
LDA:
也叫做Fisher线性判别(Fisher Linear Discriminant ,FLD),是模式识别的经典算法,基本思想是将高维的模式样本投影到最佳判别空间,投影后保证模式样本在新的子空间有最大的类间距离和最小的类内距离,即模式在该空间中有最佳的可分离性。
1.3特征构建:
在经过了特征选择之后,确定了需要放入模型的特征后,接下来就要对特征进行处理,对特征进行转换、加工、处理成模型能够识别的格式。根据不同的数据类型,需要采取不同的处理方式:
一般采用分桶或者分段的方式,即事先指定每个桶的取值范围,然后将特征值划分到桶中,最后用桶的编号作为新的特征值。对于桶的划分又可以分为等频(各个桶中的数量大致相同)、等宽(各个桶的上下界的差值相同)、人工指定。一般来说,等频离散不会像等宽离散出现某些桶中数量极多或者极少。但是等频离散为了保证每个区间的数据一致,很有可能将原本是相同的两个数值却被分进了不同的区间,会对最终模型效果产生一定影响。人工指定则需要根据过去的经验来进行划分,例如对于反馈点击率,发现过去的点击率集中在1%和2%之间,因此,可以这样划分(python代码):