混排层负责将多个异构队列的结果如广告、游戏、自然量等进行融合,需要在上下游和业务多重限制下取得最优解,相对复杂和难以控制。本文主要从业务、模型等角度介绍了vivo广告策略团队在信息流和应用商店混排上的一些探索和思考。
首先介绍一下什么是混排。所谓混排,如图所示就是需要在保障用户体验前提下,通过对不同队列中的异构内容进行合理混合,实现收益最优,更好的服务广告主和用户。混排的核心挑战体现在:
vivo的信息流场景,包括像浏览器、i视频、负一屏等,他的特点是场景众多,下拉深度较高,广告形式多样,用户个性化需求较强。而对于商店场景,是一个整体偏垂直的场景,它涉及到广告、游戏、自然量多方均衡,需要在保量和用户体验等严格要求下,取得综合最优解。后续我们将对这2个场景的特点展开逐一介绍。
对于信息流场景来说,如下图所示,混排侧所主要解决的问题是内容队列与广告队列的混排问题。也就是如何在平衡好用户体验和广告主利益的情况下,将广告插入到合适的位置。
对于传统信息流媒体来说早期的主要混排方式可能主要是以固定位模板为主。也就是运营人工定下广告与内容的插入关系,简单直接。但也带来了三个明显的问题:
以某职场社交平台的方案为例。它将优化目标设定为在用户体验价值大于一定值的前提下最优化营收价值。对于待插入广告,将用户体验货币化,与商业化价值加权衡量整体价值。如果整体价值大于用户体验价值时投放广告内容,否则投放产品内容。此外在投放时还会根据右图所示考虑间隔等约束。他的方法简单直接,很多团队采用类似的方案取得较好效果。但该方案只考虑单一item价值,未考虑item间相互影响,缺乏长期收益的考虑。
接下来介绍的是某小视频的方案,他们采用强化学习的方法进行混排。该方案将信息流混排问题抽象为序列插入问题,将不同广告对于不同槽位的插入情况抽象为不同action,通过强化学习进行选择。在考虑奖励设计时融合了广告价值(如收入等)与用户体验价值(比如下滑与离开)。通过调节超参对两者进行平衡。但是该方案对工程依赖较高且论文中已离线测试为主,缺乏线上的分析。并且该模型只考虑单广告插入,未考虑多广告情况。具体到vivo信息流场景的迭代,混排迭代包括固定位混排,Qlearning 混排和深度解空间型混排三个阶段。
整体思路是希望在Qlearning阶段通过简单的强化学习方案累积样本,快速探索收益。后续升级为深度学习方案。
上面是强化学习的基本流程,强化学习最大的特点是在交互中学习。Agent在与环境的交互中根据获得的奖励或惩罚不断的学习知识,更加适应环境。state,reward和action是强化学习中最为关键的三个要素,后续详细展开。vivo信息流的Qlearning混排机制有什么好处呢?首先它会考虑全页面收益,并考虑长期收益,符合多刷场景诉求。此外Qlearning模型可以小步快跑,积累样本同时,快速验证效果。当前整体系统架构,混排系统位于adx后,接收到内容队列与广告队列后,通过Qlearning 模型下发调权系数,对广告进行调权,叠加业务策略后,生成融合队列。而用户行为也会触发Qlearning模型更新。Qlearning模型运行原理如图,首先初始化qtable,然后选择一个action,根据action所得到的reward进行qtable的更新,而在损失函数既考虑短期收益也考虑长期收益。在vivo的实践中,在奖励设计上,我们综合考虑时长等用户体验指标与广告价值,两者进行平滑后,通过超参进行权衡。在动作设计上,一期采用数值型的方式,生成广告调权系数,作用于广告精排得分,与内容侧进行混合,从而实现混排。在状态设计上包含用户特征、上下文特征、内容侧特征和广告侧特征四个部分。像统计特征和上下文特征等对Qlearning模型有较大影响。在vivo信息流场景中,Qlearning混排取得了较好的效果,已经覆盖绝大部分场景。
Qlearning混排存在一定的局限性:
新的解空间模型action空间更大,天花板更高。但稀疏action难以学习充分,易导致预估不准。为了解决这个问题,我们在线上增加小流量随机实验,提高稀疏动作命中率,丰富样本多样性。序列特征作为模型最为重要的特征之一,也是强化学习模型刻画state的重要特征之一,我们对序列做了一些优化。在序列attention模块,为了解决用户历史兴趣与待插入广告的匹配程度,我们通过transformer刻画用户行为序列信息;之后通过待插入广告与序列attention操作,刻画匹配程度。此外在序列match模块,我们引入先验信息,产生强交叉特征,对attention进行补充;对于match权值通过CTR、是否命中、时间权重、TF-IDF等方式进行信息提取。
商店混排的核心问题是实现广告队列与游戏队列的混排。而就像图中所示广告与游戏排序分定义方式不同,难以直接对比。此外联运游戏回收周期长, LTV难以估准,即使全部按照ecpm排序也较难保证效果。
梳理下应用商店面临的核心挑战:
回到vivo应用商店混排,整体迭代包含固定位混排、PID保量、带约束混排、混排精细化分流4个阶段。
首先介绍PID的方案,PID最开始来源于自动化领域。初期为了相应业务侧诉求,参考业界主流方案,通过对广告和游戏进行保量,初步实现混排能力。但方案较为简单,且PID难以关联到收益目标,难以实现收益最优。
保量和收益最大化存在一定程度的冲突,满足保量约束下,如何实现业务综合收益最优是最大难点。vivo商店混排采取流量拆分微调的思路,在PID保量后接重排,综合考虑用户体验、广告收入、游戏价值三者的平衡点。针对重排与PID保量冲突,重排只对部分位置生效,使得在部分流量如首屏下能够进行收益的探索,而又能满足保量需求。
在重排层我们一开始考虑沿用信息流的混排方案,使用强化学习进行混排。但是存在2个问题:
在带约束重排基础上,我们思考能否进一步进行优化。
具体到重排模型上,我们也做了一些迭代。当前重排层,数值型模型存在一些问题:很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵
?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------
MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO
我认为我的问题最好用一个例子来描述。假设我有一个名为“Thing”的简单模型,它有一些简单数据类型的属性。像...Thing-foo:string-goo:string-bar:int这并不难。数据库表将包含具有这三个属性的三列,我可以使用@thing.foo或@thing.bar之类的东西访问它们。但我要解决的问题是当“foo”或“goo”不再包含在简单数据类型中时会发生什么?假设foo和goo代表相同类型的对象。也就是说,它们都是“Whazit”的实例,只是数据不同。所以现在事情可能看起来像这样......Thing-bar:int但是现在有一个新的模型叫做“Whazit”,看起来
我有一个要在我的Rails3项目中使用的数组扩展方法。它应该住在哪里?我有一个应用程序/类,我最初把它放在(array_extensions.rb)中,在我的config/application.rb中我加载路径:config.autoload_paths+=%W(#{Rails.root}/应用程序/类)。但是,当我转到railsconsole时,未加载扩展。是否有一个预定义的位置可以放置我的Rails3扩展方法?或者,一种预先定义的方式来添加它们?我知道Rails有自己的数组扩展方法。我应该将我的添加到active_support/core_ext/array/conversion
参见下面的示例,我想最好使用第二种方法,但第一种也可以。哪种方法最好,使用另一种的后果是什么?classTestdefstartp"started"endtest=Test.newtest.startendclassTest2defstartp"started"endendtest2=Test2.newtest2.start 最佳答案 我肯定会说第二种变体更有意义。第一个不会导致错误,但对象实例化完全过时且毫无意义。外部变量在类的范围内不可见:var="string"classAvar=A.newendputsvar#=>strin
我刚刚看到whitehouse.gov正在使用drupal作为CMS和门户技术。drupal的优点之一似乎是很容易添加插件,而且编程最少,即重新发明轮子最少。这实际上正是Ruby-on-Rails的DRY理念。所以:drupal的缺点是什么?Rails或其他基于Ruby的技术有哪些不符合whitehouse.org(或其他CMS门户)门户技术的资格? 最佳答案 Whatarethedrawbacksofdrupal?对于Ruby和Rails,这确实是一个相当主观的问题。Drupal是一个可靠的内容管理选项,非常适合面向社区的站点。它
如果我构建了一个应用程序来访问来自Gmail、Twitter和Facebook的一些数据,并且我希望用户只需输入一次他们的身份验证信息,并且在几天或几周后重置,那会怎样是在Ruby中动态执行此操作的最佳方法吗?我看到很多人只是拥有他们客户/用户凭证的配置文件,如下所示:gmail_account:username:myClientpassword:myClientsPassword这看起来a)非常不安全,b)如果我想为成千上万的用户存储此类信息,它就无法工作。推荐的方法是什么?我希望能够在这些服务之上构建一个界面,因此每次用户进行交易时都必须输入凭据是不可行的。
当音乐碰上区块链技术,会擦出怎样的火花?或许周杰伦已经给了我们答案。8月29日下午,B站独家首发周杰伦限定珍藏Demo独家访谈VCR,周杰伦在VCR里分享了《晴天》《青花瓷》《搁浅》《爱在西元前》四首经典歌曲Demo背后的创作故事,并首次公布18年前未发布的神秘作品《纽约地铁》的Demo。在VCR中,方文山和杰威尔音乐提及到“多亏了区块链技术,现在我们可以将这些Demos,变成独一无二具有收藏价值的艺术品,这些Demos可以在薄盒(国内数藏平台)上听到。”如何将音乐与区块链技术相结合,薄盒方面称:“薄盒作为区块链技术服务方,打破传统对于区块链技术只能作为数字收藏的理解。聚焦于区块链技术赋能,在