一文搞懂工程化协同推荐算法(四)
作者:livan
来源:数据EDTA
前言
经过前面三篇的文章:
我们全面的了解了推荐的思路,下面一篇我们深入的了解一下深度学习环境下的推荐理论、社交融合和深度模型融合方面的的内容。
如何使用社交链的问题
——社交网络模式下的推荐算法:
在社交网络下,计算好友相似度的几种方法:
1)对于用户u和v,可以使用共同好友比例计算相似度:
Out(u)是用户u指向其他好友的数量,分子部分是用户u和v共同指向好友的数量。
2)使用共同被关注的用户数量计算用户相似度:
In(u)是指用户被其他用户指向的数量。
3)用户u关注的用户中,有多大比例也关注了用户v:
这一公式含有了热门惩罚因子。
有了基于网络的数据,我们再结合前面提到的协同理论,会得到一个综合的用户相似度的分数:
基于上面的数据,我们可以再使用基于用户协同的推荐方法,计算得到推荐结果。
上面是基于社交网络最直接的计算方法,通过1、2两部分的描述,聪明的读者是不是会有一个疑问呢?
~对的~
运算量的问题、特征挖掘层次的问题。
基于社交网络的推荐自然也会遇到这两个问题,那么,该如何解决呢?
我们基于深度学习的思路,对这个问题进行了解答,主要是使用了network embedding的方法,计算出每个用户的一个坐标,用这个坐标表示用户在这个图中的位置,当进行用户相似度计算时,只需要通过这些坐标进行计算就可以了。
这个套路有没有很熟悉,没错,就是前面的降维,同样的思维又在社交网络的场景下重演了,不过依然有效,node2vec是network embedding中的一个常用方法,下面我们简单介绍一下,如有兴趣,可以百度一些论文,深度了解:
——node2vec在社交网络推荐中的应用:
这一方法主要分两个步骤:
1)对网络进行随机游走采样,将采到的节点和上下文形成组合(random walk),推荐场景下随机游走添加了p和q两个参数,以调节游走过程中是深度优先还是广度优先:
第一步:先选择t作为初始步,从tàv,在v的基础上确定下一步的节点;
第二步:计算t与v之间的距离d,并以这个距离来计算游走的概率a;
d=0,表示点往回走了,游走概率为1/p; d>distincev-x的距离时,即接下来的点距离比上一步的距离近一点,则游走概率为1;
d<distincev-x的距离时,即接下来的点距离相对较远,游走概率为1/q;
如果p>max(1,q),则1/p最小,则往回游走的概率最小,则深度优先;
如果p<min(1,q),则1/p最大,则往回游走的概率最大,则广度优先;
第三步:游走步数达到步时,游走停止,则结合上下文得出的序列便形成了。
如图:
上面图中,游走的路径为:A-a-B-c。
2)用词向量(word2vec)对上面的组合进行建模,得到网络节点表达向量,即用户向量:
将上面游走产生的用户序列添加到word2vec中,生成一个低维的用户向量,以此来确定用户的坐标。
word2vec有两种计算方式,主要是:Skip-gram和CBOW,如图可知两种的区别:
具体细节可以百度一下,展开的话估计又是一篇大文章了。
其实只要了解,这两种方法都是用神经网络的方式降维就可以了,就是一个高级的PCA而已。
比如:输入的是100维,输出的是20维。
人工进行特征推荐的问题
上面我么详细讲解了推荐系统中常见的一些问题,以及对应的解决方案,但是,有没有人想更进一步呢?
~必然是有的~
特征工程一直被称作是建模的基础,这一基础一直作为数据从业人员的水平衡量仪,肚子里有多少货,从特征工程中就可以知道了。
凡人都会有偏差,有没有方法能够尽可能的减少对人工特征工程的依赖呢?
~有~
通过对数据的深度了解,我们可以根据用户的特性采用一些模型组合的方式,尽量降低数据的人工特征工程过程,输入原始数据,比如:LR+DNN模型、DeepFM模型等,综合深度学习在特征方面的优势,采用模型融合方式尽可能的降低了对人工特征工程的依赖,但是在这里要说一点,这里只是减少了人工特征工程,工作中人工部分是必不可少的。
下面我们介绍一下基于深度学习的推荐算法思路:
——LR+DNN模型:
LR模型的优点:简单、可扩展、可解释性强,在低阶维度上效果比较明显;
LR模型的不足:对不在训练集中的特征不具备泛化能力;
DNN模型的优点:对未出现的特征存在一定的泛化能力,减轻特征工程的压力;
DNN模型的不足:很难学习低维的特征,另外,客户如果有明显的偏好,对其他项都不感兴趣时,模拟出来的效果不好,因为DNN会对0项的特征模拟出一些特征值,进行相应的推荐(这个是DNN泛化能力的体现);
为了解决特征工程时组合深度不够、人工特征工程过多的问题,大家研究出了将两个模型融合的方法:LR+DNN
一方面LR模型对低维度的特征有较好的拟合效果,另一方面DNN模型对高维度的特征有较好的拟合效果,同时兼顾了模型的广度和深度,结构如图:
从图片我们可以看出,左侧为LR模型,右侧为DNN模型,将这两个结构融合在一起,然后用统一的softmax函数进行输出,就能形成一个同时具有记忆能力和泛化能力的模型。
——DeepFM模型:
除了上面的LR+DNN模型,DeepFM模型也是一个被广泛应用的深度学习模型,这一模型的特点就是在学习user behavior背后的特征组合,从而最大化优化推荐效果。
DeepFM是用FM和DNN融合而成的模型,其特性与上面模型有一定的相似之处,我们先介绍一下FM:
FM是对LR的一次升级,通常情况下,我们使用LR模型是假设LR中各个元素都是独立的,比如x1和x2是相互独立的,然后再进行运算,但是实际上x1和x2有可能存在交叉影响,即x1*x2对y值是有影响的,因此需要将x1*x2考虑在模型中。为了解决特征交叉的问题,大家发明了FM+DNN的结构,也就是DeepFM模型:
感觉这张图已经被无数人引用,都已经不清楚了,不过这也说明了这个模型的重要性,左侧是FM模型,右侧是DNN模型,其对应的预测结果为:
这个模型的特点有两个:
其一:添加了Dense Embedding层,即两个模型共享同一套输入数据,这样保证了数据的统一,提高了训练效率,不需要额外的特征工程,进一步减少了人工干预;
其二:模型将输入数据分成多个field,在field的基础上进行模型训练,减少了训练的运算量。
我们介绍一下field思想:
对于离散的特征,我们通常的做法是采用全连接的方式输入,但是,问题在于如果特征过多,神经网络中的参数会指数级上升,导致模型运算量过大,甚至训练不成功。
如图:
One-hot输入:
50亿个参数,是不是有些恐怖?
所以,大家想到了用field的方式,将输入层进行一定程度上的组合隔离,组建一个个field,并将field输入到Dense层,使维度压缩到稠密向量中。
如图:
这样就减少了输入数据的数量,避免全连接输入。
我们对模型进行一个细分了解:
其一:FM部分:
输入层的数据是one-hot之后的变量,每个x都会被分解成(0,0,0,0,1,0)样式的向量,将这些向量concat成一个向量,即可完成输入层输入。
Dense层中的数据是Vij,每个field中的向量(Vi*j-1,Vi*j……Vi*j+n)即为FM公式中的Vi。将输入层中每个x转化的one-hot向量分割成一个field,则每个field中都含有一个1,其他的元素都是0,x经过各个权重进入Dense层的过程,得到的是x*权重之和,而x此时只有一个1,其他都为0,所以,Dense中实际上是保留了1的权重,即为Vij。
FM层中,一阶求和的部分即为one-hot向量中1的求和,因此,可以看到图中输入层的数据直接输入到了FM部分,二阶部分是对<Vi*Vj>xi*xj的计算,由于x都是1,所以这一公式实际上是对权重向量<Vi*Vj>的运算,所以看到图中每两个field输入到一个乘运算节点中。
经过上面一阶和二阶的运算,我们可以确定出FM的模型了,然后将FM的运算结果输入到sigmoid函数中。
上面即为FM部分的讲解,下面我们了解一下深度部分。
其二:深度部分:
输入层的变化就不做描述了,和FM层是一致的,这也是这个模型的优势——共享输入。
经过Dense embedding之后,输入数据变成了Vij表示的稠密向量,将这个稠密向量输入到DNN的隐含层即可获取高维度融合的特征模型。
上面的描述大家是否清楚了呢?
后记
经过上面的描述,大家是不是对推荐系统有一个深入的了解呢?
笔者在学习这部分内容的时候了解到,模型的构建过程中,如何建模用户时序行为并将这些行为和要排序的item相关联,是建模过程中的难点,用户的每一次操作都是有目的的,多次的操作行为会产生一定的时序,这个时序信息会不会给模型带来正向的影响呢?我想这是肯定的。
在通过深度学习进行推荐时,形成embedding的过程需要将用户操作的上下文作为特征信息填入其中,就是这个目的,比如用户的观看历史数据、用户搜索历史数据等,这样的思路就是添加上下文信息到用户向量中,以完善用户的向量信息。
训练中常用的模式有:
从图中我们可以看出,模型的训练需要融合尽量多的特征数据。
好了,就写到这里吧~
算法本身还是有很多值得挖掘的东西的,笔者会尽力的将自己的思考结论逐步的分享出来,希望有机会与大家一起讨论。
◆ ◆ ◆ ◆ ◆
长按二维码关注我们
数据森麟公众号的交流群已经建立,许多小伙伴已经加入其中,感谢大家的支持。大家可以在群里交流关于数据分析&数据挖掘的相关内容,还没有加入的小伙伴可以扫描下方管理员二维码,进群前一定要关注公众号奥,关注后让管理员帮忙拉进群,期待大家的加入。
管理员二维码:
猜你喜欢