每周一文(六)Facebook EBR向量召回模型

article/2025/8/27 15:38:20

契机

从样本和模型两方面来介绍向量级别召回模型的由来。提出很有建设性的工业级别的参考价值。

样本角度

有监督的二分类模型需要构建正负样本,正样本的选择不管是召回和排序来说都是一致的,即用户有显式的点击行为的样本为正样本。而对于召回模型(甚至对于粗排模型)来说,负样本的选择至关重要,如下会介绍正样本的构建方法和两种级别的负样本构建方法。

正样本抽样

有些item在用户显式点击反馈中出现的次数过高,这会导致召回模型会被这些item绑架,因而需要对用户显式点击反馈中的item进行抽样,被抽到的概率为如下公式,其中 Z ( w i ) Z(w_i) Z(wi)代表item在整个item库中出现的频次。

P p o s = ( Z ( w i ) 0.001 + 1 ) 0.001 Z ( w i ) P_{pos}=(\sqrt{\frac{Z(w_i)}{0.001}}+1)\frac{0.001}{Z(w_i)} Ppos=(0.001Z(wi) +1)Z(wi)0.001

这里抄这位大神的图,可以看出抽样概率和item出现频次是呈反比的,即出现频次越高,其抽取的概率越低。
在这里插入图片描述

负样本构建之easy negative

顾名思义,easy negative即模型比较容易判别出来的负样本,这些负样本必须特别"负"才行,换句话说就是和用户兴趣八竿子打不着的item会被当做easy negative,这样才能更好的模拟线上数据分布。

负样本构建之hard negative

送到召回模型的负样本不能只有比较容易区分的easy negative,也必须有一些较为难分的样本,即为这里的hard negative。文章中所提到的hard negative是线上召回模型排序后位置不前不后的item作为hard negative来用,这样的效果是最好的。

负样本抽样

构建好负样本后,也会面临和正样本一样的问题,即冷门和热门的问题,因而这里抽样的公式如下,其中 n ( w i ) n(w_i) n(wi)代表的是item在整个item库中出现的频次。

P n e g = n ( w i ) α ∑ j n ( w j ) α P_{neg}=\frac{n(w_i)^\alpha}{\sum_j{n(w_j)}^\alpha} Pneg=jn(wj)αn(wi)α

该公式能够兼备冷门和热门的问题,证明过程为如下代码:

import numpy as np# 每个item出现的频次
>>> x = np.array([10, 20, 30, 50]) # 没有特殊处理的各item抽样概率
>>> x / sum(x)
array([0.09090909, 0.18181818, 0.27272727, 0.45454545]) # 处理过的各item抽样概率,可以发现热门资源被抽中的概率被打压下来
# 而且冷门资源抽中概率被放大
>>> x ** 0.75 / sum(x ** 0.75)
array([0.12040937, 0.20250362, 0.27447401, 0.402613  ])

曝光未点击为"鸡肋"

这只是针对召回模型来说,用户未点击并不代表用户显式的不喜欢这些资源,而只是更加喜欢那些他们主动点击的资源,这也是召回和排序对于样本层面的不同之处。文章中也提到,用曝光未点击样本作为负样本,并没有指标上的显著提升。

模型角度

这里阐述两个概率:easy model和hard model。easy model是用easy negative作为负样本训练出的模型,hard model是用hard negative作为负样本训练出的模型。而且这里的"模型角度"主要想阐述的是不同模型之间的融合方式。

并行融合:不同模型的加权求和。
串行融合:先过easy model,再过hard model,这其实和召回+粗排的逻辑是一样的。

参考

  1. 负样本为王
  2. facebook EBR模型
  3. word2vec中的正负样本采样方法

http://chatgpt.dhexx.cn/article/NyMa8DRw.shtml

相关文章

主引导记录(MBR)、硬盘分区表(DPT)、扩展引导记录(EBR)

前言 最近在研究使用grub引导自制操作系统时,发现grub链式引导过程中向boot传递的硬盘分区表表项数据有疑问,特此记录下。 一、主引导记录(MBR) MBR是存储在计算机硬盘的第一个物理扇区的512字节的数据块,它包含了引…

MES管理端介绍,ebr二次开发产品—SIMATIC IT EBR(Opcenter Execution Pharma)

原文来至:访问原文 西门子MES软件ebr功能很强大,但给用户若只想查看一些数据是非常不方便,对外接口提供的文档也不具体,所以我二次开发了EBR的管理端。 主要功能 权限管理物料管理工单管理族谱批记录查看报表与看板审计追踪记录 …

NTFS文件系统详解(二)MBR\EBR基本信息

NTFS文件系统详解(二)MBR\EBR基本信息 一、MBR结构分析1. 第一个分区表项2. 第二个分区表项3. 第三个分区表项4. 第四个分区表项 二、EBR结构分析1. 第一个分区表项2. 第二个分区表项2.1 第一个分区表项2.2 第二个分区表项2.3 第三个分区表项 NTFS文件系…

MBR、EBR与DBR详解

demo:https://github.com/Hilaver/NtfsResolution/ 先看一张硬盘图片(一个盘面): MBR 主引导记录(MBR,Main Boot Record)是位于磁盘最前边的一段引导(Loader)代码。它负…

MBR、EBR、DBR是什么

通常情况下可以这样描述这几个概念: MBR:为计算机启动后从可启动介质上首先装入内存并且执行的代码,通常用来解释分区结构。以硬盘为例,通常为LBA的0扇区。 EBR:自MICROSOFT推出扩展分区的概念后,扩展分区就沿用了基本…

NTFS文件系统详解(二)之MBR(EBR)基本信息

经过上一篇文章对硬盘的基本结构的详细介绍后,我们再来看看MBR和EBR的结构 MBR(Main Boot Record 主引导记录区)位于整个硬盘的0磁道0柱面1扇区。不过,在总共512字节的主引导扇区中,MBR只占用了其中的446个字节,另外的64个字节交给了 DPT(Disk Partition Table硬盘分区表…

EBR内容解析

原先博客放弃使用,几篇文章搬运过来 EBR(Extended Boot Record)即扩展分区引导记录.类似于主引导记录MBR.因为MBR的四条分区信息的限制,可以使用EBR方便扩展. 它的结构与MBR类似于,但是没有引导程序和磁盘签名,仅仅保留了分区表和结束标志. 下面以实例分析: 新建一个512MB虚拟…

C++中常见的几种输入字符串的方法

C中常见的几种输入字符串的方法_是赵薰薰呀的博客-CSDN博客_c输入字符串 可以用的函数 substr substr有2种用法: 假设:string s "0123456789"; string sub1 s.substr(5); //只有一个数字5表示从下标为5开始一直到结尾:sub1 &…

MATLAB-字符串

本节我们学习如何在MATLAB中创建一个字符串。 例如: my_string 搬砖工程师domi MATLAB执行上述语句,返回以下结果: my_string 搬砖工程师domi MATLAB 认为所有变量,数组和字符串被视为字符数组。 让我们使用命令检查上面创建…

c语言:动态输入字符串数组

考研题中经常会遇到给定一条英文句子,让我们对其每个单词进行操作,不同于对整型数据操作,字符串在c语言中必须存放到数组中,无形之中又给考题增加了难度 一般情况下,字符串数组都以二维数组或指针数组定义&#xff0c…

用scanf_s输入字符串

用的是vs2019。 为了安全,scanf_s输入字符串时需要加一个数字来限制最多读取的字符数。 错误示例: char* str[100]; scanf_s("%s",str);这样写编译器没有报错,但是运行会出错,debug显示 正确写法: char…

写一函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度。

写一函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度。 解题思路&#xff1a; 字符串以\0作为结尾&#xff0c;则从第一个字符开始向后移动遇到\0认为字符串结束。 答案&#xff1a; #include <stdio.h> int mystrlen(char *str) {int len 0;char *pt…

C++输入字符串的几种方式

最近有复习到 C 基础知识&#xff0c;这里总结下在 C 中输入字符串的几种方式&#xff0c;有需要的可以参考&#xff1a; 1、cin >> <1> 输入一个数字 void Cin1() {int a, b;cin >> a >> b;cout << "a b " << a b <&l…

c语言如何用循环输入字符串,C语言使用scanf连续输入字符串出现的问题

#include int main() { char a,b; scanf("%c",&a)&#xff1b; scanf("%c",&b); printf("%c,%c",a,b); } 一段看上去很简单的代码&#xff0c;即使是C语言初学者也能看懂。 可是在运行的时候却出现了问题&#xff1a; ①输入a后按下回车…

c语言用scanf输入指针字符串,c语言如何用scanf输入字符串

在C语言中&#xff0c;可以使用“scanf(“格式控制字符串”,变量内存地址)”语句输入字符串。scanf()函数的第一个参数是格式字符串&#xff0c;它指定了输入的格式&#xff0c;并按照格式说明符解析输入对应位置的信息并存储于可变参数列表中对应的指针所指位置。 本教程操作环…

C++中输入字符串的几种方法

C中输入字符串的几种方法 C的字符串输入方式有 1.cin>> 2.cin.get() 3.cin.getline() 4.getline() 5.gets()cin 第一种用法是逐个输入数字或者字符&#xff0c;中间用空格隔开。 第二种用法是读入一个字符串&#xff0c;遇到“空格”“TAB”“回车” 都会结束。例如&a…

C语言输入字符串

文章目录 1.scanf2.gets 1.scanf 输入字符串使用 %s。不能读取空格&#xff0c;遇到空格自动结束。例如&#xff0c;输入abcde&#xff0c;得到abcde&#xff1b;而输入abc de&#xff0c;只能得到abc。输入格式&#xff1a;scanf("%s",str)。其中str表示 地址值。 …

【C语言】字符串输入的三种方式

一、gets() 该函数原型为&#xff1a; # include <stdio.h> char *gets(char *str);gets() 函数的功能是从输入缓冲区中读取一个字符串存储到字符指针变量 str 所指向的内存空间 # include <stdio.h> int main(void) {char a[256] {0};gets(a);printf("%s…

字符串输入的2种常用方法详解

字符串输入的2种常用方法详解 一.scanf函数1.扫描集2.逆向使用扫描集 二.gets函数 一.scanf函数 int main() {char arr[50] { 0 };scanf("%s", arr);printf("%s", arr);return 0; }这种方法可以输入字符串&#xff0c;但是只能输入一个词&#xff0c;遇到…

字符串的输入

字符串数据作为经常需要使用的数据&#xff0c;我们需要掌握它的输入&#xff0c;下面总结了不同的输入字符串的方式 c和c的有一点点不同 ①逐个逐个字符输入 我们可以设置一个数组&#xff0c;或者数组加指针的形式&#xff0c; 通过for循环或while循环的方式&#xff0c;…