天天看点

喜马广告算法优化实践(一):广告CVR模型演进历程

作者:闪念基因

业务背景

自营广告是喜马广告生态中的重要组成部分,它包含了多种广告类型,包括金融、电商、下载、教育、直播、专辑等,推荐广告的质量决定了用户在喜马app上的广告体验和平台广告收入,随着在线广告的不断发展,广告主从最初的以cpm、cpc方式进行流量拍卖,到目前主流的ocpx、双出价、nobid等。流量拍卖的方式越来越精细化、智能化,广告竞价pk时不仅需要考虑ctr、还需要考虑cvr、deep_cvr等多个因素,喜马自营广告平台以ocpc为主要流量拍卖方式,因此准确预估广告cvr对于自营广告平台至关重要。在喜马app中常见广告场景包括:开机、贴片、悬浮touch、首页猜你喜欢等,下图是几种常见的广告场景。

喜马广告算法优化实践(一):广告CVR模型演进历程
喜马广告算法优化实践(一):广告CVR模型演进历程
喜马广告算法优化实践(一):广告CVR模型演进历程
喜马广告算法优化实践(一):广告CVR模型演进历程

技术挑战

  1. 广告样本稀疏,区别于短视频、电商app,用户有着丰富的行为数据,喜马用户大部分时间处于闭屏收听的状态,这就导致了用户与广告的交互数据更加稀疏。
  2. 广告场景复杂,喜马app上广告资源位有着明显的长尾特点,首页位置像:焦点图、悬浮touch曝光占比高,而中小广告位数量多,但曝光占比少。
  3. 广告转化类型多,不同的转化类型之间cvr差异很大,比如下载类拉活广告cvr是表单类广告的数10倍,在联合建模时,数据量多的广告会影响数据量少广告的预估。
  4. 广告流量不稳定,自营广告平台会和三方DSP、品牌广告一起竞争流量,像开机、贴片等位置一旦出现品牌占量时,拿量会发生较大变化,据统计:品牌占量时自营广告在开机等位置曝光量级不足平时的十分之一,这对模型来说,训练样本分布则会发生较大变化。
  5. 广告冷启动问题,新广告的准确预估对于平台收入和广告主投放体验有着非常重要作用,喜马自营平台每日新增上千个广告计划和创意,同时喜马自营平台支持ocpc投放时直接进入二阶段,这对模型带了更大的挑战,

广告检索系统架构

广告检索系统的主要作用是从海量广告库中,在一定的RT要求内,筛选出最合适的广告返回给用户,出于对效果和性能的平衡,广告检索系统是一种类似于漏斗的多层架构。一次广告请求,漏斗最上层的检索环节会检索出数万级广告物料,经过过滤、召回、粗排后,剩余百级物料进入精排环节,广告CVR模型就是作用于精排环节中,预估用户点击广告后发生转化的概率,用于精排环节广告排序依据(ecpm)的计算,和作为一些广告策略的输入

  1. 常见转化类型:提交表单、付费、专辑订阅、加微、安装app等
  2. 广告精排环节排序依据:ecpm = pctr * pcvr * 广告转化出价 * 1000
喜马广告算法优化实践(一):广告CVR模型演进历程

图一:广告检索架构

模型演进路线回顾

  1. 广告算法团队从2022年到2023年在CVR模型上的技术演进,主要是时效性和大规模两个方面,(1)时效性的提升可以让新广告、新用户、新位置的样本更快进入模型学习,提升冷启动流量利用率,天级更新模型时,新广告的反馈数据需要等待超过24小时才能进入模型学习,导致新广告预估偏差大,广告主投放体感差等问题。(2)模型参数规模的提升,可以提升模型的个性化预估能力,缓解热门广告曝光过于集中的问题,做到千人千面的广告分发。
  2. 时效性上CVR模型从最初的天级全量更新到目前的小时级增量更新,模型规模上CVR模型参数量提升超30倍,模型大小提升超60倍
喜马广告算法优化实践(一):广告CVR模型演进历程

模型1.0时期

重点解决:模型基建差、转化样本稀疏

1.基础能力建设

  1. 在1.0时期,我们对模型基础能力的建设进行了升级,为后续模型迭代打好基础,比如:广告CVR Baseline模型的在样本构建上,是根据客户端上报的点击日志中的用户id和广告id关联天级画像快照来获取原始用户和广告侧画像,这种方式会存在离线训练和在线推理的特征不一致和无法使用实时特征等问题
  2. 实时画像落盘:通过将广告请求时画像实时落盘方式,将画像一致性提升到95%以上且支持添加实时特征
    1. 广告请求时,Ads广告引擎服务将竞价胜出的物料id、deviceid、response_id发送到Kafka
    2. 下游Flink任务接受到Kafka消息后,读取后端画像配置,请求画像并缓存在xcache中
    3. 广告曝光时,Flink任务根据response_id+物料id从xcache中获取对应的画像并落盘HDFS
喜马广告算法优化实践(一):广告CVR模型演进历程

图二:实时画像落盘

  1. 实时特征构建
    1. 特征实时化能更及时的收集用户和广告的数据变化,让模型能够使用最新的特征进行预测,1.0时期我们从用户侧和广告侧共生产了数十类实时画像

2.级联多目标ESMM模型

a. 广告CVR Baseline模型采用了经典的Embedding + MLP模型结构,从点击开始建模,点击未转化为负样本,反之为正样本,这种建模方式会存在:

    1. CVR模型样本稀疏,模型参数难以收敛
    2. 推理和训练的样本选择偏差

b. 针对以上问题,我们参考了阿里的ESMM模型,将CTR和CTCVR联合训练隐式学习CVR目标,通过embedding共享缓解因正样本稀疏导无法收敛的问题,因为CTR和CTCVR任务样本都是曝光空间开始建模,故CVR也可以认为是曝光空间,解决了样本选择偏差的问题,模型网络结构如下:

喜马广告算法优化实践(一):广告CVR模型演进历程

图三:1.0时期CVR模型结构

模型2.0时期

重点解决:模型时效性差、参数量少个性化能力不足

1.小时级更新

  1. 周星驰著名的电影《功夫》里面有一句著名的台词——“天下武功,无坚不摧,唯快不破”,实时性在效果广告系统中就是“唯快不破”的“柳叶飞刀”,在2.0时期我们对模型时效性上重点投入,将数据生产到模型更新端到端延迟降低了80%
  2. 训练数据小时化
    1. Spark SQL select样本数据扫描策略优化:将where 条件中 dt条件和随机化条件拆分,执行速度提升10倍
    2. 数据倾斜优化,分析spark数据处理任务发现有严重的数据倾斜导致一些task执行很慢,对倾斜的key进行特殊处理后,大大降低任务执行时间
    3. Spark任务部分机器因cpu性能问题,执行很慢,尝试开启Spark中的推测执行机制解决,spark.speculation=true
    1. 2.0时期我们对算法模型数据流进行了重新梳理,曝光、点击、转化join、样本抽取、提取画像、特征转化等任务均实现了小时级执行,核心优化包括:
  3. 阶梯式重刷
    1. 广告系统中的点击与转化均存在延迟,我们提出了创新的阶梯式数据表分区重刷方案,以解决点击转化上报延迟所引起的样本重刷、特征缓存重刷问题

2.组合特征

a. 深度模型虽然号称可以拟合任意函数,但根据经验添加一些显式的交叉特征能显著的提升样本的区分度,加速模型的收敛,我们主要从广告、广告位、用户等不同维度构造交叉特征,共增加了几十个交叉特征,但在实验过程中我们也发现,显式的交叉方式会引发一些问题,比如:

    1. 低频特征过拟合问题
    2. 特征空间显著膨胀,线上推理耗时增加

b. 针对第一个问题,我们在小流量实验时发现实验模型曝光出来的广告与基线模型差异很大,且实验模型曝光出的广告冷门占比增加,在训练多个epoch后差异越发明显,由此我们推测出是因为高维的特征交叉导致了低频特征的过拟合,我们计算了实验组与基线广告物料和广告计划分时的杰卡尔德相似度,发现epoch=1对比epoch=3时,相似度有明显提升(左图epoch=1时plan维度的相似度约45%,右图epoch=3时plan维度的相似度不到35%),故我们将模型训练的epoch由3调整到1

c.针对第二个问题,对于高维稀疏的交叉特征,我们使用类wide&deep模型中的wide侧网络来学习特征之间的记忆能力,同时加入正则项降低过拟合风险,因wide侧计算复杂度低,也降低了在线推理耗时增加的问题

  1. 组合特征实验模型在核心广告位auc+0.4%,模型结构如下:
喜马广告算法优化实践(一):广告CVR模型演进历程

图五:2.0时期CVR模型结构

模型3.0时期

重点解决:训练样本数量限制、转化延迟

1.增量学习

  1. 在1.0和2.0时期,CVR模型每次训练时都是基于固定时间窗口内的数据全局shuffle的全量训练方式,在这种训练方式下,小时级训练模型存在数据重复训练的问题,导致每次训练时间较长,且因为全局shuffle样本,导致模型对最近期的数据不敏感,而近期的数据分布更接近当前线上情况,故在3.0时期我们进行了增量训练的迭代优化,增量训练对比全量训练:
  2. 增量训练优点
    1. 模型每次更新只使用最近一段时间新的数据,模型训练时间缩短到x小时以内
    2. 增量更新方式下,模型打破了原来只训练固定时间窗口内样本的限制,可以一直增量
    3. 增量训练对近期样本更敏感,对新广告收敛更快
  3. 存在的问题
    1. 增量方式下,模型基于最新的数据一直往前增量,导致延迟转化的正样本无法进入模型训练,而CVR样本中延迟的转化数占比较高,直接丢失会导致模型低估且排序能力也会下降,在这样的背景下,我们设计一种支持回补样本的增量方式,将模型分为天级模型 + 小时级模型
    1. 1. 小时模型:在天级模型的基础上,叠加当天数据训练,用于部署上线,小时级调度2. 天级模型:训练stable(转化延迟比例很低) + temp数据(存在一定转化延迟),天级调度
喜马广告算法优化实践(一):广告CVR模型演进历程

图六:小时级增量训练方式

  1. 参数遗忘问题:在增量方式下,模型的样本不是全局shuffle的,每次增量的特征分布和全局不一致,比如hour、weekday等这些特征在增量样本中取值都是相同,最终导致这些特征失去作用,且我们发现一直基于最新的数据进行增量更新,模型预估会出现较大波动,可能得原因:
  2. 1. 对于Sparse参数和Dense参数可能需要使用不同的学习率和优化器
    1. 我们的做法是小时级增量时,会随机采样一定比例最近一周的样本混合当天样本一起训练,这样模型预估会更加稳定
  3. 3. 最新数据分布变化比较大,增量到模型后导致一些高频的embedding也发生了较大的变化,这不是我们期望的,我们期望对于高频id的embedding应该更稳定,而一些新的、低频的embedding能快速收敛

模型4.0时期

重点解决:个性化能力进一步提升、不同业务统一模型

1.DeepRec大模型

  1. 在4.0时期之前,CVR模型都是基于原生的Tensorflow框架开发,在这个框架下我们遇到了一些特定的问题限制了模型的迭代优化,比如:
    1. 广告数据具有高维、稀疏特点:当前处理是将特征通过hash取余的方式,将特征限定在指定空间内,但是随着新广告、新用户、新特征的不断增加,hash冲突的概率会越来越大,具统计,部分特征的冲突率高达30%,大量hash冲突会直接影响模型预估准确性
    2. 低频特征难以有效学习:在广告系统也存在头部效应,大量的长尾、低频特征因缺乏训练数据,不能有效学习,不做处理线上往往会导致预估偏高问题,需要降低长尾特征的影响
  2. 故在4.0时期我们联合中台AI云团队将模型训练框架由TensorFlow升级到DeepRec,开始了由TensorFlow小模型向DeepRec大模型的迭代,在DeepRec框架下我们可以添加更高维稀疏的交叉特征,包括用户id及其交叉特征,能显著提升模型个性化预估能力,之后在CTR模型迭代优化的文章中会详细介绍稀疏大模型上的相关迭代

2.CVR大模型一期:EmbeddingVariable&&低频特征准入

a. EmbeddingVariable(动态弹性特征)

    1. 针对高维、稀疏的广告数据特点,基于AI云团队开发EmbeddingVariable功能,(1)显著降低了特征哈希冲突的概率,对比基线模型,id类特征的冲突概率从30%下降到1%,(2)模型的大部分参数来自特征embedding,而基线模型中设定固定大小的hash空间,导致了内存浪费,而动态embedding可以支持动态写入,有效了避免了内存浪费
喜马广告算法优化实践(一):广告CVR模型演进历程

b. 低频特征准入

    1. 低频特征因为缺乏训练数据,不能有效学习,在之前的id类组合特征实验中就遇到了低频特征过拟合问题,导致模型高估,所以需要降低低频特征对模型预估的影响,DeepRec框架中自带了对低频特征准入的功能,目前支持基于bloom_filter和特征频次的准入,模型中采用的是基于频次的特征准入
喜马广告算法优化实践(一):广告CVR模型演进历程

c. 在大模型第一版迭代中,我们引入了上面这两个feature,同时将wide侧组合特征迁移到deep侧直接学习,离线评估auc+0.25%,pcoc降低约30%,模型结构如下:

喜马广告算法优化实践(一):广告CVR模型演进历程

图七:4.0时期大模型第一版模型结构

3.CVR大模型二期:基于Gate NU的参数个性化网络

a. 监督学习的本质是拟合数据分布,当数据分布存在不均衡时,模型往往被多数类样本或者特征主导,比如:高频用户的数据主导了模型学习,导致模型在低频用户上学习不好,其结果是预估被高频用户带偏,考虑到不同用户的广告行为具有一定差异,为了帮助模型更好的学习不同用户数据分布的差异,我们基于device_id设计了一种基于门控机制的参数个性化网络,旨在降低不均衡分布对模型的影响,提升模型的个性化预估能力

b. Gate NU(门控网络)

    1. 输入用户id特征,中间采用两层神经网络,其第二层采用sigmoid作为激活函数,为每个用户生成不同个性网络权重
  1. ii. Gate输出结果与主网络Dense层输出结果进行 element-wise product 来做用户的个性化偏置

c. 参数个性化网络的引入,模型auc+0.12%,gauc+0.28%,模型结构如下:

喜马广告算法优化实践(一):广告CVR模型演进历程

图七:4.0时期大模型第二版模型结构

4.CVR大模型三期:多目标升级

a. 目前OCPC广告投放分为单出价广告和双出价广告,单出价只需要优化一个CVR目标,双出价广告需要同时优化深、浅两个CVR目标(浅层目标:表单提交、激活等,深层目标:授信、加微、付费等),之前模型是分别建模浅层CVR和深层CVR模型,模型维护成本高,迭代效率低,基于这样的背景,我们开始了深、浅CVR模型的合并b. 合并多目标模型结构设计

    1. 一次请求需要同时预估广告的浅层cvr和深层cvr,故需要将浅层和深层独立拆塔,同时考虑到样本选择偏差和正样本稀疏的问题,我们又加入了ctr、和ctcvr两个辅助目标,模型结构如下:
喜马广告算法优化实践(一):广告CVR模型演进历程

图七:4.0时期大模型合并多目标模型结构

c. 基于广告深、浅目标的Loss Mask设计

    1. Loss = \sum(Loss_{ctr} , Loss_{ctcvr} , Loss_{shadow\_cvr} ,Loss_{deep\_cvr}) \odot Mask
    2. 单出价广告Mask
    3. 双出价广告Mask
    1. 不同出价方式的广告需要优化的目标不同,故需要设计一种Loss Mask机制对不同样本在计算Loss时进行Mask,防止带偏其他网络的学习
    2. 模型Loss和Mask

d.效果上,合并多目标模型auc+0.14%,深层cvr模型预估偏差有非常明显下降,部分深度双出价广告的cvr提升幅度超过100%,后续的文章中会有专门的topic来介绍我们针对广告主深度效果优化相关的算法策略

未来展望

自营广告cvr模型经过多次迭代优化,核心指标ecpm提升近100%,带来了明显的业务提升,但还存在很多问题需要不断解决:

(1)未来我们会继续在大规模上持续迭代,让模型的个性化预估能力得到更进一步提升。

(2)同时随着时效性的不断提升,转化延迟的问题也越发明显,故急需要对转化延迟进行建模,以解决延迟转化被模型误判为负样本带来的预估问题。

(3)虽然新广告预估准确性随着模型时效性的提升,得到了缓解,但是并没有本质上解决新广告预估准确性的问题,未来我们希望通过meta-learning的方式,真正提升模型对于新广告的预估能力,让新广告在冷启阶段就能准确的找到感兴趣的人,从而提升冷启流量的变现效率。

(4)通过更丰富的场景化特征刻画和更高效的场景化建模方式,提升cvr模型在站内、站外多场景预估的准确性。

(5)手动设计交叉特征的方式虽然有效,但是需要对业务有很深的认知,才能设计出有效的组合特征且效率较低,未来我们会去探索业界一些先进的自动交叉网络结构,比如:dcnv2、can等。

虽然喜马自营广告cvr模型取得了一定的进步,但仍然有很多可以持续优化的地方,我们相信“星光不负赶路人”,只要朝着正确的方向不断迭代,一定会为喜马自营广告带来更多业务提升。

作者:喜马Tech 郑纪伟

来源-微信公众号:喜马拉雅技术团队

出处:https://mp.weixin.qq.com/s/ku4jncV263ATWMZgSR5oog

继续阅读