本文主要是介绍百度计算广告学沙龙笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
首先解释计算广告学,追求的是,在一定环境下用户与广告的最佳匹配,这里的一定环境下,包括用户的query,当前浏览的网页,也有一些用户个人信息,但是比较少,这是用户的隐私数据,不好拿到。
点击率预估的问题:
1表示用户点击,0表示没有点击或者用户根本没看到,这个和推荐系统中用户评分差不多啊,没评分的可能表示用户根本不感兴趣或者用户根本没看到。关键的问题是:特征维度高,数据量大(每天可能上亿次的请求)。
数据预处理的问题,首先是展示于点击日志的拼接,我之前以为是在一起的。包括两方面:日志->数据,这是行上的处理,比如抽样,去除缺失数据什么的;日志->特征,这是矩阵中列的处理。
数据/特征规模的问题:百亿广告(行),千亿/百亿级的特征(列),一个问题是类别不平衡(点击的少,未点击或者用户根本没看到的多),噪声大(恶意点击等等)。
特征复杂度高:特征之间高度非线性,举个栗子:不同性别不同年龄段的人关注的广告不同,人工组合方式把特征的非线性表示出来,例如:什么样的人在什么时间应该展示出什么样的广告。话说我觉得应该是response与特征之间的高度非线性问题吧?不是特征之间的非线性,response可能依赖于非线性的某些特征,而这些特征根需要人工或者机器组合得到。
时效性高:点击率随着时间变化,也就是随着时间人的兴趣会变化。
话说核心还是人啊,有些情况下即使输入的query和广告毫不相关,用户也可能以很大的概率点击广告。当然,大部分情况下,query还是能反映出用户的一些意图的,从而推断用户的后续行为。
新广告或者流量的上下线。
数据训练频繁:包括模型更新,比如从LR->DeepLearning.另一个是策略调整(不明觉厉)。因此需要快速,要做的是1获取主要信息,2去噪,所以选择对点击概率分布足够多的样本。
数据处理,去除一些可见/不完整样本,或则机器学习的方法进行样本采样。google的做法:某个query对应的广告一个都没被点击过,则以概率p去掉该query,但是在训练时对那些以P为概率删除的样本乘以一个权重r.目的是为了补偿它。具体见google的论文<>
要用尽可能少的特征表示模型的数据,具体方法包括特征选择与特征删减。模型要小,满足速度上的需求。
主要包括大量id类特征,少量连续型特征。注意是大量id类,少量连续型。id类特征使用one-hot encoding的编码方式。
然后是一个loss function,和之前见到不同的是在非正则化项前加的C,等值线随着C的增大扩张,直到与约束(正则化项)相遇,最常见的是L1范数正则化。其实和之前的都一样。
特征删减:虽然特征那么高维,其实模型真正能用上的特征是比较少的。可以在训练前判断哪些特征的权重可能为0,比如可以根据点击的情况,也就是真实的反馈判断哪些特征权值为0,可以用一个公式衡量特征的分数,例如百度的Fea-G算法(screening test?),新的特征以概率P加入;bloomfilter + 次数超过n次的才加入;google的做法。
人工特征工程:构造高阶组合特征,描述特征间非线性关系(我还是觉得应该是response所需要的非线性特征之间的关系。ps:到底是特征间非线性关系,还是response与非线性特征之间的关系(线性or非线性)?),如下方法:1,人工经验,耗时,也容易达到上界;2,枚举,太慢了;这两种都无法泛化(泛化能力很弱)。
下面,高大上的Deep Learning登场:
DL能自动学习feature,在语音和图像上的情况是:特征少,数据量大。比如28*28的图片可以有几千万张。但是在计算广告学领域,特征的特点是大规模稀疏特征,1,目前尚无专门针对大规模稀疏特征的深度特征学习算法,2,主要是样本相对特征不充分,样本量相对特征量来说比较少。
针对第一个问题,需要降维的方法,针对第二个问题,需要把样本相对多的找出来(比如PV比较多的feature,要充分学习一个feature,需要包含该feature的样本充足)。
不过,网盟团队研发了能直接应用于大规模sparse特征的深度特征学习算法DANNOVA。逐层贪婪算法(这个信息比较有用):单特征->二阶组合->高阶组合。PPT上有个图。另外的问题:训练数据要少,模型需要稀疏才行,这样速度才会快。
优化算法:google保留前N次的梯度,这个貌似是针对L-BFGS说的?每条样本要多训练几次,一次学不完样本中的所有信息(这个我没明白,一次不久行了吗?)。SOA算法,貌似是模型优化算法?
对于L-BFGS算法来说,每一次的梯度之差,步长之差都要保留,为了根据割线定理计算hession矩阵?,由于是个向量,而且维度上千亿,所以对内存是个很大的挑战,而且,当特征矩阵的谱很大时(特征值变化范围较大),收敛速度慢;启动慢,每次重新训练时都要先得到历史上m次的梯度之差,当初始点离真实的解很近时不能很快收敛到真实解。百度自己的shooting算法,对hession矩阵分块,使得特征值差不多的靠的更近。
陈雨强的分享:
首先说广告中的长尾分布,长尾query,百度每天有约20%的query是历史记录中从没有出现过的。长尾问题,是针对query的长尾。不是广告的长尾(展示广告中是广告长尾?)理解点击:1,广告并不是用户所需要的信息(这个容易理解)2,不只是<ad-query>语义。做搜索还行,做广告就不行,对搜索广告来说,语义不是最关键的。
数据比较复杂,则模型也要复杂;数据与模型要线性的?(模型与非线性特征之间的线性?)。常用的方法:大量特征+线性模型;小量特征+非线性模型。
各大公司的方法,来自于论文以及各种传说:
1,小规模feature + 非线性模型:MS:浅层ANN;yahoo!:GBDT;淘宝:局部线性LR(从盖坤的PPT上可以看到);facebook:二层结构,low hierarchies + high hierarchies
2, 大规模特征+线性模型:百度,特征精细描述用户行为,比如query是否有空格等等。
已经证实LR对ctr预估问题有效。通过设计特征提升准确度,feature engineering.
L-BFGS:特征向量上千亿维,一条历史记录的梯度都要占用很大内存。可以使用坐标下降法,随机挑选n列(虽然是随机,但是要尽量使得能遍历全部)update。
优化数据流:所用时间少。
LR:人工加特征,组合特征。但是,人工的方式目前已经没法做了,如何改进?
高大上Deep Learning:
1,学习高层特征,2,逐层贪心算法学习(again)。
DL所遇到的问题:1,特征维度太高,2,模型不能太大,因为要数十毫秒内给出结果(只在线上的时候)。所以要对特征降维:各种降维算法(主要针对id类的,embedding function),连续值型的没必要了。
对于大规模feature,使用cpu/LBFGS即可;小规模feature(容量合适的情况下),可以使用GPU()。
另一个问题:E&E问题,这个就是机制的问题了。baseline算法比如LR可以接触到更多的badcase,从而很好的训练模型,DL接触的机会小,难以说明是不是改进的算法不行。
大家提的一些问题:
1,特征降维:根据特征的层级性。2,数据分布不一致:迁移学习,原数据->目标数据,通过学习数据量比较多的原数据的特征,加入到目标数据中,另外,定义元数据与目标数据的相似度。3,要实用更通用的特征,泛化能力强。4,分布式,SGD不适合分布式,mini-batch SGD,一般是100左右的batch。异步SGD。
总结:
核心还是人。
网搜和商搜用DL的方式不同:网搜直接针对高维稀疏特征,输入是单特征;商搜是先降维(有监督、无监督方法),针对categorical variable降维。方法还是逐层训练不是直接BP。
另外夏粉提到的数据压缩Fea-G,不知道是指的哪些方法。
DL省去了人工组合特征,让机器自己找,有监督的方法会不会更好些?特征可以是高阶,但是特征和模型要线性。
以前考虑广告数据和图像语音数据的不同,图像,语音数据具有结构性,可以抽象出直观的high level feature,所以DL取得的效果比较好。现在觉得,那并不是主要原因吧,关键应该还是非线性模型对线性低阶特征的拟合。
至少知道了我之前的想法中哪些是合理的,哪些是无解的。没办法,没人带就自己一点点儿琢磨吧…
这篇关于百度计算广告学沙龙笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!