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

news2024/9/24 7:09:14

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 = 0
    for data in k_arm_data:
        total_num += data[0]
    return total_num
 
def 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/totals
        k_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 beta
 
def test_beta_distribution():
    a, b = 9078, 4096
    r = beta.rvs(a, b, size=10)
    print(r)
     
    a1, b1 = 5539, 2567
    r1 = beta.rvs(a1, b1, size=10)
    print(r1)
     
    a2, b2 = 1, 1
    r2 = beta.rvs(a2, b2, size=10)
    print(r2)
     
    a3, b3 = 2195, 1028
    r3 = 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.68754273
 0.68937758 0.68530153 0.68749733 0.68397584]
[0.6851433  0.67626678 0.68429746 0.67905056 0.68655858 0.69324291
 0.68437178 0.68259162 0.68661927 0.67916696]
[0.84763723 0.59356287 0.3363573  0.48248605 0.10986077 0.00211299
 0.15710948 0.22735167 0.46674019 0.9081156 ]
[0.67520224 0.67626631 0.68193351 0.68757709 0.67433103 0.67179957
 0.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 np
 
epsilon = 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 index
 
count = [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.coloradmin.cn/o/2159758.html

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

相关文章

机器学习 | Scikit Learn中的普通最小二乘法和岭回归

在统计建模中,普通最小二乘法(OLS)和岭回归是两种广泛使用的线性回归分析技术。OLS是一种传统的方法,它通过最小化预测值和实际值之间的平方误差之和来找到数据的最佳拟合线。然而,OLS可以遭受高方差和过拟合时&#x…

Unreal Engine 5 C++: 插件编写03 | MessageDialog

在虚幻引擎编辑器中编写Warning弹窗 准备工作 FMessageDialog These functions open a message dialog and display the specified informations there. EAppReturnType::Type 是 Unreal Engine 中用于表示应用程序对话框(如消息对话框)返回结果的枚举…

vue.js 展示树状结构数据,动态生成 HTML 内容

展示树状结构数据: 从 jsonData 读取树状结构的 JSON 数据,将其解析并生成 HTML 列表来展示。树状结构数据根据 id 和 label 属性组织,节点可以包含子节点 children。 展示评级信息: 从预定义的表单字段 form 中读取 arRateFlag 和…

GS-SLAM论文阅读笔记--GLC-SLAM

前言 最近GS-SLAM回环检测的工作已经逐步发展了,看一下这篇新文章。 文章目录 前言1.背景介绍2.关键内容2.1 tracking2.2 local mapping2.3 Loop Closing2.4总体流程 3.文章贡献 1.背景介绍 现有的基于3dgs的SLAM方法往往存在累积的跟踪误差和地图漂移&#xff0c…

三菱FX5U CPU模块的初始化“(格式化PLC)”

1、连接FX5U PLC 1、使用以太网电缆连接计算机与CPU模块。 2、从工程工具的菜单选择[在线]中[当前连接目标]。 3、在“简易连接目标设置 Connection”画面中,在与CPU模块的直接连接方法中选择[以太网]。点击[通信测试]按钮,确认能否与CPU模块连接。 FX5…

小柴冲刺软考中级嵌入式系统设计师系列二、嵌入式系统硬件基础知识(1)数字电路基础

目录 一、信号特征 二、组合逻辑电路和时序逻辑电路 1、组合逻辑电路 2、时序逻辑线路 三、信号转换 1、数字集成电路的分类 2、常用电平接口技术 四、可编程逻辑器件 flechazohttps://www.zhihu.com/people/jiu_sheng 小柴冲刺嵌入式系统设计师系列总目录https://blo…

[vulnhub] Prime 1

https://www.vulnhub.com/entry/prime-1,358/ 主机发现端口扫描 探测存活主机,137是靶机 nmap -sP 192.168.75.0/24 // Starting Nmap 7.93 ( https://nmap.org ) at 2024-09-22 16:25 CST Nmap scan report for 192.168.75.1 Host is up (…

Rust - 字符串:str 与 String

在其他语言中,字符串通常都会比较简单,例如 “hello, world” 就是字符串章节的几乎全部内容了。 但是Rust中的字符串与其他语言有所不同,若带着其他语言的习惯来学习Rust字符串,将会波折不断。 所以最好先忘记脑中已有的关于字…

MMD模型一键完美导入UE5-VRM4U插件方案(一)

1、下载pmx模型 1、去模之屋官网下载MMD模型,模之屋 2、下载完成得到pmx和Texture文件 2、下载并启用VRM4U插件 1、下载VRM4U插件, VRM4U,点击Latest下载对应引擎版本 2、将插件放到Plugins目录,然后

GB28181语音对讲协议详解

GB28181-2016语音对讲流程如下图1所示: 图1.语音对讲流程。 其中, 信令 1 、2 、 3 、 4 为语音广播通知、 语音广播应答消息流程; 信令 5 、 1 2 、 1 3 、 1 4 、 1 5 、 1 6 为 S I P 服务器接收到客户端的呼叫请求通过 B 2 B UA 代理方式建立语音流接收者与媒…

DevExpress WPF中文教程:如何解决行焦点、选择的常见问题?

DevExpress WPF拥有120个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

【HarmonyOS】应用权限原理和封装

背景 在项目中,避免不了需要调用系统资源和系统能力,比如:日历读写、摄像头等。因此,需要了解对系统资源访问权限的申请方式方法。 授权方式 包括两种授权方式,分别是system_grant(系统授权) 和 user_grant(用户授权)…

ruoyi源码解析学习 - 微服务版 - ruoyi-gateway

com.ruoyi.gateway 今天简单看看若依的gateway的配置模块干了啥 最近面试很多外包公司,都对低代码平台有点要求,这些代码虽说用起来不费劲,但是其中还是有很多细节能让我学习学习的。(微服务版,上次搞jeecgboot的笔试…

R包安装教程,如何安装rjags和infercnv

一.介绍 在数据分析过程中,R语言因其强大的统计分析能力和丰富的包生态系统,成为众多研究人员和数据科学家的首选工具。本文将详细介绍如何在R环境中安装两个重要的R包——rjags和infercnv。rjags用于与JAGS(Just Another Gibbs Sampler&…

热斑黄斑光伏发电板 红外黄斑检测图像数据集内含最高温度信息 1200张,jpg格式。

热斑黄斑光伏发电板 红外黄斑检测图像数据集 内含最高温度信息 1200张,jpg格式。 热斑黄斑光伏发电板红外黄斑检测图像数据集介绍 数据集名称 热斑黄斑光伏发电板红外黄斑检测图像数据集(Hot Spot and Yellow Spot Detection in Photovoltaic Panels I…

Linux下进程通信与FIFO操作详解

Linux下进程通信与FIFO操作详解 一、命名管道(FIFO)概述1.1 命名管道的特点1.2 创建命名管道二、命名管道的操作2.1 打开命名管道2.2 读写命名管道2.3 关闭命名管道三、命名管道的使用实例3.1 命名管道的创建和通信过程3.1.1 发送方(writer)3.1.2 接收方(reader)3.2 运行…

java项目之健身房管理系统源码(springboot)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的健身房管理系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 健身房管理系统的主要使用…

Java框架学习(Spring)(tx)(03)

简介:以本片记录在尚硅谷学习ssm-spring-tx时遇到的小知识 详情移步:想参考的朋友建议全部打开相互配合学习! 视频: 057-spring-tx-编程式和声明式事务理解_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1AP411s7D7?p5…

第九节 Opencv自带颜色表操作

知识点:Look Up lTable(LUT)查找表 了解LUT查找表的作用与用法,代码实现与API介绍 -applyColorMap(src,dst,COLORMAP) -src表示输入图像 -dst表示输出图像 匹配到的颜色LUT,Opencv支持13种…

Android OpenGLES2.0开发(一):艰难的开始

生而为人,本质上,都是孤独的! 引言 我一直觉得OpenGL ES是一块硬骨头,每次用到GLSurfaceView作为Camera的预览视图时,总是去网上找现成的代码。CtrlC和CtrlV之后总有一种沾沾自喜的感觉,但是你要让我改里面…