曲水的博客

曲水的博客

推荐系统速成(更新ing)

2022-05-20

教程:油管视频

1 Overview

定义

推荐系统是根据用户的历史信息和行为,向用户推荐他感兴趣的内容

两大方向

  • 基于行为的协同过滤:比如用户1看过钢铁侠,系统根据历史数据算出钢铁侠和绿巨人这两个内容高度相关,那么就会推荐绿巨人给用户1。又比如用户1和用户3是好友关系,用户1看过了蝙蝠侠,那么就会给用户3推荐蝙蝠侠(例如微信的在看)。
  • 基于内容的相似推荐:用户1在历史上看过钢铁侠和Python课,系统就会推算出用户1喜欢两个题材的内容(科幻、Python),而标签是根据内容本身的信息得到的。当用户1看了某些内容,用户1就具有了某种标签,进而给用户推荐相关的内容。

解决的问题

  • 信息过载:商品、视频信息量太大,用户如何找到自己感兴趣的物品,以及系统如何展示用户喜欢的内容,以达到自己的商业目的。
  • 挖掘长尾:大部分的冷门物品得不到暴露,然而他们的加和的价值超过热门物品。例如亚马逊图书的57%收入来自于长尾冷门的书籍。
  • 用户体验:当用户的目标不明确的时候,自己很难发现自己想买的物品(类似于在淘宝、京东闲逛),推荐系统可以提升用户体验,增加系统留存。

2 推荐系统包含的环节

挑战:怎么在海量的内容中,挑选出用户感兴趣的条目,并且满足系统50ms - 300ms 的低延迟的要求。

推荐系统主要包括三个主要的环节,首先在得到用户的请求以后,在后台数据库进行搜索,这个时候得到的数据量级一般是:万/百万/亿 级别的,需要不断进行数据量级的压缩。

  1. 第一步:召回。 召回环节要完成两个任务:一是实现巨量的数据降低,数据量从万/百万/亿下降到万/千级别。二是需要选取和用户直接相关或者间接相关的初略的个性化内容。使用的方式一般有:协同过滤召回、内容相似召回、图算法召回、热门召回、新课召回等等。
  2. 第二步:排序。 这里的排序指的是个性化排序,主要采取的算法是机器学习的二分类算法,例如LR、GBDT、DNN、Wide&Deep等等,主要为了判断某个用户是否对某个特征是否喜欢,返回0或者1,进而得出每个条目喜欢的概率,并且进行排序。经过这一步以后,数据量一般下降到千/百级别。
  3. 第三步:调整。 主要是解决去重、已读过滤、已购过滤、在线过滤等问题,并且添加热门补足、分页提取、合并内容信息等等,最终再展示给用户。

3 推荐系统的召回路径

召回的路径有:i2i,u2i,u2i2i,u2u2i,u2tag2i。

  • i2i:从 Item 到 Item,主要是给用户推荐内容相似的内容,不涉及用户的行为。比如在b站一个视频下面的推荐视频列表。
  • u2i:从 User 到 Item,可以根据用户的行为来给用户推荐相关的内容,比如淘宝里用户点击过某个耳机,就有可能再给你推送这个耳机。
  • u2i2i:从 User 到 User 到 Item,先利用 u2i 的数据,再利用 i2i 的数据,然后将其结合起来。
  • u2u2i:可以通过各种信息计算两个人的相似度,用聚类等的方法,进而给一个类的人推荐相同的内容。
  • u2tag2i:中间节点是tag,而不是user和i,如果数据的标签非常多,区分度也比较好,就可以利用u2tag2i的方式,这种方式的泛化性非常好。
  • u2***2i:基于图的算法,会走很多条边,不局限于1-3条边的过程。

4 Netflix经典推荐系统架构

架构展示

  • 架构分为三层,Online在线层、Nearline近线层、Offline离线层。

  • 用户的一些行为会形成事件序列,然后会有两个分发。一个是分发到离线层的Hadoop,一个是作为队列分发到近线层的Netflix Manhattan组件,是一个流式计算的平台。其中Hadoop中数据的粒度一般是天粒度/小时粒度。

  • 离线层的数据经过特征的提取,会和过往的历史数据一起放入Netflix Hermes(调度平台)中,一是用于模型的训练,二是用于离线计算。模型训练得到的模型参数会作用于离线计算中,同时也会发到在线层,用于实时的计算。

  • 近线层主要起到桥梁的作用,数据以队列形式进入后,近线层不但能够调取离线层的数据,并且能够得到用户的操作数据,主要提供高速缓存等操作。

  • 在线层会从高速缓存中读取数据,并且放到在线层计算,在线层计算可以得到离线层系统发出的信号、离线层训练的模型、近线层的数据等等,最终得到推荐的列表,输出给用户。

优缺点分析

  • 在线层:

    • 特点:快速响应,使用最新的数据输入,比如200ms。
    • 缺点:不能使用复杂的算法,只能读取少量的数据。
  • 离线层:

    • 特点:大部分计算包括模型训练都在这一层完成。
    • 优点:可以采用复杂算法,可以扫描海量的数据。
    • 缺点:不能对最新情景和新数据做出响应,比如天粒度的数据。
  • 近线层:

    • 特点:离线和在线的这种,一般将结果存入高速缓存。
    • 优点:能够使用几乎最新的数据计算,延迟10s-1min级别。同时能够允许相比在线层更加复杂的算法处理,加载查询更多数据。
  • 组合使用的例子:

    • 天粒度:离线层做矩阵分解,得到用户向量和物品响亮做数据存储到Mysql。
    • 10s级别:近线层根据用户行为,查询TOPN相似的用品列表,存入Cassandra。
    • 200ms:在线层查询第二步骤的结果,更新推荐列表。

5 推荐系统通用技术架构(数据流图)

  • 系统数据源:包括前端打点日志(Kafka流),物品内容数据(MySQL),用户画像数据(Hbase)。

  • 近线计算层:Spark Streaming的计算有三个输入:打点日志流、离线日志数据、机器学习的预估模型。

6 如何实现基于内容的推荐系统

  • 地位:最早被使用的推荐算法,年代久远,但当今仍然被广泛使用,效果良好。

  • 定义:给用户X推荐之前喜欢的物品相似的物品,即u2i2i和u2tag2i。

  • 实现步骤:

    • 步骤1:给物品找到一个特征,比如标签、分类、演员、关键词。
    • 步骤2:根据历史,聚合计算用户的标签偏。例如简单计数、加权平均等。
    • 步骤3:使用余弦相似度算法,计算用户标签向量最相似的TOPN物品列表。

  • 余弦相似度算法:

cosθ=i=1n(Ai×Bi)i=1n(Ai)2i=1n(Bi)2\cos \theta=\frac{\sum_{i=1}^n (A_i \times B_i)}{\sqrt{\sum_{i=1}^n (A_i)^2}\sqrt{\sum_{i=1}^n (B_i)^2}}

例如:

  • 用户向量:[(动作片,3),(科幻片,2),(周星驰,1)]
  • 物品向量:绿巨人[(动作片,1),(科幻片,1),(周星驰,0)]
  • 得到相似度为:

3×1+2×1+1×09+4+1×1+1+0=55.29=0.94\frac{3\times1+2\times1+1\times0}{\sqrt{9+4+1}\times\sqrt{1+1+0}}=\frac{5}{5.29}=0.94

  • 即用户向量和物品向量的相似度值为0.94。
  • 优点:

    • 不需要其他用户的数据。
    • 能给具备独特口味的用户推荐。
    • 可以推荐最新的、冷门的物品。
    • 容易做推荐结果的解释。
  • 缺点:

    • 很难找到能表达物品的标签,有时候需要人工打标签。
    • 过于局限于自己的世界,无法挖掘出用户潜在的兴趣。
    • 新用户如果没有行为,没法做推荐。

7 如何实现基于协同过滤的推荐系统

  • 0