PinnerSage(未完待续)
推荐系统的架构:召回层(粗排)、排序层(精排)、重排序
召回层
以下均是从 负样本为王: 评Facebook的向量化召回算法摘录出来的笔记,
相关论文:
[1] Embedding-based Retrieval in Facebook Search
[2] MOBIUS: Towards the Next Generation of Query-Ad Matching in Baidu’s Sponsored Search
如果说排序是特征的艺术,那么召回就是样本的艺术,特别是负样本的艺术
如何选择负样本
排序层的目标是目标是“从用户可能喜欢的当中挑选出用户最喜欢的”,是为了优中选优,因此排序是非常讲究所谓的“真负”样本的,即必须拿“曝光未点击”的样本做负样本
召回层的目标是“是将用户可能喜欢的,和海量对用户根本不靠谱的,分隔开”,而最不靠谱的,往往不是“曝光未点击”的样本,因为这里牵扯到一个推荐系统里常见的bias,就是我们从线上日志获得的训练样本,已经是上一版本的召回、粗排、精排替用户筛选过的,即已经是对用户“比较靠谱”的样本了。拿这样的样本训练出来的模型做召回,一叶障目,只见树木,不见森林。
因此目前召回层的做法是:拿点击样本做正样本,拿随机采样做负样本。因为线上召回时,候选库里大多数的物料是与用户八杆子打不着的,随机抽样能够很好地模拟这一分布。
随机采样不是指在整个候选库里等概率抽样,由于推荐系统中存在二八定律,因此:
- 当热门物料做正样本时,要降采样,减少对正样本集的绑架。比如,某物料成为正样本的概率如下,其中z(wi)是第i个物料的曝光或点击占比
$$
P_{\text {pos }}=\left(\sqrt{\frac{z\left(w_{i}\right)}{0.001}}+1\right) \frac{0.001}{z\left(w_{i}\right)}
$$
- 当热门物料做负样本时,要适当过采样,抵消热门物料对正样本集的绑架;同时,也要保证冷门物料在负样本集中有出现的机会。比如,某物料成为负样本的概率如下,其中n(w)是第i个物料的出现次数,而一般取0.75
$$
P_{\text {neg }}=\frac{n\left(w_{i}\right)^{\alpha}}{\sum_{j} n\left(w_{j}\right)^{\alpha}}
$$
如何使用hard Negative
增强样本
我们可以将召回模型的召回样例分为三部分,即:
- 匹配度最高的,是以用户点击为代表的,那是正样本
- 匹配度最低的,那是随机抽取的。能被一眼看穿,没难度,所谓的easy negative,达不到锻炼模型的目的
- 所以要选取一部分匹配度适中的作为负样本,能够增加模型在训练时的难度,让模型能够关注细节,这就是所谓的hard negative
如何选取hard negative:
- 根据业务逻辑来选取
- 用上一版本的召回模型筛选出“ 没那么相似 ”的对,作为额外负样本,训练下一版本召回模型
模型融合
用不同难度的negative训练不同难度的模型,再做多模型的融合
- 串行:不同难度的模型独立打分,最终取Top K的分数依据是多模型打分的加权和(各模型的权重是超参,需要手工调整)
- 并行:其实就是粗排,候选物料先经过easy model的初筛,再经过hard model的二次筛选,剩余结果再交给下游,更复杂粗排或是精排。
全链路优化
- 全链路优化的目标:Ranker是在已有召回算法筛选过的数据的基础上训练出来的,日积月累,也强化了某种刻板印象,即<user,doc>之间的匹配模式,只有符合某个老召回描述的匹配模式,才能得到Ranker的青睐,才有机会曝光给用户,才能排在容易被用户点击的好位置。
- 新召回所引入的<user,doc>之间的匹配模式,突破了ranker的传统认知,曝光给用户的机会就不多。即使曝光了,也会被ranker排在不讨喜的位置,不太容易被用户点击
GraphSAGE
PinSAGE
PinnerSAGE
Faiss是Facebook AI团队开源的针对聚类和相似性搜索库,为稠密向量提供高效相似度搜索和聚类,支持十亿级别向量的搜索,是目前最为成熟的近似近邻搜索库。
PinnerSage(未完待续)