无论是基于内容的推荐算法,还是协同过滤算法,它们都只用到了用户和物品之间的行为信息,所以能不能加入更多的信息,比如用户/物品本身的信息以及上下文信息来更好地指导推荐呢?
事实上,这正在把推荐问题转化为我们所熟悉的机器学习问题。具体来讲,给定训练集,利用训练集的特征和标签训练一个模型,然后用该模型指导推荐。
在之前讲解的协同过滤算法中,我们通常是预测某用户对于某些物品的打分,然后按照打分值从高到低排列物品,选择前几个推荐给用户。
而这里,训练好的模型会直接预测某用户是否会对物品产生正反馈(比如购买一件商品,观看一部电影等),若会,则将物品推荐给该用户。没错,这就是一个二分类问题。
接下来介绍几个经典的相关模型,有一些你可能已经听说过,比如逻辑回归,嗯,就从它开始吧~
逻辑回归
逻辑回归(Logistic Regression, LR)用于分类任务,它使用sigmoid函数,将取值范围为全体实数的线性回归表达式映射到0和1之间:
z=np.array(range(-10,10))
sigm=1/(1+pow(2.73,-z))
plt.plot(z,sigm)

具体的分类规则是:设定一个0到1之间的阈值,当纵轴取值大于此阈值时为一类,否则为另一类。
注意:这里所讲的逻辑回归默认用于二分类问题,你也可以通过改造将其用于多分类问题,这是后话了。
逻辑回归的模型如下:
其中,是训练数据中的特征部分,和是模型要学习(优化)的参数。
假设训练集共个特征,那么待优化的参数共个。
于是,对于0和1两种类别,有如下结果:
综合两式,得:
上式表明,在预测概率为的前提下,样本的类别为的概率为.
每一个样本都有自身得类别标签,而且都可以通过模型预测得到1个对应的.
接下来求解和.
由极大似然估计,将每个样本对应的连乘,得到似然函数:
其中为训练样本总数。
对上式取对数,得:
我们要求解使得上式最大化时得参数和,那么对上式加个负号就把最大化目标变成了最小化目标,在加一个系数不影响最终的优化结果,于是目标函数可以写成下面这个样子:
然后就可以通过梯度下降法进行求解了,现在将所用到得全部公式放在一起,方便查看:
于是,
其中,
代入整理得:
同理可得:
求得待优化参数和梯度后,就可以应用梯度下降法开始优化了:
其中,是学习率。
逻辑回归模型简单,可解释性强,且训练开销小,在深度学习流行以前,它一度被广泛使用。
但是,逻辑回归过于简单,使得模型容易欠拟合,并且它只能使用已有特征,想要生成新的特征,就需要手动的特征工程,无法自动做特征交叉。
POLY2
POLY2解决了逻辑回归不能做特征交叉的问题。
模型如下:
其中,为训练集总特征数。
观察模型,前两项和逻辑回归中是一样的,最后一项是全部特征两两交叉得到的新的特征,并给每个新的特征赋予一个权重,比如和交叉得到新的特征,其权重为.
前两项待优化的参数和逻辑回归一样,共个。
对于最后一项,待优化的参数个数为:
现在来求解这些参数。
和逻辑回归一样,只不过多了一个特征交叉项。
先写出优化目标:
在求梯度时,前两项结果和逻辑回归中的一样,这里直接把之前求解的结果贴过来:
求解的梯度:
其中,
代入整理得:
有了各项参数的梯度,接下来应用梯度下降法更新参数即可。
POLY2在保留逻辑回归优点的同时,弥补了逻辑回归不能做特征交叉的缺陷。但是,POLY2的特征交叉,是全部特征两两进行交叉,使得参数量从直接上升到,而且这种"无脑"的特征交叉,使得原本就稀疏的特征变得更加稀疏(使用类别变量做one-hot编码后的特征做交叉,两个特征要么全0,要么只有1个为1,无论如何,它们乘起来总是0,这就是更加稀疏的解释),从而导致模型难以收敛。
FM
POLY2为每一个交叉特征配一个权重。
FM模型为每个特征学习一个隐向量,两个特征交叉得到的新的特征的系数等于这两个特征对应的隐向量的内积。
FM模型如下:

前两项同样和逻辑回归一样。
最后一项是交叉特征项,<v_i,v_j>代表特征和特征分别对应的两个隐向量和的内积。
具体地,

其中,是隐向量的维度。
此时,逻辑回归部分的参数量仍为,特征交叉项的参数量为,因为每个特征配一个隐向量,特征数为,隐向量维为。
现在来求解参数。
还是先写出优化目标:
是行列的,是维向量。
对于逻辑回归部分和之前一样,这里还是直接贴过来:
接下来重点求解隐向量中每个元素的梯度。
由于表达式中含有向量和,为了便于对每个元素(比如中的)求导,先对该表达式进行转换:

继续化简上式:
现在,求解第个特征的隐向量的第维的梯度:
代入得,
最后应用梯度下降法求解即可。
FM解决了POLY2中特征稀疏的问题,并且将复杂度降到了,加上其部署简单的特性,使其曾一度成为主流推荐模型。
FFM
FM为每一个特征配一个隐向量,而FFM为每一个特征配一组隐向量。
这里的一组究竟是多少个呢?训练集特征总共有多少个不同的域,这一组就有多少个。
域又是什么呢?举个栗子,比如对于性别特征,假设0代表男,1代表女,这是一种类别特征,通常做one-hot编码,则one-hot编码后多出两列特征,一列是"性别=男",另一列是“性别=女”,那么我们就说这两列属于同一个域,不妨给这个域起个名字,叫“性别域”。
对于全部特征,当划分好域后,就得到了不同域的个数。
FFM模型如下:
接下来求解参数。前两项依然是经典的逻辑回归,前面已经求过相应梯度了,这里主要针对最后一项。
还是先写出优化目标:

对第个特征在第个特征所属域中对应的隐向量求梯度:

表示第个特征所在域,比如是“性别域”,记作,那么域内共包含两个特征:{"性别=男","性别=女"}。
则上式可写成:

其中,FeatureIndex(性别=男/女)指的是"性别=男/女"这个特征是第几个特征。
对于类别变量,做one-hot编码后,上式结果中只有一项不为0(或者二取一),不妨将其对应特征序号记作,即不为0,则:
代入得:
后面同样使用梯度下降法求解即可。
FFM引入了特征域的概念,使得模型具有更强的表达能力。但随之而来的,是相对于FM来说更多的参数量和更高的复杂度,因此,到底是使用FM还是FFM,需要在模型效果和工程投入之间进行权衡。
参考:
[1] 王喆-《深度学习推荐系统》 [2] https://space.bilibili.com/34230158/video
南极Python交流群已成立,长按下方二维码添加我的微信,备注加群即可,欢迎进群学习交流(划水
)





