提到强化学习,似乎总给人一种难以训练且难以落地的感觉。但是听大佬说,企业里强化学习推荐系统(RLRS)落地的例子其实已经有不少,不过一般都没有公开细节。现有公开且知名的RLRS技术分享有:
- 微软DRN新闻推荐系统[1]
- 美团“猜你喜欢”[2]
- 京东基于强化学习的page-wise推荐DeepPage
本文希望汇总这三个工作中的模型结构,试图从中总结出一些RLRS的通用性的规则或做法,并指出一些RLRS流程中存在的问题(个人拙见)。
强化学习的本质是让初始化的智能体(agent)在环境中探索,通过环境的反馈(reward)来不断纠正自己的行动策略(policy),以期得到最大的reward。在推荐系统中,用户的需求会随时间动态的变化,RL agent不断探索的特性正好符合了推荐系统对动态性的要求,因此就把RL agent作为推荐系统。而agent不断探索如何满足用户的动态的需求,其实也是在不断尝试建模更长期的回报。这就引出了RLRS的两大优势:
- 满足用户的动态的需求
- 建模更长期的回报
当讨论强化学习算法的应用时,首先要明确马尔可夫决策过程(MDP)中的转移元组的各个元素的含义。在RLRS中:
动作(action):推荐内容,如商品列表或者新闻列表
奖励(reward):用户的反馈,如用户是否点击,或者浏览时间
状态(state):RLRS的agent的状态是对环境以及自身所处情况的刻画,可以简单理解为此刻的用户历史行为日志
环境(environment):环境是推荐系统所面对的外部环境,可以简单的理解为用户集合 物品集合,如果展示推荐内容的APP或者网页的某些属性(比如说APP中的推荐页面展示规则,或者页面所包含的其他内容)不能由推荐系统决定,那么环境也要包括网站与APP本身
具体来说,在微软的DRN新闻推荐系统中,MDP可以表示为下图的流程:
环境被定义为用户与新闻的集合,状态是用户的特征表示,动作是新闻的特征表示。agent的输入是用户特征表示(状态)与物品特征表示(待选动作),输出一个新闻列表(动作)并得到用户的反馈,而用户反馈又包含点击率与活跃度两部分。其他RLRS的MDP决策过程与DRN类似,只是大家对状态、奖励、环境的定义可能略有偏差。
例如,DRN中的状态,即用户特征,其每一维代表的是该用户在最近一段时间所点击的新闻的相关信息,用这样一个特征代表了用户的新闻喜好。
在美团“猜你喜欢”中,状态是由用户实时行为序列得到的,具体的:把用户实时行为序列的Item Embedding作为输入,使用一维CNN学习用户实时意图的表达;使用Dense和Embedding特征表达用户所处的时间、地点、场景,以及更长时间周期内用户行为习惯的挖掘,把这部分的输出作为上下文信息。最终把用户实时意图与上下文信息拼接,得到状态。
在DeepPage的强化学习算法中,状态也是用户的特征表示,不过是由GRU得到的。输入给GRU的是用户历史上点击过的物品序列,把GRU末端输出作为初始状态。
在值函数的估计上,美团和微软都参考了Dueling DQN的思想,把状态动作值函数分解为状态值函数和优势函数:
Dueling DQN这种对Q(s,a)的分解有更高的更新效率,因为更新了V(s)实际上就等于更新了所有Q(s,a)。并且,微软的target奖励还考虑了Double DQN的小技巧,缓解选取动作时的max操作带来的过估计问题:
美团则简化了模型:由于Actor与Critic部分都包含对state的表达,且这部分的网络参数占整个网络参数的大头,因此直接复用这部分参数。另外,对值函数V(s)的估计与动作无关,动态性很小,因此可以直接离线使用历史数据监督的训练:
离线训练的操作在DeepPage算法中也有,但是DeepPage又有所不同:DeepPage认为RLRS上线前需要进行线下的训练和评估,训练和评估主要基于用户的历史行为数据,但是这部分数据对于整个动作空间来说(也就是所有物品的可能组合)是非常稀疏的。因此DeepPage希望能够有一个模拟器来预测出从未见过的(state,action)的奖励,也就是target值函数的估计。这里并不是采取监督训练的方式来计算出一个预测模型,而是根据新(state,action)与已有(state,action)的相似度来作为奖励的权重。这个做法看似简介,其实背后的思想是防止外延误差。简单的理解外延误差,就是说在离线情况下我根据历史数据预测target值函数时,所用的(state,action)分布,与真实线上的策略所能探索到的(statce,action)分布,之间是在偏差的,这会使得离线算法的性能急剧下降。相关研究已经很多了,解决办法就是遇到没见过的策略时,给其较低的奖励,也就是保守一些,DeepPage这里的离线值估计,也是采用了这个思想。离线强化学习外延误差的问题,可以看这篇文章[3]。
DRN与美团和DeepPage的算法还有一处不同,DRN估计Q(s,a)时输入了单独的新闻特征,新闻是检索得来的,或许是粗排得到的,原文没说;而美团与京东的模型则采用了Actor-Critic的结构,动作是由Actor选取的,因为这样做避免了对动作空间(物品空间)的线性操作(max),效率明显高很多:
线上测试时,美团同时测试多个策略,每个策略就是一个优势函数,共用同一个状态值函数,更新细节没有说:
DRN在更新时,把更新分为大更新与小更新,小更新时,模型中会对原有的推荐网络增加一个扰动得到一个新网络,对比两个网络在一个时刻的性能,并保留较好的那个。这种通过扰动得到新网络的做法非常粗暴,王喆老师在其推荐系统课程中对这一点进行了分析,认为这是一种工程实现时的妥协,所以大家不必过度纠结这一步的合理性了
大更新是隔一段时间(如几个小时)进行一次,利用这段时间收集到的用户行为日志,进行离线的更新,同时大更新还会考虑用户的活跃度,用户活跃度可以看作是对长期收益的建模。总结大更新与小更新的差异如下:
- 大更新隔一段时间进行一次,使用最新收集的历史数据进行更新; 小更新发生在每次收到用户反馈时。
- 大更新除了考虑点击率等直接的奖励反馈,还考虑了用户活跃度,小更新不考虑用户活跃度。
- 大更新时没有探索的意图,是根据梯度进行更新,优化奖励函数; 小梯度是基于随机探索出的结果,探索网络的到的完全是随机的结果,没有利用梯度信息。
最后说一下DRN对用户活跃度的建模:
初始活跃度0.5,当用户离开APP时这个活跃度会递减,每当用户返回APP,活跃度就会增加,最大加到1.0。所以如果agent推荐了某些用户看完之后再也不想打开APP的东西,或者不能吸引用户再次打开APP的东西,agent就会受到惩罚。
总结一下,我认为这三个工作有这些突出的贡献:
- DRN给出了一种RLRS在线更新的方案,模型与更新方式很好的考虑了环境的动态特性,奖励函数考虑了长期回报。
- DeepPage中估计未见过的(state,action)的奖励时,给出了一种基于与历史(state,action)的相似度的奖励估计方案,缓解了RLRS离线更新时的外延误差问题。page-wise也是一种不错的思路,就是不知道有没有经过线上检验。
- 美团的比较偏向工程实践,给出了很多实践中可行的方案。
参考文献:
1. DRN: A Deep Reinforcement Learning Framework for News Recommendation
2. 强化学习在美团“猜你喜欢”的实践
3. Off-Policy Deep Reinforcement Learning without Exploration
4. https://github.com/hongleizhang/RSPapers