矩阵补充,最近邻查找

news2025/3/29 16:54:14

矩阵补充,最近邻查找

矩阵补充是向量召回最简单的一种方法,现在不常用,学习矩阵补充是为了更好的理解后面学到的双塔模型

下图,输入用户ID和物品ID后从Eebedding层拿到对应的向量做内积,内积的结果就是矩阵补充

image-20250321081203556

模型训练

基本思路

image-20250321081542623

数据集

image-20250321081729577

训练

下图公式中

  • (u,i,y) 是训练集中的一条数据,表示用户u对物品i的真实兴趣分数是y。

  • <au,bi>是向量a,b的内积,是矩阵补充模型对兴趣分数的预估,反映第u号用户有多喜欢第i号物品

    image-20250321082829184

  • y - <au,bi> 是真实兴趣分数y与预估值的差,我们希望这个差越小越好。我们取该差的平方,差的平方越小,则预估值越接近真实值y

  • Σ(u,i,y)∈Ω 表示对每条记录的差的平方求和作为优化的目标函数

  • min A,B 对目标函数求最小化,优化的变量是矩阵A和B。求最小化可以用随机梯度下降等算法每次更新矩阵A和B的一列,这样就可以学出矩阵A和B

为什么这个模型叫矩阵补充?我们拿下图绿色位置的数据训练出模型。有了模型我们可以预估出灰色位置的分数,也就是把矩阵的元素给补全,这就是为什么该模型叫矩阵补充。

image-20250321082408593

把矩阵元素补全后,就可以做推荐,给定一个用户,选出用户对应行中分数较高的物品推荐给该用户。

矩阵补充缺点

缺点1: 仅用用户ID,物品ID embedding,没利用物品,用户属性。

image-20250321084314776

缺点2:负样本的选取方式不对

image-20250321084423462

缺点3:训练模型的方法不好

  • 矩阵补充模型用内积<au,bi>`作为兴趣分数的预估,效果不如余弦相似度,工业界普遍使用余弦相似度

  • 用平方损失函数(回归),让预估的兴趣分数拟合真实的兴趣分数,不如用交叉熵损失(分类)。工业界通常用交叉熵损失做分类判断一个样本是正样本还是负样本

模型存储

线上做推荐时,要用到矩阵A和B,这两个矩阵可能很大。比如小红书有几亿用户,几亿篇笔记,这两矩阵列数都是好几亿,为了快速读取快速查找,需要特殊的存储方式,如下:

image-20250321085153032

线上服务

在训练好矩阵补齐模型后,并且把embedding向量做存储之后,可以开始做线上服务。 将其运用在推荐系统中的召回通道,比如在用户刷小红书时快速找到这个用户感兴趣的几百篇笔记。

image-20250321085839671

近似最近邻查找 (Approximate Nearest Neighbor Search)

问题:上述最近邻查找如果枚举所有物品,则时间复杂度正比与物品数量,计算量很大,在线上这是不可接受的。需要对最近邻查找进行优化。

有很多种算法假如最近邻查找,这些算法非常快即使有几亿个物品最多也只需要计算几万次内积,这些算法的结果未必是最优的但不会比最优结果差多少。

快速最近邻查找算法已被集成到很多向量数据库系统中。比较有名的包括:Milvus、Faiss、HnswLib等

image-20250324075901463

如果系统不支持余弦相似度,可以把所有向度做归一化让他们的二范数全等于1,则向量之间的内积就等于余弦相似度

加速最近邻查找的思路

  1. 划分区域。每个区域用一个向量表示,这些向量的长度都是1。
  2. 建立索引。表示每个区域的向量作为key,把区域中所有点(物品embedding向量)的列表作为value

image-20250324080926417

  1. 将用户embedding向量a与索引中的各个key做对比(如果物品数量是几亿,索引中key也只有几万而已,这步计算量不大)

image-20250324081148601

image-20250324081234213

  1. 计算用户embedding向量与key向量区域中所有物品的相似度(这一步计算量也不大)。假如我们要向量a找最相似的三个点

image-20250324081349996

总结

矩阵补充是学术界的模型,效果不好。工业界不用矩阵补充模型而是用更先进的双塔模型。

image-20250324081638772

工业界会用一些开源的向量数据库,如Milvus等,其都支持近似最近邻查找。

image-20250324081919235

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

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

相关文章

gradio调用多个CSS的HTML页

很多博客介绍的gradio读取html和css比较简单&#xff0c;如果要做很细致的前端页面优化&#xff0c;比如丰富的响应式的cssjs&#xff0c;至少要有html多个css&#xff0c;是暂不能实现的。bootstrap、font-awesome、jquery等 方案一当然是直接更换htmlcss为主的部署方式&#…

NVIDIA NeMo 全面教程:从入门到精通

NVIDIA NeMo 全面教程&#xff1a;从入门到精通 文章目录 NVIDIA NeMo 全面教程&#xff1a;从入门到精通目录框架介绍NeMo的核心特点NeMo的架构NeMo与其他框架的比较NeMo的模型集合NeMo的工作流程NeMo 2.0的新特性 安装指南系统要求使用Docker容器安装步骤1&#xff1a;安装Do…

Thales靶机攻略

1.下载导入VBox&#xff0c;并启动靶机 靶机地址&#xff1a;https://download.vulnhub.com/thales/Thales.zip 解压后&#xff0c;在VBox中导入虚拟电脑。包含所有网卡的MAC地址。 导入完成&#xff0c;设置网卡模式为仅主机网络。开启靶机。 kali网卡更改为桥接模式。点击工…

尝试使用Tauri2+Django+React项目(2)

前言 尝试使用tauri2DjangoReact的项目-CSDN博客https://blog.csdn.net/qq_63401240/article/details/146403103在前面笔者不知道怎么做&#xff0c;搞了半天 笔者看到官网&#xff0c;原来可以使用二进制文件&#xff0c;好好好 嵌入外部二进制文件 | Taurihttps://v2.taur…

6.1 模拟专题:LeetCode 1576. 替换所有的问号

1. 题目链接 LeetCode 1576. 替换所有的问号 2. 题目描述 给定一个仅包含小写字母和问号 ? 的字符串 s&#xff0c;要求将所有 ? 替换为任意小写字母&#xff0c;使得替换后的字符串中 没有相邻的两个字符相同。 示例&#xff1a; 输入&#xff1a;s "?zs" →…

Linux安装go环境

安装一个lazydocker&#xff0c;根据文档需要先安装go环境 https://github.com/jesseduffield/lazydocker 官方文档解析 https://go.dev/doc/install 文档内容如下&#xff0c;一共三步 1.删除先前安装的go&#xff0c;解压下载的go压缩包到/usr/local目录 2.添加环境变量&…

卡特兰数在数据结构上面的运用

原理 Catalan数是一个数列&#xff0c;其第n项表示n个不同结点可以构成的二叉排序树的数量。Catalan数的第n项公式为&#xff1a; &#xfffc; 其中&#xff0c;&#xfffc;是组合数&#xff0c;表示从2n个元素中选择n个元素的组合数。 Catalan数的原理可以通过以下方式理解&…

悟空crm v12安装好后出现 网络错误问题(已解决)

请求网址: http://wwww.aaaa.com/gateway/adminUser/queryUserNumInfo 请求方法: POST 状态代码: 502 Bad Gateway 远程地址: 101.37.79.226:9807 引荐来源网址政策: strict-origin-when-cross-origin

便携版:随时随地,高效处理 PDF 文件

PDF-XChange Editor Plus 便携版是一款功能强大且极其实用的 PDF 阅读与编辑工具。它不仅支持快速浏览 PDF 文件&#xff0c;还提供了丰富的编辑功能&#xff0c;让用户可以轻松处理 PDF 文档。经过大神优化处理&#xff0c;这款软件已经变得十分轻便&#xff0c;非常适合需要随…

【Golang】补充:占位符、转义字符、错误处理

&#x1f525; 个人主页&#xff1a;星云爱编程 &#x1f525; 所属专栏&#xff1a;Golang &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 1、占位符 1.1通用占位符 %v &#xff1a;默认格式的值。适…

文件上传绕过的小点总结(4)

9.末尾点删除处理缺陷 给出源码&#xff1a; $file_name trim($_FILES[upload_file][name]); $file_name deldot($file_name);//删除文件名末尾的点 $file_ext strrchr($file_name, .); $file_ext strtolower($file_ext); //转换为小写 $file_ext str_ireplace(::$DATA,…

如何用Spring AI构建MCP Client-Server架构

现代 Web 应用正加速与大语言模型(LLMs)深度融合,构建超越传统问答场景的智能解决方案。为突破模型知识边界,增强上下文理解能力,开发者普遍采用多源数据集成策略,将 LLM 与搜索引擎、数据库、文件系统等外部资源互联。然而,异构数据源的协议差异与格式壁垒,往往导致集…

如何让WordPress不同的页面、栏目显示不同的小工具侧边栏

WooSidebars 是一款用于 WordPress 的插件,主要功能是允许用户根据不同的上下文条件(如特定页面、博客文章、分类目录或搜索结果页面等)来更改侧边栏中显示的小工具。 自定义小工具区域:用户可以轻松创建自定义的小工具区域,并将其设置为在多种条件下显示,只需点击几次即…

智慧座椅的节能效果如何?

嘿呀&#xff0c;你知道不&#xff0c;咱这叁仟智慧座椅的节能效果&#xff0c;那可是像个神秘小宇宙&#xff0c;根据不同的技术和应用场景&#xff0c;会展现出超有趣的变化哦&#xff0c;下面就给你唠唠常见的几种情况哈&#xff01; 能源回收大变身&#xff1a;有些叁仟智…

Matlab:二维绘图篇——不同坐标系下的绘图命令

目录 1.极坐标系下绘图&#xff1a;polar命令 实例——极坐标图形 实例——直角坐标与极坐标系图形 2.半对数坐标系下绘图&#xff1a;semilogx和semilogy 实例——半对数坐标系图形 3.双对数坐标系下绘图&#xff1a;loglog 实例——双对数坐标系绘图 4.双y轴坐标&…

对三维物体模型的阈值操作

对三维物体模型的阈值操作 1. 使用point_coord_x、point_coord_y、point_coord_z阈值分割麻辣兔头2. point_normal_x、point_normal_y、point_normal_z有什么区别&#xff1f;3. 去除离群点 1. 使用point_coord_x、point_coord_y、point_coord_z阈值分割麻辣兔头 dev_open_win…

prometheus 添加alertmanager添加dingtalk机器人告警

1、dingtalk创建机器人,目前我们采用加白名单的方式校验 2、定位到如下图 test结果如下

向量数据库学习笔记(1) —— 基础概念

一、 嵌入模型 Embedding Models 嵌入模型是将复杂数据&#xff08;如文本、图像、音频等&#xff09;转换为向量表示的机器学习模型 1. 核心概念 嵌入(Embedding)&#xff1a;将高维、非结构化的数据映射到低维、稠密的向量空间 向量表示&#xff1a;输出固定长度的数值向量…

【算法】动态规划:回文子串问题、两个数组的dp

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;Linux 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 回文子串问题回文子串最长回文子串分割回文串 IV分割回文串 II *最长回文子序列让字符串成为回文串的最少插入次数 两个数组的dp最…

文件上传绕过的小点总结(3)

6.文件首尾加空绕过 源码给出这样的&#xff0c;发现文件名处理没有首尾去空&#xff0c;于是我们可以采用首尾加空的方式绕过。 $file_name $_FILES[upload_file][name]; $file_name deldot($file_name);//删除文件名末尾的点 $file_ext strrchr($file_name, .); $file_e…