召回阶段的相关模型

1. 协同过滤

1.1 ItemCF

1.1.1实现原理

  1. 量化用户对物品的兴趣 like(user, item)。例如:点击、点赞、收藏、转发各算一分
  2. 物品相似度计算:
    Jaccard相似度,没有考虑不同行为的偏好程度
    在这里插入图片描述
    余炫相似度,考虑用户喜欢的程度,其中V为喜欢item1item2的用户交集.
    在这里插入图片描述
  3. 预估用户对候选商品的兴趣:j为用户历史交互商品集合
    在这里插入图片描述

1.1.2 完整流程

用索引,离线计算量大,线上计算量小

1. 事先做离线计算,建立两个索引

  • 建立user ——> item的索引:记录每个用户最近点击、交互过的物品ID
    • 目的:给定任意用户id,可以找到他近期感兴趣的物品列表
    • 存储形式:user_id: [(item_id, score兴趣分)
  • 建立item ——> item的索引: 给定任意item_id,可以快速找到它最相似的kitems
    • 计算物品之间两两相似度
    • 对于每个物品,索引它最相似的k个物品
    • 存储形式:item_idtopK个最相似的[items_id, 相似度]

2. 线上做召回,用于实时推荐

  • query用户id,通过user--> item索引,找到用户近期感兴趣的物品列表last-n
  • 对于last-n列表中每个item,通过item--> item的索引,找到top-k相似物品
  • 对于取回的相似物品(最多有nk个),用公式预估用户对物品的相似分数
  • 返回分数最高的100个物品,作为itemCF通道的返回结果。重复的把分数加起来,去重

1.2 UserCF

1.2.1 原理

  • 用户相似度计算:降低热门物品权重
    在这里插入图片描述
    注: nl: 用户喜欢物品l的用户数量,反应物品的热门程度, I 为用户u1u2喜欢物品集合的交集
  • 预估用户user对候选物品item的兴趣:
    在这里插入图片描述

1.2.2 完整流程

1. 事先做离线计算

  • 建立user--> item 的索引:
    • 记录每个用户最近点击、交互过的物品ID
    • 给定任意用户ID,可以找到他近期感兴趣的物品list
    • user_id[(item_id, 兴趣分数),......]
  • 建立user-->user的索引:
    • 对于每个用户,索引他最相似的k个用户
    • 给定任意用户id,可以快速找到他最相似的k个用户
    • user_id: 最相似的k个【(user_id, 相似度),…】

2. 线上做召回

  1. 给定用户ID,通过user_id--->user_id索引,找到top-k相似用户
  2. 对于每个top-k相似用户,通过user_id-->item索引,找到用户最近感兴趣的物品列表last-n
  3. 对于召回的nk个相似物品,用公式预估用户对每个物品的兴趣分数

2. 图召回

2.1 Swing算法

背景:假如重合的用户是一个小圈子,当两件物品的受众完全不一样,圈子里很多人交互,这时就需要降低小圈子的权重,希望两个物品重合的用户广泛且多样。

模型原理:给用户设置权重,解决小圈子问题

物品相似度计算:

  1. 定义两个用户的重合度:J为用户喜欢商品的集合

在这里插入图片描述

  1. 物品相似度

在这里插入图片描述
overlap越大,用户u1和u2的重合度越高,则他们可能来自一个小圈子,要降低他们的权重

2.2 DeepWalk

  1. node2vec
  2. EGES
  3. GraphSAGE

3. 向量召回

本质上讲是将召回建模成在向量空间内的近邻搜索问题,将用户和物品均由向量表示,离线构建索引,在serving时模糊近邻查找。

3.1 算法模型

  1. DSSM 双塔召回:基本结构就是usergroup侧分别用NN网络来拟合,最上层的神经元可认为是usergroup的向量表征。CTR召回可以直接用点积+sigmod得到loss,时长模型可以用cos距离+mse计算loss
  2. SENet双塔模型
  3. FM召回:主体思路依旧是构建向量,然后离线建group_emd,线上计算user_emd再近邻查找。

3.2 具体实现

  1. 离散特征处理
  • 建立字典:把类别映射成序号
  • 向量化:将序号映射成向量
    • One-hot编码:把序号映射成高维稀疏向量
    • Embedding:把序号映射成低维稠密向量
  1. 向量模型存储
  • 用户矩阵向量:列向量储存到key-value
  • 物品矩阵向量:
  1. 近似最近邻查找
  • 集成好的支持最近邻查找的系统:MilvusFaissHnswLib
  • 衡量最近邻的标准:
    • 欧式距离最小:L2距离
    • 向量内积最大(内积相似度)
    • 向量夹角余弦最大(cosine相似度):工业界最常用。
      有些系统不支持,但只需要将向量做归一化,使二范数全等于1,内积就等于余弦相似度
  • 向量数据预处理,划分不同的区间。
    • 方法:根据衡量最近临的标准划分,比如,余弦相似度,将空间划分成扇形区域
    • 每个区域用一个向量表示,然后建立索引,key:每个区域的向量,value:区域中所有点的列表

3.3 双塔模型

3.3.1模型结构

  1. 用户塔
    拼接向量经过DNN输出用户表征向量,用户id: embedding Layer映射成embedding
    用户离散特征:one-hot —> embedding Layer
    用户连续特征:归一化、长尾特征取log、分桶等处理
  2. 物品塔: 同用户塔

3.3.2 模型训练方式

  • Pointwise: 把召回看作二元分类任务

    • 正样本:鼓励cos(a,b)接近于 +1
    • 负样本:鼓励cos(a,b)接近于-1
    • 经验:控制正负样本数量为1:2或者1:3
  • Pairwise:

    • 训练样本:输入是一个三元组,(正样本、用户、负样本)
    • 计算cos(a,b+) 以及cos(a,b-) 基本想法:鼓励cos(a,b+) 大于cos(a,b-)
    • 损失函数:如果cos(a,b+) 大于cos(a,b-) +m,则没有损失
      否则,损失等于cos(a,b-)+m - cos(a,b+)

    Triplet hinge loss:
    在这里插入图片描述

    Triplet logistic loss:
    在这里插入图片描述

  • Listwie:

    • 训练样本:一个用户,一个正样本,多个负样本
    • 分别计算:
      在这里插入图片描述
    • 将上面计算的cos值通过softmax激活函数,得到n个预测值s,和为1
      通过CrossEntropyLoss(y,s)y10,所以也是最大化正样本的余弦相似度

3.3.3 正负样本

选择负样本的原理:
召回目标:快速找到用户可能感兴趣的物品
排序目标:区分比较感兴趣和非常感兴趣的物品

正样本

  • 曝光且有点击的用户–物品二元组
  • 问题:少部分物品占据大部分点击,导致正样本大多是热门物品
  • 解决方案:过采样冷门物品或降采样热门物品
    降采样:以一定的概率(和出现次数正相关)抛弃一些样本,

负样本:
召回|粗排模型负样本选择策略

  • 简单负样本:

    • 未被召回的物品,大概率是用户不感兴趣的
    • 从全体物品中做抽样,作为负样本
      • 均匀抽样:对冷门物品不公平。28法则, 正样本大多是热门物品,如果均匀抽样产生负样本,负样本大多是冷门物品
      • 非均匀抽样:目的是打压热门物品,负样本抽样概率与热门程度(点击次数)正相关
        在这里插入图片描述
    • Batch 内负样本
      • 一个batch内有n个正样本,一个用户和n-1个物品组成负样本,这个batch内一共有(n-1)个负样本
      • 问题:这里有个问题,物品成为负样本的概率正比于点击次数,但应该正比于0.75次方,导致热门物品成为负样本的概率过大。
      • 修正:物品i被抽样到的概率为pi,则在做训练的时候,调整为cos(a,bi) - logpi。但线上做召回的时候仍旧使用cos(a,b)
  • 困难负样本:

    • 被粗排淘汰的物品(比较困难):能进入粗排的多多少少符合用户兴趣,但是不是那么强烈
    • 精排分数靠后的物品(非常困难):符合用户兴趣,但未必是用户最感兴趣的,所以在精排中排名靠后的可以被视为负样本

对于双塔模型做召回,二元分类任务,让模型区分正负样本:

  1. 把全体物品作为负样本,分类准确率高,因为负样本明显和用户兴趣不符
  2. 被粗排淘汰的作为负样本,但他们多少和用户兴趣有些相关,分类准确率较低一些
  3. 精排分数靠后的物品更容易分错

工业界训练数据:混合几种负样本,50%的负样本是全体物品,50%的负样本是没通过排序的物品。对于曝光但是没有点击,训练召回模型不能用这类负样本,训练排序模型会用这类负样本。

3.3.4 线上召回和更新

  1. 线上召回
  • 离线存储

    • 完成训练之后,用物品塔计算每个物品的特征向量b
    • <特征向量,item_id>保存到ANN框架向量数据库MilvusFaiss
    • 向量数据库建索引,以便加速最近邻查找
  • 用户塔:用户的兴趣动态变化,而物品特征相对稳定(可以离线储存用户向量,但不利于推荐效果)

    • 给定用户id和特征,在线上计算向量a
    • 将向量a作为query调用向量数据库做检索查找
    • 返回余弦相似度最大的k个物品,作为召回结果
  1. 模型更新
  • 增量更新

    • online learning更新模型参数,用户的兴趣会随时发生变化
    • 实时收集线上数据,做流式处理,生成TFRecord文件
    • 对模型做online learning, 增量更新ID embedding参数。(不更新神经网络其他部分的参数)
    • 增量更新问题:小时数据有偏,分钟级数据偏差更大
  • 全量更新

    • 在昨天的模型参数基础上做训练,并不是更新增量模型
    • 用昨天的数据,random shuffle,训练1 epoch,即每天的数据只用一遍
    • 发布新的用户塔神经网络和物品向量,供线上召回使用

随机打乱优于按顺序排列数据,全量训练优于增量训练

4. 行为序列建模召回

  1. RNN序列召回
  2. MIND多兴趣召回:其基本思想是用户兴趣多样,仅用一个向量表征用户兴趣是有偏的,如果能构建多个user_emd某种程度上就能召回出更全的候选,该论文采用胶囊网络来建模用户多种兴趣。
  3. SDM长期兴趣建模

5. 其他召回通道

  1. 地理位置召回
    用户可能对附近发生的事感兴趣
  • GeoHash: 对经纬度的编码,地图上一个长方形区域
    索引:GeoHash-->优质物品列表(按照时间倒排)
  • 同城召回:索引:城市---> 优质内容列表
  1. 作者召回
  • 用户对关注的作者发布的内容感兴趣
  • 有交互的作者召回
  • 相似作者召回
  1. 缓存召回

背景:精排输出几百个物品,送入重排,重排做多样性抽样,选出几十篇,精排结果一大半没有曝光,被浪费。
想法:复用前n次推荐精排的结果,精排前50,但是没有曝光的,缓存起来,作为一条召回通道,缓存大小固定,需要退场机制

  • 一旦商品成功曝光,就从缓存退场
  • 如果超出缓存大小,就移除最先进入缓存的物品
  • 每个物品最多被召回10次,达到10次就退场

6. 冷启动

6.1评价指标

  1. 主播侧指标:发布渗透率、人均发布量
  2. 用户侧指标:新专辑指标:新专辑的点击率、交互率
  • 新笔记的点击率、交互率:

    • 问题: 曝光的基尼系数很大,少数头部新笔记占据了大部分的曝光
  • 分别考察高曝光、低曝光新笔记

    • 高曝光:比如> 1000次曝光
    • 低曝光:比如<1000次曝光
  1. 大盘指标:消费时长、日活、月活
  2. 内容侧指标:高热专辑占比

6.2 简单的召回通道

  1. 双塔模型做id embedding是,让所有新专辑共享一个id,而不是使用自己真正的id。default embedding
    改进: 使用相似物品的embeddding ,取topk个高曝光的相似物品

  2. 类目召回、关键词召回:按照刚刚发布的时间顺序召回

6.3 聚类召回

基本思想:如果用户喜欢一件物品,那么那会喜欢内容相似的物品

  1. 事先需要训练一个神经网络,基于专辑的类目和图文内容,把专辑映射到向量。
  2. 对专辑向量做聚类,划分为1000cluster,记录每个cluster的中心方向。(k-means聚类,用余弦相似度)
  3. 给定用户id,找到他的last-n交互的专辑列表,把这写专辑作为种子专辑,把每篇种子专辑映射到向量,寻找最相似的cluster。(知道了用户对哪些cluster感兴趣)
  4. 从每个cluster的专辑列表中,取回最新的m张专辑
  5. cnn提取图片,bert提取文本特征

6.4 Look-Alike召回

6.5 流量调控

流量怎么在新、老物品中分配,目的:

  1. 促进发布,增大内容池。新专辑获得的曝光越多,作者的创作积极性越高。反映在发布渗透率、人均发布量。 挖掘优质笔记。
  2. 挖掘优质笔记。做探索,让每篇新专辑都能获得足够曝光,挖掘的能力反映在高热专辑占比。

工业界的做法:PID技术

  • 假设推荐系统只分发年龄小于30天的专辑
  • 假设采用自然分发,新专辑(年龄小于24h)的曝光占比为1/30
  • 扶持新专辑,让新专辑的曝光占比远大于1/30

流量调控技术的发展:

  1. 在推荐结果中强插新物品
  2. 对新物品的排序分数做提权boost:在排序阶段加上或乘上一个系数
  3. 通过提权,对新物品做保量
  4. 差异化保量

6.6 物品冷启动AB测试

指标:

  • 用户侧:对新专辑的点击率、交互率
  • 大盘侧:消费指标,消费时长、日活、月活

5%的用户侧实验

限定:保量100次曝光
假设:新笔记曝光越多,用户使用APP时长越低
新策略:把新专辑排序时的权重增大两倍。
结果(只看用户消费指标):AB测试的diff是负数,实验组不如对照组,如果推全,diff会缩小

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值