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

你好,我是王喆。

上节课,我们明确了推荐系统要解决的基本问题,清楚了深度学习推荐系统的技术架构,这节课我们开始走进实战。

作为程序员,我相信你肯定听过,甚至可能还很认同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/,就能看到整个推荐系统的前端效果了。

如果通过上面的步骤,你的浏览器显示出了由多个电影列表组成的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的首页

Sparrow RecSys 的首页由不同类型的电影列表组成,当用户首次访问首页时,系统默认以历史用户的平均打分从高到低排序,随着当前用户不断为电影打分,系统会对首页的推荐结果进行个性化的调整,比如电影类型的排名会进行个性化调整,每个类型内部的影片也会进行个性化推荐。

其次,是电影详情页。

你可以看到电影详情页除了罗列出电影的一些基本信息,最关键的部分是相似影片的推荐。相似内容推荐是几乎所有推荐系统非常重要的功能,传统的推荐系统基本依赖于基于内容(Content based)的推荐方法,而我们这门课程会更多地讲解基于深度学习Embedding的相似内容推荐方法。

最后,是为你推荐页。

这一部分也是整个推荐系统中最重要的部分,是用户的个性化推荐页面。这个页面会根据用户的点击、评价历史进行个性化推荐。这几乎是所有推荐系统最经典和最主要的应用场景。我希望在这门课程中,你能够动手完成个性化推荐中的每个关键步骤,包括但不限于特征的处理、候选集的召回、排序层主要模型等等。

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)等基本信息。

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

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

ratings表包含了用户ID(userId)、电影ID(movieId)、评分(rating)和时间戳(timestamp)等信息。

MovieLens 20M Dataset包含了2000万条评分数据,我们课程的实验数据集从中抽取了约104万条评论数据。评论数据集是之后推荐模型训练所需的训练样本来源,也是我们分析用户行为序列、电影统计型特征的原始数据。

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

links表包含了电影ID(movieId)、IMDB对应电影ID(imdbId)、TMDB对应电影ID(tmdbId)等信息。其中,imdb和tmdb是全球最大的两个电影数据库。因为links表包含了MovieLens电影和这两个数据库ID之间的对应关系,所以,我们可以根据这个对应关系来抓取电影的其他相关信息,这也为我们大量拓展推荐系统特征提供了可能。

此外,MovieLens的数据集中还包含了tags.csv,它用于记录用户为电影打的标签,由于课程中暂时没有使用标签数据,我就展开说了。

Sparrow Recsys涵盖的技术点

清楚了Sparrow Recsys的功能和数据,你肯定迫不及待地想知道Sparrow Recsys会使用哪些技术,可以实现哪些模型。

那我们直接来看下面这张Sparrow Recsys的技术架构图。你会发现,它其实就是我们用具体的技术选型,把上节课的深度学习推荐系统架构图给填上得到的。所以,Sparrow Recsys就是深度学习推荐系统架构的一个实现。

你可以看到,它一共分为三个模块,分别是数据、模型和前端。其中每个部分都用业界推荐系统的主流技术,比如数据部分我们会用Spark,Flink进行样本和特征的处理,模型部分我们会使用TensorFlow训练深度神经网络、Wide&Deep、PNN等模型。

我想啊,你在看到这么多的技术点和技术平台之后,肯定想问,我们的课程能把它们都讲完、讲透吗?这是个好问题,我也有必要在这里说清楚。从中,我们可以总结出Sparrow Recsys中具体用到的技术点。

其实推荐系统是一个应用属性很强的领域,想把推荐系统学好,我们就必须去学习各式各样相关的平台、技术,所以我们这门课的涉及面非常广。但你也不用因为要学这么多的技术而感到惊慌,因为我们没有必要去深究每个平台内部的原理、优化的方法,我们当好一个使用者就好。

举个例子你就明白了,我们处理数据需要用到Spark,但我们有必要成为Spark的专家吗?其实不用。因为即使你已经走上了工作岗位,也有平台架构部的同事能够提供Spark的很多技术支持。所以学习这门课程,我们大可抱着一个使用者,而不是开发者、维护者的心态去使用不同的技术平台。当然,如果你想成为某个细分方向的专家,比如Spark的专家、Flink的专家等等,我相信极客时间上肯定还有很不错的课程供你学习。

所以希望你能够通过Sparrow Recsys认识到主流深度学习推荐系统都使用了哪些技术,让自己有一个全面的认识,建立自己的知识广度。如果还想深入钻研某个方向,也可以由此开始,努力成为一个领域的专家。

小结

这堂课,我带你熟悉了我们将要实现的推荐系统Sparrow Recsys,它将是我们深度学习推荐系统这门课的落地项目和实现范例。希望有这个真实可用的推荐系统作为支撑,这门课可以同时兼顾概念讲解和代码实战,也让我们接下来的共同合作能够更好。

从开篇词到这一节课,我们从推荐系统要解决的核心问题,生发出深度学习推荐系统的技术架构,再到让技术架构实实在在地落地到Sparrow Recsys这个开源项目上。我想你已经可以感受到架构篇的学习过程,其实就是一个从抽象到具体,从形而上到形而下的过程。

那在搭建起这整门课程的框架之后,接下来我们将会一起深入到技术细节,以及深度学习的实践中,一起去体验深度学习浪潮之巅的推荐系统知识,期待继续与你同行!

课后思考

  1. 当你把Sparrow Recsys在自己的电脑上安装运行起来之后,对照着上节课的深度学习推荐系统架构图,你能试着说出每个模块的代码属于架构图中的哪一部分吗?
  2. 你觉得对于一个电影推荐系统来说,什么数据对生成用户个性化推荐结果最有帮助?

好啦,快按照这节的方法把Sparrow Recsys运行起来吧!课后的两个问题也并不困难,相信你肯定可以回答出来。今天就讲到这里了,我们下节课见!

精选留言

  • Capricornus

    2020-12-22 06:54:05

    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以上版本支持不好。

    2020-12-22 15:41:32

  • 挖掘机

    2020-12-21 23:28:38

    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即刻成功
  • 嘿人

    2020-12-09 19:57:36

    王老师您好,我学习的时候就是经常把握不好“使用者”的度,碰到什么都想扎进去研究,导致很容易陷入‘局部极小值’,请问怎么把握这个度呢?
    作者回复

    要有知识广度和宽度的概念,就像你做高考试卷,如果第一道题比较难,不太会,你总不能在第一道题上就花半个小时去解它吧,肯定是先跳过,把整体上比较简单的做完再回头做第一道。

    技术学习,和技术积累也是这样的,先知全局,再有针对性的深入,提高,否则你整体的技术水平肯定不会太高。

    2020-12-10 08:28:18

  • 浣熊当家

    2020-09-23 05:28:21

    因为没有项目经验,想知道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首页说明运行成功。

    2020-09-23 11:37:22

  • Hhha爲

    2020-09-23 12:13:00

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

    这是个好问题。

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

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

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

    2020-09-23 14:40:13

  • Geek_8a732a

    2021-08-05 14:39:39

    问题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、同类型用户最近的观影记录
  • pedro

    2020-09-22 09:41:53

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

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

    2020-09-22 14:47:23

  • Don

    2020-09-23 23:19:55

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

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

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

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

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

    2020-09-24 06:38:27

  • Sam

    2021-06-18 22:35:45

    ## 上个旧版本有些链接失效,现在补上这个新的,而且更新了步骤。
    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

    大功告成,如果安装过程有问题的同学,请留言,我们一起解决!~^^
    作者回复

    非常赞

    2021-06-23 02:53:06

  • 夜雨声烦

    2020-10-09 18:08:42

    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首页
    作者回复

    非常好。推荐给其他同学参考。

    2020-10-11 14:50:52

  • 明月

    2020-11-25 20:34:12

    老师,这是需要去了解一下java吗,在校生做推荐系统还是用Python
    作者回复

    线上部分会使用java,spark部分会使用scala,tensorflow部分会使用python。

    2020-11-26 15:34:02

  • 何去何从

    2020-09-23 14:29:17

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

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

    2020-09-24 06:50:46

  • 2020-12-29 15:27:58

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

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

    2020-12-31 03:01:40

  • 悠悠我心

    2020-09-24 00:28:41

    运行起来了,还没仔细看代码,期待
    作者回复

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

    2020-09-24 10:51:45

  • wolong

    2020-09-22 17:16:17

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

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

    2020-09-23 02:46:44

  • 太子长琴

    2020-09-25 12:57:37

    用户特征,尤其是行为特征,比如点击记录,有效浏览时长,点评记录,点评结果
    物品特征,主演,类型,评分
    作者回复

    非常好

    2020-09-26 04:18:13

  • Geek4329

    2021-02-23 20: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依赖树时失败
  • zly

    2020-12-15 19:38:35

    请问作为应届生想找推荐系统的工作,除了python以外更推荐学习什么语言呢(看到有的企业需要C++/C,有的要Java),转专业小白有点迷茫
    作者回复

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

    2020-12-16 08:18:57

  • didishuibulou

    2020-09-23 11:32:34

    并没有看到“为你推荐页”,是在哪里啊?
    作者回复

    项目还不完全,会随着课程进展逐渐完成。

    2020-09-23 14:34:34

  • MutouMan

    2021-04-25 01:11:29

    请问下使用tensorflow而不是pytorch是有什么技术原因吗?主要对tensorflow不太熟悉,想知道是不是需要学习tensorflow作为学习推荐系统的主力框架。谢谢
    作者回复

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

    2021-04-26 12:34:42