概述

  • 这节课和后面几节课将详细讲述向量召回,矩阵补充是向量召回最简单的一种方法,不过现在已经不太常用这种方法了
  • 本节课的矩阵补充是为了帮助理解下节课的双塔模型
  • 上节课介绍了embedding,它可以把用户ID和物品ID映射成向量

矩阵补充

模型结构

  • 下面的模型图是基于embedding做推荐
    在这里插入图片描述
  • 模型的输入是一个用户ID和一个物品ID,模型的输出是一个实数,是用户对物品兴趣的预估值,这个数越大,表示用户对物品越感兴趣
  • 左边的结构只有一个embedding层,把一个用户ID映射成向量,记作向量 a,这个向量是对用户的表征
  • 回忆一下上节课的内容:embedding 的参数是一个矩阵,矩阵中列的数量是用户数量,每一列都是图中 a 那么大的向量,embedding 层的参数数量等于用户数量 × 向量 a 的大小

在这里插入图片描述

  • 右边的结构是另一个 embedding 层,把一个物品ID映射到向量,记作 b,大小和向量设置成一样的,向量 b 是对物品的表征。embedding 层的参数是一个矩阵,输出的向量 b 是矩阵的一列,矩阵中列的数量是物品的数量
    在这里插入图片描述
  • 模型一共用了两个 embedding 层,它们不共享参数
    在这里插入图片描述
  • 对向量 a 和向量 b 求内积得到一个实数作为模型的输出,这个模型就是矩阵补充模型
    在这里插入图片描述

训练

基本想法

  • 用户 embedding 参数矩阵记作 A A A。第 u u u 号用户对应矩阵第 u u u 列,记作向量 a u a_u au
  • u u u 号用户对应矩阵的第 u u u 列,记作向量 a u a_u au
    在这里插入图片描述
  • 物品 embedding 的参数矩阵记作 B B B。第 i i i 号物品对应矩阵第 i i i 列,记作向量 b i b_i bi
    在这里插入图片描述
  • 内积 < a u , b i > <a_u, b_i> <au,bi> 是第 u u u 号用户对第 i i i 号物品兴趣的预估值,内积越大,说明用户 u u u 对物品 i i i 的兴趣越强
  • 训练模型的目的是学习矩阵 A A A B B B ,使得预估值拟合真实观测的兴趣分数。矩阵 A A A B B B 是 embedding 层的参数

数据集

  • 数据集:(用户ID, 物品ID, 兴趣分数) 的集合,记作 Ω = { ( u , i , y ) } \Omega = \{(u,i,y)\} Ω={(u,i,y)} 。含义为该用户对该物品真实的兴趣分数在系统里有记录
  • 数据集中兴趣分数的记录方法如下:
    • 曝光但是没有点击 → 0分
    • 点击,点赞,收藏,转法 → 各算 1 分,这些行为都说明用户对物品感兴趣
    • 分数最低是 0,最高是 4
  • 训练的目的是让模型输出拟合兴趣分数

训练

  • 把用户ID和物品ID映射成向量
    • u u u 号物品 → 向量 a u a_u au
    • i i i 号物品 → b i b_i bi
  • 求解优化问题,得到参数 A A A B B B (它们是优化变量,embedding层的参数)
  • 我们希望预估值和真实值的差越小越好,我们对其取平方。差越小,则预估值越接近真实值。对所有差的平方求和,作为优化的目标函数
  • 求最小化可以用随机梯度下降等方法,每次更新矩阵 A A A B B B 的一列,这样就可以学出矩阵 A A A B B B
    在这里插入图片描述

矩阵补充

  • 系统里面物品很多,一个用户看过的物品只是系统的极少数
    在这里插入图片描述
  • 矩阵中大部分都是灰色,只有少部分是绿色,也即曝光给用户的物品只是少数,而我们并不知道没曝光给用户的物品用户感不感兴趣
  • 我们用绿色位置的数据去训练模型,我们就可以知道灰色位置的分数,也就是把矩阵的元素给补全,这就是为什么模型叫矩阵补充
  • 把矩阵元素补全之后我们就可以做推荐,给定一个用户,我们选出对应用户的行中分数较高的物品推荐给该用户

在实践中效果并不好…

  • 缺点1:仅使用ID embedding,没利用物品,用户属性
    • 物品属性:类目,关键词,地理位置,作者信息等等
    • 用户属性:性别,年龄,地理定位,感兴趣的类目等等
    • 考虑以上的属性,推荐可以更加精准
    • 双塔模型可以看作矩阵补充的升级版,它不单单使用用户ID和物品ID,还会结合各种物品属性和用户属性,双塔模型的实际表现是非常好的
  • 缺点2:负样本的选取方式不对
    • 样本:用户——物品的二元组,记作 ( u , i ) (u,i) (u,i)
    • 正样本:曝光之后,有点击,交互(正确的做法)
    • 负样本:曝光之后,没有点击,交互(错误的做法)。这是一种想当然的做法,学术界的人可能以为这样没错,但可惜在实践中不 work。后面的课程会讲解正负样本怎么选。
  • 缺点3:做训练的方法不好
    • 内积不如余弦相似度,工业界普遍用余弦相似度而不是内积
    • 用平方损失(回归)不如用交叉熵损失(分类)。工业界一般做分类来判断一个样本是正样本还是负样本

线上服务

在训练好模型后,可以将模型用于推荐系统中的召回通道。比如在用户刷小红书的时候,快速找到这个用户可能感兴趣的一两百篇笔记

模型存储

做完训练之后,要把模型存储在正确的地方便于做召回。

  1. 训练得到矩阵 A A A B B B ,它们是 embedding 层的参数。这辆个矩阵可能会很大,比如小红书有几亿个用户和几亿篇笔记,那么这几个矩阵的列数都是好几亿。为了快速读取和快速查找,需要特殊的存储方式
    • A A A 的每一列对应一个用户
    • B B B 的每一列对应一个物品
  2. 把矩阵 A A A 的列存储到 key-value 表。
    • key 是用户的ID,value 是 A A A 的一列
    • 给定用户ID,返回一个向量(用户的embedding)
  3. 矩阵 B B B 的存储和索引比较复杂。不能简单地用 key-value 表

线上服务

在训练好模型,并且把 embedding 向量做存储之后,可以开始做线上服务,某用户刷小红书的时候,小红书开始在后台做召回:

  1. 把用户ID作为 key,查询 key-value 表,得到该用户的向量,记作 a a a
  2. 最近邻查找:查找用户最有可能感兴趣的 k 个物品,作为召回结果
    • i i i 号物品的 embedding 向量记作 b i b_i bi
    • 内积 < a , b i > <a,b_i> <a,bi> 是对第 i i i 号物品兴趣的预估
    • 返回内积最大的 k 个物品

这种最近邻查找有一个问题:如果枚举所有物品,时间复杂度正比于物品数量,这种计算量是不可接受的。比如小红书有几亿篇笔记,逐一计算向量 a a a 和每一个向量 b b b 的内积是不现实的,做不到线上的实时计算

近似最近邻查找(ANN)

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

  • 支持的系统有:Milvus, Faiss, HnswLib等等

  • 衡量最近邻的标准:

    • 欧氏距离最小(L2距离)
    • 向量内积最大(内积相似度)
    • 向量夹角余弦最大(cosine相似度,推荐系统最常用),把所有向量都做归一化,让它们的二范数都等于 1,那么此时内积等于余弦相似度
  • 如下图,其中 a 是一个用户的embedding,我们需要召回用户感兴趣的物品,这就需要计算 a 与所有点的相似度。如果用暴力枚举,计算量正比于点的数量,即物品的数量

  • 想要减少最近邻的查找的计算量,必须避免暴力枚举

在这里插入图片描述

  • 我们在查找之前,先对数据做预处理,对数据进行如下图的划分:对于如何划分取决于最近邻的标准
    • 如果是余弦相似度,那么划分结果就是这样的扇形
    • 如果是欧式距离,那么结果就是多边形

在这里插入图片描述

  • 划分之后,每个区域用一个向量表示,比如下面的蓝色区域用那个蓝色箭头的向量表示。黄色区域用图中黄色的向量表示。
  • 这些向量的长度都是 1。
  • 划分之后建立索引,把每个区域的向量作为 key,区域中所有点的表作为 value。给定一个蓝色向量,就应该取回蓝色扇形中所有的点

/

  • 现在在划分之后,每个区域都用一个单位向量来表示。那么如果我们划分成 1w 个区域,索引上就会一共有 1w 个 key 值。每个向量是一个区域的key值

在这里插入图片描述

  • 给定一个向量,就可以快速取回区域中的所有点。这样我们就可以快速做召回了
    在这里插入图片描述
  • 现在我们要做推荐,给定一个用户的 embedding 向量 a。我们首先把向量 a 和索引中的向量做对比,计算它们的相似度
  • 如果物品数量是几亿,索引中的 key 数量也只有几万而已,这一步的计算开销不大

在这里插入图片描述

  • 计算相似度之后,我们会发现橙色的向量和 a 最相似
  • 通过索引,我们可以找到这个区域内所有的点,每个点对应一个物品
  • 接下来计算 a 和区域内所有点的相似度。如果一共有几亿个物品被划分到了几万个区域,平均每个区域只有几万个点,所以这一步只需要计算几万次相似度,计算量不大

在这里插入图片描述

  • 假如我们想要找到和向量 a 夹角最小的三个点,那么我们会找到蓝色框住的三个点,代表三个物品。这三个物品就是最近邻查找的结果
  • 哪怕有几亿个物品,用这种方法查找,最终也只需要几万次查找,比暴力枚举快 1w 倍

在这里插入图片描述

总结

在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# 事件(订阅事件和触发事件)

订阅事件 订阅者向事件添加事件处理程序。对于一个要添加到事件的事件处理程序来说&#xff0c;它必须具有 与事件的委托相同的返回类型和签名。 使用运算符来为事件添加事件处理程序&#xff0c;如下面的代码所示。事件处理程序位于该运 算符的右边。事件处理程序的规范可以…

64页精品PPT | 基于DeepSeek的数据治理方案AI大数据治理解决方案数据治理大模型解决方案

这份PPT文档是关于基于DeepSeek的大模型技术在数据治理方案中的应用介绍。强调数据作为新型生产要素与人工智能技术相结合的重要性&#xff0c;指出大模型凭借强大的文学理解、生成能力以及多模态数据处理能力&#xff0c;能为数据治理带来新机遇。文档详细阐述了数据资产化的路…

【文献笔记】Tree of Thoughts: Deliberate Problem Solving with Large Language Models

Tree of Thoughts: Deliberate Problem Solving with Large Language Models https://github.com/princeton-nlp/tree-of-thought-llm 标题翻译&#xff1a;思维树&#xff1a;利用大型语言模型问题求解 1. 内容介绍 1.1. 背景 决策过程有两种模式&#xff1a; 快速、自动…

使用 Mathematical_Expression 从零开始实现数学题目的作答小游戏【可复制代码】

从零开始实现数学题目的作答小游戏 开源技术栏 使用 Mathematical_Expression 让计算机做出题人&#xff0c;让代码与数学碰撞出趣味火花。 目录 文章目录 从零开始实现数学题目的作答小游戏目录 从零开始实现数学题目的作答小游戏&#xff1a;让代码与数学碰撞出趣味火花为…

DQL-9-小结

DQL-9-小结 小结DQL语句 小结 DQL语句 SELECT 字段列表 -- 字段名 [AS] 别名FROM 表名列表WHERE条件列表 -- >、 >、 <、 <、 、 <>、 like、 between ... and、 in、 and、 or, 分组之前过滤 GROUP BY分组字段列表HAVING分组后条件列表 -- 分组之后…

[netty5: WebSocketServerHandshaker WebSocketServerHandshakerFactory]-源码分析

在阅读这篇文章前&#xff0c;推荐先阅读以下内容&#xff1a; [netty5: WebSocketFrame]-源码分析[netty5: WebSocketFrameEncoder & WebSocketFrameDecoder]-源码解析 WebSocketServerHandshakerFactory WebSocketServerHandshakerFactory 用于根据客户端请求中的 Web…

数据挖掘:深度解析与实战应用

在当今数字化时代&#xff0c;数据挖掘已经成为企业获取竞争优势的关键技术之一。通过从大量数据中提取有价值的信息&#xff0c;企业可以更好地理解客户需求、优化业务流程、提高运营效率。本文将深入探讨数据挖掘的核心技术、实际应用案例以及如何在企业中实施数据挖掘项目。…

LLM面试题14

算法岗面试题 介绍下Transformer模型。 Transformer本身是一个典型的encoder-decoder模型&#xff0c;Encoder端和Decoder端均有6个Block,Encoder端的Block包括两个模块&#xff0c;多头self-attention模块以及一个前馈神经网络模块&#xff1b;Decoder端的Block包括三个模块&…

Java金融场景中为什么金额字段禁止使用浮点类型(float/double)?

引言 Java金融场景中为什么金额字段禁止使用浮点类型&#xff1f;这是一篇你不能忽视的“爆雷”警告&#xff01; 在金融、电商、支付、清结算等业务系统中&#xff0c;浮点类型是绝对禁区&#xff01; &#x1f6a8;一、核心警告&#xff1a;浮点类型不是十进制数&#xff01;…

SVN下载与拉取

大家好我是苏麟&#xff0c;今天聊一聊SVN。 SVN官网&#xff1a;下载 TortoiseSVN - TortoiseSVN 软件 根据系统选择32位还是64位 打开文件 安装&#xff0c;下一步&#xff0c;下一步 安装成功后&#xff0c;右键找到SVNcheck 输入地址 输入用户名和密码就OK了 这期就到这里…

数据结构笔记8:堆

目录 满二叉树&#xff1a; 完全二叉树&#xff1a; 堆是一种特殊的完全二叉树&#xff1a; 我们可以以数组的方式存储堆。 父节点和子节点下标关系的推导&#xff1a; 1.使用数学归纳法证明n2 1 n0&#xff1a; 2.使用边和节点的关系证明n2 1 n0&#xff1a; 我们…

3. lvgl 9.3 vscode 模拟环境搭建 lv_port_pc_vscode-release-v9.3

文章目录1. 资源下载1. 1 lv_port_pc_vscode1.2 cmake 和 mingw 环境搭建1.3 sdl 下载1.4 下载lvgl_v9.32. 环境搭建2.1 拷贝lvgl 源码到工程2.2 添加SDL2 依赖2.3 执行工程3. 运行示例1. 资源下载 1. 1 lv_port_pc_vscode 那么多模拟器&#xff0c;为什么选择这个&#xff1…

【牛客刷题】小红的爆炸串(二)

一、题目介绍 本题链接为:小红的爆炸串(二) 小红定义一个字符串会爆炸,当且仅当至少有k对相邻的字母不同。 例如,当 k k k=2时,"arc"会爆炸,而"aabb"则不会爆炸。 小红拿到了一个长度为

【实战】如何训练一个客服语音对话场景VAD模型

1. 引言:客服场景下的VAD模型 在客服中心,每天都会产生海量的通话录音。对这些录音进行有效分析,可以用于服务质量监控、客户意图洞察、流程优化等。VAD在其中扮演着“预处理器”和“过滤器”的关键角色: 提升ASR效率与准确性:只将检测到的语音片段送入ASR引擎,可以避免…

在 Dokploy 中为 PostgreSQL 搭建 PgBouncer 数据库连接池(图文)

前言&#xff1a;为什么你需要一个连接池&#xff1f; 如果你正在使用 Node.js (尤其是像 Next.js 这样的框架) 配合 Prisma 操作 PostgreSQL 数据库&#xff0c;你很可能在某个阶段会遇到那个令人头疼的错误&#xff1a;“Error: Too many clients already”。这通常发生在应…

Mac获取终端历史

在 macOS 中&#xff0c;历史记录文件的位置取决于你使用的 shell。以下是针对不同 shell 的历史记录文件的默认位置&#xff1a;对于 Bash 用户&#xff1a; 历史记录文件通常位于 ~/.bash_history。对于 Zsh 用户&#xff08;macOS Catalina及以后版本默认使用的shell&#x…

高频交易服务器篇

在 Binance 进行高频交易&#xff08;HFT&#xff09;时&#xff0c;服务器的低延迟、高稳定性和快速网络是关键。亚马逊云&#xff08;AWS&#xff09; 提供了多种适合高频交易的方案&#xff0c;以下是推荐的配置和优化策略&#xff1a;1. 选择 AWS 区域&#xff08;Region&a…

MVC与MVVM架构模式详解:原理、区别与JavaScript实现

Hi&#xff0c;我是布兰妮甜 &#xff01;在当今复杂的前端开发领域&#xff0c;如何组织代码结构一直是开发者面临的核心挑战。MVC和MVVM作为两种经典的架构模式&#xff0c;为前端应用提供了清晰的责任划分和可维护的代码组织方案。本文将深入探讨这两种模式的原理、实现差异…

从小白到进阶:解锁linux与c语言高级编程知识点嵌入式开发的任督二脉(2)

【硬核揭秘】Linux与C高级编程&#xff1a;从入门到精通&#xff0c;你的全栈之路&#xff01; 第三部分&#xff1a;Shell脚本编程——自动化你的Linux世界&#xff0c;让效率飞起来&#xff01; 嘿&#xff0c;各位C语言的“卷王”们&#xff01; 在Linux的世界里&#xf…

锁和事务的关系

事务的4大特性(ACID) 原子性&#xff08;Atomicity&#xff09;&#xff1a;事务被视为一个单一的、不可分割的工作单元一致性&#xff08;Consistency&#xff09;&#xff1a;事务执行前后&#xff0c;数据库从一个一致状态转变为另一个一致状态&#xff0c;并且强制执行所有…