欢迎收藏Star我的Machine Learning Blog:https://github.com/purepisces/Wenqing-Machine_Learning_Blog。如果收藏star, 有问题可以随时与我交流, 谢谢大家!
广告点击预测
1. 问题描述
建立一个机器学习模型来预测广告是否会被点击。
为了简化,我们不会专注于广告技术中常用的级联分类器。
- 在继续之前,让我们了解一下广告投放的背景。广告请求会经过一个瀑布模型,在该模型中,出版商会尝试通过高 CPM(每千次展示成本)直接销售其库存。如果无法销售,出版商会将展示机会传递给其他网络,直到它被售出。
级联分类器涉及多个阶段,每个阶段都有自己的分类器,一个分类器的输出成为下一个分类器的输入。这可以帮助:
- 过滤:早期阶段过滤掉大多数负面案例(例如,不太可能被点击的情况),使后续阶段能够专注于更难分类的情况。
- 专业化:不同阶段可以专注于预测任务的不同方面,提高整体性能。
- 效率:通过逐步减少每个阶段需要考虑的案例数量,级联可以提高计算效率。
在瀑布模型中,出版商(例如《纽约时报》)首先会尝试直接将广告位卖给广告主,以获得高 CPM。如果失败,则会按顺序将机会传递给谷歌 AdSense、Facebook Audience Network 等广告网络,直到广告位被填满。
出版商直接销售:
场景:《纽约时报》直接与三星协商,在其主页上放置一个月的横幅广告,以获得高 CPM。高级广告网络:
场景:广告主使用谷歌营销平台在顶级网站(如 ESPN)上投放广告,确保其广告出现在信誉良好、流量高的网站上。垂直广告网络:
场景:旅行社使用旅行广告网络在与旅行相关的网站上投放广告,吸引对旅行感兴趣的受众。剩余广告网络:
场景:较小的广告主使用谷歌广告在谷歌网络中的剩余广告库存上竞价,使其广告以较低的成本出现在各种网站上。
出版商:出版商是创建和拥有可以展示广告的内容的实体(个人、组织或公司)。他们提供展示广告的平台。
广告网络:广告网络是一家将广告主与出版商连接起来的公司。它聚合多个出版商的广告库存并将其卖给广告主,促进广告的买卖。
展示:展示是广告在网页、应用程序或任何其他数字媒介上显示的一次实例。它是用来衡量广告被看到多少次的指标。
2. 指标设计和需求
指标
在训练阶段,我们可以专注于机器学习指标,而不是收入指标或点击率(CTR)指标。以下是两个指标:
离线指标
- 归一化交叉熵(NCE):NCE 是预测的对数损失除以背景 CTR 的交叉熵。这种方式使 NCE 对背景 CTR 不敏感。以下是 NCE 的公式:
N C E = − 1 N ∑ i = 1 n ( 1 + y i 2 log ( p i ) + 1 − y i 2 log ( 1 − p i ) ) − ( p log ( p ) + ( 1 − p ) log ( 1 − p ) ) NCE = \frac{-\frac{1}{N} \sum\limits_{i=1}^{n} \left( \frac{1 + y_i}{2} \log(p_i) + \frac{1 - y_i}{2} \log(1 - p_i) \right)}{- \left( p \log(p) + (1 - p) \log(1 - p) \right)} NCE=−(plog(p)+(1−p)log(1−p))−N1i=1∑n(21+yilog(pi)+21−yilog(1−pi))
N:样本总数。
y i y_i yi:第 i i i 个样本的实际标签。如果项目被点击, y i y_i yi 为 1,如果未被点击, y i y_i yi 为 0。
p i p_i pi:第 i i i 个项目被点击的预测概率。
p p p:背景 CTR(项目被点击的平均概率)。
背景 CTR 指的是在数据集或特定数据子集中的平均点击率。它反映了在不考虑单个项目特征的情况下,所有项目被点击的固有可能性。例如,如果平台的整体 CTR 是 0.02,这意味着平均而言,所有显示的项目中有 2% 被点击。
在线指标
- 收入提升:一段时间内收入的百分比变化。在部署后,将新模型部署在小部分流量上。关键决策是在流量百分比和 A/B 测试阶段的持续时间之间找到平衡。
A/B 测试涉及将流量分成两组:
- 控制组:使用现有模型。
- 测试组:使用新模型。
收入提升:当新模型部署时,与现有模型或基线性能相比,收入在一段时间内的百分比变化。
公式:
收入提升:
Revenue Lift = Revenue test − Revenue control Revenue control × 100 \text{Revenue Lift} = \frac{\text{Revenue test} - \text{Revenue control}}{\text{Revenue}_{\text{control}}} \times 100 Revenue Lift=RevenuecontrolRevenue test−Revenue control×100 %
其中:
- Revenue test \text{Revenue}_{\text{test}} Revenuetest 是测试组产生的收入。
- Revenue control \text{Revenue}_{\text{control}} Revenuecontrol 是控制组产生的收入。
平衡流量百分比:
- 小比例:最小化风险,但可能需要更长时间才能收集到统计显著的数据。
- 大比例:提供更快的结果,但如果新模型表现不佳,则增加风险。
A/B 测试的持续时间:
- 短时间:更快做出决策,但可能无法捕捉长期用户行为变化。
- 长时间:数据更全面,但如果新模型表现良好,会延迟其实施。
流量百分比与 A/B 测试阶段持续时间之间的平衡
风险容忍度:
- 更不愿冒风险:您可能更喜欢较小的流量比例和较长的持续时间。
- 示例:将 10% 的流量分配给测试组,并运行测试 4 周。
- 更愿意冒风险:您可能会选择较大比例的流量和较短的持续时间。
- 示例:将 50% 的流量分配给测试组,并运行测试 1 周。
对速度的需求:
- 需要快速决策:您可能会接受较高的风险,使用较大比例的流量,测试较短时间。
- 示例:将 40% 的流量分配给测试组,并运行测试 2 周。
- 时间不是问题:您可以负担得起更长时间的测试,使用较小比例的流量。
- 示例:将 20% 的流量分配给测试组,并运行测试 6 周。
需求
训练
- 不平衡数据:在实践中,点击率(CTR)非常小(1%-2%),这使得有监督训练变得困难。我们需要一种能够处理高度不平衡数据的方法来训练模型。
- 重新训练频率:在一天内多次重新训练模型的能力,以捕捉生产环境中的数据分布变化。
- 训练/验证数据分割:为了模拟生产系统,训练数据和验证数据按时间分区。
按时间分区
“训练/验证数据分割:为了模拟生产系统,训练数据和验证数据按时间分区”这句话的意思是,当将数据分割成训练集和验证集时,是根据时间来分割的,而不是随机分割。
训练数据:这个集合包括较早时间段的数据。
验证数据:这个集合包括跟随训练数据时间段之后的较晚时间段的数据。
这种方法确保模型在过去的数据上训练,并在未来的数据上测试,这更能代表生产环境中的情况,因为模型将遇到新的、未见过的数据。
推理
- 服务:广告预测的低延迟(50ms - 100ms)。
- 延迟:广告请求经过瀑布模型,因此,ML 模型的推荐延迟需要快速。
- 过度支出:如果广告投放模型反复投放相同的广告,可能会导致广告预算的过度支出,出版商会损失金钱。
总结
类型 | 期望目标 |
---|---|
指标 | 合理的归一化交叉熵和点击率 |
训练 | 处理不平衡数据的能力 |
高吞吐量,并且能够在一天内多次重新训练 | |
推理 | 50 到 100ms 的延迟 |
在投放广告时,能够控制或避免广告预算的过度支出 |
3. 模型
特征工程
特征 | 特征工程方法 | 描述 |
---|---|---|
AdvertiserID(广告主ID) | 使用嵌入或特征哈希 | 广告主数量可能达到数百万 |
用户的历史行为,如一段时间内的广告点击次数 | 特征缩放,即归一化 | |
时间特征:一天中的时间,星期几等 | 独热编码 | |
交叉特征 | 组合多个特征 |
广告主ID
- 特征工程:使用嵌入或特征哈希
- 嵌入:这种技术通常用于深度学习中,将分类数据(如广告主ID)转换为连续向量空间。它有助于捕捉不同广告主之间的关系。
- 特征哈希:这种方法将广告主ID哈希到固定数量的桶(特征)中,减少维度并有效处理大量类别。
- 描述:使用这些技术的原因是广告主数量可能达到数百万。嵌入或特征哈希有助于在计算上高效地管理大量类别。
用户的历史行为(例如,一段时间内的广告点击次数)
- 特征工程:特征缩放,即归一化
- 归一化:这种技术将特征缩放到标准范围,通常是 [0, 1] 或 [-1, 1]。它有助于提高学习算法的收敛性。
- 描述:用户行为数据(如点击次数)可能具有很大的值域。归一化这些数据可以确保模型同等对待所有特征,提升训练效率和模型性能。
时间特征(例如,一天中的时间,星期几)
- 特征工程:独热编码
- 独热编码:这种技术将分类数据转换为二进制矩阵。例如,如果一周有 7 天,每一天将表示为大小为 7 的二进制向量,其中仅对应当天的索引为 1,其余均为 0。
- 描述:时间特征如一天中的时间和星期几是分类特征。独热编码有助于模型理解这些分类值,而不假设它们之间存在任何顺序关系。
交叉特征
- 特征工程:组合多个特征
- 交叉特征:这涉及通过组合两个或多个现有特征创建新特征。例如,组合“一天中的时间”和“星期几”可以创建一个更精细的特征,捕捉特定时间在特定日子的模式。
- 描述:组合多个特征可以帮助模型捕捉特征之间更复杂的关系和交互,从而提高预测效果。
训练数据
在构建任何机器学习模型之前,我们需要收集训练数据。目标是收集不同类型帖子的数据,同时提高用户体验。正如您从上一课关于瀑布模型中回忆到的,我们可以收集大量关于广告点击的数据。我们可以使用这些数据来训练广告点击模型。
我们可以通过选择一个数据周期开始使用数据进行训练:上个月,过去六个月等。实际上,我们需要在训练时间和模型准确性之间找到平衡。我们还可以对负面数据进行下采样以处理数据不平衡问题。
模型
选择
- 我们可以在分布式环境中使用深度学习。我们可以从使用 Sigmoid 激活函数应用于最后一层的全连接层开始。由于点击率通常非常小(小于 1%),我们需要重新采样训练数据集以使数据不那么不平衡。重要的是保持验证集和测试集不变,以便准确估计模型性能。
保持验证集和测试集不变意味着在更改训练数据(如重新采样以解决类别不平衡问题)时,不应修改这些数据集。
评估
-
一种方法是将数据分为训练数据和验证数据。另一种方法是使用重放评估以避免离线评估偏差。假设我们有直到时间 t t t 的训练数据。我们使用时间 t + 1 t+1 t+1 的测试数据,并在推理过程中根据我们的模型重新排序它们的排名。如果有准确的点击预测,我们记录一个匹配。总匹配数将被视为总点击数。
-
在评估期间,我们还将评估我们的训练数据集应该有多大,以及我们需要多频繁地重新训练模型,以及其他许多超参数。
重放评估是一种通过使用历史数据模拟模型在现实场景中表现的方法。使用过去的数据来评估模型,将历史交互视为实时发生的情况。通过使用历史数据模拟实时预测,重放评估提供了模型在生产中表现的更准确度量。
4. 计算与估算
假设
- 每秒40K广告请求或每月1000亿广告请求。
- 每个观测(记录)有数百个特征,需要500字节来存储。
数据大小
- 数据:历史广告点击数据包括[用户,广告,点击或不点击]。估计1%的CTR,有10亿次点击广告。我们可以从1个月的数据开始进行训练和验证。在一个月内,我们有: 100 × 1 0 12 × 500 = 5 × 1 0 16 100 \times 10^{12} \times 500 = 5 \times 10^{16} 100×1012×500=5×1016 字节或50 PB。使其更易管理的一种方法是对数据进行下采样,即只保留1%-10%的数据,或使用1周的数据进行训练数据,并使用下一天的数据进行验证数据。
规模
- 支持1亿用户。
5. 高级设计
广告点击预测高级设计
- 数据湖:存储从多个来源收集的数据,即日志数据或事件驱动的数据(Kafka)。
- 批量数据准备:ETL(提取、转换、加载)作业集合,将数据存储在训练数据存储中。
- 批量训练作业:组织计划的作业以及按需作业,根据训练数据存储重新训练新模型。
- 模型存储:像S3这样的分布式存储,用于存储模型。
- 广告候选:由上游服务提供的一组广告候选(参见瀑布模型)。
- 流数据准备管道:处理在线特征,并将特征存储在键值存储中,以便下游处理时低延迟。
- 模型服务:独立服务,加载不同的模型并提供广告点击概率。
1. 数据湖
事件驱动的数据指的是由系统内发生的事件或动作生成的数据。这些事件可以是系统中发生的任何事情,例如用户交互、系统变化或更新。
Apache Kafka是一个开源的分布式事件流平台,用于处理实时数据流。它被设计用于处理高吞吐量和低延迟的数据流。
目的:存储从多个来源收集的原始数据。
示例:来自Web服务器的日志,通过Kafka流捕获的用户交互事件,以及历史广告点击数据。
场景:当用户访问网站时,他们的交互(如点击、停留时间和导航模式)被记录。这些日志被发送到数据湖进行存储。
2. 批量数据准备
目的:提取、转换和加载(ETL)原始数据,使其适合训练使用。
示例:ETL作业处理原始日志,提取用户人口统计、浏览历史和广告交互等特征,然后将这些数据转换为结构化格式并加载到训练数据存储中。
场景:ETL作业可能提取点击时间戳,将其转换为“时间段”或“星期几”等特征,并将这些特征加载到关系数据库中以供进一步使用。
3. 批量训练作业
批量训练作业是指使用一批数据定期训练机器学习模型的过程。这些作业按照特定的时间间隔(如每天、每周、每月)安排运行,或者可以按需触发以使用新数据更新模型。这确保了模型通过学习最新的可用数据保持当前和准确。
目的:安排和运行重新训练机器学习模型的作业。
示例:定期重新训练广告点击预测模型的作业,使用处理过的训练数据。
场景:一个作业每天午夜运行,使用最新一周的数据重新训练模型,确保模型与最近的趋势保持同步。
4. 模型存储
目的:在分布式存储系统中存储训练好的机器学习模型。
示例:使用Amazon S3存储不同版本的训练模型。
场景:训练后,新模型版本被保存到S3中,并附有指示其训练参数和性能指标的元数据。
5. 广告候选
目的:提供一组广告,供模型选择最相关的广告。
示例:根据各种标准(如活动目标、用户人口统计和先前广告表现)收集潜在广告候选的服务。
场景:当用户访问网页时,上游服务提供可能与用户相关的10个广告。
6. 流数据准备管道
目的:处理实时数据,并准备特征用于在线模型推理。
示例:处理用户实时交互的管道,并使用最新用户数据更新特征存储(如Redis)。
场景:当用户浏览网站时,他们的交互(例如查看特定类别、点击某些广告)被实时处理,并存储在键值数据库中以便即时访问。
7. 模型服务
目的:提供机器学习模型并实时提供预测。
示例:加载训练模型并为给定广告候选提供广告点击概率评分的独立服务。
场景:当用户访问页面时,模型服务获取广告候选和用户特征,加载适当的模型,并返回每个广告的点击概率评分。
让我们检查系统的流程:
-
客户端向应用服务器发送广告请求
-
应用服务器向广告候选生成服务发送广告请求
-
广告候选生成服务从数据库生成广告候选
-
广告候选生成服务向广告排名服务发送广告排名请求
-
广告排名服务从特征存储获取特征值,获取最新模型
-
广告排名服务对广告进行评分并将排名结果返回给广告候选生成服务。广告候选生成服务将结果返回给应用服务器和客户端。
系统流程
- 用户访问主页并向广告候选生成服务发送广告请求。广告候选生成服务生成广告候选列表并发送给聚合服务。
- 聚合服务将候选列表拆分并发送给广告排名工人进行评分。
- 广告排名服务从模型存储库获取最新模型,从特征存储中获取正确的特征,生成广告评分,然后将带有评分的广告列表返回给聚合服务。
- 聚合服务选择前 K K K 个广告(例如,k = 10,100等)并返回给上游服务。
6. 设计扩展
鉴于大量广告候选(50k-100k)的延迟要求为50ms-100ms,如果我们每个请求分配一个服务实例,可能无法达到服务水平协议(SLA)。为此,我们扩展了模型服务,并设置聚合服务来分散模型服务组件的负载。
一种常见的模式是使用聚合服务。它将候选列表分发到多个服务实例并收集结果。
服务水平协议(SLA)是一个正式的合同,规定了服务提供商和客户之间的期望、标准和责任。它包括性能指标、正常运行时间保证、支持响应时间、责任、不合规的惩罚以及监控和报告机制。
聚合服务是一个软件组件或服务,旨在从多个来源或服务中组合、管理和协调数据或任务,并输出单一的统一结果。它通常用于分布式系统中,以分散工作负载到多个服务或组件,然后聚合结果以提供连贯的响应。
7. 后续问题
问题 | 答案 |
---|---|
我们如何适应用户行为随时间变化? | 尽可能频繁地重新训练模型。例如,可以每隔几小时使用新数据(从用户点击数据中收集)重新训练模型。 |
我们如何处理广告排名模型未被充分探索的情况? | 我们可以在排名服务中引入随机化。例如,2%的请求将获得随机候选,98%的请求将获得广告排名服务提供的排序候选。 |
8. 总结
- 我们首先学习了选择规范化熵作为广告点击预测模型的度量标准。
- 我们学习了如何应用聚合服务以实现低延迟和克服不平衡的工作负载。
- 为了扩展系统并减少延迟,我们可以使用Kubeflow,使广告生成服务能够直接与广告排名服务通信。
附录
用户的历史行为(例如,一段时间内广告点击次数)
特征工程:特征缩放(规范化)
规范化是一种将特征值缩放到标准范围(通常为[0, 1]或[-1, 1])的技术。这个过程通过确保所有特征对模型学习过程的贡献相等来提高学习算法的收敛性。
示例
我们考虑一个场景,其中我们有用户行为数据,表示一段时间内广告点击的次数。以下是一个示例数据集:
用户ID | 上周点击次数 |
---|---|
用户1 | 2 |
用户2 | 50 |
用户3 | 150 |
用户4 | 20 |
用户5 | 5 |
点击次数范围从2到150,显示出很大的差异。直接将这些数据输入机器学习模型可能会导致问题,因为模型可能会偏向于具有较大值的特征。
逐步规范化过程
-
计算最小值和最大值:
- 最小点击次数:2
- 最大点击次数:150
-
应用规范化公式:
将值 x x x 缩放到范围[0, 1]的规范化公式为:x ′ = x − x min x max − x min x' = \frac{x - x_{\text{min}}}{x_{\text{max}} - x_{\text{min}}} x′=xmax−xminx−xmin
其中 x ′ x' x′ 是规范化后的值, x x x 是原始值, x min x_{\text{min}} xmin 是数据中的最小值, x max x_{\text{max}} xmax 是数据中的最大值。
-
规范化每个值:
- 对于用户1: x ′ = 2 − 2 150 − 2 = 0 148 = 0.00 x' = \frac{2 - 2}{150 - 2} = \frac{0}{148} = 0.00 x′=150−22−2=1480=0.00
- 对于用户2: x ′ = 50 − 2 150 − 2 = 48 148 ≈ 0.32 x' = \frac{50 - 2}{150 - 2} = \frac{48}{148} \approx 0.32 x′=150−250−2=14848≈0.32
- 对于用户3: x ′ = 150 − 2 150 − 2 = 148 148 = 1.00 x' = \frac{150 - 2}{150 - 2} = \frac{148}{148} = 1.00 x′=150−2150−2=148148=1.00
- 对于用户4: x ′ = 20 − 2 150 − 2 = 18 148 ≈ 0.12 x' = \frac{20 - 2}{150 - 2} = \frac{18}{148} \approx 0.12 x′=150−220−2=14818≈0.12
- 对于用户5: x ′ = 5 − 2 150 − 2 = 3 148 ≈ 0.02 x' = \frac{5 - 2}{150 - 2} = \frac{3}{148} \approx 0.02 x′=150−25−2=1483≈0.02
规范化数据
用户ID | 上周点击次数 | 规范化点击次数 |
---|---|---|
用户1 | 2 | 0.00 |
用户2 | 50 | 0.32 |
用户3 | 150 | 1.00 |
用户4 | 20 | 0.12 |
用户5 | 5 | 0.02 |
描述
- 目的:规范化用户行为数据(如点击广告的次数)确保所有特征处于相似的尺度,防止任何单一特征对模型产生不成比例的影响。
- 提高训练效率:通过将特征缩放到标准范围,规范化有助于提高学习算法的收敛速度,从而加快和稳定训练。
- 提升模型性能:在规范化数据上训练的模型通常表现更好,因为模型同等对待所有特征,从而能够更有效地从数据中学习。
总之,规范化用户行为数据,如广告点击次数,将特征缩放到标准范围,提高了训练效率和模型性能。
参考资料:
- Machine learning System Design from educative