索引
推荐系统为什么需要索引这一概念?
索引即指 物料的ID
我们可以根据这一ID去取到物料的各种属性字段。(正排索引)
以特征为出发点去找具备这些特征的物料。(倒排索引)基本上都使用倒排索引。
索引的意义在于 通过构建索引生成召回的候选集
主要有三步:
step1:对物料的特征构建索引 获取对应items的结果列表 (对 严格来说 只有第一步是涉及 索引 后面两步算是索引的应用)
step2:对结果列表数据进行微运算 如 计算物料质量分 物料相关性等
step3:基于上诉的运算得分对物料进行综合排序 最后返回结果给用户
在真实的生产环境中 索引的设计模式 复杂且繁多 其中涉及了大量的 数据储存技术,查找算法,排序算法,文本处理技术,甚至I/O技术。
粗排的结果很大依赖于各路召回结果的排序 而各路召回中需要涉及到 索引 的构建 : 如果一条物料不在索引中 那么这条物料基本没有召回的可能。
倒排索引
倒排索引 即 “关键词——文档” 形式的一种映射结构 有种基于 内容 去 表达 主体 的感觉。
倒排索引创建索引的流程:
1) 首先把所有的原始数据进行编号,形成文档列表
2) 把文档数据进行分词,得到很多的词条,以词条为索引。保存包含这些词条的文档的编号信息。
搜索的过程:
当用户输入任意的词条时,首先对用户输入的数据进行分词,得到用户要搜索的所有词条,然后拿着这些词条去倒排索引列表中进行匹配。找到这些词条就能找到包含这些词条的所有文档的编号。
然后根据这些编号去文档列表中找到文档
有一篇文章讲的不错 : https://zhuanlan.zhihu.com/p/62892586
目前业界很少有 自己去构建 倒排索引的 有不少的开源的工具 比如 elasticsearch ,faiss。
faiss需重点学习。
召回
协同过滤(Collaborative Filtering Recommendation):基于用户行为,考虑用户的共同行为。
基于内容的推荐(Content_based Recommendation):基于文本相关性,考虑词的共现状况。
协同过滤必须要有用户行为,基于内容的推荐可以不用考虑用户行为
协同过滤包括UserCF , ItemCF等。
UserCF: 找到跟TA喜好最相似的其他用户,然后把这些用户喜欢的商品推给TA。
ItemCF: 找到跟TA喜好最相似的商品,然后推给TA。
Content_Based: 根据内容元数据进行分析(没有考虑用户),找到相似的内容进行推荐。
具体参考这篇:协同过滤和基于内容推荐有什么区别?https://www.zhihu.com/question/19971859
以下本质上都是协同过滤的思想:
i2i:计算item-item相似度,用于相似推荐、相关推荐、关联推荐
u2i:基于矩阵分解、协同过滤的结果,直接给u推荐i
u2u2i:基于用户的协同过滤,先找相似用户,再推荐相似用户喜欢的item
u2i2i:基于物品的协同过滤,先统计用户喜爱的物品,再推荐他喜欢的物品
u2tag2i:基于标签的泛化推荐,先统计用户偏好的tag向量,然后匹配所有的Item,这个tag一般是item的标签、分类、关键词等tag
除了传统的召回方式外,也用深度学习模型进行召回。
召回代码参考链接:
https://github.com/andjsmile/Match_Algorithm
Content Based
item2vec
LFM
Personal Rank
item_CF
https://github.com/Eleanoryuyuyu/RecommendRelative
DeepAutoEncoder
node2vec
FPGrowth
item2vec
基于图的模型
基于邻域的算法
隐语义模型
https://github.com/lpty/recommendation
基于协同过滤的模型(UserCF)
基于隐语义的模型(LFM)
基于图的模型(Personal Rank)
前沿(深度学习)召回代码参考链接:
https://github.com/shenweichen/DeepMatch
https://github.com/andjsmile/Match_Algorithm
https://github.com/Eleanoryuyuyu/RecommendRelative
https://github.com/lpty/recommendation
http://github.com/microsoft/recommenders
排序
推荐系统的排序模型需要自己构建正负样本,在排序的前一步 我们得到了多个不同来源的召回队列
系统将这些不同来源组合的候选物品集合组合成一个通用的候选库 ,然后由单个模型对其进行打分并根据该分数进行排名
排序前期一般业务简单 通常选取一个指标来重点优化 ,当到中期的时候 就会发现单一指标对整体的提升比较有限 ,这个时候往往会引入多目标排序来解决这些问题
排序有常用的三种模型框架: pointwise pairwise listwise
nlp中三者也很常见(learning to rank),以query-document为例,pointwise是把单个文档作为训练样本,而pairwise是把有偏序关系的文档对作为训练样本,listwise是把某个query下所有文档的ranked list作为训练样本。
推荐系统中常用pointwise方法来做排序,更简单直观。
粗排代码参考链接:
https://github.com/shenweichen/DeepMatch
精排代码参考链接:
https://github.com/shenweichen/DeepCTR
资源汇总:
https://github.com/shenweichen/AlgoNotes
PID控制算法 (在流量控制以及广告调价中应用广泛)
proportion integration differentiation
比例,积分,微分控制
即 当得到系统的输出后 将输出经过比例 积分 微分 3种运算方式
叠加到输入中 从而控制系统的行为
可以这样理解 p是控制现在 i是纠正曾经 d是掌控未来
用户长短期兴趣:
以下只是一些摘抄,与该主题有关的点:
Sequential Recommendation:主要致力于捕捉和解决用户随时变化的,动态的偏好。
一个明显的例子就是:买了手机的用户,下一步极有可能购买手机壳,耳机贴膜等等
现在各大顶会论文整体来讲,对用户长短期偏好的建模整体还是一个encoder-decoder的结构,
在这基础上做一个long-term short-term的捕捉,然后基于seq2item监督的训练。
基于seq2seq的训练还不多,看到阿里的一篇文章,
《Disentangled Self-Supervision in Sequential Recommenders》比较有意思
推荐系统 样本划分
Q1:负样本应该如何采样更合理?
A1:可以尝试使用一定的规则筛选负样本:
base策略:随机抽取一定比例
策略1:在用户未点击的部分,选择流行度高的作为负样本(更有代表性)
策略2:在用户未点击的部分,删除用户近期已发生观看行为的电影
策略3:在用户未点击的部分,统计相应的曝光数据,取Top作为负样本(多次曝光仍无转化)
Q2:正负比例有个大致的主流数值吗?1?5?10?
A2:建议交叉验证后选择合适的数值
Q3:测试集是否需要和训练集保持相同的正负样本比例?
A3:这个问题是不成立的,首先基于一个策略生成全部的样本,再根据时间轴人为切分成训练集和测试集,并不是先生成训练集,再生成测试集。
推荐系统 样本加权
转自:https://zhuanlan.zhihu.com/p/281434497
主要思想是:样本生而不平等,需要对不同的样本不一样的学习权重。
例如 点击率 和 时长 两个优化目标,
我们在优化点击率的基础上考虑时长长的结果更能排在前面,这样的结果肯定是更好的。
目前可以做的有 多目标,多目标可以单独训练两个模型进行融合,也可以同时学习。
也可以采用 样本加权 的方式。 例如使用 时长加权, 希望在点击排序模型中,将时长长的正例排在前面。
样本加权的具体方式 可以见 https://zhuanlan.zhihu.com/p/281434497
多臂赌博机问题 (Multi-armed bandit problem, K-armed bandit problem, MAB),简称 MAB 问题。
bandit机制: https://blog.csdn.net/dengxing1234/ 大概就是用来解决mab问题的一种方法。使得效率尽量达到最高。
STEP1: 用有限的类别来表示用户的每个兴趣,也就是arm
STEP2: 经过几次实验之后(推荐反馈),来计算新用户对每个类别的感兴趣概率。
STEP3: 经历 ‘选择-评估-更新-选择’ 的循环测试之后,理论上最终的选择会越来越逼近用户真正感兴趣的类别。
ground truth : 在有监督学习中,数据是有标注的,以(x, t)的形式出现,其中x是输入数据,t是标注.正确的t标注是ground truth, 错误的标记则不是
shared embedding:
1 多个相关联的field共享一个embedding矩阵,减少了待优化变量的数目,加速计算,也降低过拟合的风险
2 同一个embedding矩阵,为多个field提供embedding向量,类似于“多任务学习”,使每个embedding向量有更多的训练机会,同时也要满足多个field的需要,也降低了过拟合的风险
网友评论