广告系列:召回与排序(二)
编辑导语:在上一篇文章中,作者介绍了关于召回排序的场景特征、异同及目标的一致性问题,《广告系列:召回与排序》;本文作者将继续分享关于召回排序时涉及的一些机器学习知识,我们一起来了解一下。
召回排序需要在大海捞针选出来合适的候选,最简单的挖掘方法是基于策略规则的;如匹配用户标签和广告标签、匹配上下文关键词和广告关键词一致就召回,规则简单直白解释性好,调整起来速度也快。
但随着业务发展场景复杂化,新规则的持续叠加会导致策略间的冲突和维护成本不断上升,所以此时机器学习闪亮登场。
机器学习主要分为两大类:有监督和无监督。
- 有监督学习:训练数据有标记信息,通过训练数据希望获得到从输入空间到输出空间的映射关系,主要代表有分类和回归,分类又分为二分类与多分类;召回排序场景下主要是利用有监督学习,即召回排序的结果通过用户行为来标记是否被点击和转化。
- 无监督学习:没有标记数据,只有输入空间研究输入空间各特征之间的关系,主要的代表有聚类和降维;无监督学习利用海量数据预训练为有监督学习奠定基础,加快了收敛速度并提升了效果,下面围绕有监督学习展开。
机器学习包含以下几个主要概念:
- 输入空间:也叫属性空间,将影响结果的因素通过处理提取成特征,所有特征共同组成属性空间。
- 输出空间:也叫标记空间,样本的真实结果就是标记,所有标记组成标记空间。
- 真相:数据中实际蕴含的内在规律和分布结构。
- 假设空间:针对真相提出了某种假设,用假设来拟合真相,所有假设构成假设空间,机器学习的过程也是在假设空间中搜索的过程。
机器学习是根据已知(数据)去训练假设模型,训练就是不断优化模型的过程,当损失函数最小时对真相的拟合达到最优,此时去预估结果。大概流程如下所示:
1)问题建模
把实际场景中遇到的问题转化为机器学习可以预估的问题。
召回转换为大型多分类问题:将广告池中每个候选都当做一个分类,基于当前用户/场景为用户在全量广告中预估下一次展示的类别,通过softmax输出的相关度来判断召回。
排序转换为二分类问题:广告排序以ecpm为标准(ecpm=1000*pctr*pcvr*bid),需要精准预估点击率/转化率,通过sigmoid输出点击率/转化率的预估值(广告和推荐在预估pctr/pcvr时也有区别:广告需要精准的值用以排序/计费,推荐更多的需要相对顺序:相关候选的值大于不相关的值,损失函数构造一般用pairwise方法)。
2)采样训练数据
样本代表总体训练模型,所以需要尽可能做到无偏,理想状态二者是服从同一个分布,其中负样本的选取很关键,尤其是召回环节需要结合实际场景。
3)特征提取和选择
特征工程流程上介于原始数据和模型之间,负责从原始数据中提取有效特征供模型使用,传统的机器学习对特征工程依赖度很高,构造一个有效特征对模型性能提升有很大帮助;优秀的特征工程即使使用简单模型也能达到很好的性能,当然需要很强的专业知识,深度学习的兴起在一定程度上承担了部分特征组合的工作。
4)模型选择
选择模型从某种意义上确定了假设的范围,反映了某种偏好。选用LR认为特征与标记之间的关系相对简单可以直接通过特征工程获得影响结果的因素,选用DNN则是高阶特征组合对结果产生主要影响。
选择模型需要经验,同时熟悉模型特性和预估问题的场景,太简单容易导致欠拟合,不足以表征真相,偏差高;太复杂容易导致过拟合,模型学习了样本特征当做全体特征,方差高,针对前者可以增加模型复杂度来解决,针对后者可以借助增加样本量级或引入正则项等方法缓解影响。
目标函数的设置也很关键,需要紧密结合实际场景中的业务指标,使二者之间尽量正相关,模型优化才能给线上业务带来切实的提升。
5)构造损失函数
模型的预估值与真实标记之间必然存在偏差,通过损失函数来获得参数优化的方向;回归问题的损失函数多采用均方误差,分类问题的损失函数多采用交叉熵。
6)训练/优化
随机梯度下降是模型训练中常用的方法,在最小化损失函数L(f,y)过程中,通过对函数求偏导结合步长不断修正参数的值,当损失函数达到最小或者迭代次数达到阈值时停止训练,认为此时假设与真相足够贴近,将参数值带入目标函数进行测试。
7)性能评估
通过训练后需要在测试集验证模型性能。测试集代表了新样本,并假设与实际场景中样本服从同一个分布,所以用测试误差来代表泛化误差。
一般通过留出法、交叉验证法或自助法等来获得测试集;实际评价时通过混淆矩阵计算获得查准率和查全率,绘制P-R曲线计算曲线下方面积或者F1来比较模型性能,也可以通过ROC曲线计算AUC来判断,面积更大者表示性能更优,代表模型处理新样本的泛化能力更强。
8)线上AB测试
线下测试通过后模型上线,前面说到训练数据与线上数据尽可能接近,但避免不了有偏差,为减少波动在模型大规模铺量前需要AB测试;借助实验平台可以小流量试用新模型,线上指标如ECPM/点击率/转化率等超过线上版本后开始大规模放量运行。
上面简略概述了使用机器学习预估问题的流程,从问题建模到最终线上测试涵盖多个方面,召回与排序的技术实现也是个发展的过程从策略规则到机器学习;由简单到复杂,将一个不可再分的点扩展成一个系统,借助内部复杂的结构来刻画真相,这既是业务的实际需要也是技术发展的潮流。
前面简要介绍了召回与排序时使用机器学习的整体流程,下面主要介绍对样本数据和特征提取的理解,其中参考了美团机器学习实践,感兴趣的同学可以自行搜索。
一、样本数据
样本选取是机器学习的前置环节,指从全量数据中选出一部分作为样本来训练模型,采样的比例和方法很重要;进行采样主要出于计算效率和有效信息量的考虑,样本集细分为训练集、验证集和测试集,其中训练集用于训练模型,验证集用来学习超参,测试集用来测试模型的泛化能力。
1. 独立同分布
样本数据的质量很大程度上决定了模型的性能,好的样本集应该具备无偏性和低方差,即样本数据和全量数据服从独立同分布,如果样本数据分布与线上实际业务的数据分布差别很大,即用拟合A分布的模型去预测B分布,效果必然会受影响。
具体到召回与排序环节上,前面说过二者之间的数据环境差别很大,需要分别处理,一般样本是通过历史日志来获取,记录主要集中在竞价成功及曝光的样本上,对排序一般是满足的,正样本:曝光且点击,负样本:曝光未点击。
对召回就有点问题,不管曝光的样本是否被点击,都是通过线上召回及排序的筛选后胜出的,意味着相关性已经超过了阈值,与全量的候选库相比这些样本已经非常优秀,二者的分布情况有很大差异,不能只用这部分数据去训练。
百度在莫比乌斯的论文中提出通过找出日志中广告候选集合和query集合,然后做笛卡尔集来模拟负样本,在对齐训练数据和线上数据上提供了一种很好的思路。
2. 信息增益
相比全量广告库推出去曝光的广告都是天之骄子,关于有标记数据总是不够的,尤其对冷启动,想要预估准确需要通过一些方式来进行信息增益;比如利用静态辅助类信息、知识图谱、多任务训练共享参数或无监督先预训练然后微调等;其中知识图谱通过关系网构建当前物品和周边的关系,在思路上是sideinfo的扩展,对召回环节的帮助较大。
预训练在数据稀疏时可以帮助提升效果,且让模型有个较高的起点,加快其收敛速度,在embedding时应用比较广泛;多任务训练是利用任务间的相关性,通过共享底层参数提升效果降低过拟合风险;目前多数聚焦在输入(feature)共享方面,阿里在ESMM论文中通过实际业务场景分析,提出点击率和转化率联合训练的思路巧妙将输出(label)间建立了关系,对多任务学习提供了一个很好的思路。
下面稍微展开说下冷启动:
数据从产生方式来讲可分为静态数据和动态数据,我们说的冷启动一般是缺乏动态交互类数据,静态属性类数据是有的,解决的整体思路:找到相似的物品/用户,用相似物品的数据来替代,运行一段时间数据量达到阈值后启用自身数据,关键点是怎么定义和使用相似。
粗糙一些使用全局均值或者所属行业均值,细一些用模型算相关度,可以用聚类中心值也可以用相关度超过阈值物品的加权平均(权重用相关度归一化后的值)。
为了在切换前后平滑过渡,用替代数据时可以同时用自身数据,保持二者权重和为1,随着数据累积替代数据权重持续下降,自身数据重要性持续上升;到阈值时顺利切换,在冷启动期间一般平台为鼓励新广告会乘倾斜系数来帮助其拿量。
二、特征提取与选择
特征提取与选择从流程上处于数据和模型中间,主要负责从原始数据空间中提取有效特征到特征空间供模型学习使用。
举个简单的栗子,比如年龄分布0-100,原始数据是连续的,但与标记之间的关系不是线性的,对广告点击的显著区别反映在不同年龄段的人如少年/青年/中年/老年,同一年龄段的差别很小;通过离散化将年龄分桶到不同年龄段后输入模型,有助于模型学习特征与标记之间的关系,一个优质的特征工程使用简单模型也有很好的性能。
特征工程主要分为两大部分:特征提取和特征选择。
1. 特征提取
特征按照类型主要有类别特征、数值特征、空间特征、时间特征和文本特征等,其中文本特征处理需要借助NLP方法如词袋、TF-IDF及word2vec、余弦相似度等。
下面主要介绍类别和数值,这两类也是最常见的特征:
1)数值特征:分为离散型(可数)、连续型(不可数);例如广告的的曝光量、点击量、点击率、浏览时长等。
常用的数值特征的处理方法如下:
无量纲化:不同特征取值范围差别很大,平滑函数对输入的尺度敏感,输入范围很大程度会影响输出范围,进而影响性能,因此无量纲化将输出控制在期望范围内。
主要包括以下方法:
- 标准化:针对服从正态分布的特征,使用标准化处理后得到均值为0,标准差为1的标准正态分布。
- 区间放缩:通过放缩:X=(X-min)/(max-min),将范围映射到[0,1]。
连续特征离散化:特征与标记间的关系不是线性的,通过离散化处理帮助模型更好的学习,主要有分桶和二值化。
- 分桶:将连续数值根据一定规则分配到不同桶并对桶编码,分桶规则包括:等距分桶(适合分布均匀)、等频分桶(包含数据的数量相同)和模型分桶(聚类)。
- 二值化:设定一个阈值,将大于阈值记为1小于记为0,二值化可以看做是分桶的特殊情况。
截断:过长的精度对模型没有太大帮助反而会形成噪音,适当的进行截断可以增强鲁棒性。
缺失值处理:实际数据会因为各种原因出现值缺失。
主要有两种处理方式:
- 按照某种规则填补,取均值或者中位数;
- 把缺失值当做特征输入模型供其学习。
对数/指数变换:利用对数指数函数的良好性质(对大数值的范围进行压缩,小数值的范围进行扩展)对数据做转换。
特征组合:不同特征进行组合获得新信息,一般随着组合阶数增长新特征蕴含的信息量也会增加,构造复杂特征+简单模型也是个很好的思路,高阶特征的使用在一定程度上能够简化模型,当然人工构造需要很强的专家知识,利用模型是大势所趋。
2)类别特征
也叫定性特征,如广告中涉及的用户ID、性别、常驻城市、学历,或者广告ID、分类、标签等,这些因素通过编码转为数值表示后喂入模型,编码模式包括以下几种:自然数编码、独热编码、分层编码、散列编码等。
其中散列编码和独热编码运用的更广泛,使用独热编码时如果该特征下有N个取值则生成N维向量,其中只有一个1其余全是0会导致稀疏,所以输入模型时一般会通过embedding转为低维稠密向量。
当数据量很大时也会通过散列编码将无界数值映射到有限的范围内,散列编码从某种意义上讲是一种聚类,运用散列函数将多个输入映射为一个类别,embedding相比之下属于一种软分类。
2. 特征选择
特征千千万,不是每个都有效,精简掉冗余、不相关的特征选出重要的子集是很有价值的操作,选取时主要考虑两个方面:
1)特征的稳定性,如果方差小于阈值说明该特征相对稳定,不会对结果太大影响;
2)对结果的影响程度,如果自变量大幅变动对输出的影响甚微那么表明相关性很小。
具体选择时主要有以下几种方法:
- 过滤:特征过滤不需要依赖机器学习算法,主要通过方差、互信息、假设检验等对特征排序,过滤掉相关性低的变量。
- 封装:封装使用机器学习算法对特征子集的效果进行评估,用同一个模型对不同的子集打分,找出分值最高的子集,需要反复试验成本较高。
- 嵌入:将特征选择嵌入模型当做模型训练的一部分,如利用树结构或者LI正则项来精简特征是使用最广泛的方法。
特征提取和选择有共性的方法和处理技巧,同时特征工程也是建立在深入理解业务逻辑的基础上,与业务领域强相关,具体到广告特征主要分为几个领域:用户U(统计类特征、历史行为、兴趣)、广告A(创意多模态内容、行业分类、标签、所属广告主)、上下文C(访问环境、具体场景、内容)、query(检索词);其中用户的历史行为涵盖了大量隐藏信息,在众多特征中对最终结果影响度更高,需要更细致的设计处理。
行为是兴趣的具体表现,兴趣是行为的抽象提炼,兴趣相对长期稳定,短期行为更多体现了迁移演化;阿里在DIEN论文里通过历史行为序列来生成用户兴趣,之后利用attention思想计算与当前候选广告的相关度,最终动态生成用户的兴趣向量与其他特征拼接输入模型,该方法为处理历史行为特征提供了一个很好的思路。
所有特征构成特征空间,数量庞大通过穷举效率太低,一种有效的思路:提取一些相互独立的特征作为基本特征,定义一套组合规则,用基本特征+组合规则来表示空间内所有特征;其中对组合规则的尝试人力有时尽,借助模型的结构来提取逐渐成为主流,从FM、GBDT到DNN。
下节重点介绍在召回排序时涉及的模型。
受限于个人认知与理解难免管窥蠡测,有纰漏的地方欢迎探讨指正。
本文由 @知乎-莫菲克 原创发布于人人都是产品经理。未经许可,禁止转载
题图来自Unsplash,基于CC0协议
- 目前还没评论,等你发挥!