推荐系统三十六式学习笔记:原理篇.矩阵分解11|facebook是怎么为十亿人互相推荐好友的?

news2024/12/25 22:55:11

目录

  • 回顾矩阵分解
  • 交替最小二乘原理(ALS)
  • 隐式反馈
  • 推荐计算
  • 总结

上一篇中,我们聊到了矩阵分解,在这篇文章的开始,我再为你回顾一下矩阵分解。

回顾矩阵分解

矩阵分解要将用户物品评分矩阵分解成两个小矩阵,一个矩阵是代表用户偏好的用户隐因子向量组成,另一个矩阵是代表物品语义主题的隐因子向量组成。

这两个小矩阵相乘后得到的矩阵,维度和原来的用户物品评分矩阵一模一样。比如原来矩阵维度是mn ,其中m是用户数量,n是物品数量,再假如分解后的隐因子向量是k个,那么用户隐因子向量组成的矩阵就是mk,物品隐因子向量组成的矩阵就是n*k。

得到的这两个矩阵有这么几个特点:
1.每个用户对应一个k维向量,每个物品也对应一个k维向量,就是所谓的隐因子向量;
2.两个矩阵相乘后,就得到了任何一个用户对任何一个物品的预测评分;

所以矩阵分解,所做的事就是矩阵填充。那到底怎么填充呢,换句话也就是说两个小矩阵怎么得到呢?
按照机器学习的套路,就是使用优化算法求解下面这个损失函数:
在这里插入图片描述
这个公式由两部分构成:加号左边是误差评分和,加号右边是分解后参数的平方。一个负责模型的偏差,一个负责模型的方差。偏差大的模型欠拟合,方差大的模型过拟合。

有了这个目标后,就要用到优化算法找到能使它最小的参数。优化方法常用的有两个:一个是随机梯度下降(SGD),另一个是交替最小二乘(ALS)。

在实际应用中,交替最小二乘更常用一些,这也是社交巨头Facebook在他们的推荐系统中选择的主要矩阵分解方法,今天,我就专门聊一下交替最小二乘求矩阵分解。

交替最小二乘原理(ALS)

交替最小二乘的核心是交替,什么意思呢?你的任务是找到两个矩阵P和Q,让他们相乘后约等于原矩阵R:
R m ∗ n = P m ∗ k ∗ Q n ∗ k T R_{m * n} =P_{m * k} * Q_{n * k}^{T} Rmn=PmkQnkT
难就难在,P和Q两个都是未知的,如果知道其中一个的话,就可以按照线性代数标准解法求得,比如知道了Q,那么P就可以这样算:
P m ∗ k = R m ∗ n ∗ Q n ∗ k − 1 P_{m*k} =R_{m*n} * Q_{n*k}^{-1} Pmk=RmnQnk1

也就是R矩阵乘以Q矩阵的逆矩阵就得到了结果;反之如果知道了P矩阵,求解Q矩阵也是一样。

交替最小二乘法通过迭代的方式解决了这个难题,具体步骤如下:
1、初始化随机变量Q里面的元素值;
2、把Q矩阵当做已知的,直接用线性代数的方法求得矩阵P;
3、得到了矩阵P后,把p当做已知的,故技重施,回去求解矩阵Q;
4、上面两个过程交替进行,一直到误差可以接收为止。

交替最小二乘法有以下几个优点:
1、在交替的其中一步,也就是假设已知其中一个矩阵求解另一个时,要优化的参数是很容易并行化的;
2、在不那么稀疏的数据集合上,交替最小二乘通常比随机梯度下降要更快地得到结果,事实上这一点就是关于隐式反馈的内容。

隐式反馈

矩阵分解算法,是为解决评分预测问题而产生的。比如说,预测用户会给商品打几颗星,然后把用户可能打高星的商品推荐给用户,
然而事实上却是,用户首先必须先去浏览商品,然后是购买,最后才可能打分。

相比“预测用户会打多少分”,“预测用户会不会去浏览”更加有意义,而且,用户浏览数据远远多于打分评价数据。也就是说,实际上推荐系统关注的是预测行为,也就是隐式反馈。

那如何从解决评分预测问题转向解决预测行为上来呢?这就是另一类问题了:One-Class。

如果把预测用户行为看成一个二分类问题,猜用户会不会做某件事,但实际上收集到的数据只是明确的一类:用户干了某件事,而用户明确不干某件事的数据却没有明确表达。这就是One-Class的由来,One-Class数据也是隐式反馈的通常特点。

对隐式反馈的矩阵分解,需要将交替最小二乘做一些改进,改进后的算法叫做加权交替最小二乘:Weighted-ALS。

这个加权要从哪说起?用户对物品的隐式反馈,通常是可以多次的,后台记录了你查看过这件商品多少次,查看次数越多,就代表你越喜欢这个。也就是说,行为的次数是对行为的置信度反应,也就是所谓的加权。

加权交替最小二乘对隐式反馈:
1、如果用户对物品无隐式反馈则认为评分为0;
2、如果用户对物品有至少一次隐式反馈则认为评分是1,次数作为评分的置信度。

那现在的目标函数在原来的基础上变成这样:
在这里插入图片描述
多出来的Cui就是置信度,在计算误差时考虑反馈次数,次数越多,就越可信。置信度一般也不是直接等于反馈次数,根据一些经验,置信度Cui这样计算:
C u i = 1 + α C C_{ui}=1+αC Cui=1+αC
其中α是一个超参数,需要调教,默认值取40就可以了,C是次数。

这里又引出另一个问题,那些没有反馈的缺失值,就是在我们的假设下,取值为0的评分非常多,有两个原因导致在实际使用时需要注意这个问题:
1、本身隐式反馈就只有正类别是确定的,负类别是假设的。
2、这会导致正负类别非常不平衡,严重倾斜到0评分这边。

因此,不能使用所有的缺失值作为负类别,矩阵分解的初心就是要填充这些值,应对这个问题的做法是负样本采样:挑选一部分缺失值作为负类别即可。

怎么挑?有两个方法:
1、随机均匀采样和正类别一样多;
2、按照物品的热门程度采样;

实践证明,第二种比较靠谱。现在,你想一下,在理想的情况下,什么样的样本最适合做负样本呢?

就是展示给用户了,他也知道了这个物品的存在了,但就是没有对其作出任何反馈。问题是:很多时候我们不能确定用户没有意识到物品的存在呢?还是知道物品的存在而不感兴趣呢?

因此按照物品热门程度采样的思想就是:一个越热门的物品,用户越可能知道它的存在。那这种情况下,用户还没对它有反馈就表明:这很可能就是真正的负样本。

实际上按照热门程度采样构建负样本,和前面提到的文本算法Word2vec学习过程,都用到了类似的负样本采样技巧。

推荐计算

在得到了分解后的矩阵后,相当于每个用户得到了隐因子变量,这是一个稠密向量,用于代表他的兴趣。同时每个物品也得到了一个稠密向量,代表它的语义或主题。两者是一一对应的,用户的兴趣就是表现在物品的语义维度上的。

貌似让用户和物品的隐因子向量两两相乘,计算点积即可得到所有的推荐结果了。实际上复杂度还是很高,尤其对于用户数量和物品数量都巨大的应用,就更不现实。于是Facebook提出了两种解决办法:

第一种,利用一些专门设计的数据结构存储所有物品的隐因子向量,从而实现通过一个用户向量可以返回最相似的k个物品。

于是Facebook给出了自己的开源实现Faiss,类似的开源实现还有Annoy,KGraph,NMSLIB。
其中Facebook开源的Faiss和NMSLIB(Non-Metric Space Library ) 都用到了 ball tree 来存储物品向量。
如果需要动态增加新的物品向量到索引中,推荐使用Faiss ,如果不是,推荐使用NMSLIB或者KGraph。 用户向量则可以存在内存数据中,这样可以在用户访问时,实时产生推荐结果。

第二种:就是拿着物品的隐因子向量先做聚类,海量的物品会减少为少量的聚类。 然后再逐一计算用户和每个聚类中心的推荐分数,给用户推荐物品就变成了给用户推荐物品聚类。

得到物品推荐的聚类后,再从每个聚类中挑选少许几个物品作为最终推荐结果。这样做的好处除了大大减小推荐计算向量之外,还可以控制推荐结果的多样性,因为可以控制在每个类比中选择的物品数量。

总结

在真正的推荐系统的实际应用中,评分预测实际上场景很少,而且数据也很少。因此,相比预测评分,预测用户会对物品干出什么事,会更加有效。

然而这就需要对矩阵分解做一些改进,加权交替最小二乘就是改进后的矩阵分解算法,被Facebook采用在了他们的推荐系统中,这篇文章里,我也详细地解释了这一矩阵分解算法在落地时的步骤和注意事项。

其中,针对One-Class 这种集合,一种常用的负采样构建方法是根据物品的热门程度采样。

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

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

相关文章

帕金森患者在饮食上需要注意什么

帕金森病患者在饮食上应该遵循以下几个基本原则: 饮食清淡:应多吃新鲜的水果和蔬菜,如苹果、芹菜、菠菜等,以补充维生素和促进胃肠道蠕动。营养均衡:应多吃富含优质蛋白的食物,如鸡蛋、牛奶,以…

需要用来做3D家具展示的软件哪个网站更专业?

国内外的3D家具展示软件网站并且值得推荐的也就那么几家: 1、Cedreo,Cedreo 是一个在线3D家居设计平台,适合专业的房屋建筑商、改造商和室内设计师。它允许用户创建2D和3D平面图以及室内外效果图,拥有7000多件可定制的3D家具、材…

考HCIE费这么大劲,只管三年?

在网络工程师的职业发展道路上,HCIE(华为认证互联网专家)认证无疑是一块极具含金量的垫脚石。 但许多人对它的有效期存在疑问,担心费尽心思获得的认证只能维持短暂的职业优势。 重认证机制是啥样的?一定要重认证吗&…

0-2年的网安新人突破低薪打杂困境妙招!

2024年即将到来,相信有很多人依旧对网络安全行业行业非常好奇,也有很多对网络安全了解过的小伙伴,依旧想要进入网络安全行业。确实,网络安全行业前景大、薪资高、入门门槛也相对较低。 但是,对于0-2年的网安新人&…

【Java】已解决java.lang.UnsupportedOperationException异常

文章目录 问题背景可能出错的原因错误代码示例正确代码示例注意事项 已解决java.lang.UnsupportedOperationException异常 在Java编程中,java.lang.UnsupportedOperationException是一个运行时异常,通常表示尝试执行一个不支持的操作。这种异常经常发生…

晶圆切割机(晶圆划片机)为晶圆加工重要设备 我国市场国产化进程不断加快

晶圆切割机(晶圆划片机)为晶圆加工重要设备 我国市场国产化进程不断加快 晶圆切割机又称晶圆划片机,指能将晶圆切割成芯片的机器设备。晶圆切割机需具备切割精度高、切割速度快、操作便捷、稳定性好等特点,在半导体制造领域应用广…

【MySQL】数据类型和表的约束

1. 数据类型 分类数据类型解释数值类型BIT (M)位类型。M位数,默认为1范围1-64BOOL01表示真假TINYINT [UNSIGNED]8位整型SMALLINT [UNDIGNED]16位短整型INT [UNSIGNED]32位整型BIGINT [UNSIGNED]64位长整型小数类型FLOAT [ (M, D) ] [UNSIGNED]32位浮点类型&#xf…

vue echarts画多柱状图+多折线图

<!--多柱状图折线图--> <div class"echarts-box" id"multiBarPlusLine"></div>import * as echarts from echarts;mounted() {this.getMultiBarPlusLine() },getMultiBarPlusLine() {const container document.getElementById(multiBar…

MathType软件下载2024最新版_MathType官方免费下载附加详细安装步骤

MathType(数学公式编辑器)是由Design Science公司研发的一款专业的数学公式编辑工具。MathType功能非常强大&#xff0c;尤其适用于专门研究数学领域的人群使用。使用MathType让你在输入数学公式的时候能够更加的得心应手&#xff0c;各种复杂的运算符号也不在话下。 安 装 包 …

氢气传感器:呼吸疾病的隐形向导

​ ​​在医学领域&#xff0c;每一次技术革新都可能成为疾病诊断与治疗的新曙光。氢气传感器&#xff0c;这一看似不起眼的装置&#xff0c;正逐渐成为辅助诊断呼吸系统疾病的关键工具。它如同一位精准的侦探&#xff0c;穿梭于呼吸的微风中&#xff0c;捕捉着那些可能预示…

sheng的学习笔记-AI-集成学习(adaboost,bagging,随机森林)

ai目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 目录​​​​​​​ 集成学习 什么是集成学习 集成学习一般结构&#xff1a; 示意图 弱学习器 经典算法 Boosting 什么是boosting 方法图 AdaBoost 算法 AdaBoost示意图 流程解析&#xff1a; 错误分类率error…

「Qt Widget中文示例指南」如何实现一个滑动条(一)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 滑动条示例展示了如…

618在即!「企业商城」作战攻略曝光,解锁电商化采购新模式

“618”购物狂欢大促即将到来&#xff0c;凡是大促&#xff0c;必为商机。 当前&#xff0c;618正在成为拉动品牌销量增长的重要战役&#xff0c;这已经是很多商家的共识。 网上商城交易采购组织形式公开透明、成本低、效率高的优势凸显&#xff0c;逐渐成为各企业采购的主流模…

苹果电脑压缩视频的软件,苹果电脑怎么压缩视频文件大小

在数字时代的浪潮中&#xff0c;视频已成为我们日常生活和工作中不可或缺的一部分。然而&#xff0c;视频文件的大小也在不断攀升&#xff0c;给存储和传输带来了不小的挑战。因此&#xff0c;视频压缩技术应运而生&#xff0c;成为解决这一问题的关键。本文将详细介绍视频压缩…

Java17 --- redis7缓存双写一致性

一、缓存双写一致性 如果redis中有数据&#xff1a;需要和数据库中的值相同。如果redis中没有数据&#xff1a;数据库中的值要是最新值&#xff0c;且准备回写redis。只读缓存。读写缓存&#xff1a;①、同步直写策略&#xff1a;写数据库后也同步写redis缓存&#xff0c;缓存…

ChatGPT的问题与回复的内容导出(Chorme)

我给出两种方式&#xff0c;第一种方式无使用要求&#xff0c;第二种方式必须安装Chorme 个人更推荐第二种方式 第一种方式&#xff1a;使用chatgpt自带的数据导出 缺点&#xff1a;会将当前未归档的所有聊天记录导出&#xff0c;发送到你的电子邮箱中 第二种方式&#xff1a…

C语言 | Leetcode C语言题解之第155题最小栈

题目&#xff1a; 题解&#xff1a; //单调栈 单调递减 typedef struct {//正常 stackint stack[10000];int stackTop;//辅助 stackint minStack[10000];int minStackTop; } MinStack;MinStack* minStackCreate() {MinStack* newStack (MinStack *) malloc(sizeof(MinS…

【Git】多人协作 -- 详解

一、多人协作&#xff08;1&#xff09; ⽬前&#xff0c;我们所完成的工作如下&#xff1a; 基本完成 Git 的所有本地库的相关操作&#xff0c;git 基本操作&#xff0c;分支理解&#xff0c;版本回退&#xff0c;冲突解决等等。 申请码云账号&#xff0c;将远端信息 clone…

C++通过VS2022使用Conan2.0安装fmt库实现控制台彩色打印

Conan是一个开源的C/C包管理器&#xff0c;用于管理和构建C/C项目的依赖关系。它允许开发人员轻松地集成第三方库、工具和资源到他们的项目中&#xff0c;并管理这些依赖项的版本、构建选项和配置。 Conan官方提供了对应的VS2022扩展插件&#xff0c;通过这个插件再搭配VS2022…

路由控制和策略路由

文章目录 一、路由控制&#xff08;1&#xff09;、前言1.1.1-路由策略 &#xff08;2&#xff09;、正反掩码和通配符1.2.1-通配符 &#xff08;3&#xff09;、ACL1.3.1-ACL步长1.3.2-步长的作用1.3.3-TCP/UDP端口号 实验1:实验2: 二、前缀列表实验1:2.1.1-前缀列表的表达式2…