推荐算法实战-五-召回(上)

一、传统召回算法

(一)基于物料属性的倒排索引

在离线时,将具有相同属性的物料集合起来,根据一些后验统计指标将物料排序。

当一个用户在线交互发出请求后,提取用户的兴趣标签,根据标签检索相应物料集合返回。

倒排索引示意

(二)基于统计的协同过滤算法

1、协同过滤的两个类型

传统的协同过滤是不是基于深度学习的,而是基于统计的。

①基于用户的协同过滤User CF

给用户a推荐与其相似的用户b喜欢的物料。

②基于物料的协同过滤Item CF

给用户a推荐与其喜欢的物料相似的物料。

2、基于Item的协同过滤

(1)机制描述

首先建立用户反馈矩阵A\in R^{m \times n},m是用户个数,n是物料个数。如果用户u和物料t交互过,那么A[u][t]=v,v可以来自于显式交互,比如打分,也可以来自于隐式交互,比如点击次数等指标。

由于大部分用户交互过的物料没那么多,因此A是比较稀疏的。

再计算物料相似矩阵S=AA^T,其中S[i][j]表示第i个物料和第j个物料的相似程度。

在为用户u召回时,可以通过计算r_u=A[u,:]S,其中r_u表示用户u对所有物料的喜好程度,根据数值大小排序后向用户推荐。

(2)优点
  • 比起数据量庞大的用户数量,物料相对稳定且数量相对较小,S可以离线计算好。
  • 可以使用MapReduce分布式算法进行S的计算。
  • 可以采用cosine、欧几里得距离等来进行相似度的计算。

(三)矩阵分解MF算法

1、MF机制

MF定义一个反馈矩阵A,同Item CF中定义相同。A中空的位置用MF预测填充,有数值的则代表用户u与物料t的显式\隐式交互指标。

定义一个预测矩阵P \in R^{m \times n},用户隐向量矩阵U \in R^{m \times k},物料隐向量矩阵V \in R^{n \times k}。有公式P=UV^T。在MF中要学习优化的便是U和V,根据A中非空值进行训练模型,使P中相应位置的值靠近A中值。训练好U和V后,P[u,:]中筛选出得分最高且未被用户u消费过的前k个物料进行推荐(未被消费过的物料在A[u,:]中以空值形式存在)。

矩阵分解示意

2、MF缺点

  • 只能将user id和item id当做feature,信息来源受限。
  • 对于没有参与训练的新用户和新物料,无法进行预测。

(四)如何合并多路召回

1、多路召回的作用和细节

多路召回有冗余防错和互相补充的作用。

将多路召回的结果合并成一个结果集,去重后再传递给下游模块。若超过了下游模块接收处理能力,那么实施截断。

2、多路召回合并

①错误的合并思路:将不同路的召回先人工评估重要性,重要性高的召回子序列先加入结果集,直到达到一定限度为止,剩下路的召回被截断。

②正确的合并思路:实施多轮多路召回合并,每次每路选取一小部分精华加入结果集,直到达到一定的限度。

二、向量化召回统一建模框架

(一)向量化召回简述

1、定义

向量化召回Embedding-based Retrieval,是将召回问题建模成向量空间内最近邻搜索问题。

2、类型

  • U2I:为用户找到其可能喜欢的物料。
  • I2I:推荐与用户喜欢的物料相似的物料。
  • U2U2I:推荐与用户相似的用户喜欢的物料。

3、机制描述

(1)机制:用户和物料都被映射到同一个向量空间

  • 每个物料实例喂给模型后都被映射成向量,然后这些向量被存入faiss等向量数据库中,建立索引。
  • 在线交互时,针对用户实例q,将其喂给模型映射成向量,然后在向量数据库中通过ANN算法查找与用户向量最为邻近的K个物料向量,将对应的物料返回。

(2)关注的问题

  • 如何定义正样本,即哪些用户向量和物料向量应该邻近。
  • 如何定义负样本,即哪些用户向量和物料向量应该远离。
  • 如何映射成向量。
  • 如何优化目标。

(二)如何定义正样本

1、关注的问题

哪些q向量(表示用户向量)和t向量(表示物料向量)在向量空间中的距离应该相近。

2、三种类型

  • I2I:同一个用户在同一个会话session(较短的用户行为序列)中交互过的物料向量应该相近,体现两个物料之间的相似性。
  • U2I:一个用户与其交互过的物料在向量空间中应该是相近的。
  • U2U

(三)如何定义负样本

1、负样本主要依靠随机采样

喂入召回模型中的负样本主要依靠随机采样。负样本在召回中地位非常重要。

2、怎么随机采样

随机采样一些样本作为负样本,与正样本相差过大的负样本被称为easy negative,与正样本优点相似的负样本被称为hard negative(比如对于一只狗而言,狐狸是hard negative,猫是easy negative)。

在召回模型中以easy negative为主,辅以hard negative。这是因为召回是从海量候选集中选出用户比较感兴趣的物料、筛去用户无感的物料,因此easy negative的数量优势能保证召回的基本精度。

(四)解耦生成embedding

1、排序鼓励交叉

  • 特征策略:通过将特征交叉挖掘新模式。
  • 模型结构:通常将用户特征、物料特征、交叉特征拼接成一个大向量共同喂给DNN,一般在第一个FC(全连接层)以后就分不清哪一位属于哪个特征了。

2、召回要求解耦

  • 召回要求解耦的原因:因为召回面对的候选集太大了,交叉以后代价过大。
  • 召回解耦的实现:(1)在离线时,计算好每个物料的embedding,存入faiss等向量数据库,建立检索。(2)用户在线交互时,计算用户的embedding向量,利用ANN算法等在faiss中检索相应物料并返回。

(五)如何优化目标

1、召回中用户物料匹配程度衡量方法

采用用户embedding和物料embedding的点积或者cosine来衡量两者的匹配程度,值越大越匹配。

2、召回与排序的精度要求

  • 召回面对的候选集很大,不追求预测值的绝对准确,而是要求排序的相对准确,只要能够筛选出用户可能感兴趣的物料即可。因此常用的一些的loss遵循learning-to-rank(LTR)思想。
  • 由于召回面对的数据中正样本是来自于真实数据,而负样本是随机采样得到的,因此在召回的过程中要求对正样本预测地较好即可,常采用多分类的softmax loss。

3、召回Loss

(1)NCE Loss

①Softmax Loss

优化目标是用户u和其交互过的物料t的向量越邻近越好,可以表示为以下公式:

L_{softmax}=-\frac{1}{|B|}\sum_{(u_i,t_i)\in B}log\frac{exp(u_i,t_i)}{\sum_{j\in T}exp(u_i,t_j)}

其中B表示一个batch,|B|是B中样本的数量,T是包含所有物料的集合,其中(u_i,t_i)被看做B中一个样本。Softmax loss将召回看成一个多分类问题,每个物料看为一类。由于量级过大,因此采用NCE Loss来简化分母。

②NCE Loss(Noise Contrastive Estimation)

NCE loss将softmax loss的超大多分类问题简化成了一个二分类问题(正样本和负样本)。其中正样本是与用户交互过的物料组成的,负样本是随机采样得到的。用G(u,t)来表示一个样本是正样本的logit如下式所示:

G(u,t)=log\frac{P(t|u)}{Q(t|u)}=logP(t|u)-logQ(t|u)

其中P表示用户u确实喜欢物料t的概率,而Q表示物料t是噪声的概率,比如说用户不喜欢物料t但是因为它太过热门被误点。

我们可以用u_i和t_i的点积来表示用户u确实喜欢物料t的概率,则可简化上式如下:

G(u,t)=log\frac{P(t|u)}{Q(t|u)}=u\cdot t-logQ(t|u)

-logQ(t|u)项的作用是为了防止热门物料被过度惩罚,因为大部分的噪声都来自于热门物料。这个修正项可以使用户u适当靠近热门物料,是一种补偿。-logQ(t|u)修正只发生在训练阶段,预测阶段不使用。

因此可以采用G(u,t)计算Binary Cross-Entropy Loss,就得到NCE Loss,公式如下:

L_{NCE}=-\frac{1}{|B|}\sum_{(u_i,t_i)\in B}[log(1+exp(-G(u_i,t_i)))+\sum_{j \in S_i}log(1+exp(G(u_i,t_j)))]

进一步简化计算,忽略修正项得到NEG(negative sampling loss)如下:

L_{NEG}=-\frac{1}{|B|}\sum_{(u_i,t_i)\in B}[log(1+exp(-u_i,t_i))+\sum_{j \in S_i}log(1+exp(u_i,t_j))]

NEGloss的优点在于:计算简便。而NCE的优点在于当负样本物料足够充足的时候,NCE梯度与softmax loss的梯度趋于一致。

(2)Sampled Softmax Loss

假设有一个推荐系统,其中需要从 1000 万个候选项中推荐商品给用户。如果使用标准的 Softmax Loss,你需要计算每个候选项的概率并归一化。而使用 Sampled Softmax Loss,你可以随机选择一小部分候选项(如1000个)进行计算,其中包括正样本(用户实际点击的商品)和若干负样本。这大大减少了计算负担,并使得模型能够在大规模数据集上有效训练。

(3)Pairwise Loss

Pairwise Loss是Learning-to-rank的一种实现。每个样本都是由用户、正样本(用户消费过的样本)、随机取样的负样本的embedding向量组成的三元组。优化目标是,用户与正样本的匹配程度要远远高于和负样本的匹配程度,因此可以采用一种Marginal Hinge Loss,表示如下:

其中m是一个超参数,为边界值。

为了减少调节超参m的麻烦,可以使用BPR loss(Bayesian personalized ranking loss)。BPR Loss的优化思想为针对用户u_i其正确排序(即正样本的排在负样本前面)的概率P_correctorder最大化。

三、借助Word2Vec

(一)Word2Vec简介

1、Word2Vec功能

Word2Vec的目标是每个单词都能学习到表征其意义的稠密向量,也就是Word embedding。

2、Skip-Gram

利用Skip-Gram实现上述目标,就是给定一个中心词w,去预测哪些词c能够出现在它的上下文中。

采用NEG loss训练有:

L_{word2vec}=-\frac{1}{|B|}\sum_{(u_i,t_i)\in B}[log(1+exp(-w_i,c_i))+\sum_{j \in S_i}log(1+exp(w_i,c_j))]

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

直方图均衡化

概念 直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法,通过拉伸像素强度分布范围来增强图像对比度。 原理 均衡化指的是把一个分布 (给定的直方图) 映射 到另一个分布 (一个更宽更统一的强度值分布),从而令强度值分布会在整个范围内…

CSS知识点详解:div盒子模型

盒子模型: 边框: border-color:边框颜色 border-width:边框粗细 1.thin 2.medium 3.thick 4.像素值 border-width:5px ; border-width:20px 2px; border-width:5px 1px 6px; border-width:1px 3px 5px 2px; 这个简写属性…

Java二十三种设计模式-责任链模式(17/23)

责任链模式:实现请求处理的灵活流转 引言 在这篇博客中,我们深入探讨了责任链模式的精髓,从其定义和用途到实现方法,再到使用场景、优缺点、与其他模式的比较,以及最佳实践和替代方案,旨在指导开发者如何…

基于springboot框架的电影订票系统_wqc3k

TOC springboot611基于springboot框架的电影订票系统_wqc3k--论文 绪 论 1.1研究背景和意义 随着科学技术的不断发展,计算机现在已经成为了社会的必需品,人们通过网络可以获得海量的信息,这些信息可以和各行各业进行关联,电影…

Selenium + Python 自动化测试22(PO+数据驱动)

我们的目标是:按照这一套资料学习下来,大家可以独立完成自动化测试的任务。 上一篇我们讨论了PO模式和unittest框架结合起来使用。 本篇文章我们综合一下之前学习的内容,如先将PO模式、数据驱动思想和我们生成HTML报告融合起来,综…

如何应对突发技术故障和危机:开发团队的应急策略

开发团队如何应对突发的技术故障和危机? 在数字化时代,软件服务的稳定性对于企业至关重要。然而,即使是大型平台,如网易云音乐,也可能遇到突发的技术故障。网页端出现502 Bad Gateway 报错,且App也无法正常…

如何生成随机数(通过rand函数,srand函数,time函数深入讲解)

目录 1. 随机数的生成 2. srand函数 3. time函数 4. 设置随机数的范围 1. 随机数的生成 既然是猜数字游戏,那么最终的数字答案肯定是重要的,我们要如何实现这个随机数的生成呢? 在这个功能上,C语言提供了一个函数叫rand&…

数据库多表设计:深入理解一对多、一对一、多对多关系 【后端 12】

数据库多表设计:深入理解一对多、一对一、多对多关系 在数据库设计中,表之间的关系决定了如何组织和存储数据。常见的表关系包括一对多、一对一和多对多。在不同的业务场景下,我们会选择不同的关系模式进行数据库设计。本文将通过具体案例介绍…

Excel技巧(一)

快捷键技巧 原文链接 选取某一行的数据直到最后一行:【CTRL SHIFT ↓ 】或者选取一行后按住SHIFT键,双击下边线就可以快速选取区域。 如果表格中有多行空行,可以先按CTRL SHIFT END,再按CTRL SHIFT 上下键调整,…

网络安全之xss靶场练习

目录 一、xss靶场练习 1、Ma Spaghet! 2、Jefff 第一个方法 第二个方法 3、Ugandan Knuckles 4、Ricardo Milos 5、Ah Thats Hawt 6、Ligma 7、Mafia​编辑 8、Ok, Boomer 一、xss靶场练习 靶场地址 https://xss.pwnfunction.com/ 页面显示如下 1、Ma Spaghet! 分析…

移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——6.vector

1.杨辉三角 . - 力扣&#xff08;LeetCode&#xff09; 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 class Solution { public:vector<vector<int>> generate(int numRows) {vector<vector<int>> arr;int i 0;int j 0;for (i…

CSS“叠叠乐”——WEB开发系列16

在现代前端开发中&#xff0c;CSS 是控制网页外观和布局的核心工具。随着项目的复杂化和样式规则的增加&#xff0c;CSS 层叠&#xff08;cascade&#xff09;变得更加重要。为了更好地管理和控制样式规则的应用&#xff0c;CSS 引入了层叠层&#xff08;cascade layers&#x…

Qt入门学什么?

Qt是一个跨平台的C图形用户界面应用程序框架&#xff0c;它为应用程序开发者提供建立图形界面所需的所有功能。Qt框架以其面向对象、易于扩展的特性而受到广泛欢迎&#xff0c;并且支持多种平台&#xff0c;包括桌面、嵌入式和移动平台 。 对于Qt的入门学习&#xff0c;可以通过…

前端3d动画-----平移 transform: translate3d()

必须加这个属性&#xff1a;transform-style: preserve-3d; perspective: 900px; 设置了景深才能感到近大远小的感觉 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible&q…

ESP32 分区表介绍

前言 个人邮箱&#xff1a;zhangyixu02gmail.com关于分区表&#xff0c;很多人看了很多资料很可能依旧是一脸懵逼。不知道各位有没有玩过 EEPROM&#xff0c;他可以断电保存数据。这里你也可以理解为分区表将 Flash 中划分出来了一个 EEPROM。虽然这样说从专业的角度是毫无疑问…

对于llama3.1 8B模型,FP32和BF16混合精度训练,用的是AdamW优化器,模型训练时占用显存分析

目录 为什么先不考虑激活值的显存占用 1. 模型参数 含义 计算 2. 梯度参数 含义 3. 优化器参数 含义 4. 较固定总显存占用 计算 详细解释 5. 激活值计算&#xff1a; 计算公式 插入数值 计算步骤 结论 显存主要被用在四个模块上&#xff1a; 模型权重本身 梯度…

C语言基础(十一)

1、指针&#xff1a; C语言中的指针是一种非常重要的数据类型&#xff0c;可以直接访问和操作内存地址。指针存储变量的内存地址&#xff0c;而不是变量的值本身。通过使用指针&#xff0c;可以灵活地控制数据的存储和访问&#xff0c;实现复杂的数据结构如链表、树。 定义指…

Redis (day 3)

一、通过jedis连接数据库 1.首先导入依赖 <!-- https://mvnrepository.com/artifact/redis.clients/jedis --><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>5.1.0</version></de…

Mac系统安装Homebrew【已成功】

1、正常安装失败原因 1.1命令行安装失败 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" 原因 没挂&#x1fa9c;&#xff0c;不过我挂了梯子安装很多次也还是失败&#xff0c;所以可能是网站原因 1.2、网…

MyBatis进阶-1-面向接口编程

通过 MyBatis 底层自动创建接口实现类&#xff0c;我们可以直接对接口的方法进行编程 若简单的 sql 语句可以使用注解的方式进行&#xff0c;复杂的查询建议使用 xml 文件编写语句 注解使用时直接在接口的方法上加上对应语句的注解即可&#xff0c;而使用 xml 需要在文件中的…