推荐系统算法(传统推荐模型)

推荐系统经历两个阶段:传统推荐模型和深度学习模型

第一阶段:传统推荐模型(协同过滤,矩阵分解,LR, FM, FFM, GBDT)。

  • 协同过滤体现了最朴素的推荐思想,同类相聚
  • 矩阵分解降低了计算复杂度
  • LR:用一层逻辑回归代替矩阵分解,预估CTR
  • FM:在LR的基础上,考虑特征组合
  • FFM:在考虑特征组合的基础上,更精细化的分不同的域做特征组合

1 召回侧或者粗排侧

1.1 基于内容的过滤算法

  • 简介:通过分析用户的历史行为给用户的兴趣建模,从而主动给用户推荐能够满足他们兴趣和需求的信息。
  • 本质:基于物品和用户的特征直接分析和计算。举个例子,假设电影A是科幻片,我们分析用户B看过的电影里有科幻片的tag,就可以推荐电影A给用户B。
  • 整体流程:
    (1)给电影打tag:从影评中切词,或者根据常用标签,得到电影的多个标签。再求每个标签的TF-IDF(Term Frequency - Inverse Document Frequency)值来计算标签权重,取Top-K个作为电影标签
    (2)建立倒排索引:可以根据关键词找到对应电影
    (3)给用户打tag:根据用户历史观影记录,找到看过的所有电影对应的关键词,统计词频,把词频最高的关键词作为用户的兴趣词
    (4)根据用户的兴趣词,从倒排表里找电影。实时推荐
  • 用到的技术:TF-IDF特征提取技术
  • 冷启动问题:对于一个新电影,用户都没有看过,无标签,通过两种技术来推荐新电影:
    (1)Word2Vec:得到的电影标签的词vector,来计算标签tag之间的相似性,推荐和用户看过的电影标签相似的电影给用户。用word embedding 的原因是如果标签词典太大,one-hot的representation维度太大,而word embedding可以用较小的维度
    (2)Doc2Vec:根据电影的所有标签,训一个模型得到最终电影的影片vector
  • 优点:一种比较简单的推荐方法,很直接,可解释性强
  • 缺点:需要用到物品本身或者是用户自身属性
from gensim.models import Word2Vec, Doc2Vec

协同过滤算法

  • 简介:对业界影响力最大,应用最广泛的一种经典模型,从1992年用到现在还在用。
  • 本质:
    (1)基于用户的系统过滤算法(UserCF):给用户推荐 和他兴趣相似的其他用户喜欢的物品
    (2)基于物品的协同过滤算法(ItemCF):给用户推荐 和他之前喜欢的物品相似的物品
  • 整体流程:
    (1)UserCF:先量化为猜测用户对一个商品喜爱程度的打分,根据之前用户购买、收藏、加购物车等行为对之前的商品分别打分,找到相似的用户,根据这些相似用户对新物品的打分,猜测该用户的打分,比较高就推荐,不高就不推荐。最后计算该用户的【相似用户们】对这个新商品的评价加权,得到该用户的评价预估。最好还可以用皮尔逊,减去每个用户的平均评分,这样消除不同用户打分标准不一致的问题
    (2)ItemCF:根据所有用户的历史偏好数据计算物品相似性,如果很多用户同时喜欢物品A和物品B,说明这俩很相似。用皮尔逊相关系数
  • 用到的技术:相似性计算
    (1)杰卡德(Jaccard)相似系数:衡量两个集合的相似程度,看交集在并集中占的比例。
    (2)余弦相似度:衡量两个向量的夹角大小,越小相似度越大。 或者
from sklearn.metrics.pairwise import cosine_similarity
cosine_similarity([[1,2,3], [4,5,6]])

(3)皮尔逊(person)相关系数:当用户容易乱打分的时候(比如用户A喜欢打高分,用户B喜欢打低分),用余弦效果就不那么好了。person就是把两个向量都减去他们的均值,然后再计算consine,效果好于直接计算consine。

from scipy.stats import pearsonr
pearsonr([[1,2,3],[4,5,6]])
  • 其他:为什么在一些场景中要使用余弦相似度而不是欧式距离呢?
    (1)一些在欧式距离中非常大,在余弦中夹角非常小的,比如文本、图像、视频领域的特征维度非常高,但余弦相似度不仅不受值域影响,而且范围都是在同向为1,正交为0,反向为-1的特性。
    (2)比如统计用户观看偏好,更关注相对差异,应该用余弦。
    (3)比如统计用户活跃度,登录次数和平均观看时长,关注数值绝对差异,应该用欧式距离。
  • 优点:完全没有用到物品本身或者是用户自身属性,仅仅根据用户和物品的交互信息就可以实现推荐,可解释性很强,非常直观
    (1)UserCF 是基于用户相似度进行推荐, 所以具备更强的社交特性, 这样的特点非常适于用户少, 物品多, 时效性较强的场合, 比如新闻推荐场景
    (2)ItemCF更适用于兴趣变化较为稳定的应用, 更接近于个性化的推荐, 适合物品少,用户多,用户兴趣固定持久, 物品更新速度不是太快的场合, 比如推荐艺术品, 音乐, 电影。
  • 缺点:稀疏矩阵的处理能力比较弱(热门物品有较强的头部效应,很容易跟大量物品产生相似,但尾部物品由于特征向量稀疏,极少被推荐),且无法利用更多信息比如物品的特征,这就是为什么协同过滤慢慢烟花到了逻辑回归模型,可以综合不同类似特征。UserCF存在数据稀疏性和算法扩展性的问题,ItemCF相对来说因为物品属性比较固定,所以相似度比较稳定。


    CF的地位

隐语义模型(LFM)与矩阵分解(MF)

  • 简介:矩阵分解(Matrix Factorization)是从协同过滤中衍生出的方向,用于解决处理稀疏矩阵的泛化能力,比如隐语义模型(Latent Factor Model)等,就是这个方向的分支模型。就是在协同过滤共现矩阵的基础上,使用更稠密的隐向量(类似NLP里的embedding)表示用户和物品,挖掘用户和物品的隐含兴趣和隐含特征,解决泛化能力。
  • 本质:把协同过滤的评分矩阵,分解成了用户矩阵乘以物品矩阵,这俩矩阵都是隐向量。预测新物品评分的时候,直接用物品向量乘以用户向量即可。为了拆解这两个矩阵,出现了很多算法(BasicSVD,RSVD,ASVD,SVD++)
  • 整体流程:共现矩阵R(mxn维度),分解成用户矩阵U(mxk维度)和物品矩阵V(kxn维度)。后续如果想知道用户u对物品i的评分,只需要
  • 用到的技术:矩阵分解最常用的方法是特征值分解(EVD)或者奇异值分解(SVD)
    (1)特征值分解EVD:要求分解的是方阵,不适用
    (2)奇异值分解SVD:可以用满秩分解对数据做压缩,但是计算复杂度高
    (3)BasicSVD:2006年的Netflix Prize之后, Simon Funk公布了一个矩阵分解算法叫做Funk-SVD,后来被称为Latent Factor Model(LFM)。思想很简单:把求解两个矩阵的问题转换成一个最优化问题,先随机初始化,然后通过和观测值的误差loss最小化,就可以用梯度下降法训练了。问题就在于两个矩阵很大的时候,参数量过多,容易陷入过拟合
    (4)RSVD:在目标函数中加入正则化参数(加入惩罚项目),避免过拟合
    (5)Netfix Prize中提出了另一种LFM:消除用户和物品打分的偏差。因为单纯根据两个隐向量的距离来打分是不够的,所以直接加上几个偏置项目:① 全局平均数,②用户偏差系数,③物品偏差系数。这样得到的隐向量更能反映不同用户对不同物品的“真实”态度差异
    (6)SVD++:把历史评分的物品加入到LFM模型中
  • 其他:隐语义模型LDM和矩阵分解FM是试图在协同过滤共现矩阵的基础上,使用更加稠密的的印象量表示用户和物品,挖掘用户和物品的隐含兴趣和隐含特征,在一定程度上弥补协同过滤模型处理稀疏矩阵能力不足的问题。
  • 优点:泛化能力强可解决稀疏问题,空间复杂度低,更好的扩展和灵活性
  • 缺点:只用到了评分矩阵,没有考虑用户、物品、上下文的特征,丧失了很多有效信息的,也很难考虑用户历史行为(所以后续有逻辑回归和因子分解机模型)。

FM+FFM 模型

  • 简介:FM(因子分解机 Factorization Machine)FFM(域感知因子分解机 Field-aware Factorization Machine)这两个因子分解机模型族,在传统逻辑回归的基础上,加入了二阶的部分,使得模型具备了特征交叉和筛选的能力。用来解决逻辑回归模型(LR模型已经把TopK的问题转成了CTR预估的问题)里表达能力不强的问题。(除了POLY2->FM->FFM这条发展线路之外,还有另外一条发展线路是GBDT+LR)
  • 本质:就是希望在LR的基础上,能考虑特征组合,毕竟LR就是粗暴的做线性组合再过一层sigmod。(考虑特征组合的线路:POLY2->FM->FFM)
    (1)POLY2:直接做暴力组合,对所有的特征进行两两交叉。从LR的变成。缺点:①会导致特征向量非常稀疏,交叉特征可能会缺乏有效数据训练;②权重参数量是太大了
    (2)FM:结合LFM的思想,用隐向量替换one-hot向量,即把替换成两个隐向量相乘的方式,一方面减少了模型参数数量,另一方面参数之间不再是相互独立的,可以减轻数据稀疏性造成的影响。另一方面,FM可以用SGD训练,可以在线性时间内训练和预测

    (3)FFM:相比较FM,FFM引入了特征域感知的概念,对于每个特征, 针对不同的交叉域要学习不同的隐向量特征,好处是交叉的时候, 可以更能够体现出不同域里面特征的差异性。
  • 整体流程:比如一个日期和年龄特征分别有3个域的embedding,如果要计算日期特征和年龄的交叉特征,首先要看年龄属于哪个域,再用那个域的embedding来相乘得到最后的交叉特征。时间复杂度上会从FM的O(nk)到FFM的O(nfk), 这里的f就是域的个数, 这里的时间复杂度会到O(kn^2)。
  • 用到的技术:
  • 其他:工业上, 原始的FFM一般不会使用, 因为这哥们计算量太大了, 每个域都会学习特征, 这个与word2vec做个对比,那里每个单词只有两个身份, 这时候,对应了2个embedding矩阵, 而这里假设有100个域, 那么相当于每个实值特征有99个身份(会和其他99个域特征交叉), 这时候99个embedding矩阵, 而每个embedding矩阵维度就很大了, 这样的计算更新是受不了的。如果真想用,一般要做一些处理, 两个改进的思路:① 共享一些矩阵 ② 减少域的数量,大致分为上下文特征、用户特征、item特征、交互特征和匹配特征 五大类,就可以只有5个embedding矩阵了
  • 优点:可以体现不同域特征里的差异性
  • 缺点:计算量太大,所以工业界一般不用FFM(无论是召回还是排序),但FM还是首选

参考:https://blog.csdn.net/wuzhongqiang/category_10128687.html

你可能感兴趣的:(推荐系统算法(传统推荐模型))