-->

深度学习推荐系统实战_11_08_Embedding实战如何使用Spark生成Item2vec和Graph_Embedding

你好,我是王哲。

今天我想和你聊聊怎么使用spark生成item work和graph in bedding.前面两节课,我们一起学习了从item wac到graph embedding的几种经典的embedding方法。

在打好了理论基础之后,这节课就让我们从理论走向实践,看看到底如何基于spark训练得到物品的embedding向量。

通过特征工程部分的实践,我想你已经对spark这个分布式计算平台有了初步的认识。

其实除了一些基本的特征处理方法,在spark的机器学习包、spark ML leap中,还包含了大量成熟的机器学习模型。

这其中就包括我们讲过的what wak模型。

基于此呢,这节课我们会在spark平台上完成item wak和基于deep o的gragraph inbedding的训练。

对其他机器学习平台有所了解的同学可能会问,tencil flow、 patt、 ch等等都有很强大的深度学习工具包。

我们能不能利用这些平台进行ebebedding训练呢?当然是可以的。

我们也会在之后的课程中介绍tencil flow,并且用它实现很多深度学习推荐模型。

但是spark作为一个原生的分布式计算平台,在处理大数据方面还是比TNL flow.这些深度学习平台更有优势势且且,业界的很多公司也还在使用spark训练一些结构比较简单的机器学习模型。

那再加上我们已经用spark进行了特征工程的处理,所以这节课我们继续使用spark来完成embedding的实践。

首先我们来看一看item to work的实现。

我们知道item to work是基于自然语言处理模型or to to work提出的。

所以tetework要处理的是类似文本句子、观影序列之类的序列数据。

我们真正开始item to wak的训练之前,我们还要先为它准备好训练用的序列数据。

在movie length数据集中有一张叫做rating表数据了,里面包含了用对看过电影的评分以及评评的时间。

既然时间和评评分历史都有了,我们要通过观影序列,自然就可以通过处理rating表得到了。

不过在使用观影序列编码之前,我们还要明确两个数据,一是movie length.这个rating表本质上只是一个评分的表,我是真正的观影序列。

以对用户来说,当然是只有看过这部电影才能够评价它。

所以我们几乎可以把评分序列当做是观影序列。

那第二个问题是,我们是应该把所有的电影都放到序列中,还是只放那些打分比较高的呢?这里我建议对评分做一个过滤,只放打分比较高的电影。

为什么这么做呢?我们要考虑一下item to back这个模型本质上是要学习什么?我们其实是希望item to back能够学习到物品之间的相似性。

既然是这样,我们当然是希望评分好的电影能够靠近一些而评分差的电影和评分好的电影尽量不要在序列中结对出现。

好,那到这里我们明确了样本处理的思路就是对一个用户来说,我们先过滤掉它评分低的电影,就把它评论过的电影,按照时间出来排序。

这样我们就得到了一个用户的观影序列,所有用户的观影序列就组成了item to back的训练样本集。

可是这个过程应该怎么在spark上实现呢?其实并不困难,我们只需要明白这五个关键步骤就可以了。

第一,我们读取rating的原始数据到spark平台。

第二,我们用where语句过滤评分低的评分记录。

然后我们用group by y ser er d操操作,聚合每个用户的评分记录。

Data frame中的每条记录是一个用户的评分序列。

接着我们定义一个自定义操作salt UDF,用它来实现每个用户的评分记录,按照时间戳进行排序。

最后,我们把每个用户的评分记录处理成一个字符串的形式,供后续训练过程使用。

具体的实践过程,我还是建议你来参考。

我在文稿中给出的代码,重要的地方我也都加上了注释,帮助大家理解。

好,那训练数据准备好了,接下来就该进入我们这堂课的重头戏模型训练了。

如果要手写item to back的整个训练过程,肯定是一件让人比较崩溃的事情。

好在spark MM leap已经为我们准备好了方便调用的what to back模型接口。

我先把训练的代码贴在文稿里,然后再带你一步一步的分析每一行代码是在做什么。

从文稿代码中我们可以看出spark的what work模型训练练程程是非非简简单,只只要要四行代代码就可完完成。

接下来我就按照从上到下的顺序依次给你解析其中三个关键的步骤。

首先是创建what back模型,并设设模型参数,我们要清楚what to back模型的关键参数有三个。

好下是side acctor size site window sizes和site eagerciations.其中,site vaccise用于设定生成的embedding向量的维度,set window size,用于设定在序列数据上进行采样的滑动窗口大小。

Set number generations用于设定训练时的迭代次数。

这些超参数的具体选择,我们就要根据实际的训练效果来做调整了。

之次模型的训练过程就是调用模型的fit接口。

训练完成后,模型会返回一个包含了所有模型参数的对象,最后一步是提取和保存embedding向量。

我们可以从最后的几行代码中看到,调用get vectors接口,就可以提取出某个电影ID对应的embedding向量了。

之后,我们再把它们保存到文件或者其他数据库中,就可以供其他模块使用了。

在模型训练完成后,我们再来验证一下训练的结果是不是合理。

我在代码中求取了ID为五九二的电影的相似电影,这部电影叫batman蝙蝠侠。

我把它的相似电影放到了文稿里。

你可以从直观上判断一下,通过item to wak生成的结果是不是合理的。

当然了,因为spirr raxes在演示过程中仅使用了一千部电影和部分用户的评论集,所以我们得出的结果并不一定非常准确。

如果你有兴趣优化这个过程,可以去movie length下载全部的样本进行重新训练。

好,讲到这里,我相信你已经熟悉了item t work方法的实现。

接下来我们再来说说基于随机游走的graph ebebeding方法,看看怎么利用spark来实现它。

这里我们选择DBOX进行实现。

在d boook方法中,我们需要准备的最关键的数据是物品之间的转移概率。

矩阵文稿中的图三就是d book的算法流程图转移概率。

矩阵表达了图三b中的物品关系图,它定义了随机游走过程中从物品a到物品b的跳转概率。

所以我们首先来看一下,如何利用spark生成这个转移概率矩阵。

结合文稿中的代码,我们可以看到生成转移概率矩阵的函数输入是在训练item to back时处理好的观影序列。

数据输出则是转移概率矩阵。

由于转移概率矩阵比较稀疏,因此我没有采用比较浪费内存的二维数组的方法,而是采用了一个双层map的结构去实现它。

比如说我们要得到物品a到物品b的转移概率,那么transfer magics item a item b就是这个转移矩阵。

在求取转移概率矩阵的过程中,我先利用spark fight map操作,把观影序列打碎成一个个影片队,再利用count by value操作,统计这些影片队的数量。

最后,根据这些影片队的数量,求取每两个影片之间的转移概率,在获得了物品之间的转移概率。

矩阵之后,我们就可以进入图三c的步骤进行随机游走采样了。

总的来说,随机游走采样的过程是利用转移概率矩阵生成新的序列样本的过程。

这怎么理解呢?首先我们要根据物品出现的次数的分布,随机选择一个起始物品之后,就进入随机游走的过程了。

在每次游走的时候,我们根据转移概率矩阵查找到两个物品之间的转移概率,然后根据这个概率进行跳转。

比如当前的物品是a从转移概率矩阵中查找到a可能的下一跳。

物品是b和c转移概率分别是零点四和零点六。

那我们就按照这个概率来随机游走到b或者c依次进行下去,直到样本的长度达到了我们的要求。

根据这个随机游走的过程,我用scale进行了实现具体的代码。

你可以参考文稿。

通过随机游走产生了我们训练所需的sample count样本。

之后下面的过程结合item to back的过程完全一致了,就是把这些训练样本输入到watd buback模型中,完成最终的graph embedding的生成。

你也可以通过iiteback样例中一样的方法得到相似物品列表中从观观上验证一下graph embedding的效果。

好了,embedding的实战到这里就结束了,我们一起来做个总结。

这节课我们运用spark实现了经典的embedding方法,item to back和debook它们的理论知识。

你应该已经在前两节节掌握了这里,我们就总结结一下,践践中应注意意几个个点。

关于itetem to back的spark实现,你应该注意的是训练what wak模型的几个参数,exercize window size、 number generations知道,它们各自的作用是分别来设置embedding向量的维度和序列,数据上采样的滑动窗口大小以及训练时的迭代次数。

而在deam book实实践中,我们应该着重理解的是生成物品间的转移概率矩阵的方法,以及通过随走走生成训练样本的过程。

最后我还是把这节课的重点知识总结在了一张表格中,希望能帮你进一步巩固。

这里我还想再多说几句。

这节课我们终于看到了深度学习模型的产出。

我们用embelding方法计算了相似电影影对我我学习这这门课来说,它完全可以看作是一个里程碑式的进步,大家也可以自自己鼓掌。

最下我我希望你能总结实战中的经验,跟我继续同行,一起来迎接未来更多的挑战。

这节课的最后,我还是按惯例给你留下了一道动手实操题。

那上节课我们在讲解graph embedding的时候,还介绍了notewak方法,你能尝试在deep book的代码基础上实现notewak吗?这其中我们应该着重改变哪部分的代码呢?欢迎把你的思考和答案写在留言区。

如果你已经掌握了embedding的实战方法,也不妨把它分享给你的朋友们。

我们下节课见。