推荐系统三十六式学习笔记:原理篇.矩阵分解12|如果关注排序效果,那么这个模型可以帮到你

news2024/11/29 4:51:42

目录

  • 矩阵分解的不足
  • 贝叶斯个性化排序
    • AUC
    • 构造样本
    • 目标函数
    • 训练方法
  • 总结

矩阵分解在推荐系统中的地位非常崇高。它既有协同过滤的血统,又有机器学习的基因,可以说是非常优秀了;但即便如此,传统的矩阵分解无论是在处理显式反馈,还是 处理隐式反馈都让人颇有微词,这一点是为什么呢?

矩阵分解的不足

前面讲过的两种矩阵分解,本质都是在预测用户对一个物品的偏好程度,哪怕不是预测评分,只是预测隐式反馈,也是这个事实。
得到矩阵分解结果后,常常在实际使用时,又是用这个预测结果来排序。原来的目标是让模型的预测误差最小化,到最后还是只想要一个好点的排序。

这种针对单个用户对单个物品的偏好程度进行预测,得到结果后再排序的问题,在排序学习中的叫做:point-wise,其中point意思就是:只单独考虑每个物品,每个物品 像是空间中孤立的点一样。与之相对应的,还有直接预测物品两两之间相对排序的问题,叫做pair-wise ,pair顾名思义就是成对成双。

前面将的矩阵分解都属于point-wise模型。这类模型的尴尬是:只能收集到正样本,没有负样本,于是认为缺失值就是负样本,再以预测误差为评判标准去逼近这些样本。逼近正样本没有问题,但同时逼近的负样本只是缺失值而已,并不能确认用户到底是不喜欢还是喜欢。虽然这些模型采取了一些措施来规避这个问题,比如负样本采样,但尴尬还是存在的,为了排序而绕路也是事实。

既然如此,能不能直面问题,采用pair-wise 来看待矩阵分解呢?当然可以。实际上,更直接的推荐模型应该是:能够较好地为用户排列出更好的物品相对顺序,而非更精确的评分。

这个问题已经有专业的从业者们提出了方法:贝叶斯个性化排序,简称BPR模型。下面,我们就一探究竟。

贝叶斯个性化排序

在前面的专栏文章中,已提到均方根误差,用于评价模型预测准确度的。现在要关注的是相对排序,用什么指标比较好呢?AUC,全称是Area Under Curve,意思是曲面下的面积,这里的曲线是ROC曲线。

AUC

AUC 这个值在数学上等价于:模型把关心的那一类样本排在其他样本前面的概率。最大是1,完美结果,而0.5是书籍排列,0就是完美的全部排错。

这个非常适合来评价模型的排序效果,比如说,得到一个推荐模型后,按照它计算的分数,能不能把用户真正想消费的物品排在前面。这个模型上线前是可以用日志完全计算出来的。

AUC 怎么计算呢?一般步骤如下:
1、用模型给样本计算推荐分,比如样本都是用户和物品这样一对一对的,同时还包含了有无反馈的标识;
2、得到打过分的样本,每条样本保留两个信息,第一个是分数,第二个是0或者1,1标识消费过,是正样本,0标识没有,负样本;
3、按照分数对样本重新排序,降序排列;
4、给每一个样本赋一个排序值,第一位r1=n,第二位r2=n-1,以此类推;其中要注意,如果几个样本分数一样,需要将其排序值调整为他们的平均值;
5、最终按照下面的这个公式计算就可以得到AUC值;

A U C = ∑ i ∈ ( 样 本 ) T i − M ∗ ( M + 1 ) 2 M ∗ N AUC =\frac{\sum_{i∈(样本)}{T_i-\frac{M*(M +1)}{2}}}{M*N} AUC=MNi()Ti2M(M+1)

这个公式:
第一部分:分母是我们关心的那类样本,也就是正样本,有M个,以及其他的样本有N个,这两类样本相对排序总共的可能性有M*N种;
第二部分:分子是这样计算的:第一名的排序值是r_1,它在排序上不但比过了所有的负样本,而且比过了自己以外的正样本。
正样本和正样本是同一类,所以要排查,于是就有N-M 种组合,以此类推,排序值为rm的就贡献了rm-1,把这些加起来就是分子;

关于AUC,越接近1越好是肯定的,但是并不是越接近0就越差,最差的是接近0.5,如果AUC很接近0的话,只需要把模型预测的结果加个负号就能让AUC接近1;

BPR模型,它提出了一个优化准则和学习框架,那到底BPR做了什么事情呢?主要有三点:
1.一个样本构造方法;
2.一个模型目标函数;
3.一个模型学习框架;

构造样本

前面介绍的矩阵分解,在训练时候处理的样本是:用户、物品、反馈,这样的三元组形式;

其中反馈又包含真实反馈和缺失值,缺失值充当负样本。BPR则不同,提出要关心的是物品之间对于用户的相对排序,于是构造的样本是:用户、物品1、物品2、两个物品相对排序,这样的四元组形式,其中两个物品的相对排序,取值是:

1、如果物品1是消费过的,而物品2不是,那么相对顺序取值为1,是正样本;
2、如果物品1和物品2刚好相反,则是负样本;
3、样本中不包含其他情况:物品1和物品2都是消费过的,或者都是没消费过的。

学习的顺序是反应用户偏好的相对顺序,而在使用时,面对的是所有用户还没消费过的物品,这些物品仍然可以在这样的模型下取得相对顺序,这就比三元组point-wise 样本要直观得多。

目标函数

现在,每条样本包含的是两个物品,样本预测目标是两个物品的相对排序。BPR完成矩阵分解,依然需要像交替最小二乘那样的思想。

先假设矩阵分解结果已经有了,于是计算出用户对于每个物品的推荐分数,只不过这个推荐分数可能并不满足均方根误差最小,而是满足物品相对排序最佳。

得到了用户和物品的推荐分数后,就可以计算四元组的样本中,物品1和物品2的分数差,这个分数可能是正数,也可能是负数,还可能是0;

希望的情况是:如果物品1和物品2相对排序为1,那么希望两者分数之差是个正数,而且越大越好;如果物品1和物品2的相对排序时0,则希望分数之差是负数,且越小越好;

用个符号来表示这个差: X u 12 X_{u12} Xu12,表示的是对于用户u,物品1和物品2的矩阵分解预测分数差。然后再用sigmoid函数把这个分数差压缩到0到1之间。
θ = 1 1 + e ( − X u 12 ) θ=\frac{1}{1+e^{(-X_{u12})}} θ=1+e(Xu12)1

用这种方式预测了物品1排在物品2前面的似然概率,所以最大化交叉熵就是目标函数了。目标函数通常还要防止过拟合,加上正则项,正则项其实认为模型参数有个先验概率,这也是BPR这个名字中有’贝叶斯’的来历。BPR认为模型的先验概率符合正态分布,对应到正则化就是说L2正则。

所有样本都计算:模型参数先验概率p theta ,和似然概率的乘积,最大化这个目标函数就能够得到分解后的矩阵参数其中theta就是分解后的矩阵参数。

这个目标函数化简和变形后,和把AUC当成目标函数是非常相似的,正因为如此,BPR模型宣称该模型是为AUC而生。

训练方法

有了目标函数之后,就要有训练方法。梯度下降可以,梯度下降又分为批量梯度和随机梯度两个选择,前者收敛慢,后者训练快但不稳定。
因此BPR使用了一个介于两者之间的训练方法,结合重复抽样的梯度下降。具体如下:

1、从全量样本中有放回地随机抽取一部分样本;
2、用这部分样本,采用随机梯度下降优化目标函数,更新模型参数;
3、重复步骤1,直到满足停止条件。

这样,就得到了一个更符合推荐排序要求的矩阵分解模型了;

总结

今天是矩阵分解三篇的最后一篇,传统的矩阵分解,无论是隐式反馈还是显示反馈,都是希望更加准确地预测用户对单个物品的偏好,而实际上,如果能够预测用户对物品之间的相对偏好,则更加符合实际需求的直觉。

BPR就是这样一整套针对排序的推荐算法,它事实上提出了一个优化准则和一个学习框架,至于其中优化的对象是不是矩阵分解并不是它的重点。但我在这里结合矩阵分解对其进行了讲解,同时还介绍了排序时最常用的评价指标AUC及其计算方法。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1844520.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图解Sieve of Eratosthenes(埃拉托斯特尼筛法)算法求解素数个数

1.素数的定义 素数又称质数。质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数(规定1既不是质数也不是合数&…

(day1)数据类型详解及DML语句入门

一、数据类型 1、整型类型 (1)创建数据库 CREATE DATABASE ql_linux; CREATE SCHEMA IF NOT EXISTS ql_linux; //IF NOT EXISTS如果没有表就创建 SHOW DATABASE; //查看数据库 (2)创建表 C…

C语言变量、指针的内存关系

1. type p ? 表示从内存地址p开始,开辟一段内存,内存大小为类型type规定的字节数,然后把等号右边的值写入到这段内存中。 因此,这块内存起点位置是p,结束是ptype字节数-1。 2. type* p ?表示从内存地址p开始&…

算法:分治(归并)题目练习

目录 题目一:排序数组 题目二:数组中的逆序对 题目三:计算右侧小于当前元素的个数 题目四:翻转对 题目一:排序数组 给你一个整数数组 nums,请你将该数组升序排列。 示例 1: 输入&#xf…

Tailwindcss 提取组件

背景 随着项目的发展&#xff0c;您不可避免地会发现自己需要重复使用常用样式&#xff0c;以便在许多不同的地方重新创建相同的组件。这在小组件&#xff08;如按钮、表单元素、徽章等&#xff09;中最为明显。在我的项目中是图表标题样式如下&#xff1a; <div class&qu…

14-Kafka-Day03

第 5 章 Kafka 消费者 5.1 Kafka 消费方式 5.2 Kafka 消费者工作流程 5.2.1 消费者总体工作流程 一个消费者组中的多个消费者&#xff0c;可以看作一个整体&#xff0c;一个组内的多个消费者是不可能去消费同一个分区的数据的&#xff0c;要不然就消费重复了。 5.2.2 消费者…

SpringSecurity6从入门到实战之登录后操作

SpringSecurity6从入门到实战之登录后操作 上次已经了解了如何进行自定义登录页面,这次主要是详细讲解登录成功,登录之后的跳转以及包括退出登录等一系列操作.让我们来看看SpringSecurity需要如何进行配置 登录之后的跳转 定义 Spring Security 配置类 Configuration EnableW…

数据治理的七大核心技术 全面了解数据治理必读篇

在当今的数字化时代&#xff0c;数据已成为企业最宝贵的资产之一&#xff0c;其价值不仅体现在数据量的巨大&#xff0c;更在于数据的深度和宽度。随着大数据、云计算、物联网&#xff08;IoT&#xff09;和人工智能&#xff08;AI&#xff09;等技术的不断进步&#xff0c;企业…

25考研线代攻略,老师及习题册推荐!

其实很多经验贴对大家有一定的误导 网上很多人说李永乐讲的好&#xff0c;确实好&#xff0c;但是没有说听李永乐的线代需要一定的基础 于是很多人去听完李永乐&#xff0c;就懵逼了&#xff0c;这讲的很乱啊&#xff0c;听的一头雾水。 其实&#xff0c;李永乐的基础班授课…

天才简史——Diederik P. Kingma与他的Adam优化器

一、了解Diederik P. Kingma 发生日期&#xff1a;2024年6月18日 前几日&#xff0c;与实验室同门一同前往七食堂吃饭。饭间&#xff0c;一位做随机优化的同门说他看过一篇被引18w的文章。随后&#xff0c;我表示不信&#xff0c;说你不会数错了吧&#xff0c;能有1.8w次被引都…

智慧城市低空+AI视频智能监控:构建新时代安全防线

随着科技的飞速发展&#xff0c;智能监控技术已经广泛应用于各个领域&#xff0c;从城市治理到工业生产&#xff0c;从公共安全到环境监测&#xff0c;都发挥着越来越重要的作用。而在低空领域&#xff0c;AI视频智能监控方案的建设更是成为了一个热点话题。 一、低空AI视频智…

Java异常和文件

一、异常 1.定义 异常&#xff1a;异常就是代表程序出现的问题 体系结构&#xff1a; 最上层的是 Throwable 类&#xff0c;下面有两个子类&#xff1a; ① Error&#xff1a;代表系统级别的问题&#xff08;属于严重问题&#xff0c;比如&#xff1a;内存溢出&#xff09;。…

VScode基本使用

VScode下载安装&#xff1a; Visual Studio Code - Code Editing. Redefined MinGW的下载安装&#xff1a; MinGW-w64 - for 32 and 64 bit Windows - Browse Files at SourceForge.net x86是64位处理器架构&#xff0c;i686是32为处理器架构。 POSIX和Win32是两种不同的操…

java文件传输小工具 java17+springboot3+thymeleaf

背景 在和同事工作中经常需要传输文件&#xff0c;但是公网传输太慢&#xff0c;业务方不是计算机专业直接用命令行沟通麻烦。 本小工具通过页面可视化方便用户使用&#xff0c;端口9090&#xff0c;启动默认展示当前登陆本机用户的桌面。 代码开源&#xff1a; https://git…

SM9加密算法:安全、高效的国产密码技术

随着信息技术的飞速发展&#xff0c;网络安全问题日益凸显。加密算法作为保障信息安全的核心技术&#xff0c;受到了广泛关注。在我国&#xff0c;一种名为SM9的加密算法逐渐崭露头角&#xff0c;凭借其卓越的安全性能和高效计算能力&#xff0c;成为了新一代国产密码技术的代表…

NGINX_九 nginx_proxy代理

九 nginx_proxy代理 1.代理 1.1 代理原理 反向代理产生的背景&#xff1a; 在计算机世界里&#xff0c;由于单个服务器的处理客户端&#xff08;用户&#xff09;请求能力有一个极限&#xff0c;当用户的接入请求蜂拥而入时&#xff0c;会造成服务器忙不过来的局面&#xff0…

使用Jetpack Compose和DummyJSON加速你的Android开发

使用Jetpack Compose和DummyJSON加速你的Android开发 在现代Android开发中&#xff0c;Jetpack Compose提供了一种全新的UI构建方式&#xff0c;同时DummyJSON简化了开发过程中数据获取的复杂性。本文将详细介绍一个名为firefly-compose的Jetpack Compose模板应用程序&#xf…

电脑一键还原系统,小白也能轻松操作!

电脑一键还原系统是一项非常实用的功能&#xff0c;当电脑遇到无法解决的问题或需要恢复到出厂设置时&#xff0c;用户可以通过一键还原功能快速恢复系统到之前的状态。这项功能不仅可以节省时间&#xff0c;还能有效解决系统问题。本文将介绍三种电脑一键还原系统的方法&#…

【React】Lodash---groupBy() 分组

例子 _.groupBy([6.1, 4.2, 6.3], Math.floor); // > { 4: [4.2], 6: [6.1, 6.3] }// The _.property iteratee shorthand. _.groupBy([one, two, three], length); // > { 3: [one, two], 5: [three] }思路分析 来源 定义一个名为groupBy的方法&#xff0c;通过扩展Ar…

AI界的“视频滤镜”(Stable Diffusion进阶篇-TemporalKit视频风格转化),手把手教你制作原创AI视频

大家好&#xff0c;我是向阳 在之前的文章中我也分享过如何进行AI视频的制作&#xff0c;说是AI视频其实也就是通过Stable Diffusion进行视频重绘&#xff0c;也就是将一个视频一帧一帧重绘为自己想要的画面&#xff0c;然后再连贯起来成为视频。 这个东西其实比较耗费时间和…