向量化召回方案
00 min
2024-9-28
2025-12-2
type
status
date
slug
summary
tags
category
icon
password

向量化召回方案

方案
模式
思想
负采样
embedding
Pairwise-loss
airbnb listing embedding召回
i2i
使用word2vec滑窗遍历click session,将窗口内的item认为是相似的,同时将final book listing作为global context,来帮助提升预定率
全局随机采样+hard negative
特征方面只用了ID信息,从embedding矩阵中提取对应行
sampled softmax loss
airbnb user/listing type embedding召回
u2i
user与其消费过的item,在向量空间中是相近的
全局随机采样+hard negative
特征方面只用了ID信息,从embedding矩阵中提取对应行
sampled softmax loss
YoTube召回
u2i
user与其观看过的视频,在向量空间中是相近的。
随机负采样
user embedding:用户相关的embedding,pooling后组成大向量输入到dnn中,最后一层fc作为user embeddingvideo embedding:使用video相关特征,通过ID从embedding矩阵中提取对应行
sampled softmax loss
Facebook EBR召回
u2i
user与其消费过的item,在向量空间中是相近的
随机负采样 + 上版模型筛选的hard negative不应使用“曝光未点击”作为负样本
双塔模型:user特征:通过user tower进行处理,最后输出user embeddingitem特征:通过item tower进行处理,最后输出item embedding
margin hinge loss
百度Mobius召回
u2i
user与其消费过的item,在向量空间中是相近的
随机负采样 + 上版模型筛选的hard negative
双塔模型:用户点击历史和 Data Augmenter 生成的数据都会输入到模型中训练,具体的模型设计则是稀疏 DNN 结构,并且采用的是双塔结构(user-side 和 ad side)。user-side 的输入是用户 profile 信息和 query 信息,ad-side 的输入是 ad 的 embedding,每个塔都会得到一个 32*3 维的向量,并计算三次内积最后进行 softmax 得到分类预测结果。
bpr loss
PinSAGE
i2i
被同一个user消费的item是相近的,为减少计算量使用了随机游走生成item-pair
随机负采样 + personal pagerank筛选的hard negative
同构图卷积:通过节点本身信息和邻居点信息生产点embedding
margin hinge loss
food search embedding召回
u2i
user与其消费过的item,在向量空间中是相近的
随机负采样 + hard negative
双塔模型:[query,dish_name]塔和[query,store_name]塔
margin hinge loss
Embedding based recall in Target Ads(paid ads)
i2i
使用word2vec滑窗遍历click session,将窗口内的item认为是相似的
-
-
-
search ads vector recall(paid ads)
u2i
user与其消费过的item,在向量空间中是相近的
-
双塔模型:Replace DSSM trigram with BERT, fasttext modelsAdd query history to query network :[clicked categories, clicked prices, clicked images]Add item information:[category, images, CTR, sold count …]
-
EGES(paid ads)
i2i
被同一个user消费的item是相近的
-
同构图卷积
-
思想:
  • i2i召回:x,y都是item,我们认为同一个用户在同一个session交互过的两个item在向量空间是相近的,体现两个item之间的“相似性”。
  • u2i召回:x是user,y是item。一个用户与其交互(e.g., 点击、观看、购买)过的item应该是相近的,体现user与item之间的“匹配性”。
  • u2u召回:x,y都是user。比如使用孪生网络,则x是user一半的交互历史,y是同一用户另一半交互历史,二者在向量空间应该是相近的,体现“同一性”。
无论哪种召回方式,为了能够与FAISS兼容,我们都拿x embedding和y embedding之间的“点积”或"cosine"来衡量距离。显然,点积或cosine越大,代表x与y在向量空间越接近
 
负采样:
  • 全局随机负采样
  • 按标签进行hard negative
  • 取上一版模型的结果进行筛选,得到hard negative
注意:千万不能(只)拿“曝光未点击”做负样本。否则,正负样本都来自“曝光”样本,都是与user比较匹配的item,而在上百万的候选item中,绝大部分item都是与user兴趣“八杆子打不着”的。
 
embedding:
特征:
  • 有的算法只使用UserId/DocId
  • 有的算法除此之外,还使用了画像、交互历史等side information
  • 图卷积算法还使用了user节点、item节点在图上的连接关系
模型:
  • 只使用ID特征的算法,模型就只有一个embedding矩阵,通过id去矩阵相应行提取embedding
  • 有的模型,将特征(id+side information)喂入DNN,逐层让特征充分交互,DNN最后一层的输出就是我们需要的embedding
  • 基于图卷积的模型中,目标节点(user或item)的embedding,是由其邻居节点的embedding,加上节点本身信息,聚合而成。一来,图上的节点不仅有user/item,还可以包括性别、年龄、职业等属性节点;二来,邻居节点也有自己的邻居。图的这种性质,使得节点embedding能够利用的信息更加广泛,并且兼具本地与全局视角。
 
pairwise-loss:
以常见的u2i召回为例,绝大多数item从未给user曝光过,我们再从中随机采样一部分作为负样本,这个negative label是存在噪声的。在这种情况下,再照搬排序使用binary cross-entropy loss追求“预估值”与“label”之间的“绝对准确性”,就有点强人所难了。所以,召回算法往往采用Pairwise LearningToRank,建模“排序的相对准确性“
notion image
notion image
 

一、Real-time Personalization using Embeddings for Search Ranking at Airbnb

背景:用户在Airbnb搜索房源时,相隔时间较短的、连续点击的房源往往是比较相似的,因此作者希望利用这些点击信息学习房源的embedding。

1.1 listing embedding召回

样本方面
click session数据对listing进行embedding(1.只有停留时间超过30s的listing page才被算作序列中的一个数据点,2.如果用户超过30分钟没有动作,那么这个序列会断掉,不再是一个序列。)
增加final booked listing作为global context加入每个滑窗,将它与点击序列中的每个listing组成正样本对(即不管这个booked listing在不在word2vec的滑动窗口中,我们都会假设这个booked listing与滑动窗口的中心listing相关)。这样做的是因为Airbnb最关注的业务指标是预订率,而word2vec是非监督的,这个策略的主要动机应该是加入人为的“监督信息”,使学到的embedding更有助于提升预订率。
notion image
 
负采样方式:用户点击序列中的listing多是同城的,导致正样本多是同城listing组成,而随机采样的负样本多是异地的,这其中存在的bias容易让模型只关注“地域”这个粗粒度特征。因此在全局随机采样生成的负样本之外,还在与中心listing同城的listing中随机采样一部分listing作为hard negative,以促使模型能够关注除“地域”外的更多其他细节。
 
embedding方面
特征方面只用了listing ID,模型是一个大的embedding矩阵。缺点是对于新listing,其id不在embedding矩阵中,无法获得embedding。
 
Pairwise-loss
sampled softmax loss(将召回看成一个超大规模的多分类问题,优化的目标是使,user选中item+的概率最高。)
 

1.2 user/listing-type embedding召回

样本方面
由于预定行为稀疏,因此将相似的user聚类成user-type,把相似的listing聚类成listing-type。用user-type去召回listing-type,假设user预定过listing,那么这两者对应的群组应该也是相似的。
负采样方式:大部分负样本还是随机采样生成,增加“被owner拒绝”作为hard negative,表达一种非常强烈的“user~item不匹配”。
 
embedding方面
特征只有user-type ID和listing-type ID,模型也只不过拿ID当行号去embedding矩阵中抽取embedding。
 
Pairwise-loss
使用sampled softmax loss。
 
参考:
 

二、Deep Neural Networks for YouTube Recommendations

样本方面
u2i召回的典型思路:user与其观看过的视频,在向量空间中是相近的。
负采样方式:随机负采样
 
embedding方面
  • user embedding
    • 用户看过的视频的embedding,pooling成一个向量
    • 用户搜索的关键词的embedding,pooling成一个向量
    • 以上两个向量,加上一些用户的基本属性,拼接成一个大向量,喂入多层全连接(FC)进行充分交叉
    • 最后一层FC的输出就是user embedding
      • notion image
  • video embedding
    • 特征只用了video id,模型也只不过是一个大的embedding矩阵
      整个模型有两个video embedding:一个input layer使用word2vec对用户看过的视频进行处理生成的embedding,另一个是softmax层中video与最后一层的权重作为这个video的embedding
notion image
Pairwise-loss
sampled softmax loss
 
参考:
重读Youtube深度学习推荐系统论文,字字珠玑,惊为神文
这里是王喆的机器学习笔记 ,每隔一到两周我会站在算法工程师的角度讲解一些计算广告、推荐系统相关的文章。选择文章必须满足一下三个条件: 这周我们一起讨论一下Youtube的深度推荐系统论文《 Deep Neural Networks for YouTube Recommendations 》,这是2016年的论文,按照今天的标准来看,已经没有什么新颖的地方,我也是两年前读过这篇文章之后就放下了,但前几天重读这篇文章,竟让发现了诸多亮点,几乎处处是套路,处处是经验,不由惊为神文。这篇神文给我留下的深刻印象有两点: 这毫无疑问是工业界论文的典范,是我非常推崇的工程导向的,算法工程师必读的文章; 我以为毫不起眼的地方,也藏着Youtube工程师宝贵的工程经验,相比上周介绍的阿里的深度兴趣网络DIN,最重要的价值就在于Attention机制,这篇文章你应该精确到句子来体会,这是我惊为神文的原因。 废话不多说,下面就跟大家分享一下两次拜读这篇论文的不同体验和收获。 第一遍读这篇论文的时候,我想所有人都是冲着算法的架构去的,在深度学习推荐系统已经成为各大公司"基本操作"的今天,Youtube在算法架构上并无惊奇之处,我们来快速介绍一下文章中的深度学习推荐系统的算法架构。 Youtube的用户推荐场景自不必多说,作为全球最大的UGC的视频网站,需要在百万量级的视频规模下进行个性化推荐。由于候选视频集合过大,考虑online系统延迟问题,不宜用复杂网络直接进行推荐,所以Youtube采取了两层深度网络完成整个推荐过程: 第一层是Candidate Generation Model完成候选视频的快速筛选,这一步候选视频集合由百万降低到了百的量级。 第二层是用Ranking Model完成几百个候选视频的精排 首先介绍candidate generation模型的架构 我们自底而上看这个网络,最底层的输入是用户观看过的video的embedding向量,以及搜索词的embedding向量。至于这个embedding向量是怎么生成的,作者的原话是这样的 Inspired by continuous bag of words language models, we learn high dimensional embeddings for each video in a xed vocabulary and feed these embeddings into a feedforward
重读Youtube深度学习推荐系统论文,字字珠玑,惊为神文
 

三、Embedding-based Retrieval in Facebook Search

notion image
样本方面
u2i召回的典型思路:user与其观看过的视频,在向量空间中是相近的。
负采样方式:大部分随机负采样(召回算法不应该拿“曝光未点击”做负样本),另外增加了部分hard negative来增强模型的区分能力。
hard negative挑选方案:用上一版本的召回模型筛选出"没那么相似"的<user,item>对,作为额外负样本,来增强训练下一版本召回模型
notion image
 
embedding方面
模型采用经典的双塔模型。
  • 模型不会将user feature与item feature接入一个DNN,防止它们在底层就出现交叉
  • user特征,通过user tower独立演进,生成user embedding
  • item特征,通过item tower独立演进,生成item embedding
  • 唯一一次user与item的交叉,只允许出现在最后拿user embedding与item embedding做点积计算匹配得分的时候
这样的有点在于:
  • 离线时,在user未知的情况下,只使用item tower,独立生成item embedding灌入faiss;
  • 在线时,只使用user tower独立生成user embedding,避免与每个候选item进行“计算交叉特征”和“通过DNN”这样复杂耗时的操作
 
Pairwise-loss
margin hinge loss
 

四、Mobius

背景:传统广告推荐系统match层跟rank层的优化目标不一样,直接用之前的rank层ctr预估模型对样本进行预估,发现在抛开之前match层的相关性束缚后,模型容易预估出高ctr但相关性很差的结果,因此设计Mobius模型来识别出低相关性且高ctr的query-ad pair作为bad case。
 
notion image
样本方面
首先,数据增强模块(Data Augmenter)会读取一个 batch 的数据,主要是用户的真实 query-ad pair。每当 Data Augmenter 读到数据后,就会进行 cross-join 操作(⨂)来构建生成更多的 query-ad pair。如果有 m 个 query 和 n个 ad,那么经过 cross-join 操作后,将会生成 m×n 个 query-ad pair,随后这些 pair 将会输入到 Relevance Judger 中进行相关性打分,在这里会设置一个阈值来获取 low-relevance pair。
最后,这些 low-relevance pair 将会喂给 CTR 模型,进行三分类训练(click,unclick,bad)来帮助模型识别那些 low relevance but high CTR 的样本。在这里,也可以设置的一个更小的阈值来过滤掉一些特别不相关的样本,但是为了保留数据增强的可探索性,这里 Mobius 设计了一个采样器,用于采样那些真正的 low relevance but high CTR 样本(增强的数据都会经过 CTR 模型,但只有部分 pair 会得到一个较高 CTR 值)并给它们打上一个 bad 标签。
 
embedding方面
用户点击历史和 Data Augmenter 生成的数据都会输入到模型中训练,具体的模型设计则是稀疏 DNN 结构,并且采用的是双塔结构(user-side 和 ad side)。user-side 的输入是用户 profile 信息和 query 信息,ad-side 的输入是 ad 的 embedding,每个塔都会得到一个 32*3 维的向量,并计算三次内积最后进行 softmax 得到分类预测结果。
 
Pairwise-loss
bpr loss(给user召回时,将item+排在item-前面的概率)

五、PinSAGE

notion image
PinSAGE 召回模型及源码分析(1): PinSAGE 简介
Pinterest 推出的基于 GCN 的召回算法 PinSAGE,被誉为"GCN 在工业级推荐系统上的首次成功运用"。最近我也在搞基于 GCN 的召回算法,在学习 DGL 的过程中,发现 DGL 官方案例库中提供一个PinSAGE 的实现 ,赶紧下载下来,仔细研读了一番,感觉收获满满。尽管不是 Pinterest"原装"的实现,在很多技术细节上还缺乏工业级实现所必需的精雕细琢,但是 PinSAGE 的核心模块,比如基于 Random Walk 的重要邻居采样、Mini-Batch 训练、hinge loss、多模态特征接入、...,也都具备了。另外,DGL 这个 PinSAGE 实现,还演示了如何自定义 neighbor sampling、如何自定义 negative sampling、如何随机游走、...等 DGL 的高级功能,对于深入理解、熟练掌握 DGL 也极具参考价值。 本文是针对 DGL PinSAGE Example 的源码阅读笔记,先简单介绍一下 GraphSAGE 和 PinSAGE 的基础知识,接下来再按"训练数据供应"、"模型各模块"、"训练"三个环节解释其源代码。本文是第一部分。 GraphSAGE 是 Graph Convolution Network(GCN)的一种实现。GCN 是当下非常热门的一项技术,介绍的资料汗牛充栋,可以非常学术和复杂,离散卷积、拓扑空间、拉普拉斯矩阵、谱分解、图上傅里叶变换、......,这样的大词不绝于耳,让人闻而生畏;也可以非常简单,比如这篇中,就用非常接地气的"计算朋友圈平均"这样的例子,形象地阐释了 GCN 的核心思想:
PinSAGE 召回模型及源码分析(1): PinSAGE 简介
样本方面
同一个user消费过的两个item是相似的,但是这样的排列组合太多了,因此PinSAGE采用随机游走的方式进行采样。
在原始的user-item二部图上,以某个item作为起点,进行一次二步游走(item→user→item),首尾两端的item构成一条边。将以上二步游走反复进行多次,就构成了item-item同构图。
在这个新构建出来的item-item同构图上,每条边连接的两个item,因为被同一个user消费过,所以是相似的,构成了训练中的正样本。
基于随机游走筛选hard negative的方法:
notion image
 
embedding方面
每个item embedding通过图卷积的方式生成。图卷积的核心思想就是:利用边的信息对节点信息进行聚合从而生成新的节点表示。多层图卷积的公式如下所示。
notion image
notion image
Pairwise-loss
margin hinge loss(user与正样本item的匹配程度,要比,user与负样本item的匹配程度,高出一定的阈值。)
上一篇
MMOE
下一篇
用户长期兴趣建模