美文网首页
rec sys - 技术

rec sys - 技术

作者: Sl0wDive | 来源:发表于2021-02-22 09:23 被阅读0次

    索引
    推荐系统为什么需要索引这一概念?

    索引即指 物料的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的需要,也降低了过拟合的风险

    相关文章

      网友评论

          本文标题:rec sys - 技术

          本文链接:https://www.haomeiwen.com/subject/auvxfltx.html