DRN——强化学习与推荐系统结合

article/2025/9/24 6:46:08

强化学习是近年来机器学习领域非常热门的研究话题,它的研究起源于机器人领域,针对智能体在不断变化的环境 中决策和学习的过程进行建模。在智能体的学习过程中,会完成收集外部反馈,改变自身状态,再根据自身状态对下一步的行动进行决策,在行动之后持续收集反馈的循环,简称“行动-反馈-状态更新”的循环。如果把推荐系统当作一个智能体,把整个推荐系统学习更新的过程当作智能体“行动-反馈-状态更新”的循环,就能理解将强化学习的诸多理念应用于推荐系统领域并不是一件困难的事情。
2018年,由宾夕法尼亚州立大学和微软亚洲研究院的学者提出的推荐领域的强化学习模型DRN,就是一次将强化学习应用于新闻推荐系统的尝试。

深度强化学习推荐系统框架

在这里插入图片描述
框架图非常清晰地展示了深度强化学习推荐系统框架的各个组成部分,以及整个强化学习的迭代过程。下面将一些强化学习中的专业名词进行解释:
智能体: 推荐系统本身,它包括基于深度学习的推荐模型、探索(explore )策略,以及相关的数据存储(memory )。
环境: 由新闻网站或App、用户组成的整个推荐系统外部环境。在环境中, 用户接收推荐的结果并做出相应反馈。
行动: 对一个新闻推荐系统来说,“行动”指的就是推荐系统进行新闻排序 后推送给用户的动作。
反馈: 用户收到推荐结果后,进行正向的或负向的反馈。例如,点击行为被认为是一个典型的正反馈,曝光未点击则是负反馈的信号。此外,用户的活跃程度,用户打开应用的间隔时间也被认为是有价值的反馈信号。
状态: 状态指的是对环境及自身当前所处具体情况的刻画。在新闻推荐场景中,状态可以被看作已收到所有行动和反馈,以及用户和新闻的所有相关信息的特征向量表示。站在传统机器学习的角度,“状态”可以被看作已收到的、可用于训练的所有数据的集合。
在这样的强化学习框架下,模型的学习过程可以不断地迭代,迭代过程主要有如下几步:
(1)初始化推荐系统(智能体)。
(2 )推荐系统基于当前已收集的数据(状态)进行新闻排序(行动),并推送到网站或App (环境)中。
(3) 用户收到推荐列表,点击或者忽略(反馈)某推荐结果。
(4) 推荐系统收到反馈,更新当前状态或通过模型训练更新模型。
(5) 重复第2步。
强化学习相比传统深度模型的优势就在于强化学习模型能够进行“在线学习”,不断利用新学到的知识更新自己,及时做出调整和反馈。这也正是将强化学习应用于推荐系统的收益所在。

DQN

智能体部分是强化学习框架的核心,对推荐系统这一智能体来说,推荐模型是推荐系统的“大脑”。在DRN框架中,扮演“大脑”角色的是Deep Q-Network (深度Q网络,简称DQN),其中Q是Quality的简称,指通过对行动进行质量评估,得到行动的效用得分,以此进行行动决策。
DQN的网络结构如下图所示,在特征工程中套用强化学习状态向量和行动向量的概念,把用户特征(user features )和环境特征(context features )归为状态向量,因为它们与具体的行动无关;把用户—新闻交叉特征和新闻特征归为行动特征,因为其与推荐新闻这行动相关。
在这里插入图片描述
用户特征和环境特征经过左侧多层神经网络的拟合生成价值(value)得分K(s),利用状态向量和行动向量生成优势(advantage)得分A(s,a),最后把两部分得分综合起来,得到最终的质量得分Q(s,a)。

DRN的学习过程

DRN的学习过程是整个强化学习推荐系统框架的重点,正是由于可以在线更新,才使得强化学习模型相比其他“静态”深度学习模型有了更多实时性上的优势。下图以时间轴的形式形象地描绘了 DRN的学习过程。
在这里插入图片描述
按照从左至右的时间顺序,依次描绘DRN学习过程中的重要步骤。
(1 )在离线部分,根据历史数据训练好DQN模型,作为智能体的初始化模型。
(2) 在t1—t2阶段,利用初始化模型进行一段时间的推送(push )服务,积累反馈(feedback)数据。
(3) 在t2—t3时间点,利用阶段积累的用户点击数据,进行模型微更新(minorupdate )。
(4) 在t3—t4时间点,利用t1—t4阶段的用户点击数据及用户活跃度数据进行模型的主更新(major update )。
(5) 重复第2〜4步。
在第4步中出现的模型主更新操作可以理^为利用历史数据的重新训练,用训练好的模型替代现有模型。那么在第3步中提到的模型微调怎么操作呢?这就牵扯到DRN使用的一种新的在线训练方法——竞争梯度下降算法 ( Dueling Bandit Gradient Descent Algorithm )。

DRN的在线学习方法——竞争梯度下降算法

在这里插入图片描述
(1 )对于已经训练好的当前网络Q,对其模型参数W添加一个较小的随机扰动△W,得到新的模型参数W1,这里称IF对应的网络为探索网络Q1。
△W的产生公式如下:
在这里插入图片描述
(2 )对于当前网络Q和探索网络Q1,分别生成推荐列表L和L1,分别生成两个推荐列表并组合成一个推荐列表后推送给用户。
(3)实时收集用户反馈。如果探索网络生成内容的效果好于当前网络, 则用探索网络代替当前网络,进入下一轮迭代;反之则保留当前网络。

其中,a是探索因子,决定探索力度的大小。rand(-1,1)是一个[-1,1]之间的随机数。
DRN的在线学习过程利用了 “探索”的思想,其调整模型的粒度可以精细到每次获得反馈之后,这一点很像随机梯度下降的思路,虽然一次样本的结果可能产生随机扰动,但只要总的下降趋势是正确的,就能通过海量的尝试最终达到最优点。DRN正是通过这种方式,让模型时刻与最“新鲜”的数据保持同步, 将最新的反馈信息实时地融入模型中。


http://chatgpt.dhexx.cn/article/XDUgeDEy.shtml

相关文章

【Pytorch深度学习实战】(7)深度残差网络(DRN)

🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃 🎁欢迎各位→点赞…

图像超分辨率 之 DRN 论文解读与感想

图像超分辨率 之 DRN (Closed-loop Matters: Dual Regression Networks for Single Image Super-Resolution)论文解读与感想 DRN是在2020年顶会(CVPR)上发表的一篇想法简单,但是结果非常不错的文章。 先来说一下文章的切入点: …

关于CSRF攻击及mvc中的解决方案 [ValidateAntiForgeryToken]

一.CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。 二.CSRF可以做什么&#xff…

CSRF简介

一.CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。 二.CSRF可以做什么&#xf…

django种表单post出现CSRF verification failed( CSRF验证失败 ) 的两种解决方案

现象 表单界面如下&#xff1a; 在点击提交之后&#xff0c;出现如下错误页面&#xff1a; HTML的代码如下&#xff1a; contact_form.html <!DOCTYPE HTML PUBLIC ><html> <head><title>Contact us</title> </head><body><h1&…

Django CSRF验证失败. 请求被中断.

项目场景&#xff1a; Python版本&#xff1a;3.7 Django版本&#xff1a;3.1.7 问题描述&#xff1a; 出现了CSRF验证失败. 请求被中断. 原因分析&#xff1a; 在Django中有个设定&#xff0c;防止跨域来请求。比如有爬虫&#xff0c;爬虫不是从网站根目录开始搜寻&#x…

detail: “CSRF Failed: CSRF token missing or incorrect 问题解决方法

如果你尝试了所有方法之后还是没用&#xff0c;那定位你的Ajax方法&#xff1a; 1&#xff0c;var $crf_token $(‘[name“csrfmiddlewaretoken”]’).attr(‘value’) 2&#xff0c;headers:{“X-CSRFToken”: $crf_token} 原因分析&#xff1a; 这是由于你的django,有一个…

CSRF防御之token认证

一、CSRF是什么&#xff1f; CSRF&#xff08;Cross-site request forgery&#xff09;&#xff0c;中文名称&#xff1a;跨站请求伪造。攻击者盗用你的身份&#xff0c;以你的名义发送恶意请求。CSRF能够做的事情包括&#xff1a;以你名义发送邮件&#xff0c;发消息&#xf…

禁止访问 (403)CSRF验证失败. 请求被中断.

出现这个问题是因为django在收到表单提交过来的信息时&#xff0c;会检查提交过来的信息中是否有token,并会对token进行校验&#xff0c;如果校验通过&#xff0c;那就继续执行&#xff0c;反之就会认定这次的数据有伪造的风险。 解决方案&#xff1a; 在项目的settings.py文…

禁止访问 (403) CSRF验证失败. 请求被中断.————错误处理(测试接口时遇到的问题)

问题描述 解决措施 在Header参数中添加Content-Type和X-CSRFToken信息&#xff0c;这样就不会报错了。 运行结果

通过验证Referer解决CSRF安全防御问题

一、背景 JAVAWEB 类项目处于客户验收阶段&#xff0c;在安全扫描处出现 CSRF 问题&#xff0c;通过多个博客中解决思路都无法解决。后来通过同事提醒 可以试试判断 Referer页面来源参数&#xff0c;最终使用该方法解决问题。 二、环境 服务器&#xff1a;Linux 前端&#…

CSRF实战案例—绕过referer值验证

在一个添加管理员的界面引起了我的注意 尝试添加一个管理员&#xff0c;如下添加成功&#xff0c;我们可以观察其请求包中并未存在token字段&#xff0c;可能存在csrf漏洞。但是存在“Referer”和“Origin”字段 我们把referer字段删了只剩origin&#xff0c;查看是否可以请求成…

访问django后台,提示CSRF验证失败. 请求被中断.Referer checking failed - **** does not match any trust

1.非debug模式看到的报错 2.settings打开debug模式&#xff0c;才能把报错信息看的详细 3.去settings.py中&#xff0c;找到CsrfViewMiddleware 中间件&#xff0c;点击进入 4.搜索匹配报错信息 5.往下看看用到这个关键字的地方 6.从源码第一行开始看 7.settings.py&…

安全认证中的CSRF

1、什么叫做CSRF攻击 简单地说&#xff0c;就是说恶意网站&#xff0c;虽然没有盗取你的用户名和密码信息&#xff0c;但是却可以伪装成你&#xff0c;然后登录到银行&#xff0c;或者等危险网站&#xff0c;模拟你进行操作。利用的就是cookies这个特性&#xff0c;即浏览器提供…

csrf验证问题 -- 不同域名下Iframe嵌套Cookie失效导致csrf验证失败

问题原因 Cookie:SameSite Chrome 51 开始&#xff0c;浏览器的 Cookie 新增加了一个SameSite属性&#xff0c;主要用于防止CSRF攻击和用户追踪。 cookie的SameSite属性用来限制第三方Cookie&#xff0c;从而减少安全风险(防止CSRF)。 SameSite可以有下面三种值&#xff1a;…

接口报403,报CSRF验证失败的问题

问题定位&#xff1a;后台两个接口重名&#xff0c;走了优先级更高的接口&#xff0c;接口没有过滤CSRF&#xff1b; 一、csrf是什么 CSRF&#xff08;Cross-site request forgery&#xff09;跨站请求伪造&#xff0c;是一种常见的web安全漏洞&#xff0c;概括地说就是指&…

Django的csrf豁免:解决CSRF验证失败,请求被中断问题

1.CSRF介绍 跨站请求伪造&#xff08;英语&#xff1a;Cross-site request forgery&#xff09;&#xff0c;也被称为 one-click attack 或者 session riding&#xff0c;通常缩写为 CSRF 或者 XSRF&#xff0c; 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的…

解决:禁止访问 (403) CSRF验证失败

在测试Django框架POST请求方式时&#xff0c;程序报错如下 在确保访问安全的情况下有一下两种方式&#xff1a; 1、在相应html文件form代码块中添加如下代码&#xff1a; <form method"post" action"/method_show/">{% csrf_token %} <!-- 改行…

Ubiquant LGBM Baseline 九坤量化大赛 版本44

数据描述&#xff1a; 该数据集包含来自数千项投资的真实历史数据的特征。你的挑战是预测与做出交易决策相关的模糊指标的价值。 Your challenge is to predict the value of an obfuscated metric relevant for making trading decisions. 这是一个代码竞赛&#xff0c;它依…

lgbm的roc曲线,auc计算

lgbm模型画ROC曲线 1、得到分类的概率 import numpy as npimport pandas as pdimport lightgbm as lgbfrom sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test \train_test_split(data.iloc[:, 0:-1], # featuredata.iloc[:, -1], # label…