推荐算法工程师需要的知识储备 (十三)
写在前面:
大家好,我是强哥,一个热爱分享的技术狂。目前已有 12 年大数据与 AI 相关项目经验, 10 年推荐系统研究及实践经验。平时喜欢读书、暴走和写作。
业余时间专注于输出大数据、AI 等相关文章,目前已经输出了 40 万字的推荐系统系列精品文章,今年 6 月底会出版「构建企业级推荐系统:算法、工程实现与案例分析」一书。如果这些文章能够帮助你快速入门,实现职场升职加薪,我将不胜欢喜。
想要获得更多免费学习资料或内推信息,一定要看到文章最后喔。
内推信息
如果你正在看相关的招聘信息,请加我微信:liuq4360,我这里有很多内推资源等着你,欢迎投递简历。
免费学习资料
如果你想获得更多免费的学习资料,请关注同名公众号【数据与智能】,输入“资料”即可!
学习交流群
如果你想找到组织,和大家一起学习成长,交流经验,也可以加入我们的学习成长群。群里有老司机带你飞,另有小哥哥、小姐姐等你来勾搭!加小姐姐微信:epsila,她会带你入群。
本章从作者自己的学习成长经历,基于自己近 10 年的大数据与推荐系统实践经验来讲解推荐算法工程师需要的知识储备。希望本章可以作为毕业后想从事推荐算法的学生以及有工作经验但是准备转行推荐算法的读者的一份学习指南,让读者可以快速地从整体把握推荐算法工程师需要的核心知识储备。
下面我们从一个一般的推荐系统业务流程引出推荐系统需要的各类知识点,并在后面对各类知识点进行详细说明与介绍。
1 推荐系统的业务流程
下面图 1 是一种可行的推荐系统业务流图,用户通过终端(如手机)访问推荐业务,终端调用推荐系统 web 服务接口(可能会用 CDN 加速,同时通过 Nginx 等 web 服务做反向代理),推荐接口从推荐结果库中将用户的推荐结果取出来,组装成合适的数据格式再返回用户。从另外一侧,用户在终端上的行为会通过日志收集系统收集到大数据平台,通过 ETL 处理进入数据仓库,我们构建推荐算法模型为用户生成推荐结果,将推荐结果通过 kafka 等消息管道组件存入推荐库中。
我们结合该图来说明学习推荐系统需要用到哪些技术,需要学习哪些相关知识点。当然,你去一个公司做推荐算法并非一定会接触到下图的所有方面(如果是创业公司,很有可能都会接触,因为创业公司没有这么多资源招聘各个模块的专业人才,一般一个人要顶几个人,所以覆盖的面也会更广,但在大公司,分工比较细化,可能只会接触其中某一个点)。如果你对所有模块有更好的认识和了解,对帮助你形成推荐系统全局认识是大有裨益的。
我们可以将上图中涉及到的知识点分为基本技能、核心技能、补充技能三大块。推荐算法工程师一般也分为偏算法类与偏工程类,偏算法类主要是根据产品特性、已有的数据资源设计一个高效可行的算法,也可能会涉及到实现相关算法,而偏工程类主要是推荐算法相关模块编码及推荐支撑模块开发等。
偏算法类的工程师需要数学基础好,机器学习理论扎实,最好有相关学术经验。偏工程类的需要编程能力强,熟悉软件架构设计、向对象思想、设计模式等,最好有开发较大工程项目的经验。
推荐算法工程师的核心技能主要是机器学习相关技术、推荐算法理论、推荐算法工程实现等。数学知识、编程知识、数据结构与算法、数据库、大数据相关知识、英文阅读能力等是基础技能。而产品 UI 交互、网络协议、web 服务、CDN、数据交互协议等属于补充技能。
入门推荐算法工程师,基础技能和核心技能是需要学习的,如算法基础、机器学习相关技术、推荐系统相关常用算法是需要掌握的。但是为了完整性,我将推荐系统涉及到的所有知识点都罗列出来了,其他非必须掌握的知识点读者可以分阶段选择性学习。
下面我们对推荐系统涉及到的技术等知识点做一个较全面的整理说明,作为读者学习的参考指南。读者可以根据刚刚提到的基本技能、核心技能、补充技能等选择性、分阶段学习。
2 数学基础
数学是一切自然科学的基础,任何自然科学(甚至人文科学)的发展离不开数学的贡献,甚至有人说过一个学科发展的成熟程度与它使用数学知识的深度正相关。
要想学好推荐算法,是需要具备一定数学基础的,具体需要对如下几个领域的数学知识有所了解和掌握。如果数据基础扎实,推荐算法可以研究得更深入,对算法原理的掌握也会更加深刻。
我认为只要学好大学的高等数学、线性代数、概率与统计这三门课就足够了,是完全可以应付推荐系统需要的数学储备的。
离散数学作为计算机系的必修课程,对理解计算机体系结构、更好地理解很多机器学习算法是非常有帮助的。如果你想在推荐上有更深的造诣是需要学习了解的,初学者前期可以不必花很多时间在这门课程上。
2.1 高等数学
微积分是整个高等数学的核心,现代科技的发展得益于微积分的发明,它让整个高等数学知识在工程科技领域得到非常广泛的运用,大大促进了自然科学和工程学科的发展壮大。机器学习是计算机与数学的交叉学科,当然也离不开高等数学。
其实推荐模型(甚至绝大多数机器学习算法模型)最终可以归结为一个最优化问题。简单来说,最优化问题就是求函数极值的问题,需要利用各种数值优化技术来求解模型的最优参数,常用的有极大似然估计,梯度下降算法等。
深度学习的激活函数、机器学习模型的目标函数的性质我们需要了解,需要计算梯度来逐步迭代求解最优解,这些都涉及到微积分相关知识。
另外,关于算法的时间空间复杂度(比如归并排序的时间复杂度是 O(nlogn))等都需要用高等数学无穷小的形式来描述。
我们需要掌握的高等数学知识主要有初等函数的基本性质、极限、积分、微分、求极值、无穷小量等。
2.2 线性代数
矩阵运算是非常简洁高效的一种数学运算。如果用矩阵来描述线性方程组是非常简单的(Ax=b,A 是系数矩阵,b 是数值向量,x 是未知向量),有很多机器学习算法都利用了矩阵相关知识,如奇异值分解、降维方法等。矩阵运算非常适合在 GPU、FPGA(Field Programmable Gate Array)等现代芯片架构上做并行处理。
推荐系统中比较出名的利用矩阵运算的算法是矩阵分解算法,深度学习中从前一层到后一层的信息传递本质上就是矩阵乘法。计算相似度的余弦相似计算也需要利用向量的内积运算。
我们需要掌握基、矩阵及向量相关运算、解线性方程、正交性、特征值、特征向量等基本知识点。
2.3 概率统计
用于模型训练的样本可以看成是从满足某个概率分布的随机变量的一次随机抽样,基于该观点,任何一个推荐算法可以看成是一个概率估计问题。很多机器学习问题可以采用概率的思想来解释,最后通过极大似然方法估计相关参数。
很多推荐算法可以利用概率的思想来建模,推荐系统的 navie bayes 方法就是一种简单的利用概率方法来做推荐的算法。我们也可以将推荐系统看成是二分类问题,可以将用户是否喜欢某个标的物看成一个概率,概率值的大小代表用户喜欢的程度,从而可以用 logistic 回归来做推荐。贝叶斯估计也是常用的概率估计方法,在推荐系统中得到了大量的使用,比如主题模型。
我们需要掌握什么是概率、概率的计算、频率与概率的关系、常用分布、贝叶斯公式、极大似然估计、先验估计、概率密度函数、均值、方差、样本、抽样、置信度、置信区间等相关概率统计知识。
2.4 离散数学
学计算机专业的同学本科时必学的一门课程是离散数学,包括的内容有集合论、图论、代数结构、组合数学、数理逻辑等部分。
计算机运算本质上就是布尔代数运算,通过二进制数来解决所有计算问题。深度学习的神经网络模型其实就是一种有向图的结构,像滴滴打车为司机寻找最短路径到达目的地其实是图的最短路径问题。机器学习的维度灾难就是一种组合爆炸。
对于这部分的理解有助于大家更好的理解计算机体系结构及相关算法原理。
3 机器学习
推荐系统是机器学习的一个分支,主要是解决为海量用户推荐标的物的问题,可以将推荐系统看成是一个监督学习问题。机器学习中的各种算法都可以用于推荐系统中,比如回归、聚类、奇异值分解、深度学习、强化学习、迁移学习等。
对传统机器学习算法有深入的了解和掌握,对学好推荐系统,对推荐系统算法的深刻理解非常有帮助。常用的聚类、分类、回归、集成学习需要有较好的掌握。很多基础算法直接就可以用于做推荐,如逻辑斯蒂回归等。
另外,对于机器学习的一些基本概念和相关知识点,如训练集、测试集、验证集、模型训练、模型推断、特征工程、模型效果评估等要有所了解和掌握。这些是构建推荐算法模型过程中一定会涉及到的概念和知识点。
4 推荐系统
既然是推荐算法工程师,当然需要对推荐算法有所了解了。首先,需要知道推荐系统是一种解决信息过载的技术手段,知道在什么场景下需要推荐算法、什么场景不需要推荐算法、推荐算法会面临哪些挑战、推荐算法在工业界的应用场景等。
推荐系统常用的算法有基于内容的推荐和协同过滤推荐(包括基于用户的协同过滤和基于物品的协同过滤)。对这两类算法要有比较好的理解,能够说清楚算法原理,能够大致推导这些算法的实现方案。同时,也需要知道怎么评估推荐算法的好坏,有哪些衡量推荐算法质量的指标,这些指标是怎么计算的,怎么解决推荐系统冷启动问题等。这些知识点在本书后续章节中都会讲到。
最好可以基于一些开源的数据集,采用第三方开源机器学习框架,自己能够独立实现这些算法,这样你会理解得比较深刻。
5 编程能力
推荐算法工程师除了设计算法外,可能需要将算法付诸实践,自己实现算法,即使是利用现有的算法框架做推荐,在处理数据、模型训练、模型推断等阶段也需要动手编程。所以,推荐算法工程师需要一定的编程基础。
在工业界最常用的编程语言是 Java 语言,Java 有非常成熟的生态系统,并且推荐系统前期数据处理是需要依赖大数据技术的,而大数据技术基本是基于 Java(或者基于 JVM 的 Scala 语言)生态系统的。所以掌握 Java/Scala 开发是可以帮助你快速熟悉和掌握各类大数据开源技术的。
随着深度学习驱动的第三次人工智能浪潮的到来,出现了越来越多的深度学习框架,如 Tensorflow、Pytorch、MxNet 等等,这些框架基本是采用 python 语言来跟用户交互的(底层一般是用 C++编写的),间接促使 Python 语言火爆起来。Python 作为一个较古老的编程语言,生态相对丰富,易于学习,并且 Python 有非常成熟的数据处理分析库及流行的机器学习框架 scikit-learn。
作为推荐算法工程师,熟悉 Java/Scala、Python 两类编程语言基本就够了。
6 数据结构与算法
上面一节提到了做推荐算法需要掌握编程技能,任何类型的编程都或多或少会涉及到一些数据结构与算法,推荐算法的实现过程中也一般会用到大量的数据结构和算法知识。因此,我们需要了解常用的数据结构,比如集合、列表、哈希、链表等。常用的排序算法等肯定是需要掌握的。同时要对算法的时间复杂度和空间复杂度要有一定的了解。布隆过滤器,压缩算法,加密算法等更高深的算法也需要有所了解,知道他们可以解决哪些问题,在需要的时候可以通过搜索相关材料快速学习。
7 工程技能
推荐算法的实现也需要考虑很多工程问题,数据处理平台采用什么,用什么编程语言,推荐结果存储在哪里,推荐结果怎么给到用户,这些问题都需要很好的工程实现。
随着用户规模的扩大,数据量越来越大,处理数据和训练推荐模型花费的时间越来越长,怎么有效的处理大规模数据和并发计算是摆在大家面前的棘手问题。
用户访问推荐页面是否有延迟,是否会开天窗(访问推荐页面无返回结果),怎么应对开天窗,怎么缩短访问时长,怎么提升推荐 web 服务的并发能力,这些问题都需要结合工程的知识和行业经验来改善和优化。
怎么设计一套高效的推荐算法组件,让整个团队开发效率更高,更容易将推荐算法落地到实际产品中,怎么在算法精准度、效率、计算复杂度上做平衡也是一种工程实现的哲学。
总之,你需要有足够多的工程实践经验,才可以设计一套高效易用的、有业务价值的推荐算法体系。本书第 18 章有专门关于推荐系统工程实现相关的介绍,读者可以参考学习。
8 大数据相关开源技术
推荐系统是一个系统性工程,从上面图 1 可以知道,要搭建一个稳定有效的推荐系统还是相当复杂的,涉及到很多知识。toC 互联网产品是构建在规模用户基础上的生意,好的 toC 互联网产品一定是服务于大量用户的,大量用户的行为会产生海量数据,这时大数据相关技术就有了用武之地。
幸好随着互联网和信息技术的发展,随着开源技术的流行和开源社区的壮大,出现了很多优秀的大数据和 AI 开源框架,如 Hadoop、Spark、Flink、Tensorflow、Pytorch 等,这些框架是我们构建工业级推荐系统的基石,下面作者对推荐系统需要用到的一些开源技术做一些简单介绍,方便读者了解熟悉,基于这些开源技术是非常容易构建一套推荐系统的。
8.1 数据收集系统
构建推荐算法模型需要依赖用户行为数据等各类数据,而这些数据来源于用户在客户端的操作,所以我们需要将这些操作日志“运输”到数据中心,这个过程就是数据收集。
大数据生态系统中常用的收集转运数据的组件有 flume、kafka 等。当我们将所有需要的数据收集到数据中心存下来后就可以进行处理、训练、构建推荐算法模型了。本书第 17 章有较多关于数据收集的介绍,读者可以参考。
8.2 数据存储系统
通过上面收集到的数据后,我们需要将数据存下来。由于互联网公司数据量很大,单台服务器一般存不下,这时就需要利用分布式数据存储技术,因此 Hadoop 的 HDFS 分布式文件系统就派上用场了。HDFS 可以横向扩容,具备数据读取等常用文件操作,并且每个数据块可以保留多份副本,即使一台服务器坏了也不会丢失数据,安全可靠性极高。
在做数据分析时,我们需要更好的存储、获取、处理数据,我们一般将数据采用 Parquet 的数据格式存储,Parquet 是基于 Hadoop 生态之上的一种列式数据存储格式,不管采用 Hadoop 生态上的什么分析组件,不管什么数据模型及编程语言,Parquet 格式都可以轻松应对。Parquet 对数据有比较好的压缩,可以极大减少存储资源的消耗。
另外,随着公司数据的增大,业务规模的扩大,我们会从更多的维度对数据进行分析处理,这时就有必要构建一套完善的数据仓库了,大数据社区构建数仓的组件主要有 Hive 和 HBase。Hive 是基于关系型数据库查询语言 SQL 的结构化数据存储组件,Hive 采用表的形式存储结构化数据,利用 SQL 查询,非常适合批处理的数据分析形式。如果你需要对数据进行实时的分析处理,可以将数据存到 HBase 上,它是一种列式数据存储组件。
8.3 数据分析系统
随着 Google 在 2003 发表了 3 篇划时代意思的论文(见参考文献 1,2,3),大数据逐步从萌芽到繁荣壮大,这其中最重要的大数据技术当属 2006 年启动的 Hadoop 工程,Hadoop 包含 HDFS 和 MapReduce 两个组件,HDFS 用于存储海量数据,可以利用廉价的服务器构建分布式集群,方便存储大量数据,并且数据有很好的容错性。而 MapReduce 是一个基于 HDFS 之上的数据分析组件。经常十几年的发展,围绕 Hadoop 形成了一套完善的大数据生态系统,正是 Hadoop 生态系统引爆了大数据浪潮。
后续陆续出现的 Spark、Flink 等基于 Hadoop 之上的数据分析软件,拓展了大数据分析的能力,这些软件的发展也壮大了整个大数据生态系统。Spark、Flink 上有非常多的算子操作,同时也有相关机器学习库(Spark 的 mllib 机器学习库包括 ALS 推荐算法),这些算法和库方便我们构建各种推荐模型。
推荐系统依赖的大数据相关技术还有很多,如调度引擎 Azkaban、交互式查询引擎 Hue、OLAP(联机分析处理)处理系统 Impala、Presto 等。读者可以参考大数据相关技术书籍,本章不做深入介绍。
9 其他支撑技术
除了上面提到的技能点外,我们还需要对下面的一些知识有所了解。这些技能点有些是构建完备的推荐系统必不可少的部分,有些是支撑推荐系统服务更好运转的基础能力。
9.1 数据库
在推荐系统架构中,需要将为用户生成的推荐结果存入数据库中,方便 web 服务提取推荐结果返回给用户,而业界主要有关系型数据库和 NoSQL 数据库两大类。
关系型数据库是最早被大规模使用的数据库,在整个互联网发展史上占有非常重要的地位,大量用于各类公司作为最核心的数据存储(如交易数据、用户注册信息等)。关系型数据库最大的特点是采用行列的形式存储数据,类似二维的电子表格,现实生活中非常多的数据都可以抽象为这种表格的形式。从这些表格数据中操作数据(增删改查)采用 SQL 语言,它简单易学,非常高效。目前比较火的开源关系型数据库有 MySQL 和 ProgreSQL 等。
推荐系统虽然不直接利用关系型数据库作为最终推荐结果的存储,但是推荐的标的物相关的信息、用户相关的信息等基本会存放在关系型数据库中,推荐算法工程师至少需要了解熟悉一种关系型数据库,并且需要熟练使用 SQL 语言。
推荐系统每天(甚至是每分钟或者每秒)需要为每个用户计算推荐结果,如果用户量大的话,将这些推荐结果插入数据库是一个非常频繁的读写操作,采用关系型数据库是非常不合适的,这时 NoSQL 就派上用场了。NoSQL 采用 key-value 的形式存储数据,是非常适合用于存储用户的推荐结果的,key 就是用户的 id,value 就是为用户的推荐结果。非常流行的 NoSQL 如 CouchBase, Redis 等都适合做推荐的结果存储,他们读写都是非常高效的,并且可以横向扩容。作者公司的推荐结果存储就是采用的这两个 NoSQL 数据库。
9.2 操作系统
除了微软体系外,整个互联网行业的基础架构基本是构建在 Linux 操作系统之上的,推荐系统的任务调度、任务监控等都是部署在 Linux 服务器上,所以作为推荐算法工程师是需要熟悉 Linux 操作系统的。磁盘、内存、核、进程、网络、文件目录结构、基础命令等常用操作是必须熟练掌握的。
9.3 网络
推荐系统的结果需要存到数据库,用户访问推荐服务时需要从数据库中将推荐结果取出来,这个过程中会涉及到数据在网络上的传输,因此需要对网络延迟、网络传输等过程有所了解。同时数据传输遵守网络协议,我们需要对 http、https、tcp 等网络协议有所了解。为了加速用户获取推荐结果,让用户体验更好,一般互联网公司都会通过 CDN 来加速用户查询过程,对 CDN 技术也需要有所了解。
9.4 互联网上常用的数据交互协议
像 json,xml,protobuf,Avro 等常用的数据交互和序列化协议需要读者熟悉。特别是 json,可读性强,很多互联网公司采用 json 格式来作为数据交互的协议,大量用于数据接口中。
9.5 Web 服务
从上面图 1 可以知道,用户获取推荐数据,需要通过 web 服务模块,该模块的作用是通过从推荐结果数据库中将用户的推荐结果取出来,组装成合适的格式返回给用户。
常用的 web 服务组件有基于 java 语言的 Tomcat,基于 go 语言的 gin、Beego,以及基于 python 语言的 Flask 等等。如果你的工作中涉及到为推荐业务开发接口,就需要对这块熟悉,否则只要知道即可。
9.6 AB 测试与指标体系
前面讲过推荐算法是一个逐步迭代优化的过程,我们需要根据公司业务场景构建一套完善的指标体系,搭建一套好用的 AB 测试平台来评估推荐算法的好坏及对业务的价值,通过不断优化迭代,让推荐算法朝着驱动公司业务发展的方向前进。
作为一个推荐算法工程师,在平时工作中是会经常接触到这两块的,因此是有义务也是有必要对这两块知识点有所了解的。由于这两块比较偏业务,初学者提前知道就可以了。本书在 16、19 章会分别介绍推荐指标体系和 AB 测试平台的实现,读者可以后续细化学习。
10 产品与交互
产品是推荐系统价值呈现的载体。用户通过使用产品中推荐模块,获得推荐结果。所以推荐系统怎么和用户交互,操作是否便捷流畅,这些因素都会影响推荐系统的最终效果。往往好的 UI 及交互方式产生的价值比好的算法还大。
推荐算法工程师对 UI 展示与交互逻辑需要有一定的了解,虽然不必对这块了解太深入,知道一些基本的交互和展示逻辑有助于更好的理解推荐业务,并通过适当的算法逻辑来满足特定的 UI 交互。本书 22、23 两章分别对推荐产品及 UI 交互进行了深入的分析。
11 英文文献阅读能力
目前关于推荐系统、机器学习等计算机相关书籍及学习资料,比较好的还是国外的。遇到复杂的问题,自己搞不定,也需要去 Google 上搜索解决方案。好的开源项目也基本是国外的,参考学习材料都是英文的。平时学习参考相关专业论文,也基本是英文的。因此为了让自己的能力得到更大的提升,需要具备读懂英文原版材料或者书籍的能力。
英文看起来比较难的就是一些专业的词汇,我建议可以尝试先看英文的,遇到不懂的单词查查,当你看完弄懂 3 本以上的英文参考书时,基本就具备阅读计算机行业英文文献的能力了。
至此,推荐算法工程师需要的知识储备基本讲完了,我们在下表中对相关知识点及比较好的学习资源做了一个归类整理,方便读者参考。
版权声明: 本文为 InfoQ 作者【数据与智能】的原创文章。
原文链接:【http://xie.infoq.cn/article/44b02b7669339399d97ef635c】。文章转载请联系作者。
评论