[搜广推]王树森推荐系统笔记——曝光过滤 Bloom Filter

news2025/2/25 6:31:18

曝光过滤 & Bloom Filter

曝光过滤主要在召回阶段做,主要方法是Bloom Filter

曝光过滤问题

-如果用户看过某个物品,则不再把该物品曝光给该用户。
- 原因是重复曝光同一个物品会损害用户体验
- 但长视频通常没有曝光过滤(youtube)

  • 要想做曝光过滤,需要对每个用户记录已经曝光过的物品。
    • 小红书只召回1个月以内的笔记,因此只需要记录每个用户最近1个月的曝光历史。
  • 召回之后,对于每个召回的物品做曝光过滤,判断它是否已经给该用户曝光过,排除掉曾经曝光过的物品。
    • 一位用户看过n个物品,本次召回r个物品,如果暴力对比,需要O(nr)的时间。
    • n 和 r 的量级大约是几千,暴力对比需要的计算量太大,无法使用,因此引入Bloom Filter

Bloom Filter

Bloom Filter是一种空间效率很高的概率型数据结构,把物品集合表征为一个m维二进制向量,用于判断一个元素是否在一个集合中。
它允许一些误报(false positives),但不允许误漏(false negatives)。也就是说,如果Bloom Filter说一个元素不在集合中,那么这个元素一定不在;但如果它说一个元素在集合中,那么这个元素可能在,也可能不在。
- 如果判断为no,那么该物品一定不在集合中。
- 如果判断为yes,那么该物品很可能在集合中。(可能误伤,错误判断未曝光物品为已曝光,将其过滤掉。)

原理

  1. 初始化
    • 每个用户有一个曝光物品的集合,表征为一个向量,需要m bit的存储。
    • Bloom filter有k个哈希函数,每个哈希函数把物品ID映射成介于0和m−1之间的整数。
      • k和m是需要设置的参数
  2. 插入:向集合中添加元素时,使用k个哈希函数计算该元素的哈希值,并将这些哈希值对应的二进制向量位置设为1。
  3. 查询:检查元素是否在集合中时,同样使用k个哈希函数计算哈希值,并查看这些位置上的二进制向量是否都为1。
    • 如果都为1,则元素很可能在集合中
    • 如果任何一个位置为0,则元素一定不在集合中。

示例

以k=1和k=3为例,展示如何通过哈希函数将物品ID映射到二进制向量中,并标记为1。
在这里插入图片描述
在这里插入图片描述

误伤概率

曝光物品集合大小为n,二进制向量维度为m,使用k个哈希函数。

Bloom filter误伤的概率为 δ ≈ 1 − e x p ( − k n m ) k δ ≈ 1 − exp(−\frac{kn}{m})^k δ1exp(mkn)k
- n越大,向量中的1越多,误伤概率越大。(未曝光物品的k个位置恰好都是1的概率大。)
- m越大,向量越长,越不容易发生哈希碰撞。但是m越大,需要的存储就越多
- k太大、太小都不好,k有最优取值。

认为设定可容忍的误伤概率为δ,那么最优参数为:

  • k = 1.44 ⋅ l n ( 1 δ ) k = 1.44 · ln(\frac1δ) k=1.44ln(δ1)
  • m = 2 n ⋅ l n ( 1 δ ) m = 2n · ln(\frac1δ) m=2nln(δ1)

曝光过滤的链路

召回 -> 排序 -> 实时流处理(Kafka+Flink)-> 曝光过滤服务(Bloom Filter)-> 写二进制向量
在这里插入图片描述

  • app记录所有曝光的物品
  • 用实时流处理,防止用户刷新得到重复数据
    • 把数据写入Kafka消息队列
    • 用实时流Flink计算曝光物品的哈希值
    • 结果写入bloom filter的二进制向量中
  • 曝光过滤用在召回完成之后
    • 召回服务器请求曝光过滤服务
    • 曝光过滤服务把用户的二进制向量发送给召回服务器
    • 召回服务器上用bloom filter计算召回物品的哈希值,再和二进制向量对比
    • 过滤已经曝光的物品
  • 曝光过滤之后,剩余的物品发给排序服务器

Bloom Filter的缺点

  • Bloom filter只支持添加物品,不支持删除物品。如果从集合中移除一个物品,无法消除它对向量的影响
    • 不能简单的把这个物品对应的k个哈希函数从1改成0,因为可能有其他物品也对应这个哈希函数)
  • 每天都需要从物品集合中移除年龄大于1个月的物品。但想要删除物品,要重新计算整个集合的二进制向量
    • 超龄物品不可能被召回,没必要把它们记录在Bloom filter,降低n可以降低误伤率。

视频合集链接

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

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

相关文章

JS CSS HTML 的代码如何快速封装

我们为什么要封装代码,是因为封装后的代码,会显得非常美观,减少代码的复用,方便我们更好的去维护代码,不用一个一个页面的去找去改,直接封装好的代码里面去改就可以了 目录 1.html代码封装 2.CSS代码封装 …

acme ssl证书自动续签 nginx

参考 github 官方操作 ,acme操作说明 说下我的操作 安装 acme.sh curl https://get.acme.sh | sh source ~/.bashrc 2.注册 acme.sh --register-account -m 123qq.com 如果你在配置 acme.sh 时选择了其他 CA(如 Let’s Encrypt)&#xff…

【专题】2024抖音电商母婴行业分析报告汇总PDF洞察(附原数据表)

原文链接:https://tecdat.cn/?p38651 在数字化浪潮的席卷下,抖音电商母婴行业正经历着深刻变革。当下,年轻一代父母崛起,特别是 24 至 30 岁以及 18 至 23 岁的群体成为抖音母婴行业兴趣人群的主力军。他们带来全新育儿理念&…

设计模式之 abstract factory

适用场景 一个系统要独立于它的产品的创建、组合和表示时。一个系统要由多个产品系列中的一个来配置时。当你要强调一系列相关的产品对象的设计以便进行联合使用时。当你提供一个产品类库,而只想显示它们的接口而不是实现时 架构演示 首先client这个东西可以接触到…

UE5仿漫威争锋灵蝶冲刺技能

这两天玩了一下漫威争锋Marvel Rivals,发现是UE5做的,对里面一些角色技能挺感兴趣的,想简单复刻一下技能功能,顺便复习一下学过的知识 首先把摄像机设置调整一下 CameraBoom里搜索lag 把摄像机延迟关掉 ,这样摄像机就…

尼伽OLED赋能中国移动,打造移动AI数字人透明显示屏

随着人工智能和显示技术的不断进步,中国移动紧跟科技潮流,将移动AI数字人技术与透明屏完美结合,为用户带来了前所未有的智能交互体验。基于中国移动九天大模型生成的数字人小天,便是这一创新技术的典型代表。它不仅能够实现定点播…

goview——vue3+vite——数据大屏配置系统

低代码数据大屏配置系统: 数据来源是可以动态api配置的: 配置上面的api接口后,在数据过滤中进行数据格式的转化。 以上内容,来源于https://gitee.com/dromara/go-view/tree/master-fetch/ 后端代码如下,需要更改…

GitLab安装|备份数据|迁移数据及使用教程

作者: 宋发元 最后更新时间:2024-12-24 GitLab安装及使用教程 官方教程 https://docs.gitlab.com/ee/install/docker.html Docker安装GitLab 宿主机创建容器持久化目录卷 mkdir -p /docker/gitlab/{config,data,logs}拉取GitLab镜像 docker pull gi…

JavaWeb Servlet的反射优化、Dispatcher优化、视图(重定向)优化、方法参数值获取优化

目录 1. 背景2. 实现2.1 pom.xml2.2 FruitController.java2.3 DispatcherServlet.java2.4 applicationContext.xml 3. 测试 1. 背景 前面我们做了Servlet的一个案例。但是存在很多问题,现在我们要做优化,优化的步骤如下: 每个Fruit请求都需…

selenium执行js

JS知识 获取元素 document.getElement 移除属性:removeAttribute("xx") 窗口移动:window.scrollTo(0, document.body.scrollHeight)方法 drivier.execute_script(js)场景: 日期选择框,不能输入,只能设置…

《信管通低代码信息管理系统开发平台》Linux环境安装说明

1 简介 信管通低代码信息管理系统应用平台提供多环境软件产品开发服务,包括单机、局域网和互联网。我们专注于适用国产硬件和操作系统应用软件开发应用。为事业单位和企业提供行业软件定制开发,满足其独特需求。无论是简单的应用还是复杂的系统&#xff…

static 和const的作用面试常问

点击上方"蓝字"关注我们 01、static 关键字 >>> 1. 局部变量 作用:将变量的生命周期延续到程序的整个运行期间,而不仅仅是它所在的函数调用期间。 void func() {static int count = 0; // 只会初始化一次 count++; printf("%d\n", count)…

VS2022 中的 /MT /MTd /MD /MDd 选项

我们有时编译时,需要配置这个 运行库,指定C/C++运行时库的链接方式。 如下图 那么这些选项的含义是什么? /MT:静态链接多线程库 /MT选项代表“Multi-threaded Static”,即多线程静态库。选择此选项时,编译器会从运行时库中选择多线程静态连接库来解释程序中的代码,…

掌握 Ansys ACP 中的参考方向:简化复杂的复合材料设计

概括 在复合材料分析领域,精度至关重要,尤其是在定义纤维方向和铺层时。Ansys ACP(Ansys Composite PrepPost)提供了强大的工具来建立参考方向,这是实现精确结构模拟的关键步骤。在本博客中,我们将揭开在 …

金仓数据库安装-Kingbase v9-centos

在很多年前有个项目用的金仓数据库,上线稳定后就没在这个项目了,只有公司的开发环境还在维护,已经好多年没有安装过了,重温一下金仓数据库安装,体验一下最新版本,也做一个新版本的试验环境; 一、…

什么是 DevOps 自动化?

DevOps 自动化是一种现代软件开发方法,它使用工具和流程来自动化任务并简化工作流程。它将开发人员、IT 运营和安全团队聚集在一起,帮助他们有效协作并交付可靠的软件。借助 DevOps 自动化,组织能够处理重复性任务、优化流程并更快地将应用程…

Windows中运行Linux(WSL)

Windows Subsystem for Linux(WSL)是一个在Windows 10和更高版本上运行Linux二进制可执行文件(ELF格式)的兼容层。它允许你在Windows上直接运行Linux环境,包括大多数命令行工具、实用程序和应用程序,无需修…

【Qt】对象树(生命周期管理)和字符集(cout打印乱码问题)

1.对象树 对象树统一管理窗口内部控件的生命周期,本质是一颗多叉树。 new对象会加入到对象树中,窗口关闭/释放时统一销毁,不需要手动delete。 如果在栈上定义label对象,生命周期随构造函数,无法正常显示控件。 1.1演…

Vue3项目中引入TailwindCSS(图文详情)

Vue3项目中引入TailwindCSS(图文详细) Tailwind CSS 是一个实用工具优先的 CSS 框架,提供丰富的低级类(如 text-center、bg-blue-500),允许开发者通过组合这些类快速构建自定义设计,而无需编写…

web-密码安全口令

目录 一、密码安全概述 二、密码安全现状 三、破解方式 四、暴力破解 五、字典破解 六、密码字典 学习心得: 一、密码安全概述 现在很多地方都是以用户名(账号)和口令(密码)作为鉴权的方式,口令&am…