Skip to main content
  1. Posts/

【推荐系统】Toward the Next Generation of Recommender Systems: A Survey of the State-of-the-Art and Possible Extensions

·1797 words·4 mins
Note: This article is available in Chinese only. 本文暂无英文版本。 View original

迫于生计,从今天开始学习推荐系统相关的内容,先来读一篇推荐系统领域的综述 Toward the next generation of recommender systems: a survey of the state-of-the-art and possible extensions

由于目前的工作其实偏向推荐系统的 serving、训练的开发,因此这些 paper 可能都是粗读,也不会把 paper 中的内容逐句翻译,而是找出我认为最为重要的一些概念加以记录。

INTRODUCTION
#

  • 推荐问题简单来说可以归纳成对 user 未看见的 item 进行打分的过程,这个分一般称之为 rating。有了 rating,推荐时取 rating 最高的 top k 个 item 给用户即可。
  • 推荐系统的预测内容有两种不同的类别,一种是预测绝对的 rating,另一种是预测 user 对不同 item 的相对喜好,称为 “preference-based recommender systems”。本文只讲前者,也就是预测具体的 rating 数值。
  • 根据使用的方法不同,推荐系统又分为三类:
    • 基于内容的推荐:user 会被推荐与他之前喜欢的 item 相似的 item
    • 基于协同过滤的推荐:user 会被推荐其他和该 user 品味相近的 user 喜欢的 item
    • 将上述两种方法结合在一起使用

基于内容的方法( Content-Based Methods )
#

常用在基于 text 内容的领域,可以用一些keyword来描述内容。具体做法是先拿到 keyword 的 weight,然后基于这些 weight 来做推荐。计算 keyword weight 的方法中,比较有名的是 TF-IDF

TF-IDF
#

tf–idf 是一个用来衡量一篇 text 中每个 keyword 的重要性(或者叫 weight)的方法。 从名字就可以看出,这个方法分为两部分:tf 和 idf。

tf 是 “term frequency” 的缩写,表示的是某个 keyword 在一篇 text 里的频率,也就是出现的次数除以所有字词出现的次数。 idf 是 “inverse document frequency” 的缩写,衡量的是某个 keyword 在语料库里的普遍性。越普遍,该值越小(比如结构助词 “的”,几乎在每一个 text 里都会出现,那么 idf 值就会很小)。

tf 和 idf 两部分都有一个公式来计算得到数值,tf-idf 算法是将两个数值相乘起来,使得最终结果可以被这两部分影响。 tf-idf 算法认为,某个 keyword 的 tf 值越高、idf 值越大,说明这个 keyword 对这篇 text 越重要。

直观地说,tf-idf 的 tf 是保留高频重要词语,idf 是将常见的词语去除的过程。


我们刚刚说 tf-idf 可以用来分析一个 text(也就是 item)中每个 keyword 的 weight,那么实际上,tf-idf 也可以用来分析对于一个 user,每个 keyword 的 weight。 这样我们就得到了两个 weight vector,分别表示每个 keyword 对一个 user 的重要性和每个 keyword 对一个 item(text)的重要性。

此时可以算一下两个向量的相似度,比如算个 cos 距离,然后根据这个相似度进行推荐。

缺点
#

  • 非 text-based 的 item 不好提取 feature
  • top k keyword 相同的两个 item,不好区分
  • 只会推荐之前打分过的 item,使得推荐系统缺乏多样性
  • 新用户的冷启动问题,推荐系统中没有新用户的喜好,导致无法做推荐

基于协同过滤的方法
#

  • 找到和某个 user taste 类似的 user group,然后将这个 user group 喜欢的 item 推给这个 user
  • 根据使用的方法不同,通常分为两类:memory-based(or heuristic-based)和 model-based。前者更多是基于某个 rule 做预测,后者是通过 ML 以及之后的 DL 方法来 train 一个 model,用这个 model 做预测
  • 由于可能需要计算任意两个 user 的相似度来判断 taste,很多 sys 会先将任意两个 user 的相似度预处理出来。
  • 虽然协同过滤的方法最初是用于计算 user 的相似度来做推荐,但是后面也有基于 item 的相似度来做推荐的方法,通常被写作 “user-based CF” 和 “item-based CF”

优点
#

  • 能够推荐给 user 他没见过,但是和他品味类似的 user group 喜欢的 item
  • 由于是基于 ratings 算相似度,所以适用于任何形态的内容(而不仅仅是 text-based content,说白了就是当时其他形态的内容不容易拿到 feature)

缺点
#

  • new user problem:不知道新用户的喜好,不知道哪些才是与 new user taste 相似的 user
  • new item problem:新 item 没有被足够的用户打分,很难被推荐给其他 user
  • Sparsity:协同过滤依赖于大量的 user。如果某个 item 没有很多 user 打分,那么就不会被经常推荐;如果某个 user 的口味独特(因此和它口味相近的人很少),那么也不会有很好的推荐效果。

混合方法
#

就是将 content-based 和协同过滤的方法混合起来。有几种混合方法:

  • 两个方法分别做,然后把最终结果混合,类似 model Ensemble,或者直接在某个步骤时取一个更好的。
  • 在协同过滤方法中添加 content-based 的特征。可以用这些 content-based 的特征算 user 的 profile。得到的 profile 不仅可以用来计算 user 之间的相似度(而不仅仅是根据 user 喜欢的 items 来计算),还可以通过计算 user 的 profile 与 item 之间的相似度直接推荐,解决了冷门 item(对应了口味独特的 user)的推荐问题。
  • 在 content-based 的方法中添加协同过滤的特征
  • 搞一个使用两种方法的统一模型

Related

【施工中】torch2trt 学习笔记

·559 words·2 mins
前言 # 偶然发现了 torch2trt 的模型转换方案,思路是直接将pytorch op映射到TensorRT的python api. 在pytorch进行每个op forward的时候,tensorrt也相应往network上添加op. 这里会先涉及torch2trt的使用,后面会补充这个转换工具的代码学习

Jetson Nano踩坑记录

·3101 words·7 mins
写在前面 # 主要是需要在 jetson nano 上做模型转换,来记录下踩的坑。 目前有两条路径,一条是我们现有的转换路径,也就是 pytorch->onnx(->caffe)->trt 的路径。 在这条路径上踩了比较多的坑,最终暂时放弃,最直接的原因是 cudnn8.0 升级接口发生改动,编译 caffe 遇到较多问题。 这里其实仍然采用了两条平行的路径,一条是直接在 nano 上构建环境,另外一种是基于 docker(包括构建交叉编译环境用于加快编译速度)。