DRN :A Deep Reinforcement Learning Framework for News Recommendation论文解读_drn论文_白水baishui的博客-程序员秘密

技术标签: DRN  推荐系统  深度强化学习  强化学习  微软  

1. 论文贡献

该论文提出了一个基于DQN的推荐框架,用于解决以下3个问题:

  1. 当前的推荐系统很难动态地推荐新闻
    新闻的动态性表现在两个方面:(1)新闻的时效性强,新闻内容很容易过时;(2)用户对不同新闻的兴趣会随着时间的推移而不断变化。
  2. 当前的强化方法利用的用户反馈信息不足
    大多数方法只将新闻是否被点击,或者用户对新闻的评分作为用户反馈,这是不够的。
  3. 当前的推荐系统总是向用户推荐类似的项目
    如果推荐系统总是推送相同的东西,会导致用户的兴趣下降,因此需要提高推荐多样性。

解决方法是:

  1. 采用DQN的强化方法,可以综合考虑当前的奖励和未来的奖励;
  2. 将用户与应用程序的交互频率作为一种用户的主动反馈;
  3. 采用了DBGD(Dueling Bandit Gradient Descent)探索策略,用于随机选择浏览项附近的其他项目,既提升了推荐的多样性,同时这种探索策略可以避免推荐完全不相关的项目(例如, ϵ \epsilon ϵ贪婪策略可能会推荐出完全不相关的项目),从而保持更好的推荐准确性。

2. 模型架构

在这里插入图片描述

小更新只用用户点击数据对主网络和目标网络进行更新;
大更新同时用用户点击数据和用户活跃度对主网络进行更新。

2.1. 特征构造

论文构造了以下四个特征用于预测用户是否会点击一个特定的新闻:

  1. 新闻特征
    新闻标题、供稿人、排名、实体名称、分类类别、主题类别,以及过去1小时、6小时、24小时、1周和1年的点击计数。
  2. 用户特征
    用户分别在1小时、6小时、24小时、1周和1年内点击过的新闻及其特征。
  3. 用户-新闻交互特征
    用户与某条新闻之间的交互记录。
  4. 上下文特征
    用户获取新闻时的背景信息,包括时间、日期和新闻的新鲜度(请求新闻时间和新闻发布时间之间的差值)。

这些特征将作为状态 s s s 被输入DQN进行训练,但在本论文中,Q函数被设计为V函数(价值函数)与A函数(优势函数)的组合:
在这里插入图片描述

如图所示,用户特征和上下文特征被输入V函数,用户特征、上下文特征、用户-新闻交互特征和新闻特征被输入A函数。

优势函数 A ( s , a ) A(s,a) A(s,a) 表示在状态 s s s 下,某动作 a a a 做出后的价值相对于平均价值 V ( s ) V(s) V(s)而言的差值: A ( s , a ) = Q ( s , a ) − V ( s ) A(s,a)=Q(s,a)-V(s) A(s,a)=Q(s,a)V(s) Q ( s , a ) = A ( s , a ) + V ( s ) Q(s,a)=A(s,a)+V(s) Q(s,a)=A(s,a)+V(s) Q Q Q值分为价值函数 V V V和优势函数 A A A来训练有助于提高策略的学习效率,更容易地发现那个动作 a a a 更好。

2.2. 深度强化学习模型

奖励公式定义为: y s , a = Q ( s , a ) = r i m m e d i a t e + γ r f u t u r e y_{s,a}=Q(s,a)=r_{immediate}+\gamma r_{future} ys,a=Q(s,a)=rimmediate+γrfuture其中,状态 s s s 是上下文特征和用户特征 ;动作 a a a 是用户-新闻交互特征和新闻特征 ; r i m m e d i a t e r_{immediate} rimmediate 表示当前状态时的立即奖励(用户是否点击此新闻); r f u t u r e r_{future} rfuture 表示对未来奖励的预测; γ \gamma γ 是折扣因子。

以上公式在DQN中表示为: y s , a , t = r a , t + 1 + γ Q ( s a , t + 1 , arg max ⁡ a ′ Q ( s a , t + 1 , a ′ ; W t ) ; W t ′ ) y_{s,a,t}=r_{a,t+1}+\gamma Q\Bigl(s_{a,t+1},\argmax_{a'}Q(s_{a,t+1},a';\mathsf{W}_t);\mathsf{W}_t'\Bigr) ys,a,t=ra,t+1+γQ(sa,t+1,aargmaxQ(sa,t+1,a;Wt);Wt)其中, r a , t + 1 r_{a,t+1} ra,t+1表示采取动作 a a a 后获得的立即奖励, t + 1 t+1 t+1是因为奖励总是延迟一个时间步的; W t \mathsf{W}_t Wt W t ′ \mathsf{W}_t' Wt分别的DQN的主网络和目标网络(探索网络)的参数; a ′ a' a是DQN估计的在状态 s a , t + 1 s_{a,t+1} sa,t+1时的动作;在一定次数的迭代后, W t ′ \mathsf{W}_t' Wt将被更新到 W t \mathsf{W}_t Wt

2.3. 用户的主动反馈

论文将用户与应用程序交互的频率作为用户的主动反馈信息,与用户是否点击某些推荐项一起作为用户反馈信息。
在这里插入图片描述

论文使用生存模型来建模用户的主动反馈。生存分析用于估计用户的返回时间,假设 t t t 是当前时间, T T T 是下一次用户返回的时间,那么衰减率可以被定义为: λ ( t ) = lim ⁡ d t → 0 P r { t ⩽ T < t + d t ∣ T ⩾ t } d t \lambda(t)=\lim_{\mathsf{d}t\to 0}\frac{Pr\{t\leqslant T < t+\mathsf{d}t\quad|\quad T\geqslant t\}}{\mathsf{d}t} λ(t)=dt0limdtPr{ tT<t+dtTt}该公式表示当返回时间与当前时间的差值 T − t T-t Tt 越大时,衰减率越大;当 T − t T-t Tt 越小时,衰减率越小,即用户返回的概率越大。为了简化问题,论文设定 λ ( t ) \lambda(t) λ(t)为一个固定的参数 λ 0 \lambda_0 λ0,也就是每个用户的衰减率被定义为恒定值。

那么, t t t 时间后用户的活跃度可以定义为: S ( 0 ) = 0.5 S(0)=0.5 S(0)=0.5 S ( t ) = e − ∫ 0 t λ ( x ) d x ⩽ 1 S(t)=e^{-\int_0^t\lambda(x)\mathsf{d}x}\leqslant 1 S(t)=e0tλ(x)dx1

则用户活跃度从当前点降为0所用的时间 T 0 T_0 T0 (即用户存活期)可以表示为: T 0 = ∫ 0 ∞ S ( t ) d t T_0=\int_0^\infty S(t)\mathsf{d}t T0=0S(t)dt

每当应用程序检测到用户的返回时,就将这个用户的活跃度加上一个特定值: S ( t ) = S ( t ) + S a S(t)=S(t)+S_a S(t)=S(t)+Sa

论文将上述的几个参数分别设定为: λ 0 = 1.2 × 1 0 − 5 \lambda_0=1.2 \times 10^{−5} λ0=1.2×105每秒; S a = 0.32 S_a=0.32 Sa=0.32 T 0 = 24 T_0=24 T0=24小时。这样的设置可以实现当用户每天访问应用程序一次时,活跃度保持不变: S 0 e − λ 0 T 0 + S a = S 0 S_0e^{-\lambda_0T_0}+S_a=S_0 S0eλ0T0+Sa=S0 S 0 = 0.5 S_0=0.5 S0=0.5 为例: 0.5 e − 1.2 × 1 0 − 5 × 12 × 60 × 60 + 0.32 ≈ 0.5 0.5e^{-1.2 \times 10^{−5}\times12\times60\times60}+0.32\approx 0.5 0.5e1.2×105×12×60×60+0.320.5

在这里插入图片描述

如图所示,该特定用户的用户活跃度在时间0时从 S 0 = 0.5 S_0=0.5 S0=0.5开始衰减。在时间戳 t 1 t_1 t1 时,用户返回,此时用户活跃度 + S a +S_a +Sa。然后, t 1 t_1 t1后用户活跃度继续衰减。由于论文设定活跃度最大为1,所以该用户在 t 4 t_4 t4 t 9 t_9 t9 期间的用户活跃度被截断为1。

结合用户点击反馈和用户活跃度反馈,立即回报就被定义为: r i m m e d i a t e = r t o t l e = r c l i c k + β r a c t i v e r_{immediate}=r_{totle}=r_{click}+\beta r_{active} rimmediate=rtotle=rclick+βractive其中, β \beta β 是权重参数。

2.4. 探索策略

论文采用了DBGD(Dueling Bandit Gradient Descent)探索策略。该策略通过向主网络的参数添加噪声数据来构造新的网络参数,并把该参数作为探索网络的参数,然后利用探索网络生成推荐项,与主网络生成的推荐项合并成推荐列表,推送给用户。如下图所示:

在这里插入图片描述
模型更新公式表示为: Δ W = α ⋅ text ( − 1 , 1 ) ⋅ W \Delta\mathsf{W}=\alpha·\text{text}(-1,1)·\mathsf{W} ΔW=αtext(1,1)W W ~ = W + Δ W \widetilde{W}=\mathsf{W}+\Delta\mathsf{W} W =W+ΔW W ′ = W + η W ~ \mathsf{W'}=\mathsf{W}+\eta\widetilde{W} W=W+ηW 根据用户点击的推荐项属于 W \mathsf{W} W W ~ \widetilde{W} W 的比例来调整 η \eta η 值,然后在进行下一次推荐之前将参数 W ′ \mathsf{W'} W 更新到主网络。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/baishuiniyaonulia/article/details/121001670

智能推荐

Spring Boot参数校验_weixin_34320724的博客-程序员秘密

1. 概述作为接口服务提供方,非常有必要在项目中加入参数校验,比如字段非空,字段长度限制,邮箱格式验证等等,数据校验常用到概念:JSR303/JSR-349: JSR303是一项标准,只提供规范不提供实现,规定一些校验规范即校验注解,如@Null,@NotNull,@Pattern,位于javax.validation.constraints包下。JSR-349是其的升级版本,添加了一些新特性...

torch.nn.NLLLoss()与torch.nn.CrossEntropyLoss()_nn.nllloss(weight=_我是天才很好的博客-程序员秘密

torch.nn.NLLLoss()class torch.nn.NLLLoss(weight=None, size_average=None, ignore_index=-100, reduce=None, reduction='mean')计算公式:loss(input, class) = -input[class]公式理解:input = [-0.1187, 0.2110, 0.7463],target = [1],那么 loss = -0.2110。个人理解:感觉像是把 target 转

优悦家装发送消息流程_岑远的博客-程序员秘密

发送文本消息点击发送按钮后,页面(ChatFragment.java)响应发送事件// 发送按钮点击事件ekBar.getBtnSend().setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String text = ekBar.getEt

《剑指offer》刷题——【树】面试题7:重建二叉树(java实现)_HW_870754395的博客-程序员秘密

《剑指offer》刷题——【字符串】面试题5:替换空格一、题目描述:二、解题思路:三、代码实现:一、题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。二、解题思路:在二叉树的前序遍历中,第一个...

你的事业(工作)到了停滞期吗?_weixin_33859231的博客-程序员秘密

作  者: wfq771105 (公子小白) 等  级: 信 誉 值: 100 所属社区: 扩充话题 程序人生 问题点数: 100 回复次数: 99 发表时间: 2006-8-9 16:33:32 以前看过一篇文章说:很多人事业(工作)都有停滞期,自我满足型停滞和能力型停滞。自我满足型停滞就是事业到达了自己的要求,觉得很满足,即使还有很大的提升空间,也不愿再往前发展了...

2.SpringMVC源码分析:DispatcherServlet的初始化与请求转发_weixin_33725272的博客-程序员秘密

一.DispatcherServlet的初始化在我们第一次学Servlet编程,学java web的时候,还没有那么多框架。我们开发一个简单的功能要做的事情很简单,就是继承HttpServlet,根据需要重写一下doGet,doPost方法,跳转到我们定义好的jsp页面。Servlet类编写完之后在web.xml里注册这个Servlet类。除此之外,没有其他了。我们启动web服务器,在浏览...

随便推点

为什么不推荐for...in遍历数组_forin可以遍历数组吗_喂维围的博客-程序员秘密

我们一般来说,使用for…in来遍历对象,使用for…of来遍历数组我们强烈建议不要使用for…in来遍历数组为什么???因为for…in遍历的是对象的key或者是数组的下标。当然最重要的原因是,他会到原型链上寻找,遍历其中新增加的属性的key值for of遍历的是数组元素值,for in 遍历的是数组的索引(即键名)for of遍历的只是数组内的元素,for in 遍历的不只是数组内的元素,还有其新增的原型属性和索引for of 遍历Array.prototype.method=func

CreatePipe 函数_iteye_19653的博客-程序员秘密

创建管道共享数据[code=&quot;C++&quot;]//创建匿名管道 SECURITY_ATTRIBUTES sa; HANDLE hRead,hWrite;sa.nLength = sizeof(SECURITY_ATTRIBUTES); sa.lpSecurityDescriptor = NULL; sa.bInheritHandle = TRUE; CreatePipe(...

刷PAT甲级的各题思路、细节以及遇到的问题记录_pat甲级题目看不懂_别看着我笑了的博客-程序员秘密

1006 Sign In and Sign Out (25分)像类似于题目中时间HH:MM:SS这种特殊格式,完全可以用scanf("d%:%d:%d:".....)的格式以整型数据输入时间,而不是用字符串输入再去麻烦的转换。此外,比较时间也不必时分秒逐个比,直接统一成秒比较即可。...

Flutter Grpc Client 连接池_Dylan93的博客-程序员秘密

关于Flutter Grpc Client 连接的管理,我写了一个,有什么不对的和可以优化的还望大家指正一下。/*** 类:ClientChannelManager * 描述:连接池管理器 * 作者:dingzuhua* 创建时间:2019/3/14 13:20*/import 'package:grpc/grpc.dart';class ClientChannelManager ...

spring boot下mybatis的单元测试写法_Liam018的博客-程序员秘密

package com.clamc.mapper;import org.junit.After;import org.junit.Assert;import org.junit.Before;import org.junit.Test;import org.junit.runner.RunWith;import org.mybatis.spring.boot.test.autoc...