推荐系统(一)

概述

分类

主流的推荐系统算法大致分为两类:

  1. 基于用户行为数据的协同过滤算法
  2. 基于内容数据的过滤算法
    大致而言,基于内容数据的算法适用于cold start,即用户和项目都比较少的时候,而基于用户行为数据的协同过滤算法在用户和项目较多,数据比较丰富的情况下有较高的准确率。

1. 基于用户行为数据的算法

1.1 基于用户的协同过滤算法(user-based CF)

一个用户喜欢和他具有相似喜好的用户喜欢的项目, 两个用户喜欢的项目交集越大, 这两个用户越相似。
两个用户兴趣相似度:常见的如 Pearson相关相似性和余弦相似度计算。

1.2 基于项目的协同过滤

基于项目的协同过滤推荐(item-based CF)基于这样的假设[8]: 一个用户会喜欢与他之前喜欢的项目相似的项目。因此, 基于项目的协同过滤推荐关键在于计算物品之间的相似度
基于用户的协同过滤和基于项目的协同过滤统称为基于邻域的推荐 (nearest neighbor recommendation),也称作基于记忆的推荐算法(memory-based recommendation)。
基于邻域的推荐算法需要维护一个用户相似度矩阵或项目相似度矩阵, 因此对于项目的数目更新速度远远小于用户数目的增长速度的情况, 宜采用基于项目的推荐算法。
另外, 有研究表明, 基于项目的算法一般在性能上要优于基于用户的算法。

基于领域的推荐算法不足之处在于数据稀疏性等问题, 难以处理大数据量下的即时结果。因此提出了基于模型的协同过滤推荐算法。

1.3 基于模型的协同过滤

基于模型的协同过滤推荐 (model-based CF) 是采用机器学习或数据挖掘等算法, 用训练数据来学习识别复杂模式, 从而得到学习模型, 然后基于学习模型在数据集上进行智能预测。

2. 基于内容数据的推荐

对一个给定的用户, 推荐与他之前喜欢的项目在内容上有相似性的其他项目。
这种推荐仅需要得到两类信息: 项目特征的描述和用户过去的喜好信息。
利用领域专家给项目打标签的方法, 也即传统的分类系统(Taxonomy),
另一种是用户给项目打标签, 也即大众分类系统 (Folksolomy)。

性能评估

准确度是最重要也是最常用的推荐系统评测指标, 用来度量推荐系统预测的能力。
对于top-N推荐,用准确率 (precision) 和召回率 (recall) 来评测推荐系统。

以微博为例:大规模推荐系统架构

来源:
微博FFM
整体模型结构:
整体

线上推荐

一般有三个过程:召回、粗排、精排,但是最常见的还是两个阶段的,就这张图展示的。
结构

召回阶段

  • 首先是因为面临的侯选数据集非常大,而最根本的要求是速度快,所以就不能部署太复杂的模型。
  • 另外要使用少量的特征,这是召回阶段的特性。
    简单来说,召回会把大量的物料减到几百上千的量级,然后扔给后面的ranking阶段。

排序阶段

只有一点需要记住:模型要够,这是它的根本。
此外,因为这一阶段处理的数据量比较少了,所以就可以部署复杂模型,就可以使用我能想到的任意有用的特征

排序算法的演进

在这里插入图片描述

  • GBDT可以半自动化地做一些特征组合,于是LR后面大家就用LR+GBDT模型,能够半自动地做特征组合了,不完全依赖人工。
  • 再往后发展就是FM。FM跟LR+GBDT区别又是什么?它可以全自动化地做特征组合
  • 用FM的时候,因为一般因为计算量的问题,只做二阶特征组合,有两个单特征进行组合。
  • DNN排序模型。除了一阶和二阶特征外,它可以捕获三阶特征、四阶特征、五阶特征等更高阶的特征组合; FM一般来说很难捕获高阶的特征,DNN典型的特点就是可以捕获更高阶的特征。
  • 核心的一点是:特征组合自动化、更高阶的特征怎么融合进去,是CTR模型进化的总体方向。

LR 到 FM

在这里插入图片描述
FM(Factorization Machine)主要是为了解决数据稀疏的情况下,特征怎样组合的问题。
在这里插入图片描述
原先的wi,j,换成了vi和vj的点积。vi和vj又是什么含义呢?
给每一个特征学到一个embedding,然后交叉模型的权重就理解为对应embeeding的内积。这样就能解决PLOY2的问题,没有出现的特征对也能得到权重,只要这个特征和其他特征出现过就能学到一个embedding,就能得到权重。

vi的意思是:对于xi这个特征来说它会学到一个embedding向量特征组合权重是通过两个单特征各自的embedding的内积呈现的,因为它内积完就是个数值,可以代表它的权重,这其实就是FM模型。
所有二次项参数 w i j w_{ij} wij可以组成一个对称阵 W W W(为了方便说明FM的由来,对角元素可以设置为正实数),那么这个矩阵就可以分解为 W = V T V W=V^TV W=VTV V V V 的第 j j j 列便是第 j j j 维特征的隐向量。
在这里插入图片描述

FM与SVM

  • SVM泛化能力弱,FM的泛化能力强。
  • SVM的二元特征交叉参数是独立的,而FM的二元特征交叉参数是两个k维的向量vi、vj,交叉参数就不是独立的,而是相互影响的。
  • FM可以在原始形式下进行优化学习,而基于kernel的非线性 SVM 通常需要在对偶形式下进行
  • FM的模型预测是与训练样本独立,而SVM则与部分训练样本有关,即支持向量
  • FM最大特点和优势:FM模型对稀疏数据有更好的学习能力,通过交互项可以学习特征之间的关联关系,并且保证了学习效率和预估能力。

为什么线性SVM和多项式SVM在稀疏条件下效果会比较差呢?

  • 线性svm只有一维特征,不能挖掘深层次的组合特征,在实际预测中并没有很好的表现;
  • 而多项式 svm 中,交叉的多个特征需要在训练集上共现才能被学习到,否则该对应的参数就为0,这样对于测试集上的 case 而言这样的特征就失去了意义,因此在稀疏条件下,SVM表现并不能让人满意。
  • 而FM不一样,通过向量化的交叉,可以学习到不同特征之间的交互,进行提取到更深层次的抽象意义。

FM 到 FFM

FFM是FM的一个特例,它更细致地刻画了这个特征。FFM把相同性质的特征归于同一个field。
首先它做了任意两个特征组合,但是区别在于,怎么刻画这个特征?
FM只有一个向量,但FFM现在有两个向量,也就意味着同一个特征,要和不同的fields进行组合的时候,会用不同的embedding去组合,它的参数量更多。
对于一个特征来说,原先是一个vector,现在会拓成F个vector,F是特征fields的个数,只要有跟其它特征的任意组合,就有一个vector来代表,这就是FFM的基本思想。
在这里插入图片描述

对于FFM的某个特征来说,会构造F个vector,来和任意其他的fields组合的时候,各自用各自的。它有什么特点呢?
首先,FFM相对FM来说,参数量扩大了F倍,效果比FM好,但是参数量太大。参数量太大导致做起来特别耗内存,特别慢

假设样本的 n 个特征属于 f 个field,那么FFM的二次项有 n ∗ f n*f nf 个隐向量。
而在 FM 模型中,每一维特征的隐向量只有一个。FM可以看作FFM的特例,是把所有特征都归属到一个field时的FFM模型。
其中, f j f_j fj是第j个特征所属的field。如果隐向量的长度为 k,那么FFM的二次参数有 n f k n_{fk} nfk 个,远多于FM模型的 n k n_k nk 个。
此外,由于隐向量与field相关,FFM二次项并不能够化简,其复杂度为 O ( k n 2 ) O(kn^2) O(kn2)

深度排序模型:从Wide&Deep到XDeepFM模型

特征输进去,然后把它转换成embedding,上面套两个隐层进行预测,这是所有模型公有的一部分。
在这里插入图片描述

并行结构

第一类我把它叫并行结构,它有DNN结构外的另外一个组件,我管它叫FM Function,它捕捉特征的两两组合,两者关系看上去是个并行的,所以我把它叫并行结构。
在这里插入图片描述

串行结构

onehot到embedding特征编码,然后用FM Function做二阶特征组合,上面套两个隐层做多阶特征捕获,这是串行结构。
典型的模型包括:PNN、NFM、AFM都属于这种结构。

在这里插入图片描述

两条演进路线怎么走的呢?

第一条路线,提出新型的FM Function,就是怎么能够设计一个新的FM Function结构,来更有效地捕获二阶特征组合,比如说典型的模型包括Wide&Deep,DeepFM,NeuralFFM等,就是用来做这个的。

第二条演进路线,就是显式地对二阶、三阶、四阶···K阶组合进行建模。目前的研究结论是这样的:对CTR捕获二、三、四阶都有正向收益,再捕获五阶以上就没什么用了。典型的代表模型是DeepCross、xDeepFM。

Wide & Deep

并行结构,右边就是DNN部分,左边的FM Function用的是线性回归 LR
在这里插入图片描述

DeepFM

DeepFM模型,它相对Wide&Deep做出了什么改进呢?其实就是把FM Function的LR换成了FM,就能自动做特征组合了,这就是DeepFM。
DeepFM是个目前技术发展阶段,完备的深度CTR模型。所谓完备,是指的里面的任意一个构件都有用,都不能少,但是如果再加新东西,感觉意义又没那么大,或者太复杂了工程化有难度。完备是从这个角度说的。
在这里插入图片描述

Deep & Cross

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,推荐系统可以分为两种类型:基于内容的推荐和协同过滤推荐。这里我来介绍一下基于协同过滤的推荐系统的实现。 首先,我们需要准备用户和物品的评分数据,可以用一个矩阵来表示。假设我们有一些用户和物品,评分矩阵如下: | | Item1 | Item2 | Item3 | Item4 | |----|-------|-------|-------|-------| | U1 | 5 | 3 | 0 | 4 | | U2 | 0 | 4 | 4 | 0 | | U3 | 3 | 0 | 0 | 4 | | U4 | 0 | 0 | 5 | 4 | | U5 | 4 | 3 | 4 | 0 | 接下来,我们需要计算用户之间的相似度。常用的相似度计算方法有皮尔逊相关系数和余弦相似度。这里我们使用余弦相似度计算用户之间的相似度。 ```python import numpy as np def cos_sim(a, b): """计算余弦相似度""" return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b)) # 计算用户之间的相似度矩阵 similarity = np.zeros((5, 5)) for i in range(5): for j in range(5): similarity[i][j] = cos_sim(data[i], data[j]) ``` 计算出相似度矩阵后,我们可以对每个用户推荐一些物品。具体地,对于每个用户,我们可以找到和他最相似的 K 个用户,然后把这 K 个用户喜欢的物品推荐给他。 ```python # 对每个用户推荐 K 个物品 K = 2 recommendations = {} for i in range(5): # 找到和当前用户最相似的 K 个用户 sim_users = np.argsort(similarity[i])[::-1][1:K+1] # 计算推荐得分 scores = {} for j in sim_users: for k in range(4): if data[i][k] == 0 and data[j][k] != 0: scores[k] = scores.get(k, 0) + similarity[i][j] * data[j][k] # 推荐得分排序,取前 N 个物品作为推荐结果 recommendations[i] = sorted(scores.items(), key=lambda x: x[1], reverse=True)[:N] ``` 这样就完成了一个简单的基于协同过滤的推荐系统。当然,这只是一个最基本的实现,还有很多优化的空间,比如可以加入时间因素、考虑用户兴趣的多样性等等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值