作者丨Leepand
研究方向丨算法、平台
原理介绍
个性化推荐是通过利用消费者的兴趣,个人资料及内容相关信息来定制推荐服务的做法。例如,个性化新闻服务将学会推荐基于新闻的文章用户与之交互过的文章。Contextual Bandit算法(Li et al., 2010; Ronen et al., 2016)经常是这种个性化推荐服务的主力。CBAs通过动态提高推荐的质量适应用户的兴趣和需求。整体而言此设置中代理的目标是学习一个策略随着时间迁移最大化用户参与度(CTR)。
推荐系统(RS)通过相关的主动推荐帮助用户发现有趣的项目(例如,要购买的产品,要观看的电影,要访问的餐馆)。为此,RS从用户反馈中学习用户偏好模型,该模型随时间收集数据实时更新参数。在这项工作中,我们在交互式环境中研究RS,系统在给定顺序推荐的情况下接收来自用户的交互式反馈。用户反馈可以是显式的(例如,评级、下载)或隐式的(例如,点击、浏览)。原则上,在提出推荐时,RS需要优化两个相互竞争的目标(如图 1):选择有助于学习用户模型(explorer)或选择更好地为用户服务的行动的决策(即推荐-exploit)。
▲ 图1. Reinforcement Learning Framework
Bandit算法是一类用来实现Exploitation-Exploration机制的策略。根据是否考虑上下文特征,Bandit算法分为context-free bandit和contextual bandit两大类。接下来我们即将介绍考虑上下文特征的一种在线学习算法-LinUCB,我们在计算参数及最后推荐结果的时候,用到以下几部分的信息:上下文特征 x,用户的反馈 c。而这些信息在每次反馈及参数更新后被存储下来,参数都可以动态更新。Bandit-based推荐系统
RL可以提供适当的框架(查看图1)来表示在与未知环境交互时从评估反馈中学习的RS。基于RS场景到RL框架组件的映射,如下所示:一般而言,RS具有丰富的应用领域,并且已经对基本MAB制定进行了不同类型的扩展,以解决与RS相关的特定特征和挑战。在这个部分,我们重点介绍RS中bandit-based的例子linUCB,包括单品和列表排序推荐。这种方法是基于内容的RS,为每个item部署一个arm,LinUCB是一种通用的上下文bandit方法,该方法考虑关于用户和item的辅助信息(即上下文特征),以便最大化用户点击总数。在具有不相交线性模型的LinUCB中,arm的预期收益(即项目的估计点击概率)是上下文向量xt,a和未知系数向量a之间的线性模型。使用来自先前试验的用户点击反馈作为训练数据来估计系数向量。预期收益的不确定性可以解释为系数向量估计的置信区间,考虑到一定程度的不确定性和arm的估计值,LinUCB的行动选择策略基于UCB,linUCB的计算复杂度与arm的数量成线性关系,支持arm集合的动态增减。
具体算法架构如图 2 所示。
▲ 图2. 模型架构/算法
LinUCB与相对于传统的在线学习(online learning)模型(比如ftrl)相比,主要区别:
- 每个arm学习一个独立的模型,特征只需要包含用户侧和用户与arm的交互信息,不需要arm侧的特征,传统在线模型为整个业务场景创建统一模型,更偏统计特性。
- 传统的在线学习采用贪心策略,最大化利用学习到的知识,没有探索机制,无法扩展历史模型之外的知识;LinUCB则有较完善的E&E机制,可以建立长期收益更新机制,直到长期均衡,类似诺贝尔经济学家格兰杰提出的协整模型或叫误差修正模型-ECM。
业务场景
在我们的广场小程序App首页,有一个优惠券瀑布流推荐场景,每次展示20-30个有商品属性的优惠券。商品候选集都是包含运营人工精选和为广场预留的券位,在更多流量刺激下有可能成为爆款,并且定期会下架一部分,加入一些新券进来。通过实现LinUcb算法,系统会对每个优惠券做充分的迭代,从而发掘出真正有销售潜力的优惠券,逐步淘汰掉不够理想的券,纠正运营人工选品的局限。经过市场验证的券,说明在一段时间内点击或销售的还是不错,从而形成良性循环,同时也给其他商家树立标杆,促进平台健康地发展。系统架构
▲ 图3. 系统架构
在我们的平台中,LinUCB算法的实现分为两个部分:
- 实现在推荐引擎里,主要完成特征向量提取、获取每个item的特征矩阵A和参数向量数据b、计算置信区间、根据最新计算出来得score排序给出推荐的优惠券/商品;
- 这部分实时解析推荐的曝光、用户反馈行为的日志为特征向量,根据上述算法更新每个item的特征矩阵和参数向量,并把更新后的参数实时写到Redis缓存里,前端应用实时读取最新参数信息及实时计算的推荐结果。
实践操作
我们的平台将算法的逻辑抽象后,模块化后部署在后台,前端只需要通过点击即可实现不同的推荐场景。点击“+create”按钮
▲ 图4. 创建引擎
在引擎创建界面选择算法模板,比如选择linUCB后会出现以下几个部分:get_context、get_action、set_reward等,在get_action中设置需要被推荐的item,如item数目较少可直接写在list中,如图中所示self.action=["action":["recom1","recom2","recom3"],如item较多且动态变化可以存在数据库或redis中,在页面中写调用程序即可,self.action=itemfunction(x)。
set_reward中固定设置前端获取的用户反馈:
LinUcb(self.reward,self.context["context"],self.action),其中
self.reward,self.context["context"],self.action均为前端api实时获取的参数。调用API
#获取action操作
http://localhost:5000/getaction?context=[0.5,0.2,0.5,0.1]&expid=986fada4ea
#用户反馈传回
http://localhost:5000/setreward?context=[0.5,0.2,0.5,0.1]&reward=1.0&action=recom2&expid=986fada4ea总结
通过本平台仅需要两步即可实现引擎的构建,最终生成两个接口,一个是实时获取推荐结果,一个时实时接收前端实时的反馈,后一个接口用于模型的实时更新,更新结果会在第一个接口中实时显示出来。参考文献
[1] Li, L., Chu, W., Langford, J., and Schapire, R. E. A Contextual-Bandit Approach to Personaized News Article Recommendation.[2] Ronen, R., Yom-Tov, E., and Lavee, G. Recommendations meet web browsing: Enhancing collaborative filtering using internet browsing logs.
关于AlgoLink
AlgoLink是自主研发的一款智能模型部署及管理产品,产品封装了模型部署、A/B Testing以及基于强化学习(Reinforcement Learning)技术的智能策略优化等模块,用户通过界面操作,即可完成自建部署机器学习模型、线上效果评估的全过程,并且可以在算法市场上展示自己的服务供其他成员使用。
阅读原文
原始链接