声明:
1)该博文是整理自网上很大牛和专家所无私奉献的资料的。具体引用的资料请看参考文献。具体的版本声明也参考原文献
2)本文仅供学术交流,非商用。所以每一部分具体的参考资料并没有详细对应,更有些部分本来就是直接从其他博客复制过来的。如果某部分不小心侵犯了大家的利益,还望海涵,并联系老衲删除或修改,直到相关人士满意为止。
3)本人才疏学浅,整理总结的时候难免出错,还望各位前辈不吝指正,谢谢。
4)阅读本文需要互联网广告业的基础(如果没有也没关系了,没有就看看,当做跟同学们吹牛的本钱)。
5)此属于第一版本,若有错误,还需继续修正与增删。还望大家多多指点。请直接回帖,本人来想办法处理。
写好标题,却迟迟不知道怎么动手,最近机器学习的一个分支——深度学习,真是火得没朋友啊,过去十几年的最热门的核方法,被成功的放到一边去了,整个工业界开始重新聚焦到神经网络这边来了。
方法万能论总是那么让人热血沸腾的。
可惜经过一段时间的摸爬滚打,脑子总算清醒了一点,也从一个广告算法工程师的角度去看看这个问题吧。
也不谦虚了,就打个比方吧,把角色分一下好说话。类别互联网广告(或者说数据挖掘领域),拿餐馆做比喻的话,那么数据就是食材,算法工程师就是厨师,算法就是配料。一道菜要好吃,就得要求食材好,厨师好,配料好而且用得好。
所以一道菜好不好吃,不是在一个点完全决定的,而是综合的作用的。
下面就分别论述一下吧。
1.1数据是王道
上面说过了,数据是食材,食材的质量本质上决定的一道菜能做到多好。食材不好,配再好的厨师,用再好的配料,都是烂泥扶不上墙的。
那么就要求有很好的数据了,那么问题就来了——什么样的数据才是好的数据?
这个问题就及其难以回答了,如果从互联网广告方面看,还算有经验。下面就班门弄斧自问自答了。
用户的profile,如年龄,性别,职业,地域(细化到某区会更好),教育水平,婚恋状态,登陆的平台(手机型号或者PC),社交好友圈,关注的名人,平时浏览的网页,平时泡的论坛,经常使用的应用等等。
为啥呢?
因为广告主都是卖东西的,一个人的年龄,性别,职业等等因素,很大程度上影响了这个人的兴趣点所在。而婚恋状态,很好说明的这个人在某些东西上面的需求;登陆的平台,一定程度上反应了一个人的消费水平甚至消费观念;职业,能说明一个人的财富水准;社交好友圈,也能反映一个人的财富水准以及兴趣圈子;关注的名人,平时浏览的网页,平时泡的论坛,经常使用的应用等,都能准确反应一个人的兴趣,不同的名人,网页,论坛,应用,可以认为是不同的兴趣的体现。
用户对广告的历史点击行为序列,也可以认为是比较有效的数据,只是会是一个瞬时发送的兴趣,瞬间消失,那是需要实时捕捉的,大部分广告平台都能得到这样的数据。
有些广告平台就没有这么好的数据了,一个人的profile数据就是非常难以获取的,相当多的DSP,其实连识别一个人都有难度,更别提用户的profile了。
如果没有profile,就依赖很多方法去估算或者去一些平台去爬,当然也可以去向DMP请求。
由这里,其实就诞生了很多工作——数据收集,清洗。这个也可以比喻成采购食材。在这一步,就可以使用一些数据挖掘的算法了,比如在清洗阶段,有些统计知识如均值,方差,数据挖掘方法如异常点检测,都能用上了。如先把数据拟合一下正态分布,把离分布中心很远的样本舍弃掉。
有些不知道年龄的用户,就用一些分类方法或者聚类去估计,这是就有决策树或者svm,kmeans的上场的机会了。
用户的职业的估计方法也很复杂,一些基本的入手思路就是从好友圈传递过来,比如好友圈里面大部分都是程序员,这个人也认为是程序员。
关注的名人、浏览的网页、使用的应用、泡的论坛,这几个都有兴趣倾向的。就需要使用LDA等等建模方法,把一个名人,网页,应用,论坛变成一个个兴趣的向量,再根据一个人在各个来源方面的倾向,给一个人分配一个兴趣向量。然后就可以根据兴趣来进行商业上面的对广告主的匹配程度了,如一个人经常关注科比,逛篮球论坛,看篮球新闻,那么这个人对篮球的相关广告也会有比较大的好感。这里,topic model啊,分词方法啊,甚至分类、回归方法都能用上;如果炫一点,还能用上深度学习算法。
有了这些用户的profile,才能把特征工程做起来,不然特征工程就巧妇难为无米之炊了。看前面的博文,各种交叉组合特征,都是建立在这个profile已经建立的情况下的,如果没有这些profile,特征工程就黄了。
对于挖掘用户profile的工程师来说,食材就是那些从各个地方收集过来的数据,他们自己是厨师(往往也是那个洗菜的),利用各种工艺和配料生成了数据。他们的产出,一部分直接端给客人了(广告主做定向),一部分作为二级食材,让大师傅(竞价排序的负责人)再加工,加配料,做出了一道大菜(广告业务),也端出去给大客人了(老板与董事会)。
1.2选择合适的算法
所谓算法是配料,就是对相同的食材,用不同的配料,得到的菜味道是不一样的。就像荔枝蘸盐蘸醋吃,味道是不一样的。
如ctr预估模型,有logisticregression,也有gbdt,也有阿里盖坤的分片线性模型,甚至有random forest,这几种预估方法,在相同的数据上面,会出现不一样的效果,有些估得会更准,有些估得不准。
又如估年龄的方法,可以利用用户的各种行为,各种关注的名人、浏览的网页、使用的应用、泡的论坛作为特征,用svm去估,能得到一个结果;用kmeans来估,又是一个结果;当然也可以根据他好友圈的年龄的平均,或者中位数,也能得到一个结果;根据他的职业和婚恋状态,利用logistic regression来估,也有一个结果。这各种结果基本都不一样,有些准,有些不准。
又如挖掘用户兴趣,利用topicmodel先把一个名人,网页,应用,论坛变成一个个兴趣的向量,再根据一个人在各个来源方面的倾向,给一个人分配一个兴趣向量,能得到一个结果;直接根据运营指定一些论坛,或者频道,网页的兴趣,然后再加权分配给每个人,也能得到一个结果;把每个广告主指定兴趣向量,根据用户的历史行为数据,每点击一个广告主,就把这个广告主的兴趣向量分给这个用户,也能得到一个结果;根据用户的各种行为,各种关注的名人、浏览的网页、使用的应用、泡的论坛作为特征,利用kmeans进行聚类,对每个类别,用相似计算的方法,或者人工指定一个兴趣向量,也能得到一个结果;把用户所有的数据一起拿过来,利用word2vec和一些深度学习的方法,得到一个用户的表征的向量,也得到了每个广告主,或者兴趣类目的表征的向量,相关的向量做相似度计算,也能得到用户兴趣向量。
综上,算法可以各种挑着用(配料嘛),出来的结果不一样,有些好,有些不好。这就很依赖人工或者线上效果去验证,评估哪个好了,好的结果才拿出去见客人,差的就不能用了。
到这,不知道大家明白了没有,说这么多,也没有说哪个算法好,而是要根据食材不同,去优选最合适的。这个跟找配偶一样的,没有最好的,只有最合适的。
1.3算法工程师的工艺
所谓看工艺,就看算法工程师的理论功底和经验了。
每个配料生产厂家都会大肆宣扬他们家的配料好,算法工程师不能每家都相信,但也不能每家都不相信,只好都试试看,选择最适合自家食材的就行。
算法工程师同样也是,选择最合适的算法来完成任务就可以了。
同样的数据,同样的可供选择的算法,在不同的算法工程师手里,依然会出现不一样的结果,如当年某公司做ctr预估的时候用的很多是连续型特征,后来某大牛过来负责后,替换成了离散型的特征,效果就好了。对于各个公司来说,找到不同的算法工程师,也能决定一个业务的能做成什么样子。
对于算法工程师来说,确实没有一劳永逸的方法,成长也没有什么捷径,摸爬滚打地成长似乎免不了,有些聪明的人,可能会快一点。以下算是一些成长经验吧。
首先算法工程师也要成长为产品经理,要加强业务功底,根据业务需求决定优化的一个限度。要注意的是,比如预估年龄这样的一个任务,可以有很多种做法,各种做法难度不一样,投入产出比不一样,投入人力也不一样,算法工程师需要了解业务对这个年龄的需要程度(是否绝对的决定收入?),还需要了解当前团队的实力以及资源(机器,可用工具),再选择一两个合适的算法去试,同时还要决定,当哪些条件满足的时候,任务就可以告一段落了。
上面对“算法工程师需要”后面的那些话,说起来好像非常清楚,只是,真有这种感觉的人才是站着说话不腰疼。
这个“了解业务对年龄的需要程度”,也是一个不容易的任务,产品经理需要的肯定是越准确越好,运营也是这么觉得的,觉得错一两个都不行,但是能做到吗?那么能做到多少是正确的?90%?80%?70%?年龄在整个业务里面占什么样的地位?定向那里算一个,ctr预估那里算一个,还有算法的其他一些挖掘算一个,整个业务的全景都了解了,才能具备“了解业务对年龄的需要程度”这个条件。
“了解当前团队的实力以及资源”,这话也是知易行难啊,了解团队的实力这个事情靠跟同事合作得来的,还得了解自己有几斤几两,这个往往有人不容易做到了;另外团队有多少机器和工具都清楚,但是这些机器也不是全部用来弄年龄这个事情的,还有其他任务要做的;团队里谁来做这个任务,或者自己做需要多少时间,其他任务怎么安排,都是问题的。老板不会专门找个挖掘年龄的人来放着的。
而“选择一两个合适的算法去试”这句话倒不简单,首先算法工程师得了解多个算法的优缺点,还得了解它们的实现难度,还需要知道当前团队有了什么样的工具可以加快速度,然后再选的算法。而了解多个算法的优缺点,还真是一件巨无霸的难事,人的精力有限,可能一直在了解着各种算法呢,要好好了解一个算法都是很需要精力的,必要的时候还得做写实验才能了解;这事也没有很好的捷径,好好加强数学功底,学会解释模型,积累对各种算法的使用经验,慢慢成长,才有能更好地选择算法。
工作后,公司不是学校,业务是最好的推动力。作业可以抄,工作却不是那么容易抄的,各个公司具有的条件不一样,很难抄得来。有的算法工程师开始工作的时候,有一个经验丰富的大哥带着,手办眼见,在打下手的同时积累了相当的经验,成长成为一个合格的算法工程师,这个途径算是比较顺利的;有时候情况是,一开始大家都不懂,一起摸爬滚打,在经过各种挫折和打击之后,慢慢成长成为一个优秀的算法工程师,这是另一种途径。无论走哪个途径,都没有一步登天的路,加强理论功底,积累实战经验,是最有成效的方式了。
1.4后话
曾经也是热血青年,也曾为某个算法牛不牛逼纠结很久,读研的时候还觉得对某个算法做了一点点事情就多牛逼了。没想过工作后被现实狠狠打脸了。工作的前面很长的时间内,其实都是一个收菜、验菜、洗菜的小伙计,偶尔还要修水龙头,修洗菜池,好久才能自己挽起袖子去加工一下食材,做成二级食材供大师傅使用,也经常遇到满心希望能做好的菜做砸了。
如果上面的话不清楚,就用术语来说,就是工作后一段时间内,都在看数据排查数据,清洗处理数据,说好听点的就是评估特征。然后还经常导数据,还包括搭建一些基础服务,如线上存储器,实时流系统等。后面有了经验后,才慢慢自己去想一些特征,去生成特征,评估,加入模型上线等等一套流程走完。
在这段时间里面,看了一些paper,也了解了其他同行怎么做的,也开始用新的视角去看待各个算法,也开始有了对一些算法的实战经验,了解了一些工具,会使用一些工具。对业务也越来越熟悉了,才有了一些算法工程师的样子。
目前的状态还是——衣带渐宽终不悔,为伊消得人憔悴吧。
没觉得轻松,但是也不知道说什么苦好。
“沉舟侧畔千帆过,病树前头万木春”,互联网时代一切都在发展,需要努力跟上。这几篇博文都是经验之谈,希望能帮助一些人吧。
多位互联网广告同行如@林昭等。
多位同事一起鼓励与提携。
[1] 大数据时代的互联网行为定向广告技术 品友互动@林昭的PPT
[2] 广告数据上的大规模机器学习 百度技术沙龙@夏粉的PPT