-->

深度学习推荐系统实战_26_19NeuralCF如何用深度学习改造协同过滤

你好,我是王哲。

今天我们来学习协同过滤的深度学习进化版本neuro CF.那在第十五节课里,我们学习了最经典的推荐算法,协同过滤在前,深度学习的时代协同过滤曾经大放异彩。

但随着技术的发展,协同过滤相比深度学习模型的弊端就慢慢显现出来了。

因为它是通过直接利用非常稀疏的贡献矩阵进行预测的,所以模型的泛化能力非常弱,遇到历史行为非常少的用户,就没办法产生准确的推荐结果了。

虽然我们可以通过矩阵分解算法增强它的泛化能力,但因为矩阵分解是利用非常简单的内积方法来处理用户向量和物品向量的交叉问题的,所以它的拟合能力也比较弱。

那这该怎么办呢?不是说深度学习模型的拟合能力都很强吗?我们能不能利用深度学习来改进协同过滤算法呢?当然是可以的。

二零一七年,新加坡国立大学的研究者就使用了深度学习网络,来改进了传统的协同过滤算法。

取名neurroc f神经网络协同过滤。

那neurroc f大大提高了协同过滤算法的泛化能力和拟合能力,让这个经典的推荐算法又重新在深度学习时代焕发生机。

这节课我就带你一起来学习和实现neurc CF.那学习neurroc f之前,我们先来简单回顾一下协同过滤和矩阵分解的原理。

那协同过滤是利用用户和物品之之间的交互行为,历史构建出一个像图一左一样的贡献矩阵。

在贡献矩阵的基础上,利用每一行用户向量的相似性,找到相似用户,再利用相似用户喜欢的物品进行推荐。

那矩阵分解就进一步加强了协同过滤的泛化能力。

它把协同过滤中的贡献矩阵分解成了用户矩阵和泛品矩阵,从用户矩阵中提取出了用户引向量,从物品矩阵中提取出了物品引向量,再利用他们之间的内积相似性,进行推荐排序。

如果用神经网络的思路来理解矩阵分解,它的结构图就是文稿。

中图二这样的那图二中的输入层是由用户ID和物品ID生成的。

One号向量那embedding层是把one号向量转化成了稠密的embedding向量表达这部分就是矩阵分解中的用户隐向量和物品向量。

那输出层使用了用户隐向量和物品隐向量的内积作为最终预测得分之后,通过跟目标梯度对比进行反向梯度传播更新。

整个网络在矩阵分解神经网络化之后,将它跟embedding加MLP以及y氮d模型做对比。

我们可以一眼看出模型中的薄弱环节,就是矩阵分解在ebeadding层之上的操作好像过于简单了,就是直接利用内积得出了最终的结果。

那这会导致特征之间还没有进行充分的交叉,就直接输出,结果模型会有欠拟合的风险。

那针对这一个弱点,neuro CF对矩阵分解进行了改进。

它的结构图就是图三的样子。

我想你一定可以一眼看出它们的区别,那就是new OCF用一个多层的神经网络替代掉了原来的简单的点积操作。

这样就可以让用户和物品影像之间进行充分的交叉,提高模型整体的拟合能力。

有了之前实现矩阵分解和深度学习模型的经验。

我想你理解起来,neo CF肯定不会有困难。

事实上,neo CF的模型结构之中蕴含了一个非常有价值的思想。

就是我们可以把模型分成用户侧模型和物品侧模型两部分,然后用互操作层把这两部分联合起来,产生最后的预测得分。

这里的用户侧模型结构和物品侧模型结构可以是简单的ebearding层,也可以是复杂的神经网络结构。

最后的互操作层可以是简单的点击操作,也可以是比较复杂的MRP结构。

但只要是这种物品侧模型加用户侧模型加互操作层的模型结构,我们就可以把它统称为双塔模型结构。

我们可以看文稿中的图四,它就是一个典型的双塔模型的抽象结构。

它的名字形象的解释了它的结构组成,那就是两侧的模型结构像两个高塔一样。

而最上面的互操作层,这是向两个塔尖搭建起的空中走廊负责两侧信息的沟通。

那对于neo CF来说,它只利用了用户ID作为用户塔的输入特征,用物品ID作为物品塔的输入特征。

事实上,我们完全可以把其他用户和物品相关的特征也分别放入用户塔和物品塔,让模型能够学到更全面的信息。

比如说youtube在构建用于召回层的双塔模型的时候,就分别在用户侧和物品侧输入了多种不同的特征。

结合文稿中的设计图,你可以看到youtube召回双塔模型的用户侧特征,包括了用户正在观看的视频ID频道ID该视频的观看数被喜欢的次数,以及用户历史观看过的视频ID等等。

那物品色的特征包括了候选视频的ID频道ID被观看次数、被喜欢次数等等。

在经过了多层real神经网络的学习之后,双塔模型最终通过soft max输出层连接两部分输出最终的预测分数。

那看到这里你可能会有疑问,这个双塔模型相比于我们之前学过的embedding MLP和y单deep有什么优势呢?那其实在实际工作中,双塔模型最重要的优势就是它易上线e向量。

我们为什么这么说呢?你注意看一下物品塔和用户塔最顶端的那层神经元,那层神经元的输出其实就是一个全新的物品embedding和用户embedding.拿图四来说,物品塔的输入特征向量是x经过物品塔的一系列变化,生成了向量UX.那么这个UX就是这个物品的embedding向量。

同理,VY是用户y的embedding向量。

这个时候我们就可以把UX和VY存入特征数据库这个以来现线上服务的时候,我们只要把UX和VY再取出来,再对它们做简单的互操作层运算,就可以得出最后的模型预测结果了。

所以使用双塔模型,我们不用把整个模型都部署上线,只需要预存物品塔和用户塔的输出,以及在线上实现互操作层就可以了。

如果这个互操作层是点击操作,那这个实现可以说是没有任何困难,是非常直接方便的这是实际应用中非常容易落地的,也是工程师们喜闻乐见的这正式双塔模型在业界巨大的优势所在。

也正是因为这样的优势,双塔模型被广泛的应用,在youtube、 facebook、百度等各大公司的推荐场景中持续发挥着它的能量。

熟悉了neo CF和双塔模型的结构之后,我们就可以使用pencil flow来实现它们了。

通过之前in八零MIP模型以及y占地模型的实现,我想你对tinl flow中读取数据定义特征训练模型的过程肯定已经驾轻就熟了。

我们只要更改之前代码中模型定义的部分,就可以实现neurroc f具体的代码。

你可以参考neuroc项目中的neurroc f点PY,我只在文稿中给出了neurroc f模型部分的实现。

接下来我就结合它来给你重点讲解一下它实现的思路。

你可以看到代码中定义的生成new yourself模型的函数,它接收了四个输入变量,其中feature inputs代表着所有的模型输入item、 feature column和user. Feature columns分别包含了物品册和用户侧的特征。

在训练的时候,如果我们只在item feature columns放入movie ID.在user feature columns放入user, ID就是neysserf的经典实现。

那通过dance features层创建好用户侧和物品侧输入层后,我们会再利用concagniate将它们连接起来,然后输入多层神经网络进行训练。

如果想要定义多层神经网络的层数和神经元数量,我们可以通过设置hidden units数组来实现。

除了经典的neurror f实践,我们还基于双塔模型的原理,实现了一个neurroc f的双塔版本。

你可以参考下面的模型定义跟经典neurr CF实现不同。

我把多层神经网络操作放到物品,塔塔用户塔的内部让塔内塔特征进行充分交叉,最最使使用内积层作为物塔塔用用塔塔交内部。

具体的步骤你可以参考文稿,代码中的注释,实现过程程很理解解,就不多多说了。

实实现了EAARRRY点dep和neuror f之后,相信你可以感觉到实现,甚至创造一个深度学习模型并不难。

基于塞tenflow提供的cos接口,我们可以根据我们的设计思路,像搭积木一样实现模型的不同结构,通过它们来验证我们的想法,这也正是深度推荐模型的魅力和优势所在。

相信随着课程的进展,你不仅可以对这一点有更深刻的感受。

同时你设计和实现模型能力也会进一步加强。

好了,今天的课程讲完了,我们一起来做个总结。

这节课我们首先学习了经典推荐算法,协同过滤的深度学习进化版本neurr CF相比于矩阵分解算法,neo CF用一个多层的神经网络替代了矩阵分解算法中简单的点击操作,让用户和物品引向量之间进行更充分的交叉。

这种通过改进物品引向量和用户引向量,互操作层的方法,大大增加了模型的拟合能力。

那利用neurroc f的思想,我们进一步学习了双塔模型。

它通过丰富物品册和用户册的特征,让模型能够融入除了用户ID和物品ID外更丰富的信息。

除此之外,双塔模型最大的优势在于模型服务的便捷性。

由于最终的互操作层是简单的神经操作或者浅层的神经网络,因此我们可以把物品塔的输出当做物embedding,用户塔的输出当做用户embedding存入特征。

数据库在线上只要实现简单的互操作层过程就可以了。

最后,我们继续使用teninl flow,实现了neo CF和双塔模型。

相信你能够进一步的感受到利用TNRL flow构建深度学习模型的便捷性,以及它和传统推荐模型相比,在模型结构灵活性上的巨大优势。

那为了帮助你复习,我把刚才的这些重点内容总结在了文稿里,你可以看一看。

好了,最后我们再做一道思考题啊,对于我们这节课学习的双塔模型来说,把物品册的embedding和用户侧的embedding存起来,就可以进行线上服务了。

但是,如果我们把一些场景特征,比如当前时间、当前地点加到用户侧或者物品册那,我们还能用这种方式进行模型服务吗?为什么?欢迎把你的思考和疑惑写在留言区。

那欢迎你把这节课转发出去,我们下节课见。