原作:@面包包包包包包
修改:@寒小阳 && @龙心尘
鸣谢:百度德川、阿里怀人、阿里口肃、腾讯Fandy王、优酷吕红亮
时间:2016年8月
出处:http://blog.csdn.net/breada/article/details/52275063 ,
http://blog.csdn.net/han_xiaoyang/article/details/52275318
声明:版权所有,转载请联系作者并注明出处
1. 引言
提笔写这篇博客,我的内心是惶恐的。原因很简单,作为一个资历尚浅的研究生,是没有资格对计算广告这样一个伟大的行业、领域和学科来评头论足的。之所以这么做,一是总结自己已掌握的知识,二是降低同学们的学习成本。本人能力有限,更缺乏实践经验,文章内容多为书籍和论文的读后感,若有不当或者错误之处,还望各位同学指出,我定悉心求教。在此,向编写《计算广告》的刘鹏和王超两位老师致谢,向各位paper作者致谢。
[关于ML学分计划]
- 由寒小阳和龙心尘发起,一个互帮互助的机器学习知识共享平台。
- 我们是一群对机器学习感兴趣的小伙伴,对于神奇的机器学习经常有“一探究竟”的冲动,却因为孤身一人学习的寂寞、亦或繁忙考试工作之余的小小拖延症,而没有持续这份对知识的渴求和热情。
- 由于深感类似情况的小伙伴之多,我们希望建立一个“ML学分计划”——机器学习的学习和分享计划——来帮助我们一起更高效地学习、更集中地整理分享我们的知识和经验。因为我们也深信”证明自己真的透彻理解一个知识,最好的方法,是给一个不熟悉这个内容的人,讲清楚这个内容“。
[关于原作@面包包包包包包]
- 海淀区明光村计算机职业技术学院,研三学生。
- 关注计算广告点击率预估和竞价算法,关注机器学习和深度学习,初学者。
- 机器学习QQ群:数据科学3群 285273721,行业同学和研究者472059892。
(上)(中)(下)全文目录
引言
广告=>互联网广告
:“您好,了解一下”互联网广告=>计算广告
:指哪儿打哪儿!计算广告四君子
:谁在弄潮?计算广告关键技术
:这孙子怎么什么都知道?广告系统架构
:要啥自行车!手把手系列之教你搭建一个最小广告系统
:mieSys
6. 广告系统架构:要啥自行车!
一句话解释广告系统架构:“道生一,一生二,二生三,三生万物。”
场景1
时间:13:40
地点:北邮北门
人物:快车司机,我
事件:去面试
状态:忐忑
坐在车里,手机打开为知笔记,想再瞅一眼的树的几种遍历方法。眼睛跟着递归,思绪却爆了内存:面试官长什么样?他会问我什么问题?部门名字听起来还挺高大上的?面试完在附近吃点什么呢?听同学说附近的小吊梨汤很赞啊!面包包包,那就小吊梨汤吧?好啊好啊,出来再加个西少爷肉夹馍吧?好啊好啊!“噗”的一下笑出了声,还好司机师傅并没有在意。我连忙收起自己的小尴尬,平复一下心情,然后开口问道,“师傅,今天您拉几单了?”
场景2
时间:14:20
地点:中关村某大厦十几层的一个小会议室内
人物:我
事件:等待面试官
状态:好奇,兴奋
原来大家工位都是在一起的呀。这这会儿灯都关着,还有午休呢。门口小哥和我差不多大,聊的还不错。面试官还没来,先把简历和白纸都摆摆好。一切准备就绪,抿了一口水,可以,这很怡宝。
场景3
时间:14:30
地点:中关村某大厦十几层的一个小会议室内
人物:面试官,我
事件:一面
状态:轻松,愉悦
我:面试官好!
面试官:你好,请坐(拿着简历开始看),先简单介绍一下自己。
我:blablabla…
面试官:嗯,来写道题吧。
我:正面钢,不能怂!挥笔写下了一行代码:
return "烫烫烫" == "屯屯屯" ? "烫屯烫" : "屯烫屯";
面试官:

我:

面试官:加个微信吧,以后要是没事儿了咱们斗图玩儿。
我:哪儿斗得过您呀,跟着您多收藏几个表情,来我扫您二维码。
场景4
地点:中关村某大厦十几层的一个小会议室内
人物:leader,我
事件:二面
状态:认真,专注
leader:听说你们刚刚斗图斗的很开心,我这儿没图,咱们换一种玩法吧。
我:我心想没图你说个。。说一声啊,我发您。
leader:不闹了哈,我看你简历上说你对计算广告有些了解,那你能不能通过一个case能让我知道你对计算广告都了解到什么程度呢?
我:我也顿时来了精神,这个问题好啊!我觉得最好的case是走一遍广告投放的整个流程,在商业逻辑的指导下带出系统框架、功能模块和关键技术,不知您是否感兴趣?
leader:非常好,那你打算从哪里切入呢?
我:就从我们来的地方吧,不忘初心。
时间回到那个清晨,网站收入报表错落着叠放在桌子的一角,左手旁是一杯冷了的速溶咖啡,鼠标有些油腻,用了一年的Cherry青轴依然趁手。敲下最后一个回车,他两手交叠,揉了揉两手酸胀的虎口,“呵,这一夜”。窗外已蒙蒙亮,他有点兴奋,因为今天的太阳,特别好看。

我们在《计算广告小窥[上]》中提到过,互联网广告相较于传统广告,显著之处就在于广告效果可以被衡量。在用结果说话的今天,数据自然拥有着至关重要的戏码。对于媒体网站来说,最重要的数据莫过于用户在什么时间,从什么地方,在网站上做了什么事情。有了这三方面的基础数据,理论上我们可以做任何我们想做的事,譬如在《计算广告小窥[中]》里我们讨论过的受众定向,为用户打上标签,这才有了饼图中的男和女;又譬如点击率预估,将用户可能点击的广告放在最显眼的位置上,提升网站收益。自计算广告诞生以来,类似的应用和场景数不胜数,时刻为用户、广告主和用户服务着。为了能够准确无误的完成上述使命,一个好的广告系统必不可少。那么问题来了,想要完成一次广告投放,需要我们的广告系统具备哪些功能呢?下面我们实地走一遭,完成一次广告投放,看看在这个过程中我们会遇到什么问题、我们如何分析以及如何去解决。所谓一个系统的设计思路,大抵如此吧。
万事俱备,只欠case,具体的case怎么选呢?我替大家选啦!目前为止,我们对饼图应该是最熟的,它那咱们就“重走长征路”,看看如何得到这张饼图,然后用饼图来指导广告投放吧。OK,我们来定义一下问题,我们要完成的是:从数据中挖掘出用户的性别,根据性别为用户展示TA们最可能点击的广告。好了,问题定义完毕,在实际操作之前先从方法论的角度分析一下什么是广告系统,主要有微观和宏观两个方面。
6.0 方法论之——“先把书读厚”
先看前半句,从数据中挖掘出用户的性别,这个好理解,输入是媒体网站的数据,输出就是每个用户的性别,典型的分类问题嘛,打个标签,规则也好,机器学习也好,都是可以做的。后半句呢,根据性别为用户展示TA们最可能点击的广告,输入是用户性别,输出是广告。这些广告是哪儿蹦出来的?想必一定是有一个广告库,这些广告是被挑选出来的,而挑选的依据就是性别。再有,什么叫最可能点击的广告?这个很好理解,当然是用户感兴趣的广告啦,光感兴趣还不行,你还得让用户看到,这就需要排序了,把用户点击率最高的广告放在最显眼的位置上。有没有觉得这些字眼都很熟悉呢?分类,标签,点击率,排序,我们好像在哪儿见过?这不就是我们在中篇里讨论过的关键技术嘛!看来那些高大上的关键技术也是很接地气的,就这么一个看似简单的投放场景,这些技术我们几乎都用到了,好像有点意思哈!现在让我们将上述过程进一步具体,让程序员们可以看懂,便可归纳出下述表格。
步骤 | 输入 | 输出 | 关键技术 |
---|---|---|---|
Step1 | 媒体网站日志数据 | 用户性别 | 受众定向 |
Step2 | 用户性别 | 召回的广告 | 广告检索 |
Step3 | 召回的广告 | 排序的广告 | CTR排序 |
6.0 方法论之——“再把书读薄”

根据这张表,一个模型已经清晰地呈现在我们眼前,如上图。在这里,“输入-系统-输出”是一个非常基本且通用的模型,大家可以在很多交叉学科里见到它的身影,例如通信工程里的《信号与系统》和《通信原理》,或者控制工程里的《现代控制原理》,再如机器学习中模型的训练过程,抽象出来都是如此。虽然应用场景各有千秋,但是核心问题只有三个:输入是什么?输出是什么?如何保证系统的稳定性?想要回答这三个问题其实也很容易,以问题场景与核心需求为导向,多问几个为什么即可。所谓:“道生一,一生二,二生三,三生万物”,就是这个道理。
方法论介绍完,微观和宏观都有了,现在让我们回到广告系统中来。系统的输入是媒体网站的数据,输出是排好序的广告,中间部分便是我们要设计的了。得嘞,那咱们走着!
6.1 日志模块
一句话解释日志模块:我有一个小
咪咪秘密
系统的原始输入是媒体网站的日志数据,具体而言就是网站的访问日志以及用户的行为记录。想不想偷偷看一眼?就一眼哦。

挺丑的哈~丑不要紧,我们有split(” “)!从日志中我们可以看出,每一条记录都是由IP地址、访问时间、GET请求、资源URL和HTTP Header组成的,其中时间就是访问时间,IP地址表示用户所处位置,做了什么就是GET。可是所有人的数据都堆在一起,我哪能分清谁是谁呢?不是有IP地址嘛!IP地址相同的就是一个人。这个思路可以,但一般不这么用,因为IP地址一般是动态的,不够稳定,而且有NAT这种东西存在,粒度不够细。那怎么办?用Cookie!
Cookie,这个?

噢不不,是这个。

Cookie往简单了说,就是媒体网站给用户起的名字,作为用户在该媒体网站上的唯一标识。有了Cookie之后,媒体网站就能很方便的从日志文件里区分出每个人的行为记录,然后就可以给每个用户打上合适的标签,做受众定向了。哇噻,这么简单呀!有数据,有Cookie,做完受众定向就能输出性别啦?没错,从原理上讲的确就这么简单,输入和输出都有了,这个日志模块算是走完了。但工业上要更复杂一些,因为我们一直没说这些日志文件都存哪儿了。心想这有什么好聊的呀,存个文件或者存个数据库不就完了?NONONO,门户网站每天访问量都是按亿算的,简单方法达不到要求。那工业上用的是什么呀,答曰Hadoop——分布式数据处理平台。(以下开源工具部分内容摘自刘鹏、王超老师著作《计算广告》,人民邮电出版社)
通常情况下,数据处理需要一个能够存储和加工海量数据的基础设施,实际上这也是大多数大数据系统都需要的平台。在开源的这类平台工具中,Hadoop几乎是工业界的标准选择。Hadoop的核心架构包括HDFS、Hadoop MapReduce和HBase,其中HDFS是GFS(Goole File System)的开源实现,MapReduce是Google MapReduce的开源实现,而HBase则是Google BigTable的开源实现。
HDFS是一种易于横向扩展的分布式文件系统,提供大规模数据文件存储服务,支持PB级数据规模。它可以运行在上万台的通用商业服务器集群上,提供副本容错机制,为海量用户提供性能优越的存取服务。计算广告系统里的海量日志文件等就是通过数据高速公路传送,最终存储在HDFS上,为各种离线计算任务提供服务。
Hadoop MapReduce是一种分布式计算框架,顾名思义,它由两个部分组成:Map和Reduce。Map是将一个作业分解成多个任务,而Reduce是将分解后多任务处理的结果汇总起来。在程序设计中,一项工作往往可以被拆分成多个任务,任务之间的关系可以分为两种:以是不相关的任务,可以并行执行;另一种是任务之间有相互依赖,先后顺序不能够颠倒,MapReduce适用于第一种类型,庞大的集群可以看作是硬件资源池,将任务并行拆分,然后交由每一个空闲硬件资源去处理,能够极大的提高计算效率,同时这种资源无关性对计算集群的横向扩展提供了最好的设计保证。
在广告系统中,Hadoop主要承担着离线数据的存储和计算需求,可以说是计算广告系统进行大规模数据处理不可或缺的基础平台。无论受众定向、点击率预估还是基础的报表生成,都需