[搜广推]王树森推荐系统——双塔模型

news2024/12/21 5:52:04

内容概览

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

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

矩阵补充模型

矩阵补充模型输入用户ID 和 物品ID,利用embedding把 用户ID 和 物品ID 映射成向量,输出向量的内积(一个实数),内积越大说明用户对这个物品越感兴趣

详见[搜广推]王树森推荐系统——矩阵补充&最近邻查找
在这里插入图片描述
没有用到属性

双塔模型

模型结构

除了用户ID,还可以从用户填写的资料和行为中获取很多特征,包括离散特征和连续特征,这些特征不能直接输入神经网络,要先做处理

方法

  1. 数据预处理
    • 把用户ID经过embedding层映射到一个向量
    • 每个离散特征分别用一个embedding层映射成向量(城市,感兴趣的话题)
      • 类别很少的离散特征可以直接用one-hot(性别)
    • 对连续特征进行处理,不同连续特征有不同的处理方法(年龄,活跃程度,消费金额)
      • 常用归一化,把数据变成均值为0方差为1的分布
      • 长尾分布的连续特征需要特殊处理,如取log或分桶等方法
  2. 拼接向量,输入神经网络
  3. 神经网络输出向量,作为用户的表征
    在这里插入图片描述
    物品的处理方法类似,最后输出物品的表征向量
    在这里插入图片描述
    双塔模型示意图如下所示:
  • 用户塔、物品塔各输出一个向量,两个向量的余弦相似度作为兴趣的预估值。
  • 双塔模型对矩阵补充模型的改进在于使用了id之外的多种特征和计算兴趣用余弦相似度(输出在0-1之间)
    在这里插入图片描述

正负样本的选择

正负样本的选择非常重要,甚至大于改进模型结构

  • 正样本:曝光而且有点击的 用户-物品 二元组。(用户对物品感兴趣)
  • 负样本 :
    • 没有被召回的 ?
    • 召回但是被粗排、精排淘汰的 ?
    • 曝光但是未点击的 ?

正样本选择

通常选择曝光而且有点击的 用户-物品 二元组。(用户对物品感兴趣)

但存在问题:少部分物品占据大部分点击,导致正样本大多是热门物品,对冷门物品不公平。

解决方案
过采样冷门物品,或降采样热门物品。

  • 过采样(up-sampling):一个样本出现多次。
  • 降采样(down-sampling):一些样本被抛弃。

负样本选择

三种情况:
在这里插入图片描述

简单负样本:全体物品

未被召回的物品,大概率是用户不感兴趣的
因为召回是从几亿数据中选几千个,未被召回的物品相比于召回的物品非常多,未被召回的物品 ≈ 全体物品

所以,可以简单地从全体物品中做随机抽样,作为负样本。

均匀抽样 or 非均匀抽样 ?

  • 均匀抽样:对冷门物品不公平
    • 正样本通常定义为那些曝光后用户点击的物品。由于热门物品点击频率更高,因此它们成为正样本的机会也更大
    • 如果采用均匀抽样来生成负样本,那么由于冷门物品在全体物品中占比较高,因此抽样得到的负样本大多数会是冷门物品。
  • 非均抽采样:目的是打压热门物品
    • 负样本抽样概率与热门程度(点击次数)正相关
      抽样概率 ∝ ( 点击次数 ) 0.75 抽样概率 ∝ (点击次数)^{0.75} 抽样概率(点击次数)0.75
简单负样本:Batch内负样本

一个Batch内有许多用户点击物品的样本,将每个用户点击的物品当做正样本,同一个Batch内其他用户点击的物品作为该用户的负样本。

  • 例如,一个 batch 内有n个(用户,点击物品)的正样本,那么每个用户和除了点击物品外的其他n-1个物品组成负样本。
  • 这个 batch 内一共有 n(n-1)个负样本。都是简单负样本。(因为第一个用户不喜欢第二个物品。)
    在这里插入图片描述

在这里插入图片描述
问题
一个物品出现在 batch 内的概率 ∝ 点击次数。因此,物品成为负样本的概率也 ∝ ( 点击次数 ) ∝(点击次数) (点击次数),但在上一种选取策略中提到过,这里应该是 ∝ ( 点击次数 ) 0.75 ∝ (点击次数)^{0.75} (点击次数)0.75

这会导致热门物品成为负样本的概率过大,模型对热门物品的打压太狠,造成偏差

如何修正偏差:
物品 i i i 被抽样到的概率: p i ∝ 点击次数 p_i ∝ 点击次数 pi点击次数
预估用户对物品i的兴趣: c o s ( a , b i ) cos(a, b_i) cos(a,bi)
做训练的时候,调整为: c o s ( a , b i ) − l o g p i cos(a,b_i)- log p_i cos(a,bi)logpi

线上做召回的时候还是用原本的余弦相似度

困难负样本

困难负样本:

  • 被粗排淘汰的物品(比较困难)
  • 精排分数靠后的物品(非常困难)

对正负样本做二元分类:

  • 全体物品(简单)分类准确率高。
  • 被粗排淘汰的物品(比较困难)容易分错。
  • 精排分数靠后的物品(非常困难)更容易分错。
训练数据

混合几种负样本:

  • 50%的负样本是全体物品(简单负样本)
  • 50%的负样本是没通过排序的物品(困难负样本)
常见错误:

曝光但是没有点击的物品不能作为召回的负样本
在这里插入图片描述
召回模型的任务是快速找到用户可能感兴趣的物品,区分用户不感兴趣的物品和可能感兴趣的物品,而不是区分有点感兴趣的物品和很感兴趣的物品

  • (easy):绝大多数是用户根本不感兴趣的全体物品被排序淘汰
  • (hard):用户可能感兴趣,但是不够感兴趣。

双塔模型的训练

  • Pointwise:独立看待每个正样本、负样本,做简单的二元分类。正负样本组成一个数据集,在数据集上做随机梯度下降,训练双塔模型
  • Pairwise:每次取一个正样本、一个负样本,组成二元组来训练
  • Listwise:每次取一个正样本、多个负样本,组成list来训练,多元分类

Pointwise 训练(最简单)

把召回看做二元分类任务:

  • 对于正样本,鼓励 c o s ( a , b ) cos(a,b) cos(a,b) 接近 +1。
  • 对于负样本,鼓励 c o s ( a , b ) cos(a,b) cos(a,b) 接近 -1。
  • 控制正负样本数量为 1:2 或者 1:3 。

Pairwise 训练

每组输入是一个三元组:一个用户+两个物品(正样本和负样本)

  • 两个物品共享一个物品塔
    在这里插入图片描述
    分别计算用户对两个物品的相似度
  • 希望 c o s ( a , b + ) cos(a,b^+) cos(a,b+) 越大越好,接近 +1
  • 希望 c o s ( a , b − ) cos(a,b^-) cos(a,b) 越小越好,接近 -1

基本想法:让用户对正样本的兴趣尽量大,对负样本的兴趣尽量小,鼓励 c o s ( a , b + ) cos(a,b^+) cos(a,b+) 大于 c o s ( a , b − ) cos(a,b^-) cos(a,b),二者差值越大越好
在这里插入图片描述

损失函数

希望用户对正样本的兴趣大,对负样本的兴趣小

  • 如果 c o s ( a , b + ) > c o s ( a , b − ) + m cos(a,b^+) > cos(a,b^-)+m cos(a,b+)>cos(a,b)+m,则没有损失。
  • 如果用户对正样本的兴趣没有那么大,即 c o s ( a , b + ) < c o s ( a , b − ) + m cos(a,b^+) < cos(a,b^-)+m cos(a,b+)<cos(a,b)+m,此时损失等于 c o s ( a , b − ) + m − c o s ( a , b + ) cos(a,b^-)+m-cos(a,b^+) cos(a,b)+mcos(a,b+)
  • m 是超参数

有两种损失函数:

  • hinge loss的 m 是超参数
  • logistic loss的 σ \sigma σ 是超参数
    在这里插入图片描述

Listwise训练

一条数据包含:

  • 一个用户,特征向量记作a。
  • 一个正样本,特征向量记作 b + b^+ b+
  • 多个负样本,特征向量记作 b 1 − , … , b n − b_1^-,…,b_n^- b1,,bn

基本思想:

  • y + = 1 y^+ = 1 y+=1,鼓励 c o s ( a , b + ) cos(a,b^+) cos(a,b+)尽量大。
  • y 1 − = ⋅ ⋅ ⋅ = y n − = 0 y_1^- = ··· = y_n^- = 0 y1=⋅⋅⋅=yn=0鼓励 c o s ( a , b − ) , … , c o s ( a , b n − ) cos(a,b^-),…,cos(a,b_n^-) cos(a,b),,cos(a,bn)尽量小。
  • 用交叉熵损失函数,鼓励 s 接近 y
    在这里插入图片描述

线上召回

离线存储

  1. 完成训练之后,用物品塔计算每个物品的特征向量b
  2. 把几亿个物品向量b存入向量数据库(比如 Milvus、Faiss、nswLib)
  3. 向量数据库建索引,以便加速最近邻查找。
    在这里插入图片描述

线上计算

  1. 给定用户ID和画像,线上用神经网络算用户向量a
  2. 最近邻查找:
    • 把向量a作为query,调用向量数据库做最近邻查找。
    • 返回余弦相似度最大的k个物品,作为召回结果。
      在这里插入图片描述

为什么事先存储物品向量b,但线上计算用户向量a?

  • 因为每做一次召回只用到一个用户向量a,但要用到几亿物品向量b,线上算物品向量的代价过大。
  • 用户兴趣动态变化,所以直接在线上进行计算;而物品特征相对稳定,所以可以把物品向量存起来。

模型更新

全量更新

今天凌晨用昨天全天的数据训练模型,在昨天模型参数的基础上做训练而不是随机初始化

  • 用昨天的数据训练1cpoch,即每天数据只用一遍
  • 训练完成后,发布新的用户塔神经网络和物品向量供线上召回使用。
  • 全量更新对数据流、系统的要求比较低。

增量更新

做 online learning 更新模型参数。

原因:用户兴趣会随时发生变化。

流程

  • 实时收集线上数据
  • 做流式处理,生成TFRecord文件
  • 对模型做 online learning,增量更新 IDEmbedding 参数(不更新神经网络其他部分的参数。)
  • 发布用户 ID Embedding,供用户塔在线上计算用户向量。

常用策略

每天内进行增量更新,凌晨时抛弃增量更新,用昨天数据进行全量更新
在这里插入图片描述

能否只做增量更新,不做全量更新?

在这里插入图片描述
不可以。

  • 小时级数据有偏,分钟级数据偏差更大。如果只进行增量更新,则容易造成很大偏差
  • 全量更新random shuffle 一天的数据,做1epoch训练;增量更新按照数据从早到晚的顺序。随机打乱优于按顺序排列数据,因此整体来看全量训练优于增量训练。

不适用于召回的模型

前期融合:在输入神经网络之前融合特征,通常用于粗排或精排(从几千个里选出几百个),不能用于召回(从几亿个选出几千个)

在这里插入图片描述

后期融合:经过神经网络之后再融合特征(计算相似度)
在这里插入图片描述

为什么前期融合模型不适用于召回?

  • 用前期融合模型进行召回时,必须把所有物品的特征挨个拼接用户向量,输入模型,预估用户对所有物品的兴趣,计算量太大
  • 没法用近似最近邻查找加速计算

双塔模型+自监督学习

双塔模型的问题

  • 推荐系统的头部效应严重,少部分物品占据大部分点击。
  • 大部分物品的点击次数不高。
  • 高点击物品的表征学得好,长尾物品的表征学得不好。

用自监督学习解决问题:做 data augmentation,更好地学习长尾物品的向量表征。

自监督学习

  • 物品 i i i 的两个向量表征 b i ′ b_i' bi b i ′ ′ b_i'' bi′′ 有较高的相似度。
  • 物品 i i i j j j 的向量表征 b i ′ b_i' bi b j ′ b_j' bj 有较低的相似度。

目的:鼓励 c o s ( b i ′ , b i ′ ′ ) cos(b_i',b_i'') cos(bi,bi′′)尽量大, c o s ( b i ′ , b j ′ ) cos(b_i',b_j') cos(bi,bj)尽量小
在这里插入图片描述

在这里插入图片描述

自监督方法

特征变换:Random Mask

随机选一些离散特征(比如类目),把它们的值遮住:

例如:

  • 某物品的类目特征是 U = { 数码 , 摄影 } U = \{数码,摄影 \} U={数码,摄影}
  • Mask 后的类目特征是 U ′ = { d e f a u l t } U'=\{ default \} U={default}

特征变换:Dropout(仅对多值离散特征生效)

如果一个物品有多个类目,那么类目是一个多值离散特征。

Dropout会随机丢弃特征中 k%的值。(k值可指定)

例如:

  • 某物品的类目特征是 U = { 美妆 , 摄影 } U=\{美妆,摄影\} U={美妆,摄影}
  • Dropout后的类目特征是 U ′ = { 美妆 } U'=\{美妆\} U={美妆}

对比:Random Mask把整个类目特征的值都丢掉,Dropout只丢一部分特征值

特征变换:互补特征(complementary)

假设物品一共有4种特征:{ID,类目,关键词,城市}

随机分成两组:

  • {ID,default,关键词,default} --> 物品表征1
  • {default,类目,default,城市} --> 物品表征2

因为两个表征是根据同一个物品生成的,所以鼓励两个物品表征尽可能相似

特征变换:Mask 一组关联的特征

受众性别:U= {男,女,中性}
类目:V ={美妆,数码,足球,摄影,科技,…}

通常来说:

  • u=女 和 v=美妆 同时出现的概率p(u,v)大
  • u=女 和 v=数码 同时出现的概率p(u,v)小

记p(u,v)为某特征取值为u,另一个特征取值为v,两个特征值同时发生的概率,那么有:

  • p(女性,美妆)=3%
  • p(女性,数码)=0.1%

因此,离线计算特征两两之间的关联,用互信息(mutualinformation)衡量:
在这里插入图片描述

流程

设一共有k种特征

  • 离线计算特征两两之间MI,得到 k ∗ k k * k kk 的矩阵。
  • 随机选一个特征作为种子,找到种子最相关的 k / 2 k/2 k/2 种特征。
  • Mask 种子 及其相关的 k / 2 k/2 k/2 种特征,保留其余的 ( k / 2 ) − 1 (k/2) -1 (k/2)1 种特征。

好处:比random mask、dropout、互补特征等方法效果更好。

坏处:方法复杂,实现的难度大,不容易维护

自监督训练

  1. 从全体物品中均匀抽样,得到m个物品,作为一个batch .
  2. 做两类特征变换,物品塔输出两组向量
  3. 计算第 i i i 个物品的损失
  4. 梯度下降,减小自监督学习的损失
    在这里插入图片描述

在这里插入图片描述

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

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

相关文章

96 vSystem

vSystem系统 1 技术背景 网络虚拟化旨在构建出一套与网络底层物理拓扑相互独立的逻辑网络环境&#xff0c;提供给不同需求的用户使用。基于这种思想&#xff0c;诞生出了 VLAN 技术和 VPN 技术。近年来&#xff0c; 随着以 VMM&#xff08;Virtual Machine Monitor&#xff0c…

低代码软件搭建自学的第一天——熟悉PyQt

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 学习计划第 1 步&#xff1a;环境搭建1.1 安装 Python1.2 安装 PyQt安装命令&#xff1a;验证安装&#xff1a; 第 2 步&#xff1a;PyQt 基础知识2.1 创建第一个窗…

【mac 终端美化】oh my zsh

快捷的mac终端美化方法。 以下是效果图&#xff0c;比较朴素&#xff0c;但是相比默认方案会好看一些&#xff0c;也能明显查看输入的命令&#xff0c;不会和输出混在一起。 下载主题 访问网址&#xff1a;https://iterm2colorschemes.com/&#xff0c;下载网页的压缩包并解…

移动魔百盒中的 OpenWrt作为旁路由 安装Tailscale并配置子网路由实现在外面通过家里的局域网ip访问内网设备

移动魔百盒中的 OpenWrt作为旁路由 安装Tailscale并配置子网路由实现在外面通过家里的局域网ip访问内网设备 一、前提条件 确保路由器硬件支持&#xff1a; OpenWrt 路由器需要足够的存储空间和 CPU 性能来运行 Tailscale。确保设备架构支持 Tailscale 二进制文件&#xff0c;例…

【笔记】深度学习模型评估指标

推荐链接&#xff1a; &#xff08;0&#xff09;多分类器的评价指标 &#xff08;1&#xff09;泛化误差的评价方法&#xff1a;【机器学习】模型评估与选择&#xff08;留出法、交叉验证法、查全率、查准率、偏差、方差&#xff09; &#xff08;2&#xff09;机器学习&…

Linux性能监控命令_nmon 安装与使用以及生成分析Excel图表

文章目录 Linux性能监控命令_nmon 安装与使用安装解压创建nmono目录解压到nmono目录当中切换到sources目录下解压 配置环境变量创建软链接到 /usr/bin/ 目录下打开 配置文件 配置环境变量在底部增加如下注册 使用使用说明监控监控CPU监控内存监控磁盘监控网络监控文件系统 后台…

串口通信控制LED灯

做这个东西的目的是锻炼一下自己的编程能力以及系统思维能力 首先&#xff0c;清楚自己要干什么&#xff0c;正点原子大家应该都看过&#xff0c;系统框图是一个比较重要的东西&#xff0c;引导我们去设计和思考。 下面先给出系统框图&#xff1a; 模块划分好后&#xff0c;结构…

WPF+MVVM案例实战与特效(四十五)- 打造优雅交互:ListBox 的高级定制与行为触发(侧边菜单交互面板)

文章目录 1、引言2、案例效果3、案例实现1、依赖安装2、文件创建3、代码实现1、依赖引用与上下文2、个性化视觉效果:自定义 ItemContainerStyle3、页面样式与布局完整代码4、ViewModel 逻辑实现5、子界面代码:3、实现效果4、源代码获取5、总结1、引言 在WPF应用程序开发中,…

分享两个爬虫练习网站+一个python游戏网站

目录 第一个网站第二个Python游戏网站 第一个网站 网站一 第二个 网站二 Python游戏网站 网站三

空天地遥感数据识别与计算--数据分析如何助力农林牧渔、城市发展、地质灾害监测等行业革新

在科技飞速发展的时代&#xff0c;遥感数据的精准分析已经成为推动各行业智能决策的关键工具。从无人机监测农田到卫星数据支持气候研究&#xff0c;空天地遥感数据正以前所未有的方式为科研和商业带来深刻变革。然而&#xff0c;对于许多专业人士而言&#xff0c;如何高效地处…

C++中的进程虚拟内存布局

进程虚拟内存布局 进程虚拟内存布局&#xff1a; .text&#xff08;代码段&#xff09;&#xff1a;存放的是程序源代码编译后的机器指令&#xff0c;是只读的。 .rodata&#xff08;只读数据段&#xff09;&#xff1a;存放的是程序中的只读数据&#xff0c;一般是程序里面的…

鸿蒙开发-ArkTS 创建自定义组件

在 ArkTS 中创建自定义组件是一个相对简单但功能强大的过程。以下是如何在 ArkTS 中创建和使用自定义组件的详细步骤&#xff1a; 一、定义自定义组件 使用Component注解&#xff1a;为了注册一个组件&#xff0c;使其能够在其他文件中被引用&#xff0c;你需要使用Component…

计算机网络B重修班-期末复习

[TOC] (计算机网络B重修班-期末复习&#xff09; 一、单选 &#xff08;20题&#xff0c;1分/题&#xff0c;共20分&#xff09; 二、判断 &#xff08;10题&#xff0c;1分/题&#xff0c;共10分&#xff09; 三、填空 &#xff08;10题&#xff0c;1分/题&#xff0c;共10…

SSH连接成功,但VSCode连接不成功

环境 在实验室PC上连接服务器234 解决方案&#xff1a;在VSCode中重新添加远程主机 删除旧的VSCode Server 在远程主机上&#xff0c;VSCode会安装一个‘vscode-server’服务来支持远程开发&#xff0c;有时旧的‘vscode-server’文件可能会导致问题&#xff0c;删除旧的&am…

揭开 Choerodon UI 拖拽功能的神秘面纱

01 引言 系统的交互方式主要由点击、选择等组成。为了提升 HZERO 系统的用户体验、减少部分操作步骤&#xff0c;组件库集成了卓越的拖拽功能&#xff0c;让用户可以更高效流畅的操作系统。 例如&#xff1a;表格支持多行拖拽排序、跨表数据调整、个性化调整列顺序&#xff1…

面试题整理9----谈谈对k8s的理解1

谈谈对k8s的理解 1. Kubernetes 概念 1.1 Kubernetes是什么 Kubernetes 是一个可移植、可扩展的开源平台&#xff0c;用于管理容器化的工作负载和服务&#xff0c;方便进行声明式配置和自动化。Kubernetes 拥有一个庞大且快速增长的生态系统&#xff0c;其服务、支持和工具的…

Elasticsearch:什么是信息检索?

信息检索定义 信息检索 (IR) 是一种有助于从大量非结构化或半结构化数据中有效、高效地检索相关信息的过程。信息&#xff08;IR&#xff09;检索系统有助于搜索、定位和呈现与用户的搜索查询或信息需求相匹配的信息。 作为信息访问的主要形式&#xff0c;信息检索是每天使用…

【深度学习】 零基础介绍卷积神经网络(CNN)

CNN学习 零基础介绍写个CNN最简单的代码一. 概述二. 搭建CNN1. 输入层2. 卷积层3. 激活层4. 池化层5. 全连接层6. 网络搭建小结7. 损失函数8. 梯度下降9. 反向传播10. 模型评估与正则化11. 尝试搭建自己的第一个CNN 三. 经典CNN结构四. 猫狗识别项目实践1. Paddle实现版本&…

flutter 使用dio 请求go语言后台数据接口展示瀑布流图片

添加依赖 dependencies:flutter:sdk: flutterdio: ^5.0.0 # 请检查最新版本flutter_staggered_grid_view: ^0.4.0 添加网络权限 <uses-permission android:name"android.permission.INTERNET" /> go后端代码 图片存放目录 // main.go package mainimport (&q…

ZYNQ初识2(zynq_7010)基于vivado,从PL端调用PS端的时钟

由于需要进行一些FPGA的简单开发&#xff0c;但板载PL端没有焊接晶振&#xff0c;所以需要从PS端借用时钟到PL端使用。 首先新建项目&#xff0c;根据自己的板载选择芯片&#xff0c;我的板载芯片是zynq_7010。 一路next&#xff0c;在自己的vivado的工作文档新建文件夹并给自…