Minmin Chen、Alex Beutel等在《Top-K Off-Policy Correction for a REINFORCE Recommender System》中提出使用强化学习来提升youtube推荐。主要是从bias/variance的角度出发,具体方法如下:

摘要

工业界推荐系统会处理非常大的动作空间(action spaces)——数百万items来进行推荐。同时,他们需要服务数十亿的用户,这些用户在任意时间点都是唯一的,使得用户状态空间(user state space)很复杂。幸运的是,存在海量的隐式反馈日志(比如:用户点击,停留时间等)可用于学习。从日志反馈中学习是有偏的(biases),这是因为只有在推荐系统上观察到的反馈是由之前版本的推荐系统(previous versions)选中的。在本文中,我们提出了一种通用的方法,在youtube生产环境上的top-k推荐系统中,使用一个基于策略梯度的算法(policy-gradient-based algorithm,比如:REINFORCE),来解决这样的偏差。该paper的主要贡献有:

  • 1.将REINFORCE扩展到生产环境推荐系统上,动作空间有数百万;
  • 2.使用off-policy correction来解决在从多种行为策略中收集的日志反馈的数据偏差(data biases)
  • 3.提出了一种新的top-K off-policy correction来解释我们一次推荐多个items的策略推荐
  • 4.展示了探索(exploration)的价值

我们通过一系列仿真(simulations)和youtube的多个真实环境,来展示我们的方法的效果。

1.介绍

在工业界,通过推荐系统来帮助用户从海量内容中挑选和发现用户感兴趣的少部分内容。该问题十分具有挑战性,因为要推荐海量的items数目。另一方面,将合适的item在合适的时间上曝光给正确的用户,需要推荐系统能基于历史交互,不断地适应用户的兴趣漂移。不幸的是,对于一个大的状态空间(state space)和动作空间(action space),我们只观察到相对少量的数据,大多数用户只被曝光了少量items,而显式反馈的数据占比更少。也就是说,推荐系统在训练时只能接受相当稀疏的数据,例如:Netflix Prize Dataset只有0.1%的数据是dense的。因此,推荐系统的大量研究会探索不同的机制来处理相当稀疏的情况。从隐式用户反馈(比如:点击、停留时间)中学习,对未观察到的交互进行填充,对于提升推荐是很重要的一步。

大多数独立的研究线上,增强学习(RL)已经在游戏、机器人领域取得了相当大的进步。RL通常聚焦于构建agents,在一个环境(environment)中采取哪些动作(action)来最大化一些长期收益(long term reward)。这里,我们探索了将推荐解析成:构建RL agents来最大化每个用户使用该系统的长期满意度。在推荐问题上,这提供给我们一个新的视角和机会来基于在RL最新进展之上进行构建。然而,将这些新东西应用于实际还是有许多挑战。

如上所述,推荐系统需要处理大的状态空间(state spaces)和动作空间(action spaces),在工业界尤其显著。推荐可提供的items集合是不确定的(non-stationary),新items会不断被引入到系统中,从而产生一个日益增长的带新items的动作空间(action space),这会产生更稀疏的反馈。另外,在这些items上的用户偏好是会随时间一直漂移的(shifting),从而产生连续演化的用户状态(user states)。在这样一个复杂的环境(environment)中,通过这些大量actions进行reason,在应用已有RL算法时提出了独特的挑战。这里,我们分享了我们的实践:在非常大的动作空间和状态空间中,在一个神经网络候选生成器(neural candidate generator)上(一个top-k推荐系统)应用REINFORCE算法[48]。

除了大量动作和状态空间外,推荐系统中的RL仍是有区别的:只有有限提供的数据。经典的RL应用通过self-play和仿真(simulation)生成的大量训练数据,已经克服了数据无效性(data inefficiencies)。相比较而言,推荐系统的复杂动态性,使得对于仿真生成真实推荐数据是不可能的。因此,我们不能轻易寻找(probe for)关于之前的state和action space的未探索领域上的回报(reward),因为观测到的回报(observing reward)需要为一个真实用户给出一个真实推荐。作为替代,该模型几乎依赖于之前推荐模型们(models即policies)所提供的数据,大多数模型我们是不能控制的或不再可以控制。对于从其它policies中大多数日志反馈,我们采用一个off-policy learning方法,在该方法中我们会同时学习之前policies的一个模型,当训练我们的新policy时,在纠正数据偏差时包含它。我们也通过实验演示了在探索数据(exploratory data)上的价值(value)。

最终,在RL方法中大多数研究主要关注于:产生一个可以选择单个item的policy。而真实世界的推荐系统,通常会一次提供用户多个推荐[44]。因此,我们为我们的top-K推荐系统定义了一个新的top-K off-policy correction。我们发现,在模拟和真实环境中,标准off-policy correction会产生一个对于top-1推荐来说最优的policy,而我们的top-K off-policy correction会生成更好的top-K推荐。我们提供了以下的贡献:

  • 1.REINFORCE推荐系统:我们在一个非常大的action space中,扩展了一个REINFORCE policy-gradient-based方法来学习一个神经网络推荐policy。
  • 2.Off-Policy候选生成:我们使用off-policy correction来从日志反馈中学习,这些日志从之前的model policies的一个ensemble中收集而来。我们会结合一个已经学到的关于行为策略(behavior policies)的神经网络模型来纠正数据偏差。
  • 3.Top-K Off-policy Correction:我们提供了一个新的top-K off-policy correction来说明:我们的推荐一次输出多个items。
  • 4.真实环境的提升:我们展示了在真实环境中(在RL文献中很少有这种情况),这些方法对于提升用户长期满意度的价值。

我们发现,这些方法的组合对于增加用户满意度是很有用的,并相信对于在推荐中进一步使用RL仍有许多实际挑战。

2.相关工作

增强学习:Value-based方法(比如:Q-learning),policy-based方法(比如:policy gradients constitue经典方法)来解决RL问题。[29]中罗列了现代RL方法的常见比较,主要关注于异步学习(asynchronous learning),它的关键点是扩展到更大问题上。尽管value-based方法有许多优点(比如:seamless off-policy learning),他们被证明是在函数逼近(function approximation)上是不稳定的[41]。通常,对于这些方法来说,需要进行大量的超参数调参(hyperparameter tuning)才能达到稳定行为。尽管许多value-based方法(比如:Q-learning)取得了实际成功,这些算法的策略收敛(policy convergence)没有被充分研究。另外,对于函数逼近来说,Policy-based方法只要给定一个足够小的learning rate,仍然相当稳定。因此,我们选择一个policy-gradient-based方法(尤其是REINFORCE[48]),将这种on-policy方法适配到在当训练off-policy时提供可靠的policy gradient估计。

神经网络推荐系统:与我们的方法紧密相关的另一条线是,在推荐系统中应用深度神经网络[11,16,37],特别是使用RNN结合时序信息和历史事件用于推荐[6,17,20,45,49]。我们使用相似的网络结构,通过与推荐系统的交互来建模用户状态(user states)的演进。由于神经网络架构设计不是本文重点,有兴趣可以自己了解。

推荐系统中的Bandit问题:在线学习方法很流行,由于新的用户反馈是可提供的,可以快速被适配到推荐系统中。Bandit算法比如(UCB)[3],会以一种解析可跟踪的方式(它在regret上提供了很强的保证)来权衡exploration和exploitation。不同的算法,比如:Thomson sampling【9】,已经被成功应用于新闻推荐和展示广告。Contextual bandits提供了一种关于基础在线学习方法的context-aware refinement,并会将推荐系统朝着用户兴趣的方向裁减[27]。Agarwal【2】使得contextual bandits可跟踪,并且很容易实现。MF和bandits的混合方法被开发出来用于解决cold-start问题[28]。

推荐系统中的倾向得分(Propensity Scoring)和增强学习(Reinforcement learning):学习off-policy的问题在RL中是很普遍的,通常会影响policy gradient。由于一个policy会演进,因此在对应梯度期望下的分布需要重新计算。在机器人领域的标准方法[1,36],会通过限制policy更新的方式来绕过,以便在某一更新policy下新数据被收集之前,不能从实质上变更policy,作为回报,它会提供关于RL目标函数的单调提升保证。这样的近似(proximal)算法很不幸不能应用于item目录和用户行为快速变化的推荐情景中,因此大量的policy会发生变更。同时,对于大的状态空间和动作空间规模来说,收集日志反馈很慢。事实上,在推荐系统环境中,对于一个给定policy的离线评估已经是个挑战。多个off-policy estimators会利用逆倾向得分(inverse-propensity scores)、上限逆倾向得分(capped inverse-propensity scores)、以及许多变量控制的measures已经被开发出[13,42,43,47]。Off-policy评估会将一个相似的数据框架纠正为off-policy RL,相似的方法会被应用于两个问题上。逆倾向指数已经被大规模的用于提升一个serving policy【39】。Joachims[21]为一个无偏排序模型学习了一个日志反馈的模型;我们采用一个相似的方式,但使用一个DNN来建模日志行为策略(logged behavior policy),它对于off-policy learning来说是必需的。更常见的是,off-policy方法已经被适配到更复杂的问题上(比如:[44]为石板推荐)。

3.增强推荐

为便于理解,这里插入了张图(from 李宏毅课程)。

我们开始描述我们的推荐系统,及我们的RL-based算法。

对于每个用户,我们考虑一个关于用户历史交互行为的序列,它会记录下由推荐系统的动作(actions,比如:视频推荐)、用户反馈(比如:点击和观看时长)。给定这样一个序列,我们会预测下一个发生的动作(action:比如:视频推荐),以便提升用户满意度指标(比如:点击、观看时长)。

我们将该过程翻译成一个马尔可夫决策过程(Markov Decision Process: MDP)\((S, A, P, R, \rho_0, \gamma)\),其中:

  • S:用于描述用户状态(user states)的一个连续状态空间(state space)
  • A:一个离散的动作空间(action space),它包含了推荐可提供的items
  • \(P: S \times A \times S \rightarrow R\):是一个状态转移概率
  • \(R: S \times A \rightarrow R\):回报函数(reward function),其中\(r(s,a)\)是立即回报(immediate reward),它通过在用户状态(user state)s上执行动作a得到
  • \(\rho_0\):初始state分布
  • \(\gamma\):对于future rewards的discount factor

我们的目标是:寻找一个policy \(\pi(a \mid s)\)(它会将一个在item上的分布转化成:基于用户状态\(s \in S\)的条件来推荐\(a \in A\)),以便最大化由推荐系统获得的期望累积回报(expected cumulative reward)

\[max_{\pi} E_{\tau \sim \pi} [R(\tau)], where \ R(\tau) = \sum\limits_{t=0}^{|\tau|} r(s_t, a_t)\]

这里,在轨迹(trajectories) \(\tau = (s_0, a_0, s_1, \cdots)\)上采用的期望,它通过根据policy: \(s_0 \sim \rho_0, a_t \sim \pi(\cdot \mid s_t), s_{t+1} \sim P(\cdot \mid s_t, a_t)\)来获得。

提供了不同族的方法来解决这样的RL问题:Q-learning[38], Policy Gradient[26,36,48]以及黑盒优化(black box potimization)[15]。这里我们主要关注policy-gradient-based方法,比如:REINFORCE[48]。

我们假设:policy的一个函数形式为\(\pi_\theta\),参数为\(\theta \in R^d\)。根据各policy参数的期望累积回报(expected cumulative reward)的梯度,可以通过”log-trick”的方式进行解析法求导,生成以下的REINFORCE梯度:

\[E_{\tau \sim \pi_\theta} [R(\tau) \nabla_\theta log \pi_{\theta} (\tau)]\]

…(1)

在online RL中,policy gradient由正在更新的policy生成的轨迹(trajectories)上计算得到,policy gradient的估计是无偏的,可以分解成:

\[\sum_{\tau \sim \pi_{\theta}} R(\tau) \nabla_{\theta} log \pi_{\theta}(\tau) \approx \sum_{\tau \sim \pi_{\theta}} [ \sum_{t=0}^{|\tau|} R_t \nabla_{\theta} log \pi_{\theta} (a_t | s_t)]\]

…(2)

对于一个在时间t上的动作(action),通过使用一个discouted future reward \(R_t = \sum\limits_{t'=t}^{\mid \tau \mid} \gamma^{t'-t} r(s_{t'}, a_{t'})\)将替换\(R(\tau)\)得到的该近似结果,可以减小在梯度估计时的方差(variance)。

4.off-policy collrection

由于学习和基础设施的限制,我们的学习器(learner)没有与推荐系统的实时交互控制,这不同于经典的增强学习。换句话说,我们不能执行对policy的在线更新,以及立即根据updated policy来生成轨迹(trajectories)。作为替代,我们会接收的的关于actions的日志反馈由一个历史policy(或者一个policies组合)选中,它们在action space上会具有一个与正在更新的policy不同的分布。

我们主要关注解决:当在该环境中应用policy gradient方法时所带来的数据偏差。特别的,在生产环境中在部署一个新版本的policy前,我们会收集包含多个小时的一个周期性数据,并计算许多policy参数更新,这意味着我们用来估计policy gradient的轨迹集合是由一个不同的policy生成的。再者,我们会从其它推荐(它们采用弹性的不同policies)收集到的成批的反馈数据中学习。一个navie policy gradient estimator不再是无偏的,因为在等式(2)中的gradient需要从updated policy \(\pi_\theta\)中抽取轨迹(trajectories),而我们收集的轨迹会从一个历史policies \(\beta\)的一个组合中抽取

我们会使用importance weighting[31,33,34]的方法来解决该分布不匹配问题(distribution)。考虑到一个轨迹 \(\tau=(s_0,a_0,s_1,...)\),它根据一个行为策略\(\beta\)抽样得到,那么off-policy-corrected gradient estimator为:

\[\sum_{\tau \sim \beta} \frac{\pi_{\theta}(\tau)}{\beta(\tau)} [\sum_{t=0}^{|\tau|} R_t \nabla_{\theta} log(\pi_{\theta} (a_t | s_t))]\]

其中:

\[\frac{\pi_{\theta}(\tau)}{\beta(\tau)} = \frac{\rho(s_0) \prod_{t=0}^{|\tau|} P(s_{t+1}|s_t, a_t) \pi(a_t|s_t)}{\rho(s_0) \prod_{t=0}^{|\tau|} P(s_{t+1}|s_t, a_t) \beta(a_t | s_t)} = \prod_{t=0}^{|\tau|} \frac{\pi(a_t | s_t)}{\beta(a_t | s_t)}\]

是importance weight。该correction会生成一个无偏估计器(unbiased estimator),其中:轨迹(trajectories)会使用根据\(\beta\)抽样到的actions进行收集得到。然而,由于链式乘积(chained products),该estimator的方差是很大的,这会快速导致非常低或非常高的importance weights值

为了减少在时间t时该轨迹上的每个gradient项的方差,我们会首先忽略在该链式乘法中时间t后的项,并在将来时间采用一个一阶近似来对importance weights进行近似:

\[\prod_{t'=0}^{|\tau|} \frac{\pi(a_{t'} | s_{t'})}{\beta(a_{t'} | s_{t'})} \approx \prod_{t'=0}^{t} \frac{\pi(a_{t'} | s_{t'})}{\beta(a_{t'}|s_{t'})} = \frac{P_{\pi_{\theta}}(s_t)}{P_{\beta}(s_t)} \frac{\pi(a_t | s_t)}{\beta(a_t|s_t)} \approx \frac{\pi(a_t|s_t)}{\beta(a_t | s_t)}\]

这会产生一个具有更低方差的关于policy gradient的有偏估计器(biased estimator):

\[\sum_{\tau \sim \beta} [\sum_{t=0}^{|\tau|} \frac{\pi_{\theta} (a_t |s_t)}{\beta(a_t | s_t)} R_t \nabla_{\theta} log \pi_{\theta} (a_t | s_t)]\]

…(3)

Achiam[1]证明了:该一阶近似对于学到的policy上的总回报的影响,会通过\(O(E_{s \sim d^{\beta}} [D_{TV}(\pi \mid \beta)[s]])\)来限定幅值,其中\(D_{TV}\)是在\(\pi(\cdot \mid s)\)和\(\beta(\cdot \mid s)\)间的总方差,\(d^{\beta}\)是在\(\beta\)下的discounted future state分布。该estimator会权衡精确的off-policy correction的方差,并仍能为一个non-corrected policy gradient收集大的偏差,这更适合on-policy learning。

4.1 对policy \(\pi_{\theta}\)进行参数化

这里有:

  • user state (\(s_t \in R^n\)): 我们对每个时间t上的user state建模,这可以同时捕获用户兴趣的演进,它使用n维向量\(s_t \in R^n\)来表示。
  • action (\(u_{a_t} \in R^m\)): 沿着该轨迹(trajectory)每个时间t上的action会使用一个m维向量\(u_{a_t} \in R^m\)进行嵌入。

我们会使用一个RNN [6, 49]来建模状态转移\(P: S \times A \times S\):

\[s_{t+1} = f(s_t, u_{a_t})\]

我们使用了许多流行的RNN cells(比如:LSTM, GRU)进行实验,最终使用一个简单的cell,称为:Chaos Free RNN (CFN)[24],因为它的稳定性和计算高效性。该state会被递归更新:

\[s_{t+1} = z_t \odot tanh(s_t) + i_t \odot tanh(W_a u_{a_t}) \\ z_t = \sigma(U_z s_t + W_z u_{a_t} + b_z) \\ i_t = \sigma(U_i s_t + W_i u_{a_t} + b_i)\]

…(4)

其中:

  • \(z_t \in R^n\)是update gate
  • \(i_t \in R^n\)是input gate

考虑到一个user state s, policy \(\pi_{\theta}( a \mid s)\)接着使用一个简单的softmax进行建模:

\[\pi_{\theta}(a | s) = \frac{exp(s^{\top} v_a / T)}{\sum\limits_{a' \in A} exp(s^{\top} v_{a'} / T)}\]

…(5)

其中:

  • \(v_a \in R^n\)是每个action a在action space A中的另一个embedding(注:前面的\(u_{a_t} \in R^m\)是m维,而\(v_a\)是与\(s_t\)相同维度)
  • T是时序(通常设置为1)。T值越大会在action space上产生一个更平滑的policy。

在softmax中的归一化项需要检查所有可能的动作,在我们的环境中有数百万量级。为了加速计算,我们会在训练中使用sampled softmax。在serving时,我们使用一个高效的最近邻查寻算法来检索top actions,并使用这些actions来近似softmax概率,如第5节所述。

总之,policy \(\pi_{\theta}\)的参数\(\theta\)包含了:

  • 两个action embeddings:\(U \in R^{m \times \mid A \mid}\)和\(V \in R^{n \times \mid A \mid}\),
  • 在RNN cell中的权重矩阵:\(U_z, U_i \in R^{n \times n}, W_u, W_i, W_a \in R^{n \times m}\)
  • biases:\(b_u, b_i \in R^n\)

图1展示了一个描述main policy \(\pi_{\theta}\)的神经网络架构。给定一个观察到的轨迹 \(\tau = (s_0, a_0, s_1, ...)\),它从一个行为策略(behavior policy)\(\beta\)中抽样得到,该新策略(new policy)首先会生成一个关于user state \(s_{t+1}\)的模型,它使用一个initial state \(s_0 \sim \rho_0\)并通过等式(4)的recurrent cell迭代得到。给定user state \(s_{t+1}\),policy head会通过等式(5)的softmax来转化在action space分布。有了\(\pi_{\theta}(a_{t+1} \mid s_{t+1})\),我们接着使用等式(3)生成一个policy gradient来更新该policy。

图1 该图展示了policy \(\pi_{\theta}\)的参数变量(parametrisation)以及behavior policy \(\beta_{\theta'}\)

4.2 估计behavior policy \(\beta\)

伴随等式(3)的off-policy corrected estimator出现的一个难题是:得到behavior policy \(\beta\)。理想状态下,对于一个选中action的日志反馈(logged feedback),我们希望也能记录(log)下选中该action的behavior policy概率。直接记录该behavior policy在我们的情况下是不可行的,因为:

  • (1) 在我们的系统中有许多agents,许多是不可控的
  • (2) 一些agents具有一个deterministic policy,将\(\beta\)设置成0或1并不是使用这些日志反馈(logged feedback)的最有效方式

作为替代,我们采用[39]中首先引入的方法,并估计行为策略\(\beta\),在我们的情况中\(\beta\)是在系统中一个多种agents的policies的混合(它们使用logged actions)。给定一个logged feedback集合 \(D = \lbrace (s_i, a_i), i=1, \cdots, N \rbrace\),Strehlet[39]会以不依赖user state的方式,通过对整个语料的action频率进行聚合来估计\(\hat{\beta}(a)\)。作为对比,我们会采用一个依赖上下文(context-dependent)的neural estimator。对于收集到的每个state-action pair(s, a),我们会估计概率\(\hat{\beta}_{\theta'}(a \mid s)\),它指的是该behavior policies的混合体来选中该action的概率,使用另一个softmax来计算,参数为\(\theta'\)。如图1所示,我们会复用该user state s(它由main policy的RNN model生成),接着使用另一个softmax layer来建模该mixed behavior policy。为了阻止该behavior head干扰到该main policy的该user state,我们会阻止该gradient反向传播回该RNN。我们也进行了将\(\pi_{\theta}\)和\(\beta_{\theta'}\)的estimators分离开的实验,由于会计算另一个state representation,这会增加计算开销,但在离线和在线实验中不会产生任何指标提升。

尽管在两个policy head \(\pi_{\theta}\)和\(\beta_{\theta'}\)间存在大量参数共享,但两者间还是有两个明显的不同之处

  • (1) main policy \(\pi_{\theta}\)会使用一个weighted softmax来考虑长期回报(long term reward)进行有效训练;而behavior policy head \(\beta_{\theta'}\)只会使用state-action pairs进行训练(言下之意,不考虑reward?)
  • (2) main policy head \(\pi_\theta\)只使用在该trajectory上具有非零回报(non-zero reward)的items进行训练(注3);而behavior policy \(\beta_{\theta'}\)使用在该轨迹上的所有items进行训练,从而避免引入在\(\beta\)估计时的bias

注3:1.具有零回报(zero-reward)的Actions不会对\(\pi_{\theta}\)中的梯度更新有贡献;2.我们会在user state update中忽略它们,因为用户不可能会注意到它们,因此,我们假设user state不会被这些actions所影响 3.它会节约计算开销

在[39]中是有争议的:一个behavior policy(在给定state s,在time \(t_1\)上的它会确定式选中(deterministically choosing)一个action a;在time \(t_2\)上选中action b),可以看成是:在日志的时间间隔上,在action a和action b间的随机化(randomizing)。这里,我们在同一点上是有争议的,这也解释了:给定一个deterministic policy,为什么behavior policy可以是0或1。另外,由于我们有多个policies同时进行acting,在给定user state s的情况下,如果一个policy会确定式选中(determinstically choosing)action a,另一个policy会确定式选中action b,那么,以这样的方式估计\(\hat{\beta}_{\theta'}\)可以近似成:在给定user state s下通过这些混合的behavior policies,action a被选中的期望频率(expected frequency)。

4.3 Top-K off-policy Correction

在我们的setting中存在的另一个挑战是:我们的系统一次会推荐一个包含k个items的页面给用户。由于用户会浏览我们的推荐(整个集合或部分集合),并与一个以上的item存在潜在交互,我们需要选择一个相关items集合(而非单个item)。换句话说,我们会寻找一个policy \(\prod\limits_{\theta} (A \mid s)\),这样每个action A会选择一个关于k个items的集合,来最大化期望累积回报(expected cumulative reward):

\[max_{\theta} E_{\tau \sim \prod_{\theta}} [ \sum\limits_t r(s_t, A_t)]\]

轨迹(trajectory) \(\tau = (s_0, A_0, s_1, \cdots)\)会通过根据 \(s_0 \sim \rho_0, A_t \sim \prod(\mid s_t), s_{t+1} \sim P(\cdot \mid s_t, A_t)\) 进行acting来获得。不幸的是,动作空间(action space)在该集合推荐公式下是指数级增长,在给定items数时这会过大(从阶数为百万级的语料中选择items)。

为了让该问题可跟踪,我们假设:一个无重复(non-repetitive) items的集合的期望回报(expected reward)等于在集合中每个item的expected reward的和(该假设仍会认为:用户会独立地检查每个item)。更进一步,我们通过对每个item a根据softmax policy \(\pi_\theta\)进行独立抽样,接着进行去重来限制生成action A集合。也就是:

\[\prod_{\theta}(A' | s) = \prod\limits_{a \in A'} \pi_{\theta} (a | s)\]

注意:集合\(A'\)会包含重复的items,可以移除重复项来形成一个无重复的集合A。

在这些假设下,我们可以对该集合推荐setting采用REINFORCE算法,将在等式(2)的梯度更新修改为:

\[\sum_{\tau \sim \pi_\theta} [ \sum_{t=0}^{|\tau|} R_t \nabla_{\theta} log \alpha_{\theta} (a_t | s_t)]\]

其中:

  • \(\alpha_{\theta} (a \mid s) = 1 - (1- \pi_{\theta}(a \mid s))^K\):表示的是一个item a出现在最终的无重复集合A中的概率。这里,\(K = \mid A'\mid >\mid A\mid = k\)。(注:作为有放回(replacement)和去重(de-duplicate)抽样的结果,最终集合A的size是可变的)

我们接着更新等式(3)中的off-policy corrected gradient,通过使用\(\alpha_{\theta}\)替代\(\pi_{\theta}\),生成top-K off-policy correction factor:

\[\sum_{\tau \sim \beta} [ \sum_{t=0}^{|\tau|} \frac{\alpha_{\theta} (a_t |s_t)}{\beta(a_t|s_t)} R_t \nabla_{\theta} log \alpha_{\theta} (a_t | s_t)] \\ = \sum_{\tau \sim \beta} [\sum_{t=0}^{|\tau|} \frac{\pi_{\theta}(a_t|s_t)}{\beta(a_t|s_t)} \frac{\partial \alpha(a_t|s_t)}{\partial \pi(a_t|s_t)} R_t \nabla_{\theta} log \pi_{\theta} (a_t | s_t)]\]

…(6)

对比等式(6)和等式(3),top-K policy会增加一个额外的乘子\(\lambda_K(s_t, a_t)\)到original off-policy correction factor的\(\frac{\pi(a \mid s)}{\beta(a \mid s)}\)中:

\[\lambda_K(s_t, a_t) = \frac{\partial \alpha(a_t | s_t)}{\partial \pi(a_t | s_t)} = K(1-\pi_{\theta} (a_t | s_t))^{K-1}\]

…(7)

现在,我们回顾下该额外乘子:

  • 随着\(\pi_{\theta}(a\mid s) \rightarrow 0, \lambda_K(s,a) \rightarrow K\)。对比起标准的off-policy correction,top-K off-policy correction会通过一个K因子来增加policy update;
  • 随着\(\pi_{\theta}(a \mid s) \rightarrow 1, \lambda_K(s,a) \rightarrow 0\)。该乘子会使policy update归0
  • 随着K的增加,以及\(\pi_{\theta}(a \mid s)\)会达到一个合理的范围, 该乘子会更快地将graident减小于0

总之,当期望的item在softmax policy \(\pi_{\theta}(\cdot \mid s)\)具有一个很小的量,比起标准的correction,top-K correction会更可能推高它的likelihood。一旦softmax policy \(\pi_{\theta}(\cdot \mid s)\)在期望的item上转化成一个合理的量(以确认它可能出现在top-K中),correction接着会将梯度归0, 不再尝试推高它的似然。作为回报,它允许其它感兴趣的items在softmax policy中占据一定的量。我们会在仿真和真实环境中进一步演示,而标准的off-policy correction会收敛到一个当选择单个item时最优的policy,top-K correction会产生更好的top-K推荐。

4.4 Variance Reduction技术

在本节开始,我们会采用一个一阶近似来减小在梯度估计时的方差(Variance)。尽管如此,梯度仍会有较大的方差,因为等式(3)中展示的\(\omega(s,a) = \frac{\pi(a \mid s)}{\beta(a \mid s)}\)具有很大的importance weight,这与top-K off-policy correction相类似。具有较大值的importance weight是因为由(1)中来自behavior policy的new policy \(\pi(\cdot \mid s)\)的导数具有较大值所产生,特别的,new policy会探索那些被behavior policy很少探索过的区域。也就是说,\(\pi(a \mid s) \gg \beta(a \mid s)\)和(2)在\(\beta\)估计中有大的方差

我们测试了在counterfactual learning和RL文献中提出的许多技术来控制在梯度估计时的方差。大多数这些技术会减小方差,但在梯度估计时会引入一些bias。

Weight Capping。

我们测试的第一种方法会简单的将weight设置上限

\[\omega_c(s,a) = min(\frac{\pi(a|s)}{\beta(a|s)}, c)\]

…(8)

c的值越小,会减小在梯度估计时的方差,但会引入更大的bias。

NIS(归一化重要性抽样:Normalized Importance Sampling)

我们使用的第二种技术是引入一个ratio来控制变量,其中我们使用经典的权重归一化,如下:

\[\bar{\omega}(s, a) = \frac{w(s,a)}{\sum\limits_{(s',a') \sim \beta} w(s', a')}\]

由于\(E_{\beta}[w(s,a)] = 1\),归一化常数等于n,batch size在预期之中。随着n的增大,NIS的效果等价于调低learning rate。

TRPO(Trusted Region Policy Optimization). TRPO会阻止new policy \(\pi\)背离behavior policy,它通过增加一个正则项来惩罚这两个policies的KL散度。它会达到与weight capping相似的效果。

5.探索(EXPLORATION)

有一点很明确:训练数据的分布对于学习一个好的policy来说很重要。现有的推荐系统很少采用会询问actions的探索策略(exploration policies),这已经被广泛研究过。实际上,暴力探索(brute-force exploration),比如:\(\epsilon-greedy\),对于像Youtube这样的生产系统来说并不是可行的,这很可能产生不合适的推荐和一个较差的用户体验。例如,Schnabel【35】研究了探索(exploration)的代价。

作为替代,我们使用Boltzmann exploration[12]来获取探索数据(exploratory data)的收益,不会给用户体验带来负面影响。我们会考虑使用一个随机policy,其中推荐会从\(\pi_{\theta}\)中抽样,而非采用最高概率的K个items。由于计算低效性(我们需要计算full softmax),这对于考虑我们的action space来说开销过于高昂。另外,我们会利用高效的ANN-based系统来查询在softmax中的top M个items。我们接着会feed这些M个items的logits到一个更小的softmax中来归一化该概率,接着从该分布中抽样。通过设置\(M \gg K\),我们仍可以检索大多数概率块,限制了生成坏的推荐的风险,并允许计算高效的抽样。实际上,我们会通过返回top \(K'\)个最大概率的items,以及从剩余的\(M-K'\)个items中抽取\(K-K'\)个items,来进一步平衡exploration和exploitation

6.实验结果

我们展示了:在一个工业界规模的推荐系统中,在一系列仿真实验和真实实验中,这些用于解决数据偏差(data biases)的方法的效果。

6.1 仿真

我们设计了仿真实验来阐明:在更多受控环境下off-policy correction的思想。为了简化我们的仿真,我们假设:该问题是无状态的(stateless),换句话说,reward R与user states是相互独立的,action不会改变user states。作为结果,在一个trajectory上的每个action可以被独立选中。

6.1.1 off-policy correction

在第一个仿真中,我们假设存在10个items:\(A=\lbrace a_i, i=1, \cdots, 10 \rbrace\)。每个action的reward等于它的index,也就是说:\(r(a_i)=i\)(可以理解成按reward大小排好序)。当我们选中单个item时,在该setting下最优的policy总是会选中第10个item(因为它的reward最大),也就是说:

\[\pi^* (a_i) = I(i=10)\]

我们使用一个无状态的softmax来对\(\pi_{\theta}\)参数化:

\[\pi(a_i) = \frac{e^{\theta_i}}{\sum_j e^{\theta_j}}\]

如果observations是从behavior policy \(\beta\)中抽样得到的,那么等式(1)中不对数据偏差负责的naively使用policy gradient的方式,会收敛到以下的一个policy:

\[\pi(a_i) = \frac{r(a_i)\beta(a_i)}{\sum_j r(a_j) \beta(a_j)}\]

这具有一个明显的缺点(downside):behavior policy越选择一个次优(sub-optimal)的item,new policy越会朝着选择相同的item偏移

图2: 当behavior policy \(\beta\)倾向于喜欢最小reward的actions时,(比如:\(\beta(a_i)=\frac{11-i}{55}, \forall i = 1, \cdots, 10\)),所学到的policy \(\pi_{\theta}\),(左):没有使用off-policy correction; (右): 使用off-policy correction

这里我附上了我的理解代码(本节的目的,主要是为说明:当存在behavior policy倾向喜欢选择较小reward actions时,不使用off-policy correction效果会差):

1
2
3
4
5
6
7
8
actions = [1,2,3,4,5,6,7,8,9,10]
b = lambda x: (11-x)/55.0
beta = [b(i) for i in actions]
rxb = [(i+1)*j for i, j in enumerate(beta)]
total = sum(rxb)
pi = [i/total for i in rxb]

图2比较了:当behavior policy \(\beta\)倾向于最少回报的items,分别使用/不使用 off-policy correction及SGD所学到的policies \(\pi_{\theta}\)。如图2(左)所示,没有对数据偏差负责naivly使用behavior policy的方式,会导致一个sub-optimal policy。在最坏的case下,如果behavior policy总是选择具有最低回报的action,我们将以一个任意差(poor)的policy结束,并模仿该behavior policy(例如:收敛到选择最少回报的item)。另外一方面,使用off-policy correction则允许我们收敛到最优policy \(\pi^*\),无需关注数据是如何收集的,如图2(右)。

6.1.2 Top-K-policy correction

为了理解标准off-policy correction和top-K off-policy correction间的不同,我们设计了另一个仿真实验,它可以推荐多个items。我们假设有10个items,其中\(r(a_1)=10, r(a_2)=9\),具有更低reward的其余items为:\(r(a_i)=1, \forall i=3,\cdots,10\)。这里,我们关注推荐两个items的问题,即K=2。 behavior policy \(\beta\)会符合一个均匀分布(uniform distribution),例如:以平等的机率选择每个item。

给定从\(\beta\)中抽样到的一个observation \((a_i, r_i)\),标准的off-policy correction具有一个SGD,以如下形式进行更新:

\[\theta_j = \theta_j + \eta \frac{\pi_{\theta}(a_j)}{\beta(a_j)} r(a_i) [ I(j=i) - \pi_{\theta}(a_j)] , \forall j = 1, \cdots, 10\]

其中,\(\eta\)是learning rate。SGD会根据在\(\pi_\theta\)下的expected reward的比例继续增加item \(a_i\)的似然(likelihood),直到\(\pi_{\theta}(a_i)=1\),此时的梯度为0。换句话说,top-K off-policy correction以如下形式进行更新:

\[\theta_j = \theta_j + \eta \lambda_K(a_i) \frac{\pi_\theta(a_j)}{\beta(a_j)} r(a_i) [I(j=i) - \pi_{\theta}(a_j)], \forall j=1, \cdots, 10\]

其中,\(\lambda_K(a_i)\)是在第4.3节定义的乘子。当\(\pi_{\theta}(a_i)\)很小时,\(\lambda_K(a_i) \approx K\),SGD会更强烈地增加item \(a_i\)的似然。由于\(\pi_\theta(a_i)\)会达到一个足够大的值,\(\lambda_K(a_i)\)会趋向于0. 作为结果,SGD不再强制增加该item的likelihood,即使当\(\pi_\theta(a_i)\)仍小于1时。作为回报(in return),这会允许第二好(second-best)的item在所学到的policy上占据一些位置。

图3 学到的policy \(\pi_{\theta}\). (左): 标准的off-policy correction; (右): 对于top-2推荐,使用top-k correction.

图3展示了使用标准(left) off-policy correction和top-k off policy correction)(右)学到的policies \(\pi_{\theta}\)。我们可以看到,使用标准的off-policy correction,尽管学到的policy会校准(calibrated),从某种意义上说,它仍会维持items关于expected reward的顺序,它会收敛到一个policy:它能在top-1 item上将整个mass转换(cast),也就是:\(\pi(a_1) \approx 1.0\)。作为结果,学到的policy会与在次优item(本例中的\(a_2\))和其余items间的差异失去联系。换句话说,该top-K correction会收敛到一个在第二优item上具有较大mass的policy,而维持在items间optimality的次序。作为结果,我们可以推荐给用户两个高回报(high-reward) items,并在整体上聚合更多reward。

6.2 真实环境

具有仿真实验对于理解新方法有价值,任何推荐系统的目标最终都是提升真实用户体验。我们因此在真实系统中运行A/B test实验。

我们在Youtube中所使用的生产环境上的 RNN candidate genreation model上评估这了些方法,相似的描述见[6,11]。该模型是生产环境推荐系统的众多候选生成器(candidate generators)之一,它们会进行打分(scored)然后通过一个独立的ranking模型进行排序(ranked),之后再在Youtube主页或视频观看页的侧边栏上展示给用户视频。如上所述,该模型的训练会采用REINFORCE算法。该立即回报(immediate reward) r被设计来体现不同的用户活动(user activities);被推荐的视频如果没有点击会收到零回报(zero reward)。长期回报(long-term reward)r会在4-10小时的时间范围内进行聚合。在每个实验中,控制模型(control model)和测试模型(test model)会使用相同的reward function。实验会运行许多天,在这期间模型会每隔24小时使用新事件作为训练数据进行持续训练。我们可以查看推荐系统的多种在线指标,我们主要关注用户观看视频时长,被称为:ViewTime。

这里的实验描述了在生产系统中的多个顺序提升。不幸的是,在这样的setting中,最新(latest)的推荐系统会为下一次实验提供训练数据,结果是,一旦生产系统包含了一个新方法,后续的实验就不能与之前的系统相进行比较。因此,后续的每个实验都应该看成是为每个(compoenent)单独分析,我需要在每一部分声明:在从新方法接收数据起,之前的推荐系统是什么。

6.2.1 Exploration

我们开始理解探索数据(exploratory data)在提升模型质量上的价值。特别的,我们会measure是否服务(serving)一个随机策略(stochastic policy),在该policy下我们使用在第5节中描述的softmax模型进行抽样,可以比serving一个确定策略(deterministic policy)(这种模型总是推荐根据softmax使用最高概率的K个items)来产生成好的推荐。

我们开展了一系列实验来理解:serving一个随机策略(stochastic policy) vs. serving一个确定策略(deterministic policy)的影响,并保持训练过程不变。在该实验中,控制流量(control polulation)使用一个deterministic policy进行serving,测试流量(test traffic)的一小部分使用第5节描述的stochastic policy进行serving。两种policies都基于等式(2)相同softmax model进行训练。为了控制在serving时stochastic policy的随机量,我们使用等式(5)的不同时间(temperature) T来区分。T值越低,会将stochastic policy降为一个deterministic policy,而一个更高的T会产生一个random policy,它以相等的机会推荐任意item。T设置为1, 我们可以观察到,在实验期间ViewTime在统计上没有较大变化,这意味着从sampling引入的随机量不会直接伤害用户体验。

然而,该实验的setup不会说明,在训练期间提供探索数据的好处。从日志数据中学习的一个主要偏差之一是,该模型不会观察未被之前推荐policy所选中actions的反馈(feedback),对数据进行探索会缓和该问题。我们展开了以下实验,其中,我们将探索数据引入到训练中。为了这样做,我们将平台上的用户分成三个buckets:90%,5%,5%。前两个buckets使用一个deterministic policy并基于一个deterministic model进行serving,最后一个bucket的用户使用一个基于一个使用exploratory data训练的模型得到的stochastic policy进行serving。deterministic model只使用由前两个分桶的数据进行训练,而stochastic model则使用第一和第三个buckets的数据进行训练。这两个模型会接收相同量的训练数据,结果表明,由于存在exploration,stochastic model更可能观察到一些更罕见state、action pairs的结果。

根据该实验过程,我们观察到在test流量中,在ViewTime上一个很大的增长。尽管提升并不大,它由一个相当小量的探索数据(只有5%的用户体验了该stochastic policy)所带来。我们期待stochastic policy被全量后所能带来的更高增益。

6.2.2 Off-policy Correction

在使用一个stochastic policy之后,我们会在训练期间对合并进的(incorporating)off-policy correction进行测试。这里,我们遵循一个更传统的A/B testing setup【注6】,我们会训练两个模型,它们均会使用所有流量。控制模型(control model)会根据等式(2)进行训练,通过reward对样本进行加权。测试模型(test model)会遵循图1的结构,其中该模型会同时学习一个serving policy \(\pi_\theta\)以及behavior policy \(\beta_{\theta}'\)。serving policy会使用等式(3)描述的off-policy correction进行训练,其中每个样本会同时使用reward以及importance weight \(\frac{\pi_\theta}{\beta_{\theta}'}\)进行加权来解决数据偏差。

【注6】:实际中,我们使用一个相当小比例的用户做为test polulation;作为结果,我们记录的feedback则几乎通过control model获取

在实验期间,我们观察到,学到的policy(test)会开始偏离behavior policy(control)(它被用于获取流量)。图4画出了:根据在控制流量中视频的排序(rank),对应在control/experiment流量中nominator所选中的视频(videos)的CDF(累积分布函数)(rank 1是由控制模型最可能指定的视频,最右表示最小可能指定)。我们看到,test model并不会模仿收集数据所用的模型(如蓝色所示),test model(绿色所示)会更喜欢那些被control model更少曝光的视频。我们观察到:来自top ranks之外视频的nominations的比例,在experiment流量中以几倍的因子递增。这与我们在图2仿真中观察到的现象一致。当忽略在数据收集过程中的偏差时,会创建一个“rich get richer”现象,其中,在学到的policy所指定(nominated)的一个视频,会只因为它在behavior policy上很难指定,采用off-policy correction可以减小该效应。

图4: 根据在control population中视频的排序(rank),在control 和test population中nominated的视频的CDF。标准的off-policy correction会解决”rich get richer”现象

有意思的是,在真实环境中,我们不会观察到control和test 流量(polulation)间在ViewTime上有一个大的改变。然而,我们看到,在视频观看(vv)数上有0.53%的提升,这在统计上是很大的,表明用户确实获得了更大的enjoyment。

6.2.3 top-k off-policy

理解超参数

最后,我们直接比较了超参数的不同选择对top-k off-policy correction的影响,以及在用户体验上的不同。我们会在top-k off-policy correction成为生产模型之后执行这些测试。

actions数目

我们首先探索了在top-K off-policy correction中K的选择。我们训练了三个结构相同的模型,分别使用:\(K \in \lbrace 1,2,16,32 \rbrace\)。控制(生产)模型(control(production) model)是top-K off-policy model,它使用K=16. 我们在图5中绘制了在5天实验中的结果。如第4.3节所示,K=1时,top-K off-policy correction会变成标准的off-policy correction。当K=1时,会失去0.66%的ViewTime(对比baseline K=16)。这进一步证明,该收益是由top-K off-policy correction带来的。设置K=2时,效果比生产模型还差,但gap降到了0.35%。K=32时效果与baseline相当。K=8时,有+0.15%的提升。

Capping

这里,我们在所学推荐器的最终质量上考虑了variance reduction技术。如4.4节所述,weight capping可以在初始实验中带来最大的online收益。我们不会观察到从归一化importance sampling或TRPO中进一步的metric提升。我们使用一个回归测试来学习weight capping的影响。我们比较了一个模型,它使用等式(8)中cap \(c=e^3\),以及\(c=e^5\)进行训练。正如我们在importance weight上提出的限制,学到的policy \(\pi_\theta\)可以潜在overfit到一个更少记录的actions,它们可能接收高的reward。在真实实验中,我们观察到使用importance weight在ViewTime中有0.52的损失。

参考

openai在《Proximal Policy Optimization Algorithms》提出了PPO。我们来看下:

摘要

我们提出了一个在RL中关于policy gradient方法的一个新家族,它可以在以下两者间做交替:通过与enviroment进行交互的方式sampling data,以及使用SGA(随机梯度上升)来最优化一个目标函数。标准的policy gradient方法会在每个data sample上执行一个梯度更新(gradient update),我们提出了一个新的目标函数,它可以允许多个关于minibatch updates的epochs。新的方法,我们称之为proximal policy optimization(PPO),它具有一些TRPO的优点,但更易于实际,更通用,并且具有更好的抽样复杂度(经验上)。我们的实验在许多benchmark任务上测试了PPO,包括仿真机器人运动(simulated robotic locomotion)和Atari游戏,我们展示了PPO的效果要好于其它online policy gradient方法,整体会在样本复杂度、简洁性和Wall-time上达到一个较好的平衡。

1.介绍

2.背景: Policy Optimization

2.1 Policy Gradient方法

Policy Gradient方法通过计算一个关于policy gradient的estimator,并将它插入到一个SGA(随机梯度上升)算法上。最常用的gradient estimator具有以下形式:

\[\hat{g} = \hat{E}_t [ \nabla_{\theta} log \pi_{\theta} (a_t | s_t) \hat{A}_t ]\]

…(1)

其中:

  • \(\pi_{\theta}\)是一个stochastic policy
  • \(\hat{A}\)是一个在timestep t时advatage function的estimator
  • 期望\(\hat{E}_t[\cdots]\)表示在一个会在sampling和optimization间做交替的算法中,一个有限batch的样本上的经验平均(empirical average)。

那些使用自动微分软件(automatic differentiation software)的实现,通过构建一个目标函数:它的梯度是policy gradient estimator,estimator \(\hat{g}\)通过对以下的目标函数进行微分得到:

\[L^{PG}(\theta) = \hat{E}_t [log \pi_{\theta} (a_t | s_t) \hat{A}_t]\]

…(2)

在该loss \(L^{PG}\)上使用相同的trajectory执行多个step的optimization时,这样做并不是空穴来风,经验上它通常会导致具有破坏性的大梯度更新(见6.1节)

2.2 Trust Region方法

在TRPO中,目标函数(”surrogate” objective)会服从在policy update的size上的一个constraint的方式最大化。特别的:

\[\underset{\theta}{maximize} \ \hat{E}_t [\frac{\pi_{\theta}(a_t|s_t)}{\pi_{\theta_{old}}(a_t|s_t)} \hat{A}_t ]\]

服从:

\[\hat{E}_t [KL[\pi_{\theta_{old}}(\cdot | s_t) , \pi_{\theta}(\cdot|s_t)]] \leq \delta\]

…(4)

此处,\(\theta_{old}\)是在更新之前policy参数的向量。在对目标函数做一个线性近似、并且对constraint做一个二次方近似后,该问题可以使用共轭梯度算法(conjugate gradient)有效地被近似求解。

TRPO的理论证明建议我们使用一个正则项(penalty)来替代constraint,比如,对一些系数\(\beta\)求解以下没有constraint的最优化问题:

\[\underset{\theta}{maximize} \ \hat{E}_t [\frac{\pi_{\theta}(a_t|s_t)}{\pi_{\theta_{old}}(a_t | s_t)} \hat{A}_t - \beta KL[\pi_{old}(\cdot|s_t), \pi_{\theta}(\cdot|s_t)]]\]

…(5)

这遵循以下事实:一个固定的surrogate objective(它会计算在states上的最大KL)会形成在policy \(\pi\)一个下界(例如:一个pessimistic bound)。TRPO会使用一个hard constraint,而非一个penalty,因为它很难选择单个\(\beta\)值在多个不同问题(或者甚至在单个问题中,其中特征会随学习过程发生变化)上效果好。因而,为了达到我们关于一阶算法的目标(模仿TRPO的单调提升),实验展示了,它不足以简单选择一个固定的penalty系数\(\beta\),并使用SGD对等式(5)的penalized objective进行最优化;需要额外的修改。

3.对Surrogate Objective进行裁减(Clip)

假设\(r_t(\theta)\)表示概率比值\(r_t(\theta) = \frac{\pi_{\theta}(a_t \mid s_t)}{\pi_{\theta_{old}}(a_t \mid s_t)}\),因而\(r(\theta_{old})=1\)。TRPO会最大化一个”surrogate”目标函数:

\[L^{CPI}(\theta) = \hat{E}_t [\frac{\pi_{\theta}(a_t |s_t)}{\pi_{\theta_{old}}(a_t | s_t)} \hat{A}_t] = \hat{E}[r_t(\theta) \hat{A}_t]\]

…(6)

上标CPI指的是保守策略迭代(conservative policy iteration)[KL02],其中该objective是被提出的。没有constraint后,对\(L^{CPI}\)最大化将会导致一个过大的policy update;因而,我们现在会考虑如何去修改该objective,来惩罚将\(r_t(\theta)\)远离1的那些policy的变更

我们提出的主要的objective如下:

\[L^{CLIP}(\theta) = \hat{E}_t [min(r_t(\theta) \hat{A}_t, clip(r_t(\theta), 1-\epsilon, 1+\epsilon) \hat{A}_t)]\]

…(7)

其中epsilon是一个超参数,比如\(\epsilon=0.2\)。该objective的动机如下。min中的第一项是\(L^{CPI}\)。第二项 \(clip(r_t(\theta), 1-\epsilon, 1+\epsilon) \hat{A}_t\),通过将概率进行clipping来修改surrogate objective,它会移除这样的动机:将\(r_t\)移出区间\([1-\epsilon, 1+\epsilon]\)外。最终,我们采用clipped和unclipped objective的最小值,因此,最终的objective是在unclipped objective上的一个下界(例如:一个pessimistic bound)。有了这个scheme,当对该objective做出提升时,我们只能忽略在概率上的变更,如果包含它会使得objective更糟糕。注意:\(L^{CLIP}(\theta) = L^{CPI}(\theta)\)对应围绕\(\theta_{old}\)(比如:r=1)的一阶,然而,当\(\theta\)远移\(\theta_{old}\)时他们变得不同。图1画出了在\(L^{CLIP}\)上的单个项(比如:单个t);注意,概率 r是在\(1-\epsilon\)或者\(1+\epsilon\)上做裁减取决于advantage是正或负。

图1: 画出了surrogate function \(L^{CLIP}\)的某一项(比如:单个timestep),作为概率比值r的一个函数,对于正的advantages(左)和负的advantages(右)。每个polit上的红色部分展示了optimization的起点(比如:r=1)。注意:\(L^{CLIP}\)会对所有这些项进行求和

图2: surrogate objectives,因为我们会在初始policy参数\(\theta_{old}\)间插入,updated policy参数,我们会在PPO的一次迭代后计算。updated policy具有与intial policy相差0.02的KL divergence,这一点上\(L^{CLIP}\)是最大的。。。

图2提供了另一个关于surrogate objective \(L^{CLIP}\)的来源。它展示了一些objectives是如何随着我们沿policy update的方向(通过PPO在一个continuous control问题上)变化的。我们可以看到,\(L^{CLIP}\)是在\(L^{CPI}\)上的一个下界,它带有一个penalty,会对过大的policy update进行惩罚

4.Adaptive KL Penalty系数

另一种方法可以被做为是clipped surrogate objective的一个替代选择,这种方法为:在KL divergence上使用一个penalty,并对该penalty系数自适应(adapt)以便在每次policy update时能完成达到KL divergence \(d_{tagr}\)的一些target value。在我们的实验中,我们发现,KL penalty比clipped surrogate objective的效果要差,然而,我们在这里仍会包含它,因为它是一个很重要的baseline

在该算法是最简单实现中,我们会在每次policy update时执行以下steps:

  • 1.使用一些minibatch SGD的epochs,来优化KL-penalized objective:\(L^{KLPEN}(\theta) = \hat{E}_t [\frac{\pi_{\theta}(a_t \mid s_t)}{\pi_{\theta_{old}}(a_t \mid s_t)} \hat{A}_t - \beta KL [\pi_{\theta_{old}} (\cdot \mid s_t), \pi_{\theta}(\cdot \mid s_t)] ]\)
  • 计算 \(d = \hat{E}_t[KL[\pi_{\theta}(\cdot \mid s_t), \pi_{\theta}(\cdot \mid s_t)]]\)
    • if \(d < d_{targ} / 1.5, \beta \leftarrow \beta / 2\)
    • if \(d > d_{targ} \times 1.5, \beta \leftarrow \beta \times 2\)

更新后的\(\beta\)被用于下一次policy update。有了该scheme,我们会偶尔看到那些KL divergence与\(d_{targ}\)存在很大差异的policy updates,然而,这很少见,因为\(\beta\)会很快进行调整。上述关于参数1.5和2的选择是启发式的,但算法对它们非常不敏感。\(\beta\)的初始值是另一个超参数,但实际上不是很重要,因为该算法会很快对它进行调整。

5.算法

前一节的surrogate losses可以被计算,并使用一个关于典型的policy gradient实现上一个很小变更的版本进行微分。对于使用自动微分的实现,一个简单的构建loss \(L^{CLIP}\)或\(L^{KLPEN}\)来替代\(L^{PG}\),会在该objective上执行多个SGA steps。

大多数用于计算variance-reduced advantage-function的estimators会使用一个学到的state-value function\(V(s)\);例如,generalized advantage estimation[Sch+15a],或者finite-horizon estimators[Mni+16]。如果要使用一个在policy function和value function间共享参数的神经网络架构,我们必须使用这样一个loss function:它可以结合policy surrogate和一个value function error项。该objective可以进一步通过添加一个entropy bonus进行扩展来确保足够的探索(exploration),正如[Wil92, Mni+16]所建议的。通过组合这些项,我们可以获取以下的objective,它可以近似最大化每个迭代:

\[L_t^{CLIP+VF+S}(\theta) = \hat{E}_t [L_t^{CLIP}(\theta) - c_1 L_t^{VF}(\theta) + c_2 S[\pi_{\theta}](s_t)]\]

….(9)

其中:

  • \(c_1, c_2\)是系数
  • S表示一个entropy bonus
  • \(L_t^{VF}\)是一个squared-error loss:\((V_{\theta}(s_t) - V_t^{targ})^2\)

在[Mni+16]中普及的一种policy gradient实现,很适合使用RNN,可以为T timesteps运行policy(其中:T要比episode length要小很多),并使用收集到的样本进行一个upate。该种实现需要一个advantage estimator(它不会看到超过timestep T后的)。[Mni+16]中所使用的该estimator为:

\[\hat{A}_t = -V(s_t) + r_t + \gamma r_{t+1} + \cdots + \gamma^{T-t+1} r_{T-1} + \gamma^{T-t} V(s_T)\]

…(10)

其中:t指的是time index \([0, T]\),在一个长度为T的trajectory segment内。

我们可以使用一个truncated版本的generalized advantage estimation对该方式进行泛化,当\(\gamma=1\)时即可以化简为等式(10):

\[\hat{A}_t = \delta_t + (\gamma \lambda) \delta_{t+1} + \cdots + \cdots + (\gamma \lambda)^{T-t+1} \delta_{T-1}, \\ where \ \ \delta_t = r_t + \gamma V(s_{t+1}) - V(s_t)\]

….(11)(12)

使用固定长度的trajectory segments的一个PPO算法,如下所示。每个迭代中,(并行的)N个actors中的每个都会收集T timesteps的数据。接着,我们会在这些NT timesteps的数据上构建surrogate loss,并在K个epochs上使用minibatch SGD(或者,Adam)来进行optimize。

算法1

6.实验

参考

deepmind在《Emergence of Locomotion Behaviours in Rich Environments》提出了PPO。我们来看下:

1.介绍

2.使用Distributed PPO进行大规模增强学习

我们在增强学习上关注的点是,在丰富的仿真环境上使用连续state和action spaces。我们的算法在多个任务变种上是健壮的,可以有效扩展到其它领域。我们将轮流介绍每个issues。

使用PPO的Robust policy gradients

深度学习算法基于大规模、高吞吐的optimization方法,在离散和低维action spaces中(比如:Atari games和三维导航(3D navigation))可以产生state-of-the-art的结果。作为对比,许多之前的工作都是基于连续动作空间的,关注一些可对比的小问题。大规模、分布式的optimization较少广泛使用,相应的算法也很少被开发。我们发布了一个robust policy gradient算法,很适合高维连续控制的问题,可以使用分布式计算扩展到许多更大的领域上。

Policy gradient算法为连续控制(continuous control)提供了一个吸引人的范式。他们通过根据stochastic policy \(\pi_{\theta}(a \mid s)\)的参数\(\theta\)直接最大化rewards的期望和:

\[J(\theta) = E_{\rho_{\theta}(\tau)} [\sum_t \gamma^{t-1} r(s_t, a_t)]\]

该期望会对应于由policy \(\pi_{\theta}\)和系统动态性(dynamics) \(p(s_{t+1} \mid s_t, a_t)\)两者所联合生成的trajectories\(\tau=(s_0,a_0,s_1,\cdots)\)的分布:

\[\rho_{\theta}(\tau) = p(s_0) \pi(a_0 | s_0) p(s_1 | s_0, a_0) ...\]

\(\theta\)对应的目标函数的梯度是:

\[\nabla_{\theta} J = E_{\theta} [\sum_t \nabla_{\theta} log \pi_{\theta}(a_t | s_t)(R_t - b_t)]\]

其中:

  • \[R_t = \sum_{t'=t} \gamma^{t'-t} r(s_{t'}, a_{t'})\]
  • \(b_t\)是一个baseline(它不依赖于\(a_t\)或者future states和actions)。该baseline通常会选择\(b_t = V^{\theta} (s_t) = E_{\theta} [R_t \mid s_t]\)。

实际上,期望的future return通常近似于使用一个sample rollout,\(V^{\theta}\)通过一个学到的近似\(V_{\phi}(s)\)和参数\(\phi\)来替代。

Policy gradient的estimates可以有很高的variance,算法对于超参数的设置很敏感。有许多方法可以使得policy gradient算法更健壮。一种有效的measure是:采用一个trust region constraint,可以限制policy update的任意更新量(amount)。采用该思想的一种流行算法是:TRPO(trust region policy optimization)。在每个迭代中,给定当前参数\(\theta_{old}\),TRPO会收集一个(相对较大)的batch数据,并优化surrogate loss:

\[J_{TRPO}(\theta) = [ \sum_t \gamma^{t-1} \frac{\pi_{\theta}(a_t | s_t)}{\pi_{\theta_{old}}(a_t | s_t)} A^{\theta_{old}}(a_t, s_t)]\]

它会服从一个constraint:policy被允许更改多少,以KL divergence的方式表示:

\[KL[\pi_{\theta_{old}} | \pi_{\theta}] < \delta\]

\(A^{\theta}\)是advantage function,可以通过\(A^{\theta}(s_t, a_t) = E_{\theta}[R_t \mid s_t, a_t] - V^{\theta}(s_t)\)得到。

PPO算法可以被看成是一个依赖于一阶梯度的TRPO的近似版本,它可以更方便地使用RNNs,并可以用在一个大规模分布式setting中。trust region constraint通过一个正则项来实现。使用的正则项系数依赖于该是否先前违反了constraint。算法1展示了PPO算法的伪代码。

算法1 PPO

在算法1中,超参数\(KL_{target}\)是在每个iteration上policy的期望变更。如果在policy上的实际变更很低、或者大大超过target KL,归一化项\(\alpha > 1\)可以控制着KL-正则参数的调整(例如:落在区间\([\beta_{low} KL_{target}, \beta_{high} KL_{target}]\)之外)。

分布式PPO(DPPO)进行可扩展增强学习

为了在丰富的、仿真环境上达到较好性能,我们实现了一个分布式版本的PPO算法(DPPO),数据的收集和梯度计算在workers间是分布式的。我们使用同步更新和异步更新进行实验,发现平均梯度和将以同步方式使用会导致更好的结果。

原始的PPO算法会使用完整的rewords求和来估计advantages。为了使用RNN及batch updates,同时支持可变长的episodes,我们会遵循与[2]相似的策略(strategy),并使用一个长度为K的空间的截断BPTT(truncated backpropagation through time)。这使得它很自然地(虽然不是必须)使用K-step returns来估计advantage,例如:我们会在相同的K-step windows对rewards求和,并在K-steps后对value function进行bootstrap:\(\hat{A}_t = \sum_{i=1}^{K} \gamma^{i-1} r_{t+i} + \gamma^{K-1} V_{\phi}(s_{t+k} - V_{\phi}(s_t)\)

John Schulman[20]的公开提供的PPO实现对于核心算法增加了一些修改。它们包含了对inputs、rewards、以及在loss中的一个额外项(它会惩罚对于较大违反trust region constraint的情况)的normalization。我们采用在分布式setting中相似的augmentations,但发现在跨多个workers间对多个统计进行sharing和synchronization需要一些注意。我们的分布式实现(DPPO)采用tensorflow,参数在一个parameter server中,workers会在每个gradient step后同步它们的参数。伪码和详情在附件中提供。

A.DPPO

A.1 算法详情

DPPO算法的伪码在算法2和算法3中提供。W是workers的数目;D会为workers的数目设置一个阀值,它们的gradients必须被提供来更新参数。M,B是在给定一个batch的datapoints,使用policy和baseline updates的sub-iterations的数目。T是在参数更新被计算之前每个worker收集的data points的数目。K是用于计算K-step returns和truncated BPTT的time steps的数目。

算法2:

算法3:

normalization

根据[20]我们会执行以下的normalization steps:

  • 1.我们会通过减mean并除以标准差,将observations(或者 states \(s_t\))进行归一化。。。
  • 2.我们会通过一个正在运行的关于标准差的estimate对reward进行缩放(scale),在整个实验过程中进行聚合
  • 3.我们会使用关于advantages的per-batch normalization

跨workers共享算法参数

在分布式setting中,我们发现,对于跨workers的data normalization来说共享相关统计很重要。Normalization在数据收集(collection)期间使用,统计会在每个environment step之后被本地更新。当一次迭代完成时,统计的本地变改(local changes)在数据收集(collection)后被应用到全局统计中。随时间变化(time-varying)的正则化参数\(\lambda\)也会跨workers共享,但更新会基于本地统计(它基于对每个worker在本地计算的平均KL)来决定,通过使用一个调整参数\(\hat{\alpha} = 1+(\alpha-1)/K\)由每个worker单独使用。

额外的trust region constraint

当KL超过期望变更的一个特定margin时(),我们也会采用一个额外的罚项。在我们的分布式实现中,该criterion会在一个per-worker basis上进行测试和应用。

参考

阿里在paper《Deep Session Interest Network for Click-Through Rate Prediction》中提出了基于session的ctr预测模型,我们可以借鉴一下:

0.

大多数已经存在的研究会忽略序列内在的结构:序列由sessions组成,其中sessions是发生时间内独立的用户行为。我们可以观察到:在每个session中的用户行为是同度同质的,不同sessions间差异很大。基于此观察,提出了新的CTR模型:DSIN,它可以利用在行为序列中的用户多个历史sessions。我们首先使用self-attention机制以及bias encoding来抽取每个sessions的用户兴趣。接着,我们应用Bi-LSTM来建模:用户兴趣是如何在sessions间演化和交互的。最后,我们使用local activation unit来自适应学习多个session interests对target item的影响。实验表明:DSIN效果要好于state-of-the-art模型。

1.介绍

如图1所示,从真实工业界应用中抽样得到的一个用户,我们将它的行为序列分为3个sessions。sessions按如下原则进行划分:时间间隔超过30分钟[Grbovic and Cheng, 2018]。该用户在session 1内主要浏览长裤(trousers),在session 2中浏览戒指(finger rings),在sessions 3内浏览大衣(coats)。图1的现像很普遍。它表明:一个用户通常在一个session内有一个明确唯一的意图,而该用户开启另一个session时会发生剧烈变化

图1 真实应用中的一个关于sessions的demo。图片下的数字表示当前item上点击时间与首个item点击时间之间的时间间隔,以秒计。原则上,Sessions以超过30分钟进行划分.

受上述观察的启发,我们提出了DSIN(Deep Session Interest Network)来在CTR预测任务上,通过利用多个历史sessions来建模用户序列行为。DSIN有三个关键部分。

  • 首先,将用户序列行为划分成sessions
  • 接着,使用self-attention network以及bias encoding来建模每个session。Self-attention可以捕获session行为(s)的内在交互/相关,接着抽取每个session的用户兴趣(s)。这些不同的session interests可能相互间相关,接着遵循一个序列模式。
  • 最后,我们使用Bi-LSTM来捕获交互、以及用户多个历史session interests的演进。由于不同session interests对于target item具有不同的影响,最终我们设计了local activation unit根据target item来聚合他们,形成该行为序列的最终表示。

主要贡献:

  • 我们强调用户行为在每个session中高度同质,不同sessions差异很大。
  • 设计了一个self-attention network以及bias encoding来获得每个session的精准兴趣表示。接着我们使用Bi-LSTM来捕获历史sessions间的顺序关系(sequential relationship)。最后,考虑到不同session interest在target item上的影响,我们使用local activation unit来聚合。
  • 两组比较实验。表明DSIN效果更好。

2.相关工作

2.1 CTR

2.2 Session-based推荐

session的概率常被序列化推荐提及,但很少出现在CTR预测任务中。Session-based推荐受益于用户兴趣在sessions上动态演化的启发。GFF使用关于items的sum pooling来表示一个session。每个item具有两种表示,一个表示自身,另一个表示session的上下文(context)。最近,RNN-based方法被应用于session-based推荐中来捕获在一个session中的顺序关系。基于此,Li 2017提出了一个新的NARM(attentive neural networks framework)来建模用户的序列化行为,并能捕获用户在当前session中的主要目的。Quadrana 2017提出的Hierarchical RNN依赖于RNNs的latent hidden states跨用户历史sessions的演化。另外,Liu 2018 的RNNs使用self-attention based模型来有效捕获一个session的long-term和short-term兴趣。Tang 2018使用CNN、Chen 2018使用user memory network来增强序列模型的表现力。

3.DSIN

3.1 BaseModel

本节主要介绍BaseModel所使用的:

  • feature representation,
  • embedding,
  • MLP以及loss function。

特征表示

CTR预测任务中统计了大量信息特征。总共使用了三大组:User profile、item profile、User Behavior。每组包含了一些稀疏特征:

  • User Profile包含了gender、city等;
  • Item Profile包含了:seller id、brand id等;
  • User Behavior包含了用户最近点击的item ids等

注意,item的side information可以进行拼接来表示自身。

Embedding

MLP

Loss Function

3.2 模型总览

在推荐系统中,用户行为序列包含了多个历史sessions。用户在不同sessions上兴趣不同。另外,用户的session interests相互间有顺序关联。DSIN提出了在每个session上抽取用户的session interest,并捕获session interests间的顺序关系。

图2 DSIN模型总览。在MLP layers前,DSIN主要由两部分组成。一部分是sparse features,另一部分处理用户行为序列。自顶向上,用户行为序列S首先被划分成sessions Q,它接着会加上bias encoding,并使用self-attention来抽取session interests I。有了Bi-LSTM,我们将session interests I和上下文信息进行混合作为hidden states H。session interests I和hidden states H的Vectors受target item的激活,User profile和item profile的embedding vectors被拼接在一起,进行flatten并被feed到MLP layers中进行最终预测

如图2所示,DSIN在MLP前包含了两部分。一部分是从User Profile和Item Profile转向后的embedding vectors。另一部分是对User Behavior进行建模,自顶向上具有4个layers:

  • 1) session division layer,会将用户行为序列划分为sessions
  • 2) session interest extractor layer:会抽取用户的session interests
  • 3) session interest interacting layer:会捕获session interests间的顺序关系
  • 4) session interest activating layer:会对与target item有关的session interests使用local activation unit

最后,session interest activating layer的最终输出、以及User Profile和Item Profile的embedding vectors被feed给MLP做最终预测。以下述章节中,我们会引入这4个layers。

1.Session Division Layer

为了抽取更精准的用户的session interests,我们将用户行为序列S划分成sessions Q,其中第k个session为:

\[Q_k = [b_1; \cdots; b_i; \cdots; b_T] \in R^{T \times d_{model}}\]

其中:

  • T是我们在该session中的行为数
  • \(b_i\)是在该session中的用户第i个行为

相邻行为间存在的user sessions的划分,会遵循该原则:时间间隔超过30分钟

2.Session Interest Extractor Layer

在相同session中的行为,相互之间强相关。另外,用户在session中的偶然行为会使得该session interest偏离它的原始表示(original expression)。为了捕获在相同session中的行为间的内在关系,并减少这些不相关行为的效果,我们在每个session中使用multi-head self-attention机制。我们也对self-attention机制做了一些改进来更好地达到我们的目的。

2-1 Bias Encoding

为了利用sequence的顺序关系,self-attention机制会应用positional encoding到input embeddings中。另外,sessions的顺序关系,以及在不同表示子空间中存在的bias需要被捕获。因而,我们在position encoding的基础上提出了bias encoding(BE):

\[BE \in R^{K \times T \times d_{model}}\]

其中BE中的每个元素被如下定义:

\[BE_{(k,t,c)} = w_k^K + w_t^T + w_c^C\]

…(2)

其中:

  • \(w^K \in R^K\):是session的bias vector
  • k:是sessions的索引
  • \(w^T \in R^T\):是在session中position的bias vector
  • t:是在sessions中行为的索引
  • \(w^C \in R^{d_{model}}\):是在behavior embedding中unit position的bias vector
  • c:是在behavior embedding中unit的index

在加上bias encoding后,用户的behavior sessions Q按如下方式更新:

\[Q = Q + BE\]

…(3)

2-2 Multi-head Self-attention

在推荐系统中,用户的点击行为受许多因素(颜色、风格、价格等)的影响。Multi-head self-attention可以捕获不同表示子空间的表示。数学上,假设:

\[Q_k = [Q_{k1}; \cdots; Q_{kh}; \cdots; Q_{kH}]\]

其中:

  • \(Q_{kh} \in R^{T \times d_h}\):是\(Q_k\)的第h个head
  • H是heads的数目
  • \[d_h = \frac{1}{h} d_{model}\]

\(head_h\)的输出如下计算:

\[head_h = Attention(Q_{kh} W^Q, Q_{kh} W^K, Q_{kh} W^V) \\ =softmax(\frac{Q_{kh} W^Q W^{K^T} Q_{kh}^T}{\sqrt{d_{model}}}) Q_{kh} W^V\]

…(4)

其中,\(W^Q, W^K, W^Q\)是线性矩阵。

接着不同heads的vectors被拼接到一起被feed到一个feed-forward network中:

\[I_k^Q = FFN(Concat(head_1, \cdots, head_H) W^O)\]

…(5)

其中,\(FFN(\cdot)\)是feed-forward network,\(W^O\)是线性矩阵。我们也在相继使用了residual connections和layer normalization。用户的第k个session的兴趣\(I_k\)按如下方式计算:

\[I_k = Avg(I_k^Q)\]

…(6)

其中,\(Avg(\cdot)\)是average pooling。注意,在不同sessions间self-attention机制中的weights是共享的。

3.Session Interest Interacting Layer

用户的session interests会持有带上下文的顺序关系。建模动态变化会增强session interests的表示。Bi-LSTM在捕获顺序关系是很优秀的(此处有疑问?? self-attention也能捕获顺序关系,感觉有些多此一举),很天然地可应用于在DSIN中建模session interest的交互。LSTM cell的实现如下:

\[i_t = \sigma(W_{xi} I_t + W_{hi} h_{t-1} + W_{ci} c_{t-1} + b_i) \\ f_t = \sigma(W_{xf} I_t + W_{hf} h_{t-1} + W_{cf} c_{t-1} + b_f) \\ c_t = f_t c_{t-1} + i_t tanh(W_{xc}I_t + W_{hc} h_{t-1} + b_c) \\ o_t = \sigma(W_{xo} I_t + W_{ho} h_{t-1} + W_{co}c_t + b_o) \\ h_t = o_t tanh(c_h)\]

…(7)

其中,\(\sigma(\cdot)\)是logistic function,其中: i,f,o,c分别是:input gate、forget gate、output gate、cell vector,它们具有与\(I_t\)相同的size。权重矩阵的shapes可以通过下标来表示。Bi-direction意味着存在forward和backward RNNs,hidden states H按如下方式计算:

\[H_t = \overrightarrow {h_{ft}} \oplus \overleftarrow {h_{bt}}\]

…(8)

其中,\(\overrightarrow {h_{ft}}\)是forward LSTM的hidden state,\(\overleftarrow {h_{bt}}\)是backward LSTM的hidden state。

4.Session Interest Activating Layer

与target item更相关的用户的session interests,对于用户是否点击该target item的影响更大。用户的session interests的weights需要根据target item进行重新分配。Attention机制(再做一次attention)会使用在source和target间的soft alignment,被证明是一个很有效的weight allocation机制。与target item相关的session interests的自适应表示可以如下计算得到:

\[a_k^I = \frac{exp(I_k W^I X^I)}{\sum\limits_k^K exp(I_k W^I X^I)} \\ U^I = \sum\limits_k^K a_k^I I_k\]

…(9)

其中\(W_I\)具有相应的shape。相似的,session interests的自适应表示会混杂着与target item相关的上下文信息,如下计算:

\[a_k^H = \frac{exp(H_k W^H X^I)}{\sum\limits_k^K exp(H_k W^H X^I)} \\ U^H = \sum\limits_k^K a_k^H H_k\]

…(10)

其中\(W_H\)具有相应的shape。User Profile和Item Profile的Embedding vectors,\(U^I\)和\(U^H\)会被拼接到一起,flatten,然后feed给MLP layer。

4.实验

略.

参考

#

tmall在《Multi-Interest Network with Dynamic Routing for Recommendation at Tmall》开放了它们的召回算法。在matching stage上,提出了Multi-Interest Network with Dynamic routing (MIND)来处理用户的多样化兴趣。特别的,还基于capsule routing机制设计了一个multi-interest extractor layer,用于聚类历史行为和抽取多样化兴趣。另外,我们还开发了一种称为”label-aware attention”的技术来帮助学习具有多个向量的用户表示 。目前的效果要好于state-of-the-art的其它推荐方法。并在天猫APP的移动端主页上部署,会处理主要的在线流量。

1.介绍

tmall APP的主页如图1(左)所示,它占据着tmall APP的半数流量,并会部署RS来展示个性化的商品来满足客户个性化需求。

图1

由于数十亿规模的users和items,tmall的推荐过程设计包括两部分:matching stage和ranking stage。对于这两阶段,建模用户兴趣和发现可以捕获用户兴趣的用户表示(user representation)非常重要,以便能支持对items的高效检索来满足用户兴趣。然而,由于用户的多样化兴趣的存在,在tmall上建模用户兴趣是很有意义的(non-trivial)。平均上,数十亿用户访问tmall,每个用户每天会与成百上千个商品交互。交互的商品趋向于属于不同类目,可以表示用户兴趣的多样性。例如,如图1(右)所示,不同用户根据它们的兴趣来说是不同的,相同的用户也可能对不同类型的items感兴趣。因此,捕获用户的多样化兴趣的能力变得十分重要。

已经存在的推荐算法会以不同方式建模和表示用户兴趣。CF-based方法可以通过历史交互items[22]或隐因子[17]来表示用户兴趣,可以承受稀疏性问题或计算需要。deep learning-based方法通常以低维embedding vectors来表示用户兴趣。例如,youtube DNN[7]从用户过往行为中转换得到固定长度的vector,它对于建模多样化兴趣可能是个瓶颈,因为在tmall上,它的维度必须很大,以便能表示海量的interest profiles。DIN[31]使用attention机制,使得单个用户对于不同的items会有不同用户表示,这样可以捕获多样化的用户兴趣。然而,采用attention机制也使得它对于海量items的大规模应用来说是在计算上是不可行的,因为它需要为每个item重新计算用户表示(user representation),这使得DIN只适用于ranking stage。

在本paper中,我们主要关注在matching stage上为用户建模多样化兴趣的问题。为了克服已存在方法的限制,我们提出了MIND来学习用户表示,它可以在matching stage上影响用户的多样化兴趣。为了infer用户表示向量,我们设计了一个新的layer,它称为“multi-interest extract layer”,该layer会利用“dynamic routing”[21]机制来自适应地将用户历史行为聚合成用户表示(user repesentation)。dynamic routing的过程被看成是软聚类(soft-clustering),它会将用户的历史行为聚合成许多聚类(clusters)。每个历史行为的cluster会进一步根据一个特定兴趣,被用于infer用户表示的向量。这种方式下,对于一个特定用户,MIND会输出多个表示向量,它们表示共同表示用户的多样化的兴趣。用户表示向量只会被计算一次,并被用于matching stage来从海量items中检索相关items。该方法的主要贡献有:

  • 1.为了捕获用户行为的多样化兴趣,我们设计了multi-interest extractor layer,它可以利用dyniamic routing来自适应地将用户历史行为聚合成用户表示向量。
  • 2.通过使用由multi-interest extractor layer和一个新提出的label-aware attention layer生成的用户表示向量(vectors),我们构建一个DNN来做个性化推荐。对比已存在的方法,MIND在多个公开数据集上和天猫上的效果要好一些。
  • 3.为了在tmall上部署MIND,我们构建了一个系统来实现整个pipline,包括:data collecting、model training和online serving。部署的系统可以极大提升Tmall APP的ctr。

2.相关工作

深度学习推荐。受CV和 NLP的deep learning的成功启发,我们尝试了许多deep learning-based的推荐算法。除了[7,31],还有许多其它deep模型。NCF[11]、DeepFM[9]、DMF[27]会构建由许多MLP组成的神经网络来建模users和items间的交互。[23]提供一种可捕获许多特征的united and flexible network来解决top-N序列推荐。

User Representation。在推荐系统中,将users表示为vectors很常见。传统的方法会将用户偏好组合成由感兴趣的items[4,12,22]、keywords[5,8]和topics[29]的vectors。随着分布式表示学习的出现,user embeddings可以通过NN获得。[6]使用RNN-GRU来从时序阅读文档中学习user embeddings。[30]从word embedding vectors中学习user embedding vectors,并将它们应用于推荐学术微博上。[2]提出了一种新的CNN-based模型来显式学习和利用user embeddings。

Capsule Network。“胶囊(Capsule)”的概念,对一小部分neurons组合输出一整个vector,首次由2011年Hinton[13]提出。用于替代BP,dynamic routing[21]被用于学习capsules间连接的权重,通过利用EM算法[14]来克服多种缺陷并达到较好的accuracy。它与CNN有两个主要不同之处,使得capsule networks可以编码在part和whole间的关系,这在CV和NLP中是很先进的。SegCaps[18]证明,capsules可以成功建模目标的局部关系(spatial),比传统CNNs要好。[28]研究了文本分类的capsule网络,并提出了3种策略来增强效果。

3.方法

3.1 问题公式化

工业界RS的matching stage的目标,从海量item池子I中,为每个用户\(u \in U\)检索一个items子集,使得该子集包含数千个items,每个item与用户兴趣相关。为了达到该目标,由RS生成的历史数据收集来构建一个matching模型。特别的,每个实例可以通过一个tuple \((I_u, P_u, F_i)\)进行表示,其中:

  • \(I_u\)表示与用户u交互的items集合(也称为:用户行为(user behavior))
  • \(P_u\)是用户u的基础profiles(比如:gender和age)
  • \(F_i\)是target item的特征(比如:item id和category id)

MIND的核心任务是,学习一个函数,来将原始特征(raw features)映射到用户表示上,它可以公式化为:

\[V_u = f_{user}(I_u, P_u)\]

…(1)

其中,\(V_u = (\vec{v}_u^1, \cdots, \vec{v}_u^K) \in R^{d \times K}\)表示用户u的表示向量,d是维度,K是表示向量的数目。当K=1时,只使用一个表示向量,如同Youtube DNN一样。另外,target item i的表示向量通过一个embedding function获取:

\[\vec{e}_i = f_{item}(F_i)\]

…(2)

其中,\(\vec{e}_i \in R^{d \times 1}\)表示item i的表示向量,\(f_{item}\)的细节会在”Embedding &Pooling Layer”这节详述。

当学习到用户表示向量和item表示向量,top N候选items会根据打分函数进行检索:

\[f_{score}(V_u, \vec{e}_i) = \underset{1 \leq k \leq K}{max} \vec{e}_i^T \vec{e}_u^k\]

…(3)

其中,N是在matching stage中检索出的items的预定义数目。

3.2 Embedding & Pooling Layer

图2 MIND总览。MIND会使用用户行为、用户profile特征作为输入,输出用户表示向量(vectors)以便在matching stage时做item检索。input layer的ID特征通过embedding layer被转换成embeddings,每个item的embeddings(item_id, cat_id, brand_id都会有embedding)会进一步通过一个pooling layer进行平均。用户行为embeddings被feed给multi-interest extractor layer,它会生成interest capsules。通过将interest capsules与user profile embedding进行拼接,并通过一些ReLU layers将concatenated capsules进行转换,可以获得用户表示向量(vectors)。在训练期间,一个额外的label-aware attention layer被引入到指导训练过程。在serving时,多个用户表示向量通过一个ANN查询方式被用于检索items。

如图2所示,MIND的输入包含了三个groups:user profile \(P_u\),user behavior \(I_u\),label item \(F_i\)。每个group包含了许多类别型特征(categorical id features),这些id features具有极高的维度。例如,item ids的数目是数十亿的,因而,我们会采用广泛使用的embedding技术来将这些id features嵌入到低维dense vectors(a.k.a embeddings)中,这会极大减小参数数目,并减缓学习过程。对于来自\(P_u\)的id features(gender、age等),相应的embeddings会进行拼接(concatenated)来形成user profile embedding \(\vec{p}_u\)。对于item ids、以及其它类别型ids(brand id, shop id等),对于来自\(F_1\)的冷启动items[25],它已经被证明是有用的[25],相应的embeddings会进一步通过一个average pooling layer来形成label item embedding \(\vec{e}_i\)。最后,对于来自user behavior \(I_u\)的items,相应的item embeddings被组合来形成user behavior embedding \(E_u = \lbrace \vec{e}_j, j \in I_u \rbrace\)。

3.3 Multi-Interest Extractor Layer

我们认为,通过一个表示向量来表示用户兴趣,这对于捕获用户多样化兴趣是个瓶颈,因为我们必须将与用户的多样化兴趣相关的所有信息压缩到一个表示向量中。因而,关于用户的多样化兴趣的所有信息,是混合在一起的,对于matching stage来说这会造成错误的item检索。作为替代,我们采用多个表示向量来单独表示用户的不同兴趣。通过该方法,用户的多样化兴趣在matching stage中会被单独对待,对于每个方面的兴趣,使得item检索更精准。

为了学习多种表示向量,我们会使用聚类过程来将用户的历史行为group成一些clusters。在一个cluster中的items被认为是相互更接近的,可以表示用户兴趣的某个特定方面。这里,我们会设计multi-interest extractor layer来对历史行为进行聚类和并对生成的聚类进行inferring表示向量。由于multi-interest extractor layer的设计受最近提出的dynamic routing[13,14,21]的启发,我们首先回顾必要的基础,以便使该paper可以自圆其说。

3.3.1 Dynamic Routing

我们简短介绍capsules表征学习的dynamic routing[21],这是表示向量的一种新的neural units形式。假设我们有两层capsules,我们将第一层看成是low-level capsules,将第二层的capsules看成是high-level capsules。dynamic routing的目标是,给定low-level capsules,以迭代方式计算high-level capsules的值。在每轮迭代中,给定的low-level capsules \(i \in \lbrace 1, \cdots, m \rbrace\),它相应的向量为:

\[\vec{c}_i^l \in R^{N_l \times 1}, i \in \lbrace 1,\cdots,m \rbrace\]

high-level capsules \(j \in \lbrace 1, \cdots, n \rbrace\),它相应的向量为:

\[\vec{c}_j^h \in R^{N_h \times 1}, j \in \lbrace 1, ..., n \rbrace\]

在low-level capsule i和high level capsule j之间的routing logit \(b_{ij}\),可以通过以下公式计算(注:hinton paper中的\(\hat{u}_{j \mid i}\)在此处被展开,\(S_{ij}\)即hinton paper中的\(W_{ij}\)):

\[b_{ij} = (\vec{c}_j^h)^T S_{ij} \vec{c}_i^l\]

…(4)

其中,\(S_{ij} \in R^{N_h \times N_l}\)表示要学习的bilinear mapping matrix。T表示transpose。

有了routing logits,对于high-level capsule j的候选向量(candidate vector),可以(注:\(w_{ij}\)即hinton paper中的\(c_{ij}\)耦合系数):

\[\vec{z}_j^h = \sum\limits_{i=1}^m w_{ij} S_{ij} \vec{c}_i^l\]

…(5)

其中,\(w_{ij}\)表示连接low-level capsule i和high-level capsule j的权重,可以通过在routing logits上执行softmax计算得到:

\[w_{ij} = \frac{exp (b_{ij})}{ \sum\limits_{k=1}^m exp (b_{ik})}\]

…(6)

最后,使用一个非线性”squash”函数来获得high-level capsules的vectors:

\[\vec{c}_j^h = squash(\vec{z}_j^h) = \frac{\| \vec{z}_j^h \|^2}{ 1 + \| \vec{z}_j^h \|^2} \frac{\vec{z}_j^h}{ \| \vec{z}_j^h \|}\]

…(7)

\(b_{ij}\)的值被初始化为0, routing process通常会重复三次以便收敛。当routing完成时,high-level capsule的值\(\vec{c}_j^h\)是确定的,可以被当作是next layers的inputs。

3.3.2 B2I Dynamic Routing

简单来说,capsule是一种新型neuron,它由一个vector表示,而非在普通神经网络中使用的一个标量(scalar)。vector-based capsule被认为是能够表示一个实体的不同属性,在其中,一个capsule的方向(orientation)可以表示一个属性(property),capsule的长度被用于表示该属性存在的概率(probability)。相应的,multi-interest extractor layer的目标是,为用户兴趣的属性(properties)通过学习得到表示(representations)以及学习是否存在相应的兴趣(representations)。在胶囊(capsules)和兴趣表示(interest representations)间的语义关联启发我们将行为/兴趣表示(behavior/interest representations)看成是行为/兴趣胶囊(behavior/interest capsules),并使用dynamic routing来从behavior capsules中学习interest capsules。然而,原始routing算法是为图像数据而提出的,并不能直接应用到处理用户行为数据上。因此,我们提出了Behavior-to-Interest(B2I) dynamic routing来自适应地将用户行为聚合到兴趣表示向量(interest representation vectors)中,它与原始的routing算法有三个不同之处:

1.Shared bilinear mapping matrix.

在原始版本的dynimic routing中,每个(low-level capsules, high-level capsules) pair,会使用一个单独的bilinear mapping matrix;我们的版本则会使用固定(fixed)的bilinear mapping matrix S来替换,这是由于两方面的考虑:

  • 一方面,用户行为是变长的,对tmall用户来说,范围从几十到几百不等,因而,使用固定的bilinear mapping matrix是可泛化推广(generalizable)的
  • 另一方面,我们希望interest capsules位于相同的向量空间中,但不同的bilinear mapping matrice会将interest capsules映射到不同的向量空间上。从而,routing logit可以通过以下公式计算:
\[b_{ij} = \vec{u}_j^T S \vec{e}_i, i \in I_u, j \in \lbrace 1, \cdots, \rbrace\]

…(8)

其中:

  • \(\vec{e}_i \in R^d\)表示behavior item i的embedding
  • \(\vec{u}_j \in R^d\)表示interest capsule j的向量。
  • bilinear mapping matrix \(S \in R^{d \times d}\)是跨每个(behavior capsules, interest capsules) pairs间共享的。

2.随机初始化routing logits

由于使用共享的bilinear mapping matrix S,将routing logits初始化到0可能会导致相同初始化的interest capsules。接着,后续的迭代可能会陷入这样的情形,不同的interest capsules在所有时刻都会相同。为了消除该现象,我们会使用高斯分布\(N(0, \sigma^2)\)来抽样一个random matrix来初始化routing logits,使得初始的interest capsules相互间都不同,这与K-means聚类算法相类似。

3.动态兴趣数(Dynamic interest number)

由于不同用户的interest capsules的数目会有不同,我们引入一个启发式规则来为不同用户自适应调整K值。特别的,用户u的K值可以通过下式进行计算(注:\(\mid I_u \mid\)表示用户行为item数):

\[K_u' = max(1, min(K, log_2(|I_u|)))\]

…(9)

对于那些具有更少兴趣的users,调整interest capsules数目的策略,可以节省一些资源(包括计算资源和内存资源)。

整个dynamic routing过程如算法1所示。

a1.png

算法1

3.4 Label-aware Attention Layer

通过多兴趣抽取层(multi-interest extractor layer),从用户的行为embeddings可以生成许多的interest capsules。不同的interest capsules表示用户兴趣的不同方面,相关的interest capsule被用于评估在指定items上的用户偏好。因而,在训练期间,我们设计了一个label-aware attention layer,它基于缩放点积注意力(scaled dot-product attention)[24]机制,可以让target item选择要使用哪个interest capsule。特别的,对于一个target item,我们会计算每个interest capsule和target item embedding间的兼容性(compatibilities),并计算一个关于interest capsules的加权求和来作为该target item的用户表示向量,其中,一个interest capsule的权重由相应的兼容性(compatibility)所决定。在label-aware attention中,label是query,interest capsules是keys和values,如图2所示。user u对于item i的output vector,可以计算如下:

\[\begin{align} \vec{v}_u & = Attention (\vec{e}_i, V_u, V_u) \\ & = V_u softmax(pow(V_u^T \vec{e}_i, p)) \end{align}\]

其中:

  • pow表示element-wise指数操作符(exponentiation oprator),pow(x,y)表示x的y次幂;
  • p是一个可调参数,用于调节attention分布。当p接近0时,每个interest capsule趋向于接收偶数(even)attention。当p大于1时,随着p的增加,该值会大于点乘,会接受越来越多的权重。考虑到极限的情况,当p无穷大时,attention机制会变成一种hard attention,它会选中具有最大attention的值,并忽略其它。在我们的实验中,我们发现:使用hard attention会导致更快的收敛。

其它:

  • \(\vec{e}_i\)表示target item i的embedding
  • \(V_u\):用户u的表示向量,共由K个interest capsules组成
  • \(\vec{v}_u\):user u对于item i的output vector

3.5 Training & Serving

有了user vector \(\vec{v}_u\)和label item embedding \(\vec{e}_i\),我们可以计算user u和label item i间的概率:

\[Pr(i | u) = Pr(\vec{e}_i | \vec{v}_u) = \frac{exp(\vec{v}_u^T \vec{e}_i)}{ \sum_{j \in I} exp(\vec{v}_u^T \vec{e}_j)}\]

…(10)

接着,对于训练MIND的整个目标函数为:

\[L = \sum\limits_{(u,i) \in D} log Pr(i|u)\]

…(11)

其中,D是包含user-item交互的训练数据集。由于items数目的规模为数十亿,(10)的分母的sum操作在计算上是不可行的。因而,我们使用sampled softmax技术[7]来使目标函数可追踪,并使用Adam optimizer来训练MIND。

在训练后,除了label-aware attention layer外的MIND网络可以被用于user representation mapping函数:\(f_{user}\)。在serving时,用户的行为序列和user profile会feed给\(f_{user}\)函数,为用户生成多个表示向量。接着,这些表示向量通过一个近似最近邻(ANN)方法[15]被用于检索top N个items。对于matching stage,具有与user representation vectors最高相似度的那些items,可以被检索并组合候选items的最终集合。请注意,当一个用户具有新动作时,他的行为序列、以及相应的user representation vectors也会被更改,因而,MIND可以在matching stage上用于实时个性化召回。

3.6 与已存在方法的联系

这里,我们比较了MIND与其它两种已存在方法的关系,展示了相似之处和不同之处。

Youtube DNN. MIND和Youtube DNN都使用深度神经网络来建模用户行为数据并生成用户表示,都被用于在matching stage上检索海量item。然而,Youtube DNN只使用一个vector来表示一个用户,而MIND使用多个vectors。当在算法1中K的值为1时,MIND退化成Youtube DNN,而MIND可以看成是Youtube DNN的泛化(generalization)。

DIN. DIN可以捕获用户的多样化兴趣,MIND和DIN具有相似的目标。然而,这两种方法在达成该目标以及应用上各不相同。为了处理多样化兴趣,DIN会在item级别使用一个attention机制,而MIND使用dynamic routing来生成interest capsules,并在interest level考虑多样性。再者,DIN关注在ranking stage处理上千的items,而MIND会解耦inferring用户表示和衡量user-item兼容性,使它应用于在matching stage上海量items的召回。

4.实验

4.1 离线评估

4.2 超参数分析

在本节中,我们在Amazon Books数据集上做了关于multi-interest extractor layer和label-aware attention layer的超参数的实验。

routing logits的初始化

对于在multi-interest extractor layer中的routing logits,我们采用随机初始化,它与K-means中心点的初始化类型,其中,初始簇心的分布对于最终的聚类结果有很强的影响。由于routing logits是根据高斯分布\(N(0, \sigma^2)\)进行初始化的,我们会关于\(\sigma\)的不同值是否会导致不同的收敛,从而影响效果。为了研究\(\sigma\)的影响,我们使用3个不同的\(\sigma\)值:0.1, 1, 5来初始化routing logits \(b_{ij}\). 结果如图3所示,3个值的每条曲线几乎重叠。该观察表明MIND是对\(\sigma\)值是健壮的。对于实际应用,我们使用\(\sigma=1\)。

图3 超参数的影响。上部展示了MIND使用不同\(\sigma\)的结果;下部展示了MIND中p越大,效果越好

在label-aware attention中的power数。正如前所述,在label-aware attention中的power number p控制着每个兴趣在组合的label-aware interest representation中的的比例。我们对p从0到\(\infty\)做了比较,结果如图3所示。很明显,p=0的效果要比其它要差。原因是,当采用p=0时,每个兴趣具有相同的attention,因而,组合起来的兴趣表示(interest representation)等到兴趣的平均,与label无关。如果\(p \ge 1\),attention scores与兴趣表示向量和target item embeddings间的相似度成比例,这使得组合兴趣表示是一个关于兴趣的加权求和。结果表明,随着p的增大,效果会越好,因为与target item更相似的兴趣的表示向量会获得更大的attention。当\(p = \infty\)时,它会变为一个hard attention scheme。通过该scheme,与target item接近的兴趣表示会主导着组合兴趣表示,从而使得MIND收敛更快,效果更好。

4.3 在线实验

通过部署MIND在tmall主页上处理真实流量持续一周,我们开展在线实验。为了公平比较,所有方法在matching stage阶段进行部署,并采用相同的ranking过程。我们使用CTR来衡量online serving流量的效果。

有两种baseline方法进行在线实验。一个是item-based CF,它服务在线流量中的matching算法占居主要地位。另一个是Youtube DNN。我们在一个A/B test框架中部署了所有要比较的方法,它们feed给ranking stage并给出最终推荐。

4.png

图4

实验结果如图4所示。很明显MIND的效果要好于item-based CF和youtube DNN,这表示MIND生成了一个更好的user representation。另外,我们做出了以下观察:

  • 1) 通过长期实践的优化,item-based CF的效果要好于YouTube DNN,它也超过具有单个兴趣的MIND算法。
  • 2) 另一个显著的趋势是,MIND的效果会随着抽取的兴趣数的增加而变好(从1到5)。
  • 3) 当抽取的兴趣数为5时,MIND的效果达到峰值,这之后,CTR保持数据,兴趣数达到7的提升可以忽略。
  • 4) 使用动态兴趣数(dynamic interest number)的MIND与具有7个兴趣的MIND效果相当。

从上述观察来看,我们可以做出一些结论。

  • 首先,对于Tmall,用户兴趣的最优数目是5-7, 这可以表示用户兴趣的平均多样性(diversity)。
  • 第二,动态兴趣数机制并不能带来CTR增益,但在实验期间,我们意识到该scheme可以减少serving的开销,这有利于tmall这样的大规模服务,在实际上更易接受。

总之,在线实验验证了MIND对于建模多样化兴趣的效果,并能极大提升整体RS。

4.4 案例研究

4.4.1 耦合系数

在behavior capsules和interest capsules间的耦合系数,可以量化行为和兴趣级的等级关系。在这一节,我们将这些耦合系数可视化,来展示兴趣抽取过程的可解释性。

5.png

图5

图5展示了从tmall日活用户中随机抽取的两个用户相关的耦合系数,每一行对应于一个interest capsule,每一列对应于一个behavior。它展示了用户C(上)与4个类别的商品(耳机(headphones)、小吃(snacks)、手提包(handbags)、衣服(clothes))有交互,每个商品都在一个interest capsule上具有最大解耦系数,并形成了相应的兴趣。而用户D(下)只在衣服上(clothes)有兴趣,因而,从行为中看到该用户具有3个细粒度的兴趣(毛衣(sweaters)、大衣(overcoats)、羽绒衣(down jackets))。关于该结果,我们证实了user behaviors的每个类都可以聚类在一起,并形成相应的兴趣表示向量。

4.4.2 item分布

7.png

图6

在serving时,与user兴趣相似的items通过最近邻搜索进行检索。我们基于相应兴趣的相似度,对这些通过单个兴趣召回的items的分布进行可视化。图6展示了图5中提到的相同用户(user C)的item分布。该分布分别通过两种方法获取,其中上面的轴4展示了基于MIND通过4个兴趣召回的items,而最下面的轴展示了基于Youtube DNN的结果。items根据它们与兴趣的相似度分散在轴上,通过最大最小归一化法归一化到0~1, 并围绕在0.5附近。上面的一个点指的是在一定范围内的组成的items,因而每个点的大小(size)表示了在相应相似度中items数目。我们也展示了从所有候选中随机选中的一些items。正如所预料的,通过MIND召回的items与对应的兴趣强相关,而Youtube DNN则会与items的类目更宽泛些,它们与用户行为具有较低相似度。

5.系统部署

7.png

图7

当用户加载Tmall APP时,推荐请求会被发送给Tmall Personality Platform,该server集群会将一大堆插件式模块进行集成,并作为在线推荐进行服务。用户最近的行为会通过Tmall Personality Platform进行检索到,并将它发送给User Interest Extractor,它是实现MIND的主模块,用于将用户行为转换成多个user interests。接着,Recall Engine会搜索与user interests最近的embedding vectors相关的items。由不同兴趣触发的items会被合成候选items,并通过用户兴趣的相似度进行排序。从海量item池中选择上千个候选items的整个过程通过User Interest Extractor和Recall Engine来完成,整个过程小于15ms,由于基于MIND的serving的高效性,在items范围和系统响应时间间的tradeoff,这些候选items的top 1000可以通过Ranking Service(它会使用一堆特征来预测ctr)进行打分。最终,Tmall个性化平台会完成最终展示给用户的推荐结果item列表。User Interest Extractor和Ranking Service在Model Training Platform上会使用100 GPUs进行训练,训练过程会执行8个小时。受益于Model Training Platform的高性能,用于预测服务的深度网络会每天更新一次,可以保证最新的商品被计算和被曝光。

参考