电商搜索广告排序系统

plus2047 于 2022-12-31 发布

排序系统(精排)一般是推广搜系统中最核心的部分,体现为模型最为复杂、更新迭代带来的收益最为明显。不凑巧,这并不是我最近的工作范畴,所以我对这一块并不十分熟悉。本文是我对这主题浅薄的认识。

pCTR 与 pCR 任务目标

虽然本文标题是搜索广告的排序系统,但这个标题并不十分贴切,本文要介绍的其实是 pCTR 和 pCR 两个深度模型。这两个模型的作用参照 出价系统 一文,它们是真正的排序公式(由出价策略决定)中最重要的两部分,通常使用深度学习模型构建。同时,pCTR 模型也不仅仅应用在搜索广告中,pCTR 模型预测用户的点击率,是几乎所有推广搜系统的核心。pCR 模型预测用户的转换率(已经点击的前提下下单的概率),一般是电商场景特有的。

形式化的 pCTR 和 pCR 问题可以表述为,

\[\mathrm{pCTR} = \operatorname{Model}_{\mathrm{pCTR}}(\mathrm{User}, \mathrm{Query}, \mathrm{Item}) \\ \mathrm{pCR} = \operatorname{Model}_{\mathrm{pCR}}(\mathrm{User}, \mathrm{Query}, \mathrm{Item})\]

训练数据与损失函数

pCTR 模型和 pCR 模型预测的都是二分类的概率模型,适合使用交叉熵损失函数,

\[L = - \frac 1 N \sum_{i=1}^N \left[ y_i \log p_i + (1 - y_i) \log (1 - p_i) \right]\]

这里 $p_i$ 是模型预测的概率,$y_i$ 是样本标签,实际发生了点击(或者下单)则为 1,否则为 0.

模型的训练数据来自用户行为日志。以 pCTR 模型为例,pCTR 模型使用用户点击日志进行训练。训练数据的正样本当然就是用户产生行为的样本,负样本则比较多样化。基本的,可以使用日志中曝光但没有点击的物品作为负样本,以及全局负采样、Batch 内负采样。

类似的,pCR 模型可以使用用户下单日志进行训练,但 pCR 模型有个难点:下单行为要远比点击行为更为稀少,因此数据量会少一到两个量级。ESMM 工作将 pCR 模型和 pCTR 模型设计成了一个统一的多任务模型,借助 pCTR 任务提升 pCR 任务。

特征

特征层面上,推广搜的 Item 侧特征都差不多,最基本的就是 Item 类别等特征、统计特征,以及 Item ID Embedding, 以及 Title text Embedding. 搜索场景的特殊之处在于,Query 非常重要,因此有很多 Query 侧特征,包括统计特征、基于统计的 Query Category 特征等,以及 Query Embedding. 搜索场景还可以引入 Query-Item 交叉统计特征,如 Query-Item pair 7 days, 30 days CTR, Click 等。由于电商平台物品变化没有那么迅速,这些统计特征常常能够起到非常好的效果。

用户侧特征则跟推荐系统相似,除了年龄、性别等基本特征外,最重要的用户特征是用户行为序列 User Sequence. 近期的一些工作引入比较长的用户行为序列(150+ 甚至 1000+),取得了较好的效果。

模型结构

相对于复杂的 NLP 等模型,推广搜领域的模型结构是相对简单的。典型的工作是阿里的 DIN. 如果使用了 ID 类特征,则模型最底层就是一个参数量非常大的 Embedding 层。模型的其他输入特征一般也可以转换成 one-hot 特征,统一过 Embedding 层。行为序列特征需要特殊处理,可以使用 LSTM, Attention 等序列模型加以处理。最后,所有的特征经过几层(一般不会太深,三层左右)MLP 后经过输出层。

Calibration 校正

对于非广告场景,Ranking 模型并不需要精确的预测 pCTR 值,更重要的是预测「序」,只需要保证高质量 Item 得分更高,就能保证最终结果的排序正确。比如,所有 Item 的得分高估一倍,是不会有任何影响的。

但广告场景中,pCTR 模型的预测值并不是直接进行排序,而是作为 Bidding 排序公式的一部分,所以需要模型给出「无偏」的预测值。一般的做法并不是设法让模型能够无偏的预测,而是在模型之后再加一层校正机制。这方面经典的做法是「保序回归」。

保序回归是为了达成两个需求:

实际的做法大概是,首先收集一些样本(如一天或者更多 log),然后使用模型对这些样本进行打分。将打分之后的样本按照分值分桶(比如 1000 个桶),然后,每个桶中可以计算实际统计 CTR. 于是这个桶中 pCTR 均值就校正对应到统计 CTR. 这样我们就得到了跟桶的个数相等的差值点,这些点之间可以做线性插值。