02|Sparrow RecSys:我们要实现什么样的推荐系统?

2020-09-21 王喆
深度学习推荐系统实战
进入课程

讲述:王喆

时长12:38大小11.57M

你好,我是王喆。
上节课,我们明确了推荐系统要解决的基本问题,清楚了深度学习推荐系统的技术架构,这节课我们开始走进实战。
作为程序员,我相信你肯定听过,甚至可能还很认同 Linux 之父 Linus Torvalds 的那句话“Talk is cheap.Show me the code.”。我也一样,所以只讲解理论知识不是这门课的风格,我希望你通过这门课的学习,不仅能构建出一棵深度学习推荐系统的知识树,还能动手实现出一个看得见、摸得着、能操作、能修改的推荐系统。
所以今天,你跟着我的讲解,只需要花三十分钟的时间,就能将一套完整的深度学习推荐系统,Sparrow RecSys(随着课程的进行,我们会逐渐补充新的模块),在你自己的电脑上运行起来。这也是我们这门课最终要实现的深度学习推荐系统。

废话不多说,直接运行

废话不多说,我们先把 Sparrow RecSys 安装运行起来。因为我已经把项目相关的所有代码(代码还会随着课程进行持续更新)、数据都整理到 GitHub 的开源项目中,所以你不需要额外安装任何的支持软件,也不需要额外下载任何数据。
这样,整个安装过程就跟“把大象装进冰箱“一样,只需要三步,就是打开冰箱门,把大象装进去,关上冰箱门。“翻译”成咱们的过程就是,从 GitHub 中 clone 代码,在本地以 maven project 的形式安装,运行 RecSysServer 主函数启动推荐服务器。接下来,我们详细地解释一下这三个步骤。
首先,从 GitHub 中 clone 代码。这里,我直接给出了 Sparrow Recsys 开源项目的地址:https://github.com/wzhe06/SparrowRecSys。点击之后,你需要使用git clone https://github.com/wzhe06/SparrowRecSys.git命令,或者从 Web 端下载的方式,把代码下载到本地。
然后,你可以在本地以 maven project 的形式安装,也就是导入项目到 IDE。我推荐你使用 IntelliJ IDEA 为本项目的 IDE。这样,我们直接使用 IDEA,打开本地的 Sparrow Recsys 项目根目录就能导入项目。不过有一点需要注意,如果项目没有自动识别为 maven project,你还需要右键点击 pom.xml 文件,选择将该项目设置为 maven project 才能进行后面的操作。
最后,运行 RecSysServer。等到所有库文件自动下载完毕,项目编译完毕后,我们找到项目的主函数com.wzhe.sparrowrecsys.online.RecSysServer,右键点击运行。因为推荐服务器默认运行在 6010 端口,所以我们打开浏览器,输入http://localhost:6010/,就能看到整个推荐系统的前端效果了。
图1 Sparrow Recsys的主页
如果通过上面的步骤,你的浏览器显示出了由多个电影列表组成的 Sparrow Recsys 的主页,那么恭喜你,你已经拥有了这套深度学习推荐系统。
而且我相信,你把 Sparrow Recsys 这只“大象”装到自己冰箱里的时间,不会超过 30 分钟。但第一次见面的热情过后,你会不但想知其然,还想知其所以然,那接下来我就和你说说 Sparrow Recsys 的来历,以及功能和架构。而且在接下来的课程中,我会以它为例来给你讲透深度学习推荐系统。

“麻雀虽小,五脏俱全”的 Sparrow Recsys

Sparrow RecSys,全称 Sparrow Recommender System,中文名“麻雀推荐系统”,名字取自“麻雀虽小,五脏俱全”之意。
你第一眼见到它,可能认为它像个 Demo 或者玩具。虽然它不可能真正具备一个工业级深度学习推荐系统的全部功能,但我希望它是一颗能够成长为参天大树的种子,一只未来有可能大鹏展翅的雏鸟。在投入一定的精力改造、拓展之后,它甚至有可能支撑起一个规模互联网公司的推荐系统框架。这就是我设计 Sparrow RecSys 的初衷。我也希望你能够在实现 Sparrow RecSys 的过程中,快速领略深度学习推荐系统的主要模块和主流技术,并且找到乐趣、找到成就感。
那么 Sparrow Recsys 到底实现了哪些功能呢?它又包含了哪些深度学习推荐系统的关键技术呢?下面,我会为你一一讲解。

Sparrow Recsys 的功能有哪些

Sparrow RecSys 是一个电影推荐系统,视频推荐是我最熟悉的领域,这也是我以电影推荐作为切入点的原因。像所有经典的推荐系统一样,它具备“相似推荐”“猜你喜欢”等经典的推荐功能,在页面设置上,主要由“首页”“电影详情页”和“为你推荐页”组成。
首先,是 Sparrow RecSys 的首页
图2 Sparrow RecSys的首页
Sparrow RecSys 的首页由不同类型的电影列表组成,当用户首次访问首页时,系统默认以历史用户的平均打分从高到低排序,随着当前用户不断为电影打分,系统会对首页的推荐结果进行个性化的调整,比如电影类型的排名会进行个性化调整,每个类型内部的影片也会进行个性化推荐。
其次,是电影详情页。
图3 电影详情页
你可以看到电影详情页除了罗列出电影的一些基本信息,最关键的部分是相似影片的推荐。相似内容推荐是几乎所有推荐系统非常重要的功能,传统的推荐系统基本依赖于基于内容(Content based)的推荐方法,而我们这门课程会更多地讲解基于深度学习 Embedding 的相似内容推荐方法。
最后,是为你推荐页。
图4 为你推荐页
这一部分也是整个推荐系统中最重要的部分,是用户的个性化推荐页面。这个页面会根据用户的点击、评价历史进行个性化推荐。这几乎是所有推荐系统最经典和最主要的应用场景。我希望在这门课程中,你能够动手完成个性化推荐中的每个关键步骤,包括但不限于特征的处理、候选集的召回、排序层主要模型等等。

Sparrow Recsys 的数据从哪来?

知道了 Sparrow RecSys 的功能之后,你肯定想问,“老师,咱们的数据从哪来呀?”。既然 Sparrow RecSys 是一个开源项目,那么 Sparrow RecSys 的数据源肯定也是开源和免费的,它的数据源来自于著名的电影开源数据集movieLens
为了方便你调试,咱们这门课程的教学数据集对 movieLens 数据集进行了精简,只留下了 1000 部电影。如果希望在全量数据集上进行推荐,你可以去 MovieLens 的官方网站下载全量数据,它一共包含了 27000 部电影。
MovieLens 的数据集包括三部分,分别是 movies.csv(电影基本信息数据)、ratings.csv(用户评分数据)和 links.csv(外部链接数据)。下面,我就具体说说它们分别长什么样。

1. movies.csv(电影基本信息数据)

movies 表是电影的基本信息表,它包含了电影 ID(movieId)、电影名(title)、发布年份以及电影类型(genres)等基本信息。
图5 电影基本信息数据
MovieLens 20M Dataset 包含了 2016 年前的约 13 万部电影,我们课程的实验数据集从中抽取了前 1000 部电影。电影数据集是我们推荐的主体,其中分类、发布年份、电影名称等信息也将是推荐模型可以利用的重要特征。

2. ratings.csv(用户评分数据)

ratings 表包含了用户 ID(userId)、电影 ID(movieId)、评分(rating)和时间戳(timestamp)等信息。
图6 用户评分数据
MovieLens 20M Dataset 包含了 2000 万条评分数据,我们课程的实验数据集从中抽取了约 104 万条评论数据。评论数据集是之后推荐模型训练所需的训练样本来源,也是我们分析用户行为序列、电影统计型特征的原始数据。

3. links.csv(外部链接数据)

links 表包含了电影 ID(movieId)、IMDB 对应电影 ID(imdbId)、TMDB 对应电影 ID(tmdbId)等信息。其中,imdb 和 tmdb 是全球最大的两个电影数据库。因为 links 表包含了 movieLens 电影和这两个数据库 id 之间的对应关系,所以,我们可以根据这个对应关系来抓取电影的其他相关信息,这也为我们大量拓展推荐系统特征提供了可能。
图7 外部链接数据
此外,MovieLens 的数据集中还包含了 tags.csv,它用于记录用户为电影打的标签,由于课程中暂时没有使用标签数据,我就展开说了。

Sparrow Recsys 涵盖的技术点

清楚了 Sparrow Recsys 的功能和数据,你肯定迫不及待地想知道 Sparrow Recsys 会使用哪些技术,可以实现哪些模型。
那我们直接来看下面这张 Sparrow Recsys 的技术架构图。你会发现,它其实就是我们用具体的技术选型,把上节课的深度学习推荐系统架构图给填上得到的。所以,Sparrow Recsys 就是深度学习推荐系统架构的一个实现。
图8 Sparrow Recsys的推荐系统架构
你可以看到,它一共分为三个模块,分别是数据、模型和前端。其中每个部分都用业界推荐系统的主流技术,比如数据部分我们会用 Spark,Flink 进行样本和特征的处理,模型部分我们会使用 TensorFlow 训练深度神经网络、Wide&Deep、PNN 等模型。
图9 Sparrow Recsys中的技术点
我想啊,你在看到这么多的技术点和技术平台之后,肯定想问,我们的课程能把它们都讲完、讲透吗?这是个好问题,我也有必要在这里说清楚。
从中,我们可以总结出 Sparrow Recsys 中具体用到的技术点。
其实推荐系统是一个应用属性很强的领域,想把推荐系统学好,我们就必须去学习各式各样相关的平台、技术,所以我们这门课的涉及面非常广。但你也不用因为要学这么多的技术而感到惊慌,因为我们没有必要去深究每个平台内部的原理、优化的方法,我们当好一个使用者就好。
举个例子你就明白了,我们处理数据需要用到 Spark,但我们有必要成为 Spark 的专家吗?其实不用。因为即使你已经走上了工作岗位,也有平台架构部的同事能够提供 Spark 的很多技术支持。所以学习这门课程,我们大可抱着一个使用者,而不是开发者、维护者的心态去使用不同的技术平台。当然,如果你想成为某个细分方向的专家,比如 Spark 的专家、Flink 的专家等等,我相信极客时间上肯定还有很不错的课程供你学习。
所以希望你能够通过 Sparrow Recsys 认识到主流深度学习推荐系统都使用了哪些技术,让自己有一个全面的认识,建立自己的知识广度。如果还想深入钻研某个方向,也可以由此开始,努力成为一个领域的专家。

小结

这堂课,我带你熟悉了我们将要实现的推荐系统 Sparrow Recsys,它将是我们深度学习推荐系统这门课的落地项目和实现范例。希望有这个真实可用的推荐系统作为支撑,这门课可以同时兼顾概念讲解和代码实战,也让我们接下来的共同合作能够更好。
从开篇词到这一节课,我们从推荐系统要解决的核心问题,生发出深度学习推荐系统的技术架构,再到让技术架构实实在在地落地到 Sparrow Recsys 这个开源项目上。我想你已经可以感受到架构篇的学习过程,其实就是一个从抽象到具体,从形而上到形而下的过程。
那在搭建起这整门课程的框架之后,接下来我们将会一起深入到技术细节,以及深度学习的实践中,一起去体验深度学习浪潮之巅的推荐系统知识,期待继续与你同行!

课后思考

当你把 Sparrow Recsys 在自己的电脑上安装运行起来之后,对照着上节课的深度学习推荐系统架构图,你能试着说出每个模块的代码属于架构图中的哪一部分吗?
你觉得对于一个电影推荐系统来说,什么数据对生成用户个性化推荐结果最有帮助?
好啦,快按照这节的方法把 Sparrow Recsys 运行起来吧!课后的两个问题也并不困难,相信你肯定可以回答出来。今天就讲到这里了,我们下节课见!

13 人觉得很赞  |  提建议

unpreview
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
上一篇
01|深度学习推荐系统的经典技术架构长啥样?
下一篇
03|深度学习基础:你打牢深度学习知识的地基了吗?
 写留言

精选留言(26)

  • 2020-09-23
    因为没有项目经验,想知道git clone到本地之后,怎么运行这个Maven project呢?油管上有没有类似的demo可以看看,老师能出一下小的录屏么?万分感谢。。第一步就卡住了。。

    作者回复: 简单来说就是:
    1、到这个地址下载IDE, https://www.jetbrains.com/idea/download/#section=mac
    2、安装IDEA
    3、打开IDEA
    4、选择File->Open->选择项目根目录
    5、在pom.xml点击右键,设置为maven project(最新的IDE版本也可能不用)
    6、找到类文件 class RecSysServer,右键点击-> run
    7、浏览器输入http://localhost:6010/
    8、看到SparrowRecSys首页说明运行成功。

    3
    15
  • 2020-09-23
    老师您好,我查阅了网上的一些博客资料,大多认为协同过滤这样的传统方法应该是在召回层。,不过在您的图里是在排序(精排)层,可以问一下这样分类的理由是什么吗?谢谢!

    作者回复: 这是个好问题。

    五六年前的传统推荐系统不少还在用协同过滤作为主排序模型。这几年慢慢被淘汰了,排序层变成了以深度学习推荐模型为主的复杂模型。

    但因为协同过滤类算法比较简单,比如矩阵分解之后可以进行embedding快速召回,所以放在召回层也完全适用。

    文章中推荐系统的架构是一个比较经典的架构,但也没必要认为它是无法改变的真理。在实际应用场景之中要根据业务特点灵活运用。

    6
  • 2020-10-09
    JAVA小白 mac os系统 安装Sparrow Recsys时的历程:
    1,安装java8和scala2.11
    网上有很多参考教程。
    安装Java8:https://blog.csdn.net/irokay/article/details/71374426
    遇到的/etc/profile是readonly的情况,解决方法是更改该文件的权限,增加写权限:775.https://blog.csdn.net/good007boy/article/details/88659162
    安装scale:https://blog.csdn.net/u012373815/article/details/53231292
    遇到的问题,在执行scala的时候出现“scala [ERROR] Failed to construct terminal; falling back to unsupported”,应该是跟iterm2起了什么冲突,解决方案:https://blog.csdn.net/merrily01/article/details/102823539
    2,安装、打开IDEA
    略过
    3,执行文件
    在pom.xml点击右键,设置为maven project->'Reload project'
    配置SDK:在File->Project Structure->Project配置Project SDK
    然后找到SparrowRecSys/main/java/online/RecSysServer,右击选择"Run 'RecSysServer.main()'",程序就执行起来了
    浏览器输入http://localhost:6010/,就可以看到SparrowRecSys首页
    展开

    作者回复: 非常好。推荐给其他同学参考。

    3
  • 2020-09-23
    召回有优化之后,排序并不能捕捉到召回新增的特征,在排序后召回的优化点弱化很多,这种一般怎么处理?比如:召回有话增加了性别+年龄的特征,但是排序层没有用这维特征,导致根据该特征召回的内容排序后都在靠后位置没有机会曝光
    展开

    作者回复: 非常好的实践经验。在设计召回层和排序层的时候一般要联合设计,召回层要特别关注召回率指标。

    如果你认为你的排序模型效果是非常不错的,把性别和年龄特征召回的item排在后面,就说明二者相关的item不应该被召回。

    如果年龄和性别这两个特征对结果影响很大,那为什么排序层模型训练的时候不引入这两个特征呢?

    所以需要再重新评估一下两个层,做一个重新的设计。

    3
  • 2020-09-22
    暂时没有去跑项目,先尝试回答问题二吧,对于一个电影爱好者而言,从我的角度出发,一个能够取悦我的,电影推荐系统,必须满足我在电影种类,演员,电影内容,电影质量上的需求,要说什么最有帮助,我觉得应该是用户历史浏览记录。
    展开

    作者回复: 非常好,几乎就是我想说的了。你说的前一部分是content based特征,后一部分是user behavior类特征。一般从对结果的影响大小来看,user behaviour特征在电影推荐、电商推荐等场景下都是更重要的。

    3
  • 2020-09-23
    老师不好意思问一下,之前没接触过intelij idea,需要配置什么东西么,按照您说的步骤没有run

    作者回复: 也许是编程环境的问题。
    需要配置idea的java8环境和scala2.11环境。

    最好能自己搜一下操作细节。下面这篇(全局JDK设置部分)也许可做参考
    https://blog.csdn.net/qq_39816581/article/details/105384973

    3
    2
  • 2020-09-23
    老师您好!因为之前工作没有过推荐系统相关的项目经验,如果后期有机会面试相关岗位,能否把这个项目写到简历中当做一个项目经验呢?
    展开

    作者回复: 这个看自己吧,如果你能吃透细节,也能修改,我觉得不是不可以。

    2
  • 2020-09-23
    并没有看到“为你推荐页”,是在哪里啊?
    展开

    作者回复: 项目还不完全,会随着课程进展逐渐完成。

    1
    2
  • 2020-10-01
    老师您好!我第一次用java,按照您给的运行方法,打开找到classs RecSysServer文件后,IDE就自动提示62个错误,如:cannot resolve symbol 'eclipse'。请问如何解决呢?谢谢!
    注:右键pom.xml没有发现设置为maven project选项
    展开

    作者回复: 应该就是因为没有正确引入相关library导致的错误。可能每个ide版本不一样,设置的方法不同,建议搜索一下如何在IDEA中设置maven项目,再尝试一下。

    1
    1
  • 2020-09-24
    运行起来了,还没仔细看代码,期待
    展开

    作者回复: 代码还会持续更新,注意在每次新的实践课前通过git pull来更新代码。

    1
  • 2020-09-22
    大佬您好!我这边大概从事搜索、广告、推荐的工作也大概有六七年的光景,我有几个一直困扰的问题希望您能抽时间帮忙解答。
    1.现在关于实时广告点击率预估,业界主流的深度学习解决方案是怎样的思路?
    2.深度强化学习在推荐行业目前的应用主要瓶颈在那些点?
    展开

    作者回复: 我们在之后的课程中讨论这些问题吧。都会在相应的章节中有介绍。因为这两个问题都是要体系化回答的,不是一两句能讲清楚,期待之后咱们再一起讨论。

    1
  • 2020-09-22
    我觉得context应该对个性化特别重要,用户特征用于相似推荐。

    作者回复: 想法是对的,但不是特别准确。可以自己站在用户角度上,谈谈电影推荐这个具体的场景下,哪些数据特征是有价值的。

    2
    1
  • 2020-10-19
    请问下有比较适合生产环境的go语言版的推荐系统?
    展开

    作者回复: 我目前没有发现比较知名的go语言版开源推荐系统项目。

  • 2020-10-10
    老师好,我http://localhost:6010/可以进入首页了 但是不会显示图片,只有Adventure;Drama;Comedy;Thriller;Romance;Action这几个模块,并没有上文中有图片的效果。请问我有问题吗,还是说后面完善之后才会有
    展开

    作者回复: 有图片。应该是跟具体环境有关的问题,建议自己debug一下。

  • 2020-10-08
    老师您好,在视频推荐领域,有没有那种只做视频推荐的网站呀,就是网站上本身没有视频,而是通过爬取其他视频网站对视频的描述,以及用户对视频的评价,然后做的一个视频推荐网站。相当于可以整合多个视频网站的资源给用户推荐视频。
    展开

    作者回复: 一般都是些小网站和打擦边球的网站。除了一些开源数据集,抓取这个事情本身是不合法的。

    1
  • 2020-10-06
    跑起来了,真的不到半小时。幸好我提前学习了臧萌老师的java入门课程。

    作者回复: 赞

  • 2020-10-05
    老师,我现在刚开始从事推荐系统这一块的工作,训练都是用python,我也只会python,我只能看框架体系知识了
    展开

    作者回复: 还是推荐能够学习一下java,毕竟也不是什么小众语言。

  • 2020-10-01
    老师,我之前没有接触过Java的程序,在运行上出现了一些问题,还请老师指点一二。我成功安装了Java8和Scala2.11,也在IDEA里面无报错地编译了。但是在运行的时候还是出现了以下错误:
    Error: AJNI error has occurred, please check your installation and try again
    Exception in thread “main” Java.Lang.NoClassDefFoundError: javax/servlet/Servlet
    ...
    Caused by: java.lang.ClassNotFoundException: javax.servlet.Servlet
    ...
    到底是什么原因呢?谢谢老师!
    展开

    作者回复: 应该是没有正确引入相应的库导致的。跟环境比较相关的问题还是建议自己多调试一下。我这边可能难以还原你的环境。

    1
  • 2020-09-29
    环境已经装完,坐等细节,我看到离线是用的scala,这一块没接触过,不知道会不会有影响

    作者回复: scala是实现spark的主要语言,但如果有编程基础的话,上手应该很快,可以看一下项目里已经有的几个spark程序体会一下。

  • 2020-09-25
    用户特征,尤其是行为特征,比如点击记录,有效浏览时长,点评记录,点评结果
    物品特征,主演,类型,评分
    展开

    作者回复: 非常好

×
拖拽到此处
图片将完成下载