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

2024-08-26 06:28
文章标签 算法 实战 推荐 召回

本文主要是介绍推荐算法实战五-召回(下),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、FM的召回功能

(一)打压热门物料

FM主要应用于U2I召回场景正样本采用与用户正向交互过的样本。负样本来源于两个途径,一个是随机采样,一个是曝光但未点击的负向物料。由于热门物料曝光率高,因此正负样本中热门物料参与度都不小,为了确保推荐结果的多样性,对正负样本分别采取不同的热门物料打压策略。

1、热门物料在正样本中要降采样

降低热门物料被选为正样本的概率,曝光率越高,选为正样本的概率就越低。定义一个物料t_i能被任何用户选为正样本的概率P_post(t_i)为:

α是一个超参数,可以认为是冷门物料的门槛,当f(t_i)<=α并且被用户点击过,那么可以认定为正样本。

2、热门物料在负样本中要过采样

负样本采样需要满足以下两个要求:需要尽可能广泛地采样负样本,覆盖尽可能多的物料样本;采集一些热门物料来抵消少数热门物料垄断正样本的情况。负采样概率如下所示:

其中V是所有物料的集合。当超参数b为1的时候,对热门物料的打压力度最大;当超参数b为0的时候,则是uniform sampling,任何物料选为负样本的概率都一样大。

(二)增广Embedding

 拆解得到用户特征和物料特征后,用FM表示用户u和物料t的匹配程度如下式所示:

W_t是一阶物料特征权重之和,W_u是一阶用户特征权重之和,V_uu是用户特征集内部两两交叉,V_tt是物料特征集内部两两交叉,V_ut是用户特征和物料特征的两两交叉。

由于b、W_u、V_uu对于不同物料都是相同的,因此可以省略这三项,后面变成向量内积的形式求解:

E_u是在在线召回时实时计算得到的用户向量。E_t是物料向量,离线计算好存入faiss建立索引。面对新用户V_ut提供的信息有限,主要依赖W_t和V_tt。训练的时候没必要将用户向量和物料向量拆开,只在预测时使用上式。

FM召回的主力函数如下所示:

二、大厂主力:双塔模型

(一)不同场景下的正样本

1、I2I

同一个用户在同一个会话中交互过的两个物料可以组成为正样本。

2、U2I

用户和其交互过的物料可以组成正样本。

3、U2U

用户一半历史行为和另外一个用户一半历史行为,基于同一个兴趣爱好的,可以组成为正样本。

(二)简化负采样

1、Batch内负采样

  • 方式:u_i交互过的物料表示为t_i,负样本则由一个batch中其他正样本中除了t_i以外的物料t_j和u_i组成。
  • 优点:因为t_j在正样本中被计算过了,复用向量t_j避免了大量重复计算。
  • 缺点:一个batch内大部分正样本都被热门物料垄断了,因此负采样得到的物料大多是热门物料,这是hard negative。缺少与用户兴趣毫不相干的easy negative。这种现象被称为样本选择偏差sample selection bias(SSB)。
Batch内负采样示意

2、混合负采样

为了解决batch内负采样造成的样本选择偏差,采用混合负采样策略(mixed negative sampling)

主要思想如下:

  • 额外建立了向量缓存,缓存多个Batch的物料向量。
  • batch内负采样作为hard negative。
  • 额外从向量缓存中取出之前计算好的物料向量作为easy negative。
混合负采样示意

(三)双塔结构特点

塔内可以复杂,塔间不能。

1、单塔可以很复杂

  • 塔就是一个DNN。
  • U2I的话就是将用户特征输入用户塔,物料特征喂给物料塔,输出embedding。
  • 塔底座可以很宽,不局限于user ID,item ID这两种特征,可以接受的特征很丰富。
  • 塔高可以足够高,实现充分的交叉。
双塔模型结构示意

2、双塔一定要解耦

  •  解耦:①在特征上解耦:不使用物料特征和用户特征的交叉特征。②在结构上解耦:不能像DIN那样使用候选物料特征对用户行为序列做attention。③补充:用户特征向量和物料特征向量只有最后一步才点积交叉。
  • 将用户行为序列接入用户塔:①最简单的方式是average pooling,但是这样会将所有历史行为视为相同重要。②由于无法使用候选物料对用户历史行为序列做attention,因此可以采用以下方式:(1)利用用户搜索文本当做query。(2)阿里巴巴将用户画像当做query给历史行为打分。(3)微信利用用户行为序列中最后交互的物料来体现用户最新行为兴趣,来衡量历史行为的重要性。

(四)sampled softmax loss的技巧

双塔模型常用的基于Batch内负采样的sampled softmax loss。

其中G(u,t)表示物料和用户的匹配程度。

1、L2正则化

已知u表示用户向量,t表示物料向量。每个向量都除以向量的L2正则,这样就将点积求匹配度转换成了cosine。由于cosine的范围在-1到1,更容易衡量匹配度。

2、温度调整难度

\tau被称为温度,由Tower loss可知,应当使得正样本的匹配程度尽量大,负样本的匹配程度尽量小。因此当负样本训练得不够好的时候,1/\tau就会放大这个问题,导致分母变大,损失增加,没被训练好的负样本就会被重新聚焦。

  • \tau设置的足够小的时候,对错误放大的功能很强,会将与用户交互过的物料牢牢记住,而将没有交互过的物料与用户向量强行分开,这样推荐精度很高,但是兴趣覆盖不够。
  • \tau设置的足够大的时候,对错误放大能力较弱,会突破信息茧房来为用户推荐更广兴趣范围的物料,但是有损精度。

3、采样概率修正

除了batch内负采样之外,引入向量缓存中的物料向量作为负样本。

(五)Tensorflow实现双塔

class MovielensModel(tfrs.models.Model):"""电影推荐场景下的双塔召回模型"""def __init__(self, layer_sizes):super().__init__()self.query_model = QueryModel(layer_sizes)  # 用户塔self.candidate_model = CandidateModel(layer_sizes)  # 物料塔self.task = tfrs.tasks.Retrieval(......)  # 负责计算Lossdef compute_loss(self, features, training=False):# 只把用户特征喂入“用户塔”,得到user embedding "query_embeddings"query_embeddings = self.query_model({"user_id": features["user_id"],"timestamp": features["timestamp"],})# 只把物料特征喂入“物料塔”,生成item embedding "movie_embeddings"movie_embeddings = self.candidate_model(features["movie_title"])# 根据Batch内负采样方式,计算Sampled Softmax Lossreturn self.task(query_embeddings, movie_embeddings, ......)class Retrieval(tf.keras.layers.Layer, base.Task):def call(self, query_embeddings, candidate_embeddings,sample_weight, candidate_sampling_probability, ......) -> tf.Tensor:"""query_embeddings: [batch_size, dim],可以认为是user embeddingcandidate_embeddings: [batch_size, dim],可以认为是item embedding"""# query_embeddings: [batch_size, dim]# candidate_embeddings: [batch_size, dim]# scores: [batch_size, batch_size],batch中的每个user对batch中每个item的匹配度scores = tf.linalg.matmul(query_embeddings, candidate_embeddings, transpose_b=True)# labels: [batch_size, batch_size],对角线上全为1,其余位置都是0labels = tf.eye(tf.shape(scores)[0], tf.shape(scores)[1])if self._temperature is not None:  # 通过温度,调整训练难度scores = scores / self._temperatureif candidate_sampling_probability is not None:# SamplingProbablityCorrection的实现就是# logits - tf.math.log(candidate_sampling_probability)# 因为负样本是抽样的,而非全体item,Sampled Softmax进行了概率修正scores = layers.loss.SamplingProbablityCorrection()(scores, candidate_sampling_probability)......# labels: [batch_size, batch_size]# scores: [batch_size, batch_size]# self._loss就是tf.keras.losses.CategoricalCrossentropy# 对于第i个样本,只有labels[i,i]等于1,scores[i,i]是正样本得分# 其他位置上的labels[i,j]都为0,scores[i,j]都是负样本得分# 所以这里实现的是Batch内负采样,第i行样本的用户,把除i之外所有样本中的正例物料,当成负例物料loss = self._loss(y_true=labels, y_pred=scores, sample_weight=sample_weight)return loss

这篇关于推荐算法实战五-召回(下)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1107795

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO