极客时间已完结课程限时免费阅读

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

02 | Sparrow RecSys:我们要实现什么样的推荐系统?-极客时间

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

讲述:王喆

时长12:39大小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 运行起来吧!课后的两个问题也并不困难,相信你肯定可以回答出来。今天就讲到这里了,我们下节课见!
分享给需要的人,Ta购买本课程,你将得20
生成海报并分享

赞 77

提建议

上一篇
01 | 技术架构:深度学习推荐系统的经典技术架构长啥样?
下一篇
03 | 深度学习基础:你打牢深度学习知识的地基了吗?
 写留言

精选留言(111)

  • Capricornus
    置顶
    2020-12-22
    MAC OS系统 1.下载IDEA(https://www.jetbrains.com/idea/download/#section=mac) 2.下载JDK(https://www.oracle.com/java/technologies/javase-jdk15-downloads.html) 3.安装IDEA和JDK(JDK的路径~/Library/Java/JavaVirtualMachines/openjdk-15.0.1-1) 4.打开IDEA,打开File->Project Strucure->Project->Project JDK(我的好像会自动识别)。若没有识别(显示jdk15.1),点击三角号,自己添加,步骤Add SDK->JDK->选择上面提到的JDK路径选择。 5.在pom.xml点击右键,设置为maven project->'Reload project'。耐心等待,这个很费时间。 6.然后找到SparrowRecSys/src/main/java/com/SparrowRecSys/online/RecSysServer,右击选择"Run 'RecSysServer.main()'",程序就执行起来了. 7.浏览器中键入http://localhost:6010/
    展开

    作者回复: jdk推荐使用java8的版本,因为spark目前对java8以上版本支持不好。

    共 12 条评论
    54
  • 挖掘机
    置顶
    2020-12-21
    windows下搭建推荐系统的步骤 1. 使用的vscode作为IDE 2. 编译命令为mvn package assembly:single 3. 我的web root uri在源代码里总是为空,稍微改了一下,这里是为了绕过去,也请指导的高手告诉正确方法 RecSysServer.java中49行改成了绝对路径 URI webRootUri = URI.create("file:/D:/Work/RecommendationSystem/Sparrow/SparrowRecSys/target/classes/webroot/"); 4. 运行java -jar target\SparrowRecSys-1.0-SNAPSHOT-jar-with-dependencies.jar即刻成功
    展开
    共 6 条评论
    11
  • 浣熊当家
    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首页说明运行成功。

    共 7 条评论
    38
  • 嘿人
    2020-12-09
    王老师您好,我学习的时候就是经常把握不好“使用者”的度,碰到什么都想扎进去研究,导致很容易陷入‘局部极小值’,请问怎么把握这个度呢?

    作者回复: 要有知识广度和宽度的概念,就像你做高考试卷,如果第一道题比较难,不太会,你总不能在第一道题上就花半个小时去解它吧,肯定是先跳过,把整体上比较简单的做完再回头做第一道。 技术学习,和技术积累也是这样的,先知全局,再有针对性的深入,提高,否则你整体的技术水平肯定不会太高。

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

    作者回复: 这是个好问题。 五六年前的传统推荐系统不少还在用协同过滤作为主排序模型。这几年慢慢被淘汰了,排序层变成了以深度学习推荐模型为主的复杂模型。 但因为协同过滤类算法比较简单,比如矩阵分解之后可以进行embedding快速召回,所以放在召回层也完全适用。 文章中推荐系统的架构是一个比较经典的架构,但也没必要认为它是无法改变的真理。在实际应用场景之中要根据业务特点灵活运用。

    34
  • Geek_8a732a
    2021-08-05
    问题1: 1、数据部分 flink流处理平台准实时数据处理:src/main/java/com/sparrowrecsys/nearline/flink spark大数据离线数据处理: 数据处理:src/main/java/com/sparrowrecsys/offline/spark/embedding 特征工程:src/main/java/com/sparrowrecsys/offline/spark/featureeng 2、模型部分 模型部分,RecPySpark/src/com/sparrowrecsys/offline/pyspark 模型评估,src/main/java/com/sparrowrecsys/offline/spark/evaluate 离线模型训练,src/main/java/com/sparrowrecsys/offline/spark/model 模型计算,src/main/java/com/sparrowrecsys/online/model 模型部分,TFRecModel/src/com/sparrowrecsys/offline/tensorflow 3、在线服务部分 数据管理,包括电影、评分、客户端,src/main/java/com/sparrowrecsys/online/datamanager 为你推荐、相似电影处理,src/main/java/com/sparrowrecsys/online/recprocess 提供http服务,src/main/java/com/sparrowrecsys/online/service 问题2 1、用户最近的观看历史,影片名字、主演、导演、影片类型,观看时长(“时长”受到别人回答的启发) 2、用户高分和低分的打分数据,点赞、踩、评论、分享(“分享”受到其他人回答的启发) 3、同类型用户最近的观影记录
    展开
    27
  • pedro
    2020-09-22
    暂时没有去跑项目,先尝试回答问题二吧,对于一个电影爱好者而言,从我的角度出发,一个能够取悦我的,电影推荐系统,必须满足我在电影种类,演员,电影内容,电影质量上的需求,要说什么最有帮助,我觉得应该是用户历史浏览记录。

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

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

    作者回复: 非常好的实践经验。在设计召回层和排序层的时候一般要联合设计,召回层要特别关注召回率指标。 如果你认为你的排序模型效果是非常不错的,把性别和年龄特征召回的item排在后面,就说明二者相关的item不应该被召回。 如果年龄和性别这两个特征对结果影响很大,那为什么排序层模型训练的时候不引入这两个特征呢? 所以需要再重新评估一下两个层,做一个重新的设计。

    共 2 条评论
    18
  • 夜雨声烦
    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首页
    展开

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

    共 6 条评论
    15
  • 陈威洋
    2021-06-18
    ## 上个旧版本有些链接失效,现在补上这个新的,而且更新了步骤。 win7下 搭建 推荐系统 的步骤: 1. 第1步骤:下载IDEA。 https://www.jetbrains.com/idea/download/#section=windows 2. 第2步骤:如何下载和配置JDK1.8(一定要JDK1.8) https://www.cnblogs.com/hejh/p/11276434.html 3.第3步骤:IDEA配置JDK1.8(一定要JDK1.8) https://blog.csdn.net/liluo_2951121599/article/details/78484776 4. 第4步骤:window下安装scala步骤 https://www.cnblogs.com/onlyxx/p/5168882.html 4.1 第4.1步骤:Scala安装问题找不到主类的(不要安装在有空格的路径) https://blog.csdn.net/weekdawn/article/details/94625067 4.2 第4.2步骤:Scala2.11要匹配JDK1.8,否则出问题 https://blog.csdn.net/yulutian/article/details/80566728 5. 第5步骤:IDEA配置Scala https://www.cnblogs.com/starzy/p/10461038.html 6. 第6步骤:win7安装hadoop spark https://www.jianshu.com/p/9f40fe1b6587 7. 第7步骤:安装Redis https://www.cnblogs.com/liuqingzheng/p/9831331.html 大功告成,如果安装过程有问题的同学,请留言,我们一起解决!~^^
    展开

    作者回复: 非常赞

    共 6 条评论
    13
  • 明月
    2020-11-25
    老师,这是需要去了解一下java吗,在校生做推荐系统还是用Python

    作者回复: 线上部分会使用java,spark部分会使用scala,tensorflow部分会使用python。

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

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

    10
  • 2020-12-29
    老师,马上就要秋招找工作了。时间问题只学习了python,感觉学习java体系来不及了,为了找工作想在scala系和pyspark系取舍一下。请问pyspark等用python调大数据相关技术在工业界运用广吗?

    作者回复: 如果确实时间紧张的话,就不要去钻研scala了,业界面试不会在乎你是用scala实现的还是python实现的。着重于spark的原理和实践能力是重点。

    共 2 条评论
    7
  • 悠悠我心
    2020-09-24
    运行起来了,还没仔细看代码,期待

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

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

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

    共 2 条评论
    7
  • 太子长琴
    2020-09-25
    用户特征,尤其是行为特征,比如点击记录,有效浏览时长,点评记录,点评结果 物品特征,主演,类型,评分

    作者回复: 非常好

    6
  • Geek4329
    2021-02-23
    如果哪位同学遇到maven无法下载依赖,报错guava21的类似错误,可以在pom中指定guava版本号如下: <dependencyManagement> <dependencies> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>21.0</version> </dependency> </dependencies> </dependencyManagement> 猜测原因,maven版本过低,解析pom依赖树时失败
    展开
    共 2 条评论
    5
  • zly
    2020-12-15
    请问作为应届生想找推荐系统的工作,除了python以外更推荐学习什么语言呢(看到有的企业需要C++/C,有的要Java),转专业小白有点迷茫

    作者回复: python和java是基本的,有的公司的服务器端用C++,如果觉得时间有限,C++可以放一放。

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

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

    共 8 条评论
    5
  • MutouMan
    2021-04-25
    请问下使用tensorflow而不是pytorch是有什么技术原因吗?主要对tensorflow不太熟悉,想知道是不是需要学习tensorflow作为学习推荐系统的主力框架。谢谢

    作者回复: 不需要一定是用tensorflow,只不过这门课程主要选择了tf,另外tf在工业级模型部署上有优势,pytorch这部分有所欠缺。

    4