Processing math: 100%

第 3 章 基础推荐算法

原文

全文目录

相关性召回+点击率排序

推荐逻辑流程架构

根本任务: 匹配

匹配过程步骤:

  1. 相关性召回, 对用户做360度全方位扫描, 尽量多的描述和覆盖用户可能感兴趣高质量的物品;
  2. 候选集融合, 重点关注多样性和相关性的均衡, 召回算法的优先级等问题;
  3. 结果排序, 按照某一确定目标进行排序;
  4. 业务干预

推荐系统的逻辑流程图

分层明确的逻辑架构, 有利于项目整体的并行化和效果调优的并行化;

召回算法的基本逻辑

匹配的常用计算路径:

  1. 直接计算用户与物品的相关性;
  2. 用户到物品的行为权重+物品与物品的相关性 => 用户与物品的相关性; (基于物品的协同过滤(Item-based CF)算法)
  3. 用户与用户的相关性+用户到物品的行为权重 => 用户与物品的相关性; (基于用户的协同过滤(User-based CF)算法)
  4. 用户与标签的相关性+标签与物品的相关性 => 用户与物品的相关性;

相关性, 由算法计算出的相关性, 认为是一种复杂相关性静态相关性;

行为权重, 根据用户与物品之间产生的行为关系计算出的一种时效性较短的相关性, 认为是一种简单相关性动态相关性;

常用的基础召回算法

用户与物品的相关性

基于矩阵分解的算法, 隐语义模型(Latent Factor Model, LFM), 将用户与物品之间的关系, 建模为 "用户到隐特征 + 隐特征到物品" 的链条, 然后通过求解隐特征信息来求解整个链条;

矩阵 R 表示用户对物品行为的原始矩阵

R={r1,1r1,2r1,Ir2,1r2,2r2,IrU,1rU,2rU,I}

每一行表示一个用户, 每一列表示一个物品, 每个元素 Ru,i 表示用户 u 对物品 i 的行为;

矩阵分解则是分解为:

RXT×YX={x1,1x1,2x1,Ux2,1x2,2x2,UxK,1xK,2xK,U},Y={y1,1y1,2y1,Iy2,1y2,2y2,IyK,1yK,2yK,I}

X 矩阵每一列表示一个用户, Y 矩阵每一列表示一个物品; 每一行均表示一个隐类别;

优点:

  • 发现人工没有找出的类别;
  • 更好适应数据变化; 根据用户的行为以及行为之间的关系找到隐类别, 时效性比较强;
  • 将用户, 物品与隐类别之间的关系进行量化;

缺点: 隐特征缺乏直接的解释, 导致隐变量这个中间数据难易复用, 有效数据只有最终的用户和物品的数据;

LFM 思路: 先得到用户和物品的原始行为矩阵, 然后借助矩阵中有值(有行为)的元素来计算求解两个隐变量矩阵的值, 再用隐变量反过来求解缺失值元素的值, 从而得到推荐结果;

衍生出的相关模型: pLSA, LDA, 词嵌入, 句嵌入, 文档嵌入等;

LFM 求解 X, Y 转化为以下式子的优化问题(损失函数):

L=||Rsample(XT×Y)sample||2F

||M||2F 是矩阵 M 的 Frobenius 范数(F-范数)的平方, 表示矩阵中每个元素的平方和;

M=[ai,j]m×n||M||F=i,ja2i,j

sample 下标代表矩阵中的样本集;

目标: 损失函数 L 取得最小值的 xu,k, yi,k:

L=u,isample(ru,ik(xu,k×yi,k))2

单纯优化上式可能会出现过拟合现象, 所以加入正则化项:

L=u,isample(ru,ik(xu,k×yi,k))2+λ(x2i,j+y2i,j)

其中, λ 是正则化参数, 代表正则化力度;

求解方法有两种:

基于梯度下降的方法

随机梯度下降法(Stochastic Gradient Descent, SGD), 每次随机找一条训练样本, 求得其梯度, 然后将参数向梯度的反方向前进一步, 不断重复该过程, 求得一组结果稳定的参数值;

求两组参数 xu,kyi,k 的偏导数:

ΔLΔxu,k=2(ru,i(xu,k×yi,k))yi,k+2λxu,kΔLΔyi,k=2(ru,i(xu,k×yi,k))xu,k+2λyi,k

根据上面的梯度求得参数的前进方向:

xu,k=xu,k+α((ru,i(xu,k×yi,k))yi,kλxu,k)yi,k=yi,k+α((ru,i(xu,k×yi,k))xu,kλyi,k)

可以先将 xu,kyi,k 随机初始化, 然后按上面公式不断迭代;

其中三个参数 λ(正则化系数) , α(学习率) , K(隐特征) 都需要反复试验来确定最优值;

不基于梯度的交替最小二乘法

交替最小二乘法(ALS), 将两组参数交替保持一组固定不变, 来优化另外一组;

引入新变量: cu,i=1+αru,i

优化目标变更为:

L=u,icu,i(ru,i(xu,k×yi,k))2+λ(x2i,j+y2i,j)

  • 增加 cu,i 参数, 让每条样本都有不同的权重;
  • 所有数据参与计算, 移除 sample 下标;

改写向量形式:

L=u,icu,i(ru,ixTuyi)2+λ(u||xu||2+i||yi||2)L=u=m,i=nu=0,i=0(cu,i(ru,ixTuyi)2+λ(||xu||2+||yi||2))

通过微积分运算求得解析解:

xu=(YCuYT+λI)1YCuRuyi=(XCiXT+λI)1XCiRi

物品与物品的相关性

从根本逻辑上划分算法:

  • 基于行为的算法
    • 以余弦相似度为代表的相似度算法
    • 以 Apriori 与 FP-Growth 为代表的关联规则算法
  • 基于内容的算法(后面介绍)

关联规则算法是对数据做了严格限制, 比如限制分析一次购物涉及的物品之间的关系, 计算出的数据相关性会更强, 由于使用了更少的数据而导致覆盖率较差;

相似度算法则是分析一段时间内购买行为数据, 相关性上有所牺牲, 但会有更好的多样性和覆盖率;

可以说相似度算法是一种广义的关联规则算法;

两个 N 维向量 X (X=(x1,x2,,xN)T)和 Y (Y=(y1,y2,,yN)T) 的余弦相似度:

consine(X,Y)=XY||X||||Y||=Ni=1XiYiNi=1X2iNi=1Y2i

大数据稀疏情况下会造成两个层面的浪费:

  • 物品对层面的浪费: 每个用户只会对少量物品产生行为;
  • 点积层面的浪费: 少量用户同时对两个物品产生行为;

采用剪枝优化,

  • 分子, 同时对物品 i 和物品 j 产生过行为的用户数, intersect(i, j);
  • 分母, 物品 i 和物品 j 对应的向量长度, 即对物品 i 和物品 j 产生过行为的用户数, count(i), count(j);

优化后的计算流程:

  1. 将用户到物品的行为原始数据转为物品到用户的倒排表;
  2. 遍历倒排表得到所有的 intersect(i, j), 和所有的 count(i);
  3. 使用 intersect(i,j) 和 count(i) 计算物品 i 和物品 j 之间的非零相似度;

用户与用户的相关性

同物品与物品的相关性计算方法, 将用户和物品位置互换即可;

一般网站, 用户数的量级要比物品数的量级大, 增加了用户之间相关性计算的复杂度; 所以要考虑业务特点和规模;

小结

以上介绍的方法都是基于用户行为的召回算法, 存在如下问题:

  • 依赖用户行为, 扩展能力差(冷启动和时效性);
  • 缺乏抽象, 知其然不知其所以然;
  • 长尾挖掘能力差与滞后性, 直接依赖用户行为的算法, 也称基于记忆的算法, 对于新物品或长尾物品不利;

以下介绍基于用户画像(标签)的算法;

用户与标签的相关性

用户标签来源:

  • 根据行为分析; => 行为权重+时间衰减;
  • 根据行为分析+相关性; => 在1基础上再考虑标签的相关性;
  • 不直接依赖用户行为, 用户本身属性; => 用户主动填写高权重, 算法推测低权重;

标签与物品的相关性

  • 类别到物品, 常用方法是在召回热品, 新品或质量高的物品时, 加入一些品类下的重点物品; 过程中最好加入一些随机因素;
  • 语义主题到物品, LDA, 通过贝叶斯公式得到每个主题下不同物品的概率 P(doci|topic)=P(topic|doci)P(doci)kP(topic|dock)P(dock)
  • 搜索词到物品;

将用户与物品的关系拆解为多个中间相关性的组合;

冷启动场景下的推荐

  • 用户维度冷启动, 用户没有在系统中留下足够的行为;
  • 物品维度冷启动, 新物品, 还没有足够多的用户对其产生行为;

解决方法: 基于内容的推荐算法, 或直接推荐畅销热品或新品;

冷启动时期推荐系统的责任:

  1. 给出推荐结果;
  2. 尽快探测用户的兴趣, 推荐种类丰富的物品, 增大命中用户兴趣的可能性;

解决冷启动问题, 在推荐系统中称为 Exploration & Exploitation 问题(EE问题), 即探索与利用问题;

参考文章

  1. ALS交替最小二乘法推导
posted @   01码匠  阅读(228)  评论(0编辑  收藏  举报
编辑推荐:
· 你所不知道的 C/C++ 宏知识
· 聊一聊 操作系统蓝屏 c0000102 的故障分析
· SQL Server 内存占用高分析
· .NET Core GC计划阶段(plan_phase)底层原理浅谈
· .NET开发智能桌面机器人:用.NET IoT库编写驱动控制两个屏幕
阅读排行:
· 我干了两个月的大项目,开源了!
· 推荐一款非常好用的在线 SSH 管理工具
· 千万级的大表,如何做性能调优?
· 聊一聊 操作系统蓝屏 c0000102 的故障分析
· .NET周刊【1月第1期 2025-01-05】
点击右上角即可分享
微信分享提示