mirror of
https://github.com/cheetahlou/CategoryResourceRepost.git
synced 2025-11-17 06:33:48 +08:00
mod
This commit is contained in:
126
极客时间专栏/深度学习推荐系统实战/基础架构篇/01 | 技术架构:深度学习推荐系统的经典技术架构长啥样?.md
Normal file
126
极客时间专栏/深度学习推荐系统实战/基础架构篇/01 | 技术架构:深度学习推荐系统的经典技术架构长啥样?.md
Normal file
@@ -0,0 +1,126 @@
|
||||
<audio id="audio" title="01 | 技术架构:深度学习推荐系统的经典技术架构长啥样?" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/54/15/5415875b7dd714872cb00959ebf5b415.mp3"></audio>
|
||||
|
||||
你好,我是王喆。从今天开始,我们正式开始学习“深度学习推荐系统”了。在开始之前,我想先问你一个问题:当你开始学习一个全新领域的时候,你想做的第一件事情是什么?
|
||||
|
||||
当然每个人可能都有自己的答案,但对于我自己来说,我最想搞明白的是两个问题。一个是,这个领域到底要解决什么问题?第二个是,这个领域有没有一个非常高角度的思维导图,让我能够了解这个领域有哪些主要的技术,做到心中有数?
|
||||
|
||||
针对“深度学习推荐系统”这个领域啊,可能还会有第三个问题,为什么我们要一直强调“深度学习”,深度学习到底给推荐系统带来了什么革命性的影响?相信听完了这一节课,你心中的这三个问题也都能迎刃而解。
|
||||
|
||||
## 推荐系统要解决的根本问题是什么?
|
||||
|
||||
在开篇词中我们提到,推荐系统的应用已经渗透到购物、娱乐、学习等生活的方方面面,虽然商品推荐、视频推荐、新闻推荐这些推荐场景可能完全不同,既然它们都被称为“推荐系统”,解决的本质问题一定是相通的,遵循着共通的逻辑框架。
|
||||
|
||||
推荐系统要解决的问题用一句话总结就是,**在“信息过载”的情况下,用户如何高效获取感兴趣的信息。**
|
||||
|
||||
因此,推荐系统正是在“浩如烟海的互联网信息”和“用户的兴趣点”之间,搭建起的一座桥梁。那这座桥是怎么一步步搭建起来的呢?下面,我们先来看看,推荐系统比较抽象的逻辑架构是什么样的,再一步步搭建起它的技术架构,让你对推荐系统有一个整体上的印象。
|
||||
|
||||
## 推荐系统的逻辑架构
|
||||
|
||||
从推荐系统的根本问题出发,我们可以清楚地知道,推荐系统要处理的其实是“**人**”和“**信息**”之间的关系问题。也就是基于“人”和“信息”,构建出一个找寻感兴趣信息的方法。
|
||||
|
||||
这里“信息”的定义非常多样,它在不同场景下的具体含义也千差万别。比如说,在商品推荐中指的是“商品信息”,在视频推荐中指的是“视频信息”,在新闻推荐中指的是“新闻信息”,为了方便,我们可以把它们统称为“物品信息”。
|
||||
|
||||
而从“人”的角度出发,为了更可靠地推测出“人”的兴趣点,推荐系统希望能利用大量与“人”相关的信息,这类信息包括历史行为、人口属性、关系网络等,它们可以被统称为“用户信息”。
|
||||
|
||||
此外,在具体的推荐场景中,用户的最终选择一般会受时间、地点、用户的状态等一系列环境信息的影响,这些环境信息又可以被称为“场景信息”或“上下文信息”。
|
||||
|
||||
清楚了这些信息的定义,推荐系统要处理的问题就可以被形式化地定义为:**对于某个用户**U**(User),在特定场景**C**(Context)下,针对海量的“物品”信息构建一个函数 ,预测用户对特定候选物品**I**(Item)的喜好程度,再根据喜好程度对所有候选物品进行排序,生成推荐列表的问题**。
|
||||
|
||||
这样一来,我们就可以抽象出推荐系统的逻辑框架了。虽然这个逻辑框架还比较简单,但我们正是在此基础上,对各模块进行细化和扩展,才产生了推荐系统的整个技术体系。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/c7/07/c75969c5fcc6e5e374a87d4b4b1d5d07.jpg" alt="" title="图1 推荐系统逻辑架构">
|
||||
|
||||
## 深度学习对推荐系统的革命
|
||||
|
||||
有了推荐系统的逻辑架构,我就能回答开头的第三个问题“**深度学习到底给推荐系统带来了什么革命性的影响?**”。
|
||||
|
||||
在推荐系统逻辑架构图中,居于中心位置的是一个抽象函数**f(U,I,C)**,它负责“猜测”用户的心,为用户可能感兴趣的物品打分,从而得出最终的推荐物品列表。在推荐系统中,这个函数一般被称为“推荐系统模型”(今后简称“推荐模型”)。
|
||||
|
||||
深度学习应用于推荐系统,能够极大地增强推荐模型的拟合能力和表达能力。简单来说,就是让推荐模型“猜的更准”,更能抓住用户的“心”。这么说你可能还没有一个清晰的概念,接下来,我们再从模型结构的角度出发,来比较一下传统机器学习推荐模型和深度学习推荐模型的区别,让你有一个更清晰的认识。
|
||||
|
||||
我在下面给出了一张模型结构对比图,它对比了传统的矩阵分解模型和深度学习矩阵分解模型的区别。我们先忽略细节不谈,你第一眼看上去有什么感觉?是不是觉得深度学习模型变得更复杂了,一层又一层,层数增加了很多。
|
||||
|
||||
你的感觉一点儿都没错,其实正是**因为深度学习复杂的模型结构,让深度学习模型具备了理论上拟合任何函数的能力**。如果说**f(U,I,C)** 这个推荐函数具有一个最优的表达形式,那传统的机器学习模型只能够拟合出**f(U,I,C)** 这个推荐函数的近似形式,而深度学习模型则可以最大程度地接近这个最优形式。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/3d/7e/3d786a8a7ab6141edaeb2383858b137e.jpg" alt="" title="图2 传统的矩阵分解模型和深度学习矩阵分解模型的对比图[br]来源:《Neural collaborative filtering》">
|
||||
|
||||
除此之外,深度学习模型非常灵活的模型结构还让它具备了一个无法替代的优势,就是我们可以**让深度学习模型的神经网络模拟很多用户兴趣的变迁过程,甚至用户做出决定的思考过程**。比如阿里巴巴的深度学习模型——深度兴趣进化网络(如图3),它利用了三层序列模型的结构,模拟了用户在购买商品时兴趣进化的过程,如此强大的数据拟合能力和对用户行为的理解能力,是传统机器学习模型不具备的。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/b2/b9/b2606096aa4ff97461dd91b87d748db9.jpg" alt="" title="图3 阿里巴巴的深度兴趣进化网络 [br]来源:《Deep Interest Evolution Network for Click-Through Rate Prediction》">
|
||||
|
||||
但是,深度学习对推荐系统的革命影响还远不止这些。近几年,由于深度学习模型的结构复杂度大大提高,使通过训练使模型收敛所需的数据量大大增加,这也反向推动了推荐系统大数据平台的发展,让推荐系统相关的大数据存储、处理、更新模块也一同迈入了“深度学习时代”。
|
||||
|
||||
讲了这么多深度学习对推荐系统的影响,我们似乎还没看到一个完整的深度学习推荐系统架构。别着急,下面,我们就来讲一讲,经典的深度学习推荐系统的技术架构是什么样的。
|
||||
|
||||
## 深度学习推荐系统的技术架构
|
||||
|
||||
讲之前啊,我还要说明一点,深度学习推荐系统的架构与经典的推荐系统架构其实是一脉相承的,它对经典推荐系统架构中某些特定模块进行了改进,使之能够支持深度学习的应用。所以,我会先讲经典的推荐系统架构,再讲深度学习对它们的改进。
|
||||
|
||||
在实际的推荐系统中,工程师需要着重解决的问题有两类。
|
||||
|
||||
- 一类问题与数据和信息相关,即“用户信息”“物品信息”“场景信息”分别是什么?如何存储、更新和处理数据?
|
||||
- 另一类问题与推荐系统算法和模型相关,即推荐系统模型如何训练、预测,以及如何达成更好的推荐效果?
|
||||
|
||||
一个工业级推荐系统的技术架构其实也是按照这两部分展开的,其中“数据和信息”部分逐渐发展为推荐系统中融合了数据离线批处理、实时流处理的数据流框架;“算法和模型”部分则进一步细化为推荐系统中,集训练(Training)、评估(Evaluation)、部署(Deployment)、线上推断(Online Inference)为一体的模型框架。基于此,我们就能总结出推荐系统的技术架构图。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/a8/c1/a87530cf45fb76480bf5b60b9feb60c1.jpg" alt="" title="图4 推荐系统技术架构示意图">
|
||||
|
||||
在图4中,我把推荐系统的技术架构分成了“数据部分”和“模型部分”。那它们的工作内容和作用分别是什么呢?深度学习对于这两部分的影响又有哪些呢?下面,我来一一讲解。
|
||||
|
||||
### 第一部分:推荐系统的数据部分
|
||||
|
||||
推荐系统的“数据部分”主要负责的是“用户”“物品”“场景”信息的收集与处理。根据处理数据量和处理实时性的不同,我们会用到三种不同的数据处理方式,按照实时性的强弱排序的话,它们依次是**客户端与服务器端实时数据处理、流处理平台准实时数据处理、大数据平台离线数据处理**。
|
||||
|
||||
在实时性由强到弱递减的同时,三种平台的海量数据处理能力则由弱到强。因此,一个成熟推荐系统的数据流系统会将三者取长补短,配合使用。我们也会在今后的课程中讲到具体的例子,比如使用Spark进行离线数据处理,使用Flink进行准实时数据处理等等。
|
||||
|
||||
大数据计算平台通过对推荐系统日志,物品和用户的元数据等信息的处理,获得了推荐模型的训练数据、特征数据、统计数据等。那这些数据都有什么用呢?具体说来,大数据平台加工后的数据出口主要有3个:
|
||||
|
||||
1. 生成推荐系统模型所需的样本数据,用于算法模型的训练和评估。
|
||||
1. 生成推荐系统模型服务(Model Serving)所需的“用户特征”,“物品特征”和一部分“场景特征”,用于推荐系统的线上推断。
|
||||
1. 生成系统监控、商业智能(Business Intelligence,BI)系统所需的统计型数据。
|
||||
|
||||
可以说,推荐系统的数据部分是整个推荐系统的“水源”,我们只有保证“水源”的持续、纯净,才能不断地“滋养”推荐系统,使其高效地运转并准确地输出。在深度学习时代,深度学习模型对于“水源”的要求更高了,**首先是水量要大**,只有这样才能保证我们训练出的深度学习模型能够尽快收敛;**其次是“水流”要快**,让数据能够尽快地流到模型更新训练的模块,这样才能够让模型实时的抓住用户兴趣变化的趋势,这就推动了大数据引擎Spark,以及流计算平台Flink的发展和应用。
|
||||
|
||||
### 第二部分:推荐系统的模型部分
|
||||
|
||||
推荐系统的“模型部分”是推荐系统的主体。模型的结构一般由“召回层”、“排序层”以及“补充策略与算法层”组成。
|
||||
|
||||
其中,“召回层”一般由高效的召回规则、算法或简单的模型组成,这让推荐系统能快速从海量的候选集中召回用户可能感兴趣的物品。“排序层”则是利用排序模型对初筛的候选集进行精排序。而“补充策略与算法层”,也被称为“再排序层”,是在返回给用户推荐列表之前,为兼顾结果的“多样性”“流行度”“新鲜度”等指标,结合一些补充的策略和算法对推荐列表进行一定的调整,最终形成用户可见的推荐列表。
|
||||
|
||||
从推荐系统模型接收到所有候选物品集,到最后产生推荐列表,这一过程一般叫做“**模型服务过程**”。为了生成模型服务过程所需的模型参数,我们需要通过模型训练(Model Training)确定模型结构、结构中不同参数权重的具体数值,以及模型相关算法和策略中的参数取值。
|
||||
|
||||
模型的训练方法根据环境的不同,可以分为“离线训练”和“在线更新”两部分。其中,离线训练的特点是可以利用全量样本和特征,使模型逼近全局最优点,而在线更新则可以准实时地“消化”新的数据样本,更快地反应新的数据变化趋势,满足模型实时性的需求。
|
||||
|
||||
除此之外,为了评估推荐系统模型的效果,以及模型的迭代优化,推荐系统的模型部分还包括“离线评估”和“线上A/B测试”等多种评估模块,用来得出线下和线上评估指标,指导下一步的模型迭代优化。
|
||||
|
||||
我们刚才说过,深度学习对于推荐系统的革命集中在模型部分,那具体都有什么呢?我把最典型的深度学习应用总结成了3点:
|
||||
|
||||
1. 深度学习中Embedding技术在召回层的应用。作为深度学习中非常核心的Embedding技术,将它应用在推荐系统的召回层中,做相关物品的快速召回,已经是业界非常主流的解决方案了。
|
||||
1. 不同结构的深度学习模型在排序层的应用。排序层(也称精排层)是影响推荐效果的重中之重,也是深度学习模型大展拳脚的领域。深度学习模型的灵活性高,表达能力强的特点,这让它非常适合于大数据量下的精确排序。深度学习排序模型毫无疑问是业界和学界都在不断加大投入,快速迭代的部分。
|
||||
1. 增强学习在模型更新、工程模型一体化方向上的应用。增强学习可以说是与深度学习密切相关的另一机器学习领域,它在推荐系统中的应用,让推荐系统可以在实时性层面更上一层楼。
|
||||
|
||||
## 小结
|
||||
|
||||
这节课,我带你熟悉了深度学习推荐系统的技术架构,虽然涉及的内容非常多,但如果没有记住的话,你也完全不用慌张,只需要在心中留下这个框架的印象就可以了。你完全可以把这节课的内容当作整个课程的技术索引,让它成为属于你自己的一张知识图谱。
|
||||
|
||||
形象点来说,你可以把这节课程的内容想象成是一颗知识树,它有根,有干、有枝、有叶,还有花。
|
||||
|
||||
其中,推荐系统的根就是推荐系统要解决的根本性问题:在“信息过载”情况下,用户怎么高效获取感兴趣的信息。
|
||||
|
||||
而推荐系统的干就是推荐系统的逻辑架构:对于某个用户**U**(User),在特定场景**C**(Context)下,针对海量的“物品”构建一个函数 ,预测用户对特定候选物品**I**(Item)的喜好程度的过程。
|
||||
|
||||
枝和叶就是推荐系统的各个技术模块,以及各模块的技术选型。技术模块撑起了推荐系统的技术架构,技术选型又让我们可以在技术架构上实现各种细节,开枝散叶。
|
||||
|
||||
最后,深度学习在推荐系统的应用无疑是当前推荐系统技术架构上的明珠,它就像是这颗大树上开出的花,是最精彩的点睛之笔。深度学习的模型结构复杂,数据拟合能力和表达能力更强,能够让推荐模型更好的模拟用户的兴趣变迁过程,甚至是做决定的过程。而深度学习的发展,也推动着推荐系统数据流部分的革命,让它能够更快、更强地处理推荐系统相关的数据。
|
||||
|
||||
好了,这节课我们就讲到这里,希望你能牢牢记住深度学习推荐系统的架构,播撒下这一粒种子,然后跟随我后面的课程让它长大成一颗属于你自己的参天大树。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/0e/a1/0e269ebf95dcb772ed31f9c28cef2aa1.jpeg" alt="" title="图5 推荐系统的技术架构像树一样生发而出">
|
||||
|
||||
## 课后思考
|
||||
|
||||
下面是Netflix的推荐系统的经典架构图,你能结合本节课讲的推荐系统技术架构,说出Netflix架构图中哪些是数据部分,哪些是模型部分吗?
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/41/c0/4189db7d4yy86a74903dd2acb30742c0.jpg" alt="" title="图6 Netflix架构图示意图">
|
||||
|
||||
这样的深度学习推荐系统和你想的一样吗?如果今天的课程对你有帮助,也欢迎你把它转发出去!我们下节课见!
|
||||
124
极客时间专栏/深度学习推荐系统实战/基础架构篇/02 | Sparrow RecSys:我们要实现什么样的推荐系统?.md
Normal file
124
极客时间专栏/深度学习推荐系统实战/基础架构篇/02 | Sparrow RecSys:我们要实现什么样的推荐系统?.md
Normal file
@@ -0,0 +1,124 @@
|
||||
<audio id="audio" title="02 | Sparrow RecSys:我们要实现什么样的推荐系统?" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/9a/a7/9a74c445ed975ecdc0a67100c6abaca7.mp3"></audio>
|
||||
|
||||
你好,我是王喆。
|
||||
|
||||
上节课,我们明确了推荐系统要解决的基本问题,清楚了深度学习推荐系统的技术架构,这节课我们开始走进实战。
|
||||
|
||||
作为程序员,我相信你肯定听过,甚至可能还很认同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](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/`,就能看到整个推荐系统的前端效果了。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/29/e0/291a34c2e4cd379434efd2e3aed777e0.jpg" alt="" title="图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的首页**。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/29/e0/291a34c2e4cd379434efd2e3aed777e0.jpg" alt="" title="图2 Sparrow RecSys的首页">
|
||||
|
||||
Sparrow RecSys 的首页由不同类型的电影列表组成,当用户首次访问首页时,系统默认以历史用户的平均打分从高到低排序,随着当前用户不断为电影打分,系统会对首页的推荐结果进行个性化的调整,比如电影类型的排名会进行个性化调整,每个类型内部的影片也会进行个性化推荐。
|
||||
|
||||
**其次,是电影详情页。**
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/b1/46/b12e82af7b561f2d657da25b04960946.jpg" alt="" title="图3 电影详情页">
|
||||
|
||||
你可以看到电影详情页除了罗列出电影的一些基本信息,最关键的部分是相似影片的推荐。相似内容推荐是几乎所有推荐系统非常重要的功能,传统的推荐系统基本依赖于基于内容(Content based)的推荐方法,而我们这门课程会更多地讲解基于深度学习Embedding的相似内容推荐方法。
|
||||
|
||||
**最后,是为你推荐页。**
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/55/65/55d0f2b3395d30b9ecac47a615686765.jpg" alt="" title="图4 为你推荐页">
|
||||
|
||||
这一部分也是整个推荐系统中最重要的部分,是用户的个性化推荐页面。这个页面会根据用户的点击、评价历史进行个性化推荐。这几乎是所有推荐系统最经典和最主要的应用场景。我希望在这门课程中,你能够动手完成个性化推荐中的每个关键步骤,包括但不限于特征的处理、候选集的召回、排序层主要模型等等。
|
||||
|
||||
## Sparrow Recsys的数据从哪来?
|
||||
|
||||
知道了Sparrow RecSys的功能之后,你肯定想问,“老师,咱们的数据从哪来呀?”。既然Sparrow RecSys是一个开源项目,那么Sparrow RecSys的数据源肯定也是开源和免费的,它的数据源来自于著名的电影开源数据集[MovieLens](https://grouplens.org/datasets/movielens/)。
|
||||
|
||||
为了方便你调试,咱们这门课程的教学数据集对MovieLens数据集进行了精简,只留下了1000部电影。如果希望在全量数据集上进行推荐,你可以去MovieLens的官方网站下载全量数据,它一共包含了27000部电影。
|
||||
|
||||
MovieLens的数据集包括三部分,分别是 **movies.csv(电影基本信息数据)、ratings.csv(**用户评分数据)**和 links.csv**(外部链接数据)。下面,我就具体说说它们分别长什么样。
|
||||
|
||||
### 1. movies.csv(电影基本信息数据)
|
||||
|
||||
movies表是电影的基本信息表,它包含了电影ID(movieId)、电影名(title)、发布年份以及电影类型(genres)等基本信息。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/f3/7a/f3579fbb04e430d5322fcd58fb410c7a.jpeg" alt="" title="图5 电影基本信息数据">
|
||||
|
||||
MovieLens 20M Dataset包含了2016年前的约13万部电影,我们课程的实验数据集从中抽取了前1000部电影。电影数据集是我们推荐的主体,其中分类、发布年份、电影名称等信息也将是推荐模型可以利用的重要特征。
|
||||
|
||||
### 2. ratings.csv(用户评分数据)
|
||||
|
||||
ratings表包含了用户ID(userId)、电影ID(movieId)、评分(rating)和时间戳(timestamp)等信息。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/6c/ec/6c1d79ba6f9ea7017b7b0f60d3798aec.jpeg" alt="" title="图6 用户评分数据">
|
||||
|
||||
MovieLens 20M Dataset包含了2000万条评分数据,我们课程的实验数据集从中抽取了约104万条评论数据。评论数据集是之后推荐模型训练所需的训练样本来源,也是我们分析用户行为序列、电影统计型特征的原始数据。
|
||||
|
||||
### 3. links.csv(外部链接数据)
|
||||
|
||||
links表包含了电影ID(movieId)、IMDB对应电影ID(imdbId)、TMDB对应电影ID(tmdbId)等信息。其中,imdb和tmdb是全球最大的两个电影数据库。因为links表包含了MovieLens电影和这两个数据库ID之间的对应关系,所以,我们可以根据这个对应关系来抓取电影的其他相关信息,这也为我们大量拓展推荐系统特征提供了可能。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/95/07/951f3fb63de288774c404c215756cf07.jpeg" alt="" title="图7 外部链接数据">
|
||||
|
||||
此外,MovieLens的数据集中还包含了tags.csv,它用于记录用户为电影打的标签,由于课程中暂时没有使用标签数据,我就展开说了。
|
||||
|
||||
## Sparrow Recsys涵盖的技术点
|
||||
|
||||
清楚了Sparrow Recsys的功能和数据,你肯定迫不及待地想知道Sparrow Recsys会使用哪些技术,可以实现哪些模型。
|
||||
|
||||
那我们直接来看下面这张Sparrow Recsys的技术架构图。你会发现,它其实就是我们用具体的技术选型,把上节课的深度学习推荐系统架构图给填上得到的。所以,Sparrow Recsys就是深度学习推荐系统架构的一个实现。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/8c/9e/8cee6a7eeebda9745bfbe1b6yy18c59e.jpg" alt="" title="图8 Sparrow Recsys的推荐系统架构">
|
||||
|
||||
你可以看到,它一共分为三个模块,分别是数据、模型和前端。其中每个部分都用业界推荐系统的主流技术,比如数据部分我们会用Spark,Flink进行样本和特征的处理,模型部分我们会使用TensorFlow训练深度神经网络、Wide&Deep、PNN等模型。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/2f/02/2f89e7a0fb0f130f2ec8e75d3848f802.jpeg" alt="" title="图9 Sparrow Recsys中的技术点">
|
||||
|
||||
我想啊,你在看到这么多的技术点和技术平台之后,肯定想问,我们的课程能把它们都讲完、讲透吗?这是个好问题,我也有必要在这里说清楚。从中,我们可以总结出Sparrow Recsys中具体用到的技术点。
|
||||
|
||||
其实推荐系统是一个应用属性很强的领域,想把推荐系统学好,我们就必须去学习各式各样相关的平台、技术,所以我们这门课的涉及面非常广。但你也不用因为要学这么多的技术而感到惊慌,因为我们没有必要去深究每个平台内部的原理、优化的方法,我们当好一个使用者就好。
|
||||
|
||||
举个例子你就明白了,我们处理数据需要用到Spark,但我们有必要成为Spark的专家吗?其实不用。因为即使你已经走上了工作岗位,也有平台架构部的同事能够提供Spark的很多技术支持。所以学习这门课程,我们大可抱着一个使用者,而不是开发者、维护者的心态去使用不同的技术平台。当然,如果你想成为某个细分方向的专家,比如Spark的专家、Flink的专家等等,我相信极客时间上肯定还有很不错的课程供你学习。
|
||||
|
||||
所以希望你能够通过Sparrow Recsys认识到主流深度学习推荐系统都使用了哪些技术,让自己有一个全面的认识,建立自己的知识广度。如果还想深入钻研某个方向,也可以由此开始,努力成为一个领域的专家。
|
||||
|
||||
## 小结
|
||||
|
||||
这堂课,我带你熟悉了我们将要实现的推荐系统Sparrow Recsys,它将是我们深度学习推荐系统这门课的落地项目和实现范例。希望有这个真实可用的推荐系统作为支撑,这门课可以同时兼顾概念讲解和代码实战,也让我们接下来的共同合作能够更好。
|
||||
|
||||
从开篇词到这一节课,我们从推荐系统要解决的核心问题,生发出深度学习推荐系统的技术架构,再到让技术架构实实在在地落地到Sparrow Recsys这个开源项目上。我想你已经可以感受到架构篇的学习过程,其实就是一个从抽象到具体,从形而上到形而下的过程。
|
||||
|
||||
那在搭建起这整门课程的框架之后,接下来我们将会一起深入到技术细节,以及深度学习的实践中,一起去体验深度学习浪潮之巅的推荐系统知识,期待继续与你同行!
|
||||
|
||||
## 课后思考
|
||||
|
||||
1. 当你把Sparrow Recsys在自己的电脑上安装运行起来之后,对照着上节课的深度学习推荐系统架构图,你能试着说出每个模块的代码属于架构图中的哪一部分吗?
|
||||
1. 你觉得对于一个电影推荐系统来说,什么数据对生成用户个性化推荐结果最有帮助?
|
||||
|
||||
好啦,快按照这节的方法把Sparrow Recsys运行起来吧!课后的两个问题也并不困难,相信你肯定可以回答出来。今天就讲到这里了,我们下节课见!
|
||||
115
极客时间专栏/深度学习推荐系统实战/基础架构篇/03 | 深度学习基础:你打牢深度学习知识的地基了吗?.md
Normal file
115
极客时间专栏/深度学习推荐系统实战/基础架构篇/03 | 深度学习基础:你打牢深度学习知识的地基了吗?.md
Normal file
@@ -0,0 +1,115 @@
|
||||
<audio id="audio" title="03 | 深度学习基础:你打牢深度学习知识的地基了吗?" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/d4/f1/d47a52f61cfe3d10362807d9b3535ef1.mp3"></audio>
|
||||
|
||||
你好,我是王喆。
|
||||
|
||||
今天,我想用一节课的时间,带你梳理巩固一下深度学习的相关基础知识。打好基础之后,我们再去学习深度学习推荐系统的技术细节,就能更加得心应手了。
|
||||
|
||||
具体来说,我会从一个基本的神经元开始,讲到多神经元组成的神经网络,再到结构各异的深度学习网络,最后再讲一讲深度学习和推荐系统是怎么结合的。这样,从0到1带你体会深度学习网络生长的整个过程。
|
||||
|
||||
是不是已经迫不及待想要开始今天的课程啦?接下来,我们就一起“钻”进一个神经元里面,跟它一起成长吧。
|
||||
|
||||
## 一切要从一个神经元开始
|
||||
|
||||
上中学的时候,你肯定在生物课上学到过,神经元是我们神经系统的最基本单元,我们的大脑、小脑、脊髓都是由神经元组成的。比如,大脑大概包含了1000亿个神经元!正是这些小小的神经元之间互相连接合作,让大脑能够完成非常复杂的学习任务,这是一个多么神奇的过程!
|
||||
|
||||
于是,计算机科学家们就有一个设想,是不是我们也能从神经元出发,创造出一个人造大脑,来帮我们完成各种不同的任务呢?这其中当然也包括我们课程要讲的推荐任务。事实上,随着近十年深度学习网络的快速发展,这个设想已经被成功应用到图像识别、语音处理、推荐搜索等多个领域了!那组成这个“人造大脑”的基础,也就是神经元到底是什么样子的呢?
|
||||
|
||||
下面这张图就是一个神经元的结构示意图,它大致由**树突**、**细胞体**(图中细胞核和周围的部分)、**轴突、轴突末梢**等几部分组成。**树突**是神经元的输入信号通道,它的功能是将其他神经元的动作电位(可以当作一种信号)传递至细胞体。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/86/f9/86892b5dfbf5e37e355c5dee84c846f9.jpeg" alt="" title="图1 神经元示意图">
|
||||
|
||||
在接收到其他神经元的信号后,**细胞体**会根据这些信号改变自己的状态,变成“激活态”还是“未激活态”。具体的状态取决于输入信号,也取决于神经细胞本身的性质(抑制或加强)。当信号量超过某个阈值时,细胞体就会被激活,产生电脉冲。电脉冲会沿着**轴突**传播,并通过**轴突末梢**传递到其它神经元。
|
||||
|
||||
我上面讲的这些是神经元工作的生物学过程,那如果要用一个神经元来解决推荐问题,具体又该怎么做呢?举个例子,我们可以假设其他神经元通过树突传递过来的信号就是推荐系统用到的特征,有的信号可能是“用户性别是男是女”,有的信号可能是“用户之前有没有点击过这个物品”等等。细胞体在接收到这些信号的时候,会做一个简单的判断,然后通过轴突输出一个信号,这个输出信号大小代表了用户对这个物品的感兴趣程度。这样一来,我们就可以用这个输出信号给用户做推荐啦。
|
||||
|
||||
看起来用神经元来完成推荐任务还是很有希望的,但在实际应用里面,我们还得把生物结构的神经元抽象成一个数学形式,这样我们才能用程序来实现它。图2就是这样的一个抽象结构,这个神经元的结构很简单,只有两个传递输入信号的树突。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/3e/b7/3eb558f5b5f41df5b5644841cb1694b7.jpeg" alt="" title="图2 神经元的抽象结构">
|
||||
|
||||
我们可以看到,图2中的x<sub>1</sub>、x<sub>2</sub>就相当于两个树突传递的输入信号,蓝圈内的结构相当于神经元的细胞体,细胞体用某种方式处理好输入信号之后,就通过右面的轴突输出信号y。因为输入输出都很简单,所以我想现在你的疑问,肯定聚焦在细胞体对输入信号的处理方式上了,我们可以把细胞体的数学结构放大一点看看。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/c2/54/c28b5eee53a2b4e70233cdf232873e54.jpeg" alt="" title="图3 基于Sigmoid激活函数的神经元">
|
||||
|
||||
其实细胞体中的计算就做了两件事情,一件事情是把输入信号x<sub>1</sub>、x<sub>2</sub>各自乘以一个权重w<sub>1</sub>、w<sub>2</sub>,再把各自的乘积加起来之后输入到一个叫“激活函数”的结构里。
|
||||
|
||||
图3中的激活函数是sigmoid激活函数,它的数学定义是:$f(z)=\frac{1}{1+\mathrm{e}^{-z}}$ 。它的函数图像就是图3中的S型曲线,它的作用是把输入信号从(-∞,+∞)的定义域映射到(0,1)的值域(因为在点击率预测,推荐问题中,往往是要预测一个从0到1的概率)。再加上sigmoid函数有处处可导的优良数学形式,方便之后的梯度下降学习过程,所以它成为了经常使用的激活函数。
|
||||
|
||||
当然,激活函数的种类有很多种,比较流行的还有tanh、ReLU等,在训练神经元或者神经网络的时候,我们可以尝试多种激活函数,根据效果来做最终的决定。
|
||||
|
||||
## 什么是神经网络?
|
||||
|
||||
不过,单神经元由于受到简单结构的限制,预测能力并不强,因此在解决复杂问题时,我们经常会用多神经元组成一个网络,这样它就具有更强的拟合数据的能力了,这也就是我们常说的**神经网络**。比如说,下图就向我们展示了一个由输入层、两神经元隐层和单神经元输出层组成的简单神经网络。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/dc/c6/dc2e967466dc1d05fe7e443b8400b6c6.jpeg" alt="" title="图4 简单神经网络示意图">
|
||||
|
||||
其中,每个蓝色神经元的构造都和刚才的单神经元构造相同,h<sub>1</sub>和h<sub>2</sub>神经元的输入是由x<sub>1</sub>和x<sub>2</sub>组成的特征向量,而神经元o<sub>1</sub>的输入则是由h<sub>1</sub>和h<sub>2</sub>输出组成的输入向量。这是一个最简单的三层神经网络,在深度学习的发展过程中,正是因为研究人员对神经元不同的连接方式的探索,才衍生出各种不同特性的深度学习网络,让深度学习模型的家族树枝繁叶茂。在后面课程的学习中,我们也会深入讲解各种不同的网络结构,相信你对这句话的理解也会随着学习的推进而更加深刻。
|
||||
|
||||
## 神经网络是怎么学习的?
|
||||
|
||||
清楚了神经网络的结构之后,更重要的问题是我们该如何训练一个神经网络。也就是说,我们怎么得到图5中x<sub>1</sub>到h<sub>1</sub>、h<sub>2</sub>的权重w<sub>1</sub>、w<sub>3</sub>,以及图中其他的权重呢?
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/35/92/356aeb6e93f4292a89e5b57a4a385d92.jpeg" alt="" title="图5 神经网络中的权重">
|
||||
|
||||
这里需要用到神经网络的重要训练方法,**前向传播(Forward Propagation)<strong>和**反向传播(Back Propagation)</strong>。前向传播的目的是在当前网络参数的基础上得到模型对输入的预估值,也就是我们常说的模型推断过程。比如说,我们要通过一位同学的体重、身高预测TA的性别,前向传播的过程就是给定体重值71,身高值178,经过神经元h<sub>1</sub>、h<sub>2</sub>和o<sub>1</sub>的计算,得到一个性别概率值,比如说0.87,这就是TA可能为男性的概率。
|
||||
|
||||
在得到预估值之后,我们就可以利用损失函数(Loss Function)计算模型的损失。比如我们采用绝对值误差(Absolute Loss)作为我们的损失函数,如果这位同学的真实性别是男,那真实的概率值就是1,根据公式2的绝对值误差定义,这次预测的损失就是|1-0.87| = 0.13。
|
||||
|
||||
$$l_{1}\left(y_{i}, \hat{y}_{i}\right)=\left|y_{i}-\hat{y}_{i}\right|$$
|
||||
|
||||
我们常说“知错能改,善莫大焉”,神经网络的学习更是践行了这句话。发现了预测值和真实值之间的误差(Loss),我们就要用这个误差来指导权重的更新,让整个神经网络在下次预测时变得更准确。最常见的权重更新方式就是梯度下降法,它是通过求取偏导的形式来更新权重的。比如,我们要更新权重w<sub>5</sub>,就要先求取损失函数到w5的偏导$\frac{\partial L_{o 1}}{\partial w_{5}}$。从数学角度来看,梯度的方向是函数增长速度最快的方向,那么梯度的反方向就是函数下降最快的方向,所以让损失函数减小最快的方向就是我们希望梯度w5更新的方向。这里我们再引入一个超参数α,它代表了梯度更新的力度,也称为学习率。好,现在我们可以写出梯度更新的公式了:$w_{5}^{t+1}=w_{5}^{t}-\alpha * \frac{\partial L_{o 1}}{\partial w_{5}}$。公式中的w<sub>5</sub>当然可以换成其他要更新的参数,公式中的t代表着更新的次数。
|
||||
|
||||
对输出层神经元来说(图中的 o<sub>1</sub>),我们可以直接利用梯度下降法计算神经元相关权重(即图5中的权重w<sub>5</sub>和w<sub>6</sub>)的梯度,从而进行权重更新,但对隐层神经元的相关参数(比如w<sub>1</sub>),我们又该如何利用输出层的损失进行梯度下降呢?
|
||||
|
||||
答案是“利用求导过程中的链式法则(Chain Rule)”。通过链式法则我们可以解决梯度逐层反向传播的问题。最终的损失函数到权重w<sub>1</sub>的梯度是由损失函数到神经元h<sub>1</sub>输出的偏导,以及神经元h<sub>1</sub>输出到权重w<sub>1</sub>的偏导相乘而来的。也就是说,最终的梯度逐层传导回来,“指导”权重w<sub>1</sub>的更新。
|
||||
|
||||
$$\frac{\partial L_{o 1}}{\partial w_{1}}=\frac{\partial L_{o 1}}{\partial h_{1}} \cdot \frac{\partial h_{1}}{\partial w_{1}}$$
|
||||
|
||||
具体在计算的时候,我们需要根据具体的问题明确最终损失函数的形式,以及每层神经元激活函数的形式,再根据具体的函数形式进行偏导的计算。这部分的学习需要一定的微积分基础,如果你觉得不是很好理解,也不用担心,因为对于大部分的机器学习库来说,梯度反向传播的过程已经被实现并且封装好了,直接调用就可以了,但是原理我们还是有必要了解的。
|
||||
|
||||
到这里,神经网络相关的基本知识我们就讲完了,前面讲了这么多,我想再带你做个总结。**神经元是神经网络中的基础结构,它参照生物学中的神经元构造,抽象出带有输入输出和激活函数的数学结构。而神经网络是通过将多个神经元以串行、并行、全连接等方式连接起来形成的网络,神经网络的训练方法是基于链式法则的梯度反向传播。**
|
||||
|
||||
但是细心的你可能会问了,搭建深度学习推荐系统跟神经网络到底有什么关系呢?
|
||||
|
||||
## 神经网络与深度学习的关系是什么?
|
||||
|
||||
想要搞清楚这个问题,我得先给你讲点儿神经网络和深度学习的历史。
|
||||
|
||||
其实学术界对于人工神经网络的研究非常早,可以追溯上世纪60年代,但由于计算机发展本身的限制,我们没有办法完成神经网络学习所需的大量计算。直到上世纪80年代,Hinton等人提出了反向传播算法(BP算法),神经网络才能够完成类似字母识别的简单任务。
|
||||
|
||||
时间到了2012年,Hinton的学生Alex Krizhevsky提出了一个用于图像识别的深度神经网络结构AlexNet,在当年著名的图像识别大赛ImageNet上,它以碾压第二名的成绩荣获桂冠。也正是从那时起,人们突然意识到,原来用深层的神经网络可以完成这么复杂的任务。深度学习的浪潮从此被正式引爆了!
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/93/3e/9399bb223f60eec8b2fd9fc32d09303e.jpg" alt="" title="图6 著名的深度学习模型AlexNet">
|
||||
|
||||
结合上图你可以看到,跟我们刚才讲的简单神经网络相比,AlexNet无论从深度,还是每一层的神经元数量来说,都大大增加了,并且神经元的连接方式和种类也更加丰富。
|
||||
|
||||
那知道了这些,我们就可以回答刚才提出的问题了。深度学习可以说是神经网络的延伸和发展,它极大地丰富神经网络的结构种类,让它能够处理各类复杂问题。
|
||||
|
||||
这个时候,你可能又会问:好像深度学习相比传统的神经网络没什么革命性的创新呀,为啥到了2012年才取得这么大的突破呢?这是个好问题,我觉得主要有三个原因。
|
||||
|
||||
**一是算力的极大提高。** 到了2012年,随着GPU大量应用于机器学习领域,神经网络的训练速度也有了量级上的提高,时至今日,OpenAI刚发布的语言模型GPT-3居然有高达1750亿个参数,这放在十年前是完全不可想像的。
|
||||
|
||||
**二是数据的极大丰富。** 之前神经网络面临的一大问题是,在训练数据量较小的情况下,模型难以收敛。但随着越来越多成熟的大数据开源平台,以及越来越多丰富的开源数据集的出现,即使神经网络的结构变得越来越复杂,我们也完全可以凭借海量的训练数据使它完全收敛。
|
||||
|
||||
**三是深度学习理论的进一步发展。** 虽然深度学习是站在“神经网络”这一巨人的肩膀上发展起来的,但专家们也取得了非常多的理论创新,就比如,pooling层的加入和成功应用,各类更适合深度学习的梯度下降方法的提出等等,这些都让深度学习的应用成为了可能。
|
||||
|
||||
## 深度学习是如何应用在推荐系统中的?
|
||||
|
||||
前面我们介绍的都是通用的深度学习知识,但深度学习又是如何应用在推荐系统中的呢?下面,我就着重来说说这一点。
|
||||
|
||||
在刚才讲解神经元原理的时候,我讲到用单个神经元可以预测用户对物品感兴趣的程度。事实上,无论是单个神经元,还是结构非常复杂的深度学习网络,它们在推荐系统场景下要解决的问题都是一样的,就是**预测用户对某个物品的感兴趣程度,这个感兴趣程度往往是一个概率,最典型的就是点击率、播放率、购买概率等**。
|
||||
|
||||
所以在深度学习时代,我们使用深度学习模型替代了传统的推荐模型,目的就是让它作出更准确的推荐。但像上节课提出的,深度学习的革命要求我们对算力、数据都作出大幅度的调整,而这些调整因为涉及到分布式计算平台、深度学习平台,以及线上的模型服务部分,所以我们需要在推荐系统的整体架构上都作出不小的改造,让它适应深度学习时代的需求。这也是我们学习这门课的目的所在。
|
||||
|
||||
## 小结
|
||||
|
||||
今天,我带你学习了深度学习的基础知识。我们从神经元学到了神经网络,再到训练神经网络的方法,以及神经网络和深度学习的关系。今天的知识点比较密集,而且每个知识点之间都是层层递进的。为了方便你记忆,我把本节课的重点整理成了一张表格,帮你巩固所学。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/e3/a7/e3ba1a60e19832aec4c2152c14e501a7.jpeg" alt="">
|
||||
|
||||
这些知识是未来我们搭建深度学习推荐系统的基础。我希望你能够在动手实践之前完全掌握它。从下节课开始,我们就会进入深度学习推荐系统技术细节和实战环节,你准备好了吗?
|
||||
|
||||
## 课后思考
|
||||
|
||||
你觉得都有哪些因素影响着深度学习网络的结构?深度学习模型是越深越好吗?为什么?
|
||||
|
||||
欢迎在留言区分享你的答案和疑惑,如果你的朋友也想了解神经网络和深度学习的基本知识,也欢迎你把这节课分享给他。好了,今天的内容就到这里了,我们下节课见!
|
||||
93
极客时间专栏/深度学习推荐系统实战/基础架构篇/国庆策划 | 关于深度学习推荐系统,我有这些资料想推荐给你.md
Normal file
93
极客时间专栏/深度学习推荐系统实战/基础架构篇/国庆策划 | 关于深度学习推荐系统,我有这些资料想推荐给你.md
Normal file
@@ -0,0 +1,93 @@
|
||||
<audio id="audio" title="国庆策划 | 关于深度学习推荐系统,我有这些资料想推荐给你" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/4c/65/4c79fe03a45b2f78c1fbc93f98394c65.mp3"></audio>
|
||||
|
||||
你好,我是王喆。明天就是国庆和中秋假期了,这里我提前祝你节日快乐!
|
||||
|
||||
专栏上线以来,通过跟同学们在留言区讨论,我发现同学们的基础差别很大。有的同学已经是其他领域的资深工程师,希望借这门课丰富一下知识体系。有的同学确实是0基础的新手,可能对于机器学习的一些基本概念都不是特别清楚。
|
||||
|
||||
所以,我特意准备了一些适合不同阶段学习的参考书目和一些基础的实践项目,希望你能借着国庆假期查漏补缺,为我们后面的学习打好基础。
|
||||
|
||||
虽然这些参考书适合的学习阶段不同,但它们有两个特点,一是这些书,我都读过很多遍,它们在我学习、工作生涯的某个阶段让我受益匪浅;二是这些书都非常易读易懂,不是那种诘屈聱牙的“不适合人类阅读”的技术书。好,我们先来看看都有哪些书吧。
|
||||
|
||||
## 技术参考书,贵精不贵多
|
||||
|
||||
如果你在学习[第3节课](https://time.geekbang.org/column/article/291245)的时候有一些困难,就说明你对机器学习的一些基础概念还不太清楚,我希望你能继续巩固机器学习的基础知识,这里我推荐三本书,你根据自己的偏好和知识基础选择一本就好啦。
|
||||
|
||||
**第一本书是南京大学周志华老师的《机器学习》。**
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/42/01/42254cfaea1cb4d1f4701d4yy5d72001.jpg" alt="">
|
||||
|
||||
这本书也称“西瓜书”,它的内容比较偏向传统机器学习,深度学习的内容也有,但不是重点。它的特点就是内容非常全面、详尽,语言也流畅易懂。所以,我把它推荐给机器学习基础不太好的同学,希望能够帮助你巩固基础。
|
||||
|
||||
**第二本书是复旦大学邱锡鹏老师的《神经网络与深度学习》。**
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/79/b0/79415dyye34a8997abf3f2bfa1f592b0.jpg" alt="">
|
||||
|
||||
这本书也叫“蒲公英书”,它更偏向介绍神经网络和深度学习,对深度学习的介绍非常全面、详尽,但又不故作高深,是我们入门深度学习非常好的选择。
|
||||
|
||||
**第三本书是诸葛越和hulu机器学习团队的《百面机器学习》。**
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/be/8f/bef7d9a7cf91840732ae93238dd4068f.jpg" alt="">
|
||||
|
||||
这本书是我在hulu时跟hulu的机器学习团队一同编写的,也称“葫芦书”。它重在讲解一些机器学习领域关键的知识点,如果你正在准备算法岗位的知识性面试,它会是你极佳的选择。这本书比较适合有一些机器学习基础,但还不够深入的同学来查漏补缺。
|
||||
|
||||
除此之外,如果你在学习推荐系统技术架构时还有一些疑惑的话,我再给你推荐两本推荐系统领域的书籍,你可以利用它们进一步来丰富推荐系统的知识。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/34/ab/344bb940aca63yya4cd617d885a8c7ab.jpg" alt="">
|
||||
|
||||
在我刚工作的时候,**项亮的这本《推荐系统实践》**让我受益匪浅,它介绍了经典的协同过滤、矩阵分解方法,还有推荐系统可以利用的数据,以及基本的评测方法等等。时至今日,其中经典的推荐系统知识仍然可以让我们受用。如果你想了解经典的推荐系统算法、技术架构,可以尝试读一读它。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/9f/91/9f74436347b19bd473dfc71e9530a291.jpg" alt="">
|
||||
|
||||
这里,我还想给你推荐一本我的新书,**《深度学习推荐系统》**,它是今年年初出版的。我也看到很多同学在留言区提问说“老师,咱们的专栏和这本书的区别在哪呀?”。这里,我统一回复一下。
|
||||
|
||||
这本书当然跟咱们专栏有着千丝万缕的联系,因为它们共享了同样的知识框架。不过,咱们的专栏重在实践,这本书注重介绍知识,二者呈互补的关系。在学习这门课的同时,你也可以购买这本书,进一步拓展自己在深度学习推荐系统这个领域的知识面。
|
||||
|
||||
除了这些和深度学习推荐系统非常相关的书籍之外,我还想给你推荐两本课外书,这两本书是我非常喜欢的计算机领域的“闲书”。如果假期有时间的话,我非常推荐你读一读,它们可以帮助我们建立更全面的计算机思维和系统设计理念。当然,如果你都读过,也欢迎在留言区和我分享你的看法。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/34/1c/34585b20d15e6a4449e4ebdc69e6671c.jpg" alt="">
|
||||
|
||||
**首先是吴军老师的《数学之美》,**这本书在我刚工作的时候给了我很多的灵感,书中的内容涉及了机器学习、人工智能、信息论、自然语言处理等等重要的计算机科学子领域。虽然涉及面非常广,但是讲得非常透,生动有趣的语言也让我完全没有阅读压力。所以,我把它推荐给想拓展知识面的同学。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/4e/ac/4e85ea6bbdb96a025cb319019ca01aac.jpg" alt="">
|
||||
|
||||
计算机经典书籍有很多,但最让我感到惊喜的是这本《**程序员修炼之道**》。我读这本书是两年前,因为已经有了很多大项目的开发和架构经验,所以读这本书时候,很多地方我都会会心一笑,太有感触了。书里面介绍了很多重构、架构、系统设计、程序员哲学相关的经验知识。因为推荐系统毫无疑问是一个复杂的大系统,所以有些时候,我们总要以系统的眼光去看待推荐系统的问题,这本书涉及的理念就至关重要了。
|
||||
|
||||
更关键的是,我非常喜欢它的副标题,“通向务实的最高境界”。我认为这是“返璞归真”的程序员的最高境界,也是我们作为一名工程师应该遵循的思考方式
|
||||
|
||||
## 初识实践工具,走好入门第一步
|
||||
|
||||
咱们这门课之后的实战环节,还会涉及很多推荐系统相关的工具,比如Spark、TensorFlow、Redis、Jetty Server等等。为了在之后的学习中避免一些上手的困难,我建议你先熟悉一下Spark、TensorFlow和Redis这三个工具。如果你对这些工具完全没有概念,可以通过我在下面介绍进行初步的了解。
|
||||
|
||||
首先是Spark。它是业界最流行的分布式计算平台,如果你还没有相关经验的话,我建议你按照我给出的三步来学习。首先,你可以通过[这篇文章](https://www.zhihu.com/question/27974418)(如何用形象的比喻描述大数据的技术生态?Hadoop、Hive、Spark 之间是什么关系?)来了解一下大数据的生态,然后,你可以通过Spark的[官方教程](https://spark.apache.org/docs/2.4.3/quick-start.html)尝试写一个Spark Hello World程序(在我们的SparrowRecSys里面新建一个Scala文件就可以)。因为咱们这门课大量使用了Spark的机器学习库Spark MLlib,所以最后可以通过[这个官方教程](https://spark.apache.org/docs/2.4.3/ml-guide.html)来做一些初步的了解。
|
||||
|
||||
其次是TensorFlow。它是我们这门课要使用的训练深度学习模型的平台。Keras是一套TensorFlow支持的API,因为它的易用性,我们主要利用Keras API来实现我们的推荐模型。所以,我们第一步可以先看一篇[介绍TensorFlow和Keras的基本概念的文章](https://blog.csdn.net/li528405176/article/details/83857286),对它们有一个初步的认识,再通过给TensorFlow的Keras接口写一个Hello World[项目](https://www.tensorflow.org/tutorials/quickstart/beginner)做一个基本的上手实践。最后,如果你还有时间,可以通过[TensorFlow官方教程](https://www.tensorflow.org/tutorials)进一步熟悉TensorFlow的其他功能。
|
||||
|
||||
最后是Redis。Redis是我们这门课要频繁使用的内存数据库,用来存储模型所需线上特征。你可以先在官网熟悉一下[Redis](http://www.redis.cn/)[的基本介绍](http://www.redis.cn/),然后下载安装它,最后尝试使用Redis内置客户端redis-cli,来执行几条[基本的](http://www.redis.cn/download.html)[Redis](http://www.redis.cn/download.html)[命令](http://www.redis.cn/download.html)。
|
||||
|
||||
相信熟悉了深度学习的基础知识和基本工具之后,你学习起来专栏后续的课程就会更加得心应手。对于完全0基础的同学,我可以这样说,如果你能通过我列出的书单和项目列表打牢基础,学习后面的课程肯定完全没有问题!
|
||||
|
||||
最后,我也想问问你,你在进行推荐、广告、搜索这些领域的学习的时候,还阅读过哪些非常不错的技术书?欢迎也在留言区分享出来,我们可以一起交流读后感,也可以让更多的同学受益。最后,再次祝你假期快乐,我们国庆之后再会!
|
||||
|
||||
## 推荐阅读
|
||||
|
||||
Spark:
|
||||
|
||||
1.[大数据生态的介绍](https://www.zhihu.com/question/27974418)
|
||||
|
||||
2.[写一个Spark Hello World程序](https://spark.apache.org/docs/2.4.3/quick-start.html)
|
||||
|
||||
3.[Spark的机器学习库MLlib官方文档](https://spark.apache.org/docs/2.4.3/ml-guide.html)
|
||||
|
||||
TensorFlow:
|
||||
|
||||
1.[TensorFlow和最常用的接口Keras推荐阅读](https://blog.csdn.net/li528405176/article/details/83857286)
|
||||
|
||||
2.[利用TensorFlow的Keras接口写一个hello world](https://www.tensorflow.org/tutorials/quickstart/beginner)
|
||||
|
||||
3.[TensorFlow官方教程](https://www.tensorflow.org/tutorials)
|
||||
|
||||
Redis:
|
||||
|
||||
1.[Redis官方简介](http://www.redis.cn/)
|
||||
|
||||
2.[基本的Redis命令](http://www.redis.cn/download.html)
|
||||
21
极客时间专栏/深度学习推荐系统实战/基础架构篇/国庆策划 | 深度学习推荐系统基础,你掌握了多少?.md
Normal file
21
极客时间专栏/深度学习推荐系统实战/基础架构篇/国庆策划 | 深度学习推荐系统基础,你掌握了多少?.md
Normal file
@@ -0,0 +1,21 @@
|
||||
<audio id="audio" title="国庆策划 | 深度学习推荐系统基础,你掌握了多少?" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/6a/86/6ace9e254d8bf5e394c33990394f1786.mp3"></audio>
|
||||
|
||||
你好,我是王喆。
|
||||
|
||||
今天是国庆假期的第二天,我在基础架构篇的基础上,设计了一套测试题,希望你能在假期里试做一下,温故知新,巩固所学。
|
||||
|
||||
在这套测试题中,有 10 道选择题,每道题 10 分,满分为 100。这些内容全部来自我们之前专栏所讲的内容,都是基础知识,希望能帮助你查缺补漏。
|
||||
|
||||
最后呢,我还为你准备了两道实践题,这两道题为选做。如果你对自己有更高的要求,我希望你可以show me the code!当然,在答题和实践中遇到任何问题,都可以在留言区评论,我们一起来探讨。还等什么,点击下面的按钮开始测试吧!
|
||||
|
||||
## 选择题
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/28/a4/28d1be62669b4f3cc01c36466bf811a4.png" alt="">](http://time.geekbang.org/quiz/intro?act_id=216&exam_id=666)
|
||||
|
||||
## 问答题
|
||||
|
||||
第一题:通过阅读SparrowRecSys的代码,你能找到首页中每行内部的电影都是按照什么排序的吗?
|
||||
|
||||
第二道题:如果你已经发现了排序的规则,你能在推荐服务器的代码里添加一个叫“热度”(popularity)的排序规则,然后让首页按照“热度”排序吗(💡补充:热度的定义是“这个电影被评价的次数”)?
|
||||
|
||||
我相信这是熟悉movielens数据、推荐服务器代码的一个非常好的机会,那在实现过程中的任何问题,都欢迎你留言和我交流!我们10月9日再见!
|
||||
Reference in New Issue
Block a user