一文搞懂工程化协同推荐算法(四)

一文搞懂工程化协同推荐算法(四)

     作者: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的过程需要将用户操作的上下文作为特征信息填入其中,就是这个目的,比如用户的观看历史数据、用户搜索历史数据等,这样的思路就是添加上下文信息到用户向量中,以完善用户的向量信息。

一文搞懂工程化协同推荐算法(四)

训练中常用的模式有:

一文搞懂工程化协同推荐算法(四)

从图中我们可以看出,模型的训练需要融合尽量多的特征数据。

好了,就写到这里吧~

算法本身还是有很多值得挖掘的东西的,笔者会尽力的将自己的思考结论逐步的分享出来,希望有机会与大家一起讨论。

一文搞懂工程化协同推荐算法(四)

◆ ◆ ◆  ◆ 

一文搞懂工程化协同推荐算法(四)

长按二维码关注我们


数据森麟公众号的交流群已经建立,许多小伙伴已经加入其中,感谢大家的支持。大家可以在群里交流关于数据分析&数据挖掘的相关内容,还没有加入的小伙伴可以扫描下方管理员二维码,进群前一定要关注公众号奥,关注后让管理员帮忙拉进群,期待大家的加入。

管理员二维码:

一文搞懂工程化协同推荐算法(四)

猜你喜欢

 笑死人不偿命的知乎沙雕问题排行榜

 用Python扒出B站那些“惊为天人”的阿婆主!

 互联网大佬学历&背景大揭秘,看看是你的老乡还是校友

 上万条数据撕开微博热搜的真相!

 你相信逛B站也能学编程吗?