万字入门推荐系统!
Posted Datawhale
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了万字入门推荐系统!相关的知识,希望对你有一定的参考价值。
最近一周我、强子、Y哥三人,根据自身如何入门推荐系统,再结合三人分别在腾讯做广告推荐、字节做视频推荐、百度做信息流推荐的经历,整理出了这份万字入门推荐系统。内容十分详细,涵盖了推荐系统基础、进阶、实战的全部知识点,并且每一块都给出了我们自己看过且觉得高质量的参考资料,所以不管你是科班还是非科班,按照这条路线走下去,找到推荐系统相关工作是完全没问题的。因为内容过于全面详细,即便你不从事推荐系统方向,只要是从事程序员,看完这篇文章也能有所收获。不过要先强调一下,如果是没有基础且时间充足的同学,可以按部就班的学,如果有一定基础或时间紧张,那就直接看核心知识。其中『 机器学习、深度学习、推荐算法理论知识、推荐系统实战项目 』这四块是核心知识,像数学、计算机基础可以等到你需要的时候再反过头来学习。在核心知识中也有次重点,要学会有的放矢,哪些知识是次重点,我都会在后面一一说明。
本文框架目录如下:
数学
主要是微积分、线性代数、概率论这三门课。
微积分通常情况下,机器学习需要得到一个函数(模型,或者说假设)来预测未来的数据。既然是函数,那自然就离不开微积分了。微积分为我们研究函数的性质提供了理论依据,同时它也是学习概率论、最优化方法等后续课程的基础,是整个高等数学的基石。
重点掌握函数的求导法则(特别是链式法则),以及泰勒公式。这对后续的梯度下降法,牛顿法,拟牛顿法等优化算法的推导至关重要!
线性代数机器学习算法的输入、输出、中间结果通常为向量、矩阵、张量。这些都属于线性代数里的知识。
重点掌握向量、矩阵含义及其数学运算公式。
概率论对于机器学习来说,概率论是一种重要的工具。如果将机器学习算法的输入、输出看作随机变量/向量,则可以用概率论的观点对问题进行建模。使用概率论的一个好处是可以对不确定性进行建模,这对于某些问题是非常有必要的。另外,它还可以挖掘变量之间的概率依赖关系,实现因果推理。
重点掌握常见概率分布、概率公式。
总结数学好是入门机器学习的优势,但并非关键。因为数学知识量太庞大了,花太多时间在其上,容易打击学习积极性。另外做算法一般分两种:理论模型和实际应用,前者的行业title是算法研究员,主要发paper、提出新的模型或者优化方法,所以对于数学能力要求很高。后者的行业title是算法工程师,致力于把模型应用于数据上,攫取商业价值,对于数学能力要求并不高。往往大部分人都属于后者,我个人也是后者。熟悉不同算法的应用场景、掌握模型落地工程技术,才是我们更应该投入精力的地方。
参考资料:
《DeepLearning》,又名「花书」,被誉为深度学习领域圣经。它前面有必备数学知识的介绍,讲得挺不错的。 B站搜索微积分、线性代数、概率论关键词,会有很多教学视频,随便选取时长较短的看看即可。
计算机基础
计算机基础包含数据结构与算法、计算机组成原理、操作系统、计算机网络、数据库、五大课程。其中数据结构与算法是面试必考内容,大家都会花时间好好学。但是另外4门课,开发岗面试中一定会问,算法岗却很少会问,再加上很多做算法的人是转行过来,非计算机科班出身,大学期间没有上过此类专业课。所以很多做算法的人计算机基础比较薄弱。但是在我看来计算机基础是很重要的。一是能提高我们计算机素养,二是增加工程代码理解能力。所以后面我会针对这四门课程,出一个面向算法工程师的系列文章,做到让大家对这些课程重点知识有个了解,同时又不会陷入细枝末节。这里先给大家做个大概讲解:
数据结构与算法数据结构包含:数组、链表、栈、队列、树、散列表、图。数据结构本质是描述数据与数据之间的关系
算法包含:排序、查找、五大经典算法(动态规划、回溯、分支界限、分治、贪心)。计算机解决问题其实没有任何奇技淫巧,它唯一的解决办法就是穷举。算法设计的本质无非就是先思考「如何穷举」,然后再追求「如何聪明地穷举」。「聪明的穷举」分为两部分:「去掉重复的穷举」、「去掉不必要的穷举」。比如,备忘录法,用数组保存求过的结果,用空间换时间,这就是去掉重复的穷举;动态规划根据最优子结构,使当前问题只与某几个子问题有关,从而大大减少问题分解次数,这就是去掉不必要穷举。
参考资料:
《剑指offer》,准备过面试的人应该都知道这本书。 《大话数据结构》通俗易懂。剩下的就是多刷LeetCode,多看别人的题解。
讲解计算机组成结构。主要由CPU(运算器、控制器),存储器(内存、外存),IO设备(输入、输出设备),总线这几部分构成。如果把计算机比作人,那么CPU是人的大脑,负责控制全身和运算;内存是人的记忆,负责临时存储;外存是人的笔记本,负责永久存储;输入设备是耳朵或眼睛或嘴巴,负责接收外部的信息存入内存;输出设备是你的脸部(表情)或者屁股,负责输出处理后的结果;以上所有的设备都通过总线连接,总线相当于人的神经。
操作系统是应用程序与硬件之间的管家:对下管理计算机硬件资源(CPU、存储器、IO设备)、对上管理应用程序。
内核(kernel)是直接控制硬件的。比如:内核控制硬件有1000种方式,导致直接调内核去操作硬件很麻烦,于是就封装内核,向外提供了易于调用的接口,比如:桌面系统、shell等。这些接口对非编程人员用户还是不友好,于是编程人员用编程语言再对这些接口在进行封装,就产生了应用程序。本质是封装的思想。
我们学的编程语言到最后都是在调用操作系统内核API。所以这也是为什么所有的语言都有不同操作系统版本,因为每个操作系统的内核API是不同的。
参考资料:
《深入理解计算机系统》,配套视频:https://www.bilibili.com/video/BV1cD4y1D7uR 《鸟哥的Linux私房菜》,Linux是最常用的服务器系统,也是我们工作中最常接触的。熟悉Linux常用命令很有必要。
很多教材都是从五层模型(物理层、数据链路层、网络层、传输层、应用层)讲解。其实这样讲是比较晦涩难懂的,因为很多东西我们都没接触过,很陌生。好的办法是通过人类的语言系统进行类比。计算机网络是计算机的语言系统,与人类语言系统的本质是一样的。
人类语言系统构成:
词汇 语法 声带+耳朵 传播介质:空气
以此类比到计算机网络:
数据:计算机之间传输的信息 通信协议:决定数据的排列方式 网卡:数据发射器与接收器 传播介质:光纤、网线、WIFI
此外还有人的身份证相当于Mac地址,家庭地址相当于IP地址等等。计算机网络中的许多概念都可以用生活中人类是如何通信的进行类比。人类通信我们是非常熟悉的,所以非常有助于我们理解。
参考资料:
《计算机网络自顶向下方法》这本书相比于其他计算机网络书籍较通俗易懂,学习起来应该不太费劲。这本书重点章节是第2、3、4、5、6章,其他章节可以跳过。配套视频:https://www.bilibili.com/video/BV1mb4y1d7K7 谢希仁的《计算机网络》,是国内很有名的教材。
数据库就是我们存储数据的工具。数据如何存储与读取,直接决定了整个系统的效率。常用的关系型数据库是mysql,非关系型数据库是Redis
参考资料:
《SQL必知必会》,快速掌握常用的SQL语法 一天学会 MySQL 数据库:https://www.bilibili.com/video/BV1Vt411z7wy
机器学习
人工智能、机器学习、深度学习关系如下:
我们一般说机器学习都是指除了深度学习以外的机器学习,也称为传统机器学习。虽然近几年深度学习越来越火,但是很多领域还是在使用机器学习,并且学好机器学习,对于AI算法基础和知识广度都有很大提高。这里可以先给大家罗列一些必备的基础知识:
首先要知道一些基础的术语和概念,比如有监督与无监督,训练集,验证集与测试集,经验误差与泛化误差,方差与偏差,过拟合与欠拟合等,再比如比较重要的一些模型性能度量方法(混淆矩阵,精确率,召回率,auc,roc等), 再比如经典的评估方法(留出,交叉验证,自助等)
其次是经典的模型。机器学习模型非常多,全部掌握不现实,我给大家罗列几个经典,也是面试中常考的模型:逻辑回归、SVM、树模型、集成学习、朴素贝叶斯、K-Means聚类、PCA。(EM、最大熵、概率图这些考的少,能了解是加分项)。
在学习过程中,各个模型是相互联系的,不要孤立去分析单个模型。比如:逻辑回归,我认为是最基础、也最重要的模型:
逻辑回归=线性回归+sigmoid激活函数,从而将回归问题转换为分类问题 逻辑回归+矩阵分解,构成了推荐算法中常用的FM模型 逻辑回归+softmax,从而将二分类问题转化为多分类问题 逻辑回归还可以看做单层神经网络,相当于最简单的深度学习模型
通过逻辑回归由点及面,就能演化出如此多模型。再比如树模型。我们把以决策树为基础的一系列模型统称为树模型,也是AI比赛中最常用的模型。
决策树经历了三次改进,ID3、C4.5、CART,主要区别在于一个根据信息增益划分特征、一个根据信息增益率、一个根据基尼指数。 随机森林=决策树+Bagging集成学习 GBDT=决策树+AdaBoost集成学习 XGB是陈天奇2014年提出,相当于GBDT的工程改进版,在实用性和准确度上有很大提升。比如:使用泰勒二阶展开近似损失函数,支持处理缺失值、在特性粒度上并行计算等等特性。 LGB是微软2016年提出,对XGB进行了改进,使用单边梯度采样算法减少不必要的样本;在寻找最优分割点时采用直方图算法使计算代价更小;支持类别特征... CGB是Yandex2017年提出,对类别特征进行了更完美的支持。
所以学习模型,要由点及面,层层递进。这样不仅方便理解,也有利于归纳总结,同时还能锻炼搭建知识体系的能力。
关于上面这些知识,整理一个系列帮助大家由点及面打通这块知识,文章已写了五篇,后面会陆续放出来。
实战我认为最好的实战方式就是参加AI比赛。这个过程中不仅能与高手同台竞技,如果获奖还能拿到不菲的奖金(很多比赛奖金都是10万以上)与荣誉。我之前参加了很多比赛,拿过冠军和多个top 10。对于我个人能力提升与找工作都有很大帮助。这里推荐三个公众号:kaggle竞赛宝典、Coggle数据科学、第一次打比赛。他们会发布新比赛的通知与过往比赛的解决方案,非常值得学习。
再就是书籍:《机器学习算法竞赛实战》这本书是Datawhale成员,top级竞赛选手鱼佬写的。
参考资料:
如果是一个机器学习小白,那么推荐两个入门视频, 吴恩达或者李宏毅的ML视频(B站上都有),先快速过一遍,了解机器学习是什么。 如果有了一定的机器学习基础,就需要去进阶。建议是看书与高质量文章。推荐两本书:周志华的《机器学习》、李航的《统计学习方法》这两本书,可以好好先研究一本,注意这里是研究,一本通了,另一本也就差不多。如果发现看一遍很难看懂,这是正常现象,随着后面实践经历慢慢变多,再看一遍,会有很多新的感悟。再就是公众号:Datawhale,里面有很多高质量文章。
注意:学习过程中一定要跟着实战,否则知识很难真正理解。
深度学习
前面也提到了,深度学习本属于机器学习,但是鉴于其发展迅速、应用越来越广泛,所以单独拿出来说。深度学习每年新模型、新技术层出不穷,一味追求新技术不可取,要先打好基础。比如:对于一个简单的全连接神经网络,包含训练算法(正向传播、反向传播),激活函数(sigmoid、ReLU、Maxout、softmax等),正则化(L1和L2、Dropout、提前早停等),优化算法(随机梯度下降、Momentum、Adagrad、Adam等)
掌握了基础后,再根据自身领域学习相关的模型。大部分人找工作属于这三个领域:
计算机视觉(CV):卷积神经网络(CNN)及其改进。 自然语言处理(NLP):循环神经网络(RNN)及其改进,Transformer、Bert等。 推荐算法:Embeding、Wide & Deep及其改进。
熟练使用TensorFlow或pytorch去实现训练模型。通过官网的一些demo就可以快速的掌握一个深度学习框架的基本用法,然后在实际的应用中再去了解一些框架的高级用法,这个不需要花太多的时间单独学习,应该边用边学习。
积累模型调参经验,比如学习率,batchsize, 优化器对模型的影响,使用tensorboard可视化训练过程的曲线,通过曲线分析训练过程的相关问题,然后再调参或者调解网络结构,在实践的过程中要有意识的去总结一些经验。
参考资料:
李沐《动手学深度学习》https://zh-v2.d2l.ai/ 邱锡鹏《神经网络与深度学习》https://nndl.github.io/ 吴恩达《深度学习》https://www.bilibili.com/video/BV1FT4y1E74V 《DeepLearning》,又名「花书」,被誉为深度学习领域圣经。 TensorFlow、pytorch官网是最好的参考资料。如果英语不好,那么可以看看下面的资料: Pytorch学习笔记:https://blog.csdn.net/wuzhongqiang/category_10024538.html 《30天吃掉那只TensorFlow2》:https://github.com/lyhue1991/eat_tensorflow2_in_30_days 《20天吃掉那只Pytorch》:https://github.com/lyhue1991/eat_pytorch_in_20_days PyTorch深度学习快速入门教程:https://www.bilibili.com/video/BV1hE411t7RN
数据挖掘与分析
熟练使用相关工具包:numpy、pandas、matplotlib(seabron是matplotlib的简化版)、Scikit-Learn。完成数据的可视化、分析以及特征工程。工具包的学习建议边用边学,可以先看一些中文教程整体了解一下工具包的使用。在具体使用的时候,如果忘记了可以去对应工具包的官网查看详细的文档。
除了熟悉数据分析工具以外,其实更需要的是数据分析的方法,我觉得最好的学习方式就是看开源竞赛的方案,因为在开源方案中,作者会写很多他们分析问题的思路,以及对可视化结果给出的他们认为的正确观点。
参考资料:
英文教程首推官网,中文教程推荐Datawhale的开源项目
numpy中文教程:https://github.com/datawhalechina/powerful-numpy pandas中文教程(这份文档可能比官方文档还适合学习):https://github.com/datawhalechina/joyful-pandas matplotlib中文教程:https://github.com/datawhalechina/fantastic-matplotlib 《Hands-on-Machine-Learning-with-Scikit-Learn》用sklearn工具实现各种机器学习模型
大数据
在实际工业场景中,我们面临的都是海量数据,也就是所谓的大数据。再用上面提到的MySQL数据库、numpy、pandas等工具是不行的。这个时候就需要专业的大数据处理工具:Hadoop、Spark生态。有的同学想从这些生态的基本原理学起, 如果有时间,知其所以然是好的,但往往我们需要兼顾算法和大数据,时间并不是很充足,所以建议大数据这块可以先掌握到会用的层次,当做工具即可。
常用的:首先是Hive查询,也就是用HQL进行一些表数据的基础查询,这个和SQL有些类似,另外一个,就是sparkSQL以及spark的DataFrame, 这些相关操作常用来做数据分析和处理,处理完毕之后,写回到Hive表里面。其次,遇到复杂的处理逻辑,就需要写原生spark脚本去跑数据了。关于这块知识,后面也会整理一篇文章。
参考资料:
这一块实操性特别强,所以建议先看视频,跟着视频一步步来:
尚硅谷大数据Hadoop 3.x:https://www.bilibili.com/video/BV1Qp4y1n7EN 尚硅谷大数据Spark教程从入门到精通:https://www.bilibili.com/video/BV11A411L7CK 推荐系统算法基础+综合项目实战:https://www.bilibili.com/video/BV1qK4y1479r
推荐算法理论知识
终于到了核心部分。再次强调一下,上面的知识不要求全掌握,既不需要,也不现实。如果为了快速入门,掌握机器学习、深度学习基础后就可以直接进入这一节了。
在实际的工业推荐系统中,一般会有四个环节:
我梳理了这四个环节中用到的主流技术,整理成了如下导图:
上图就是整个推荐算法的核心内容。这里先放出这个导图,一是让大家对推荐算法有个整体框架,二是告诉大家后续文章的内容:打算通过解读论文的形式,结合自身在工作中接触的工业场景,把里面的模型和知识点一一为大家解读。
这个系列我取名:"热追"推荐算法。主要包括以下四个部分:
召回粗排召回的目的是根据用户部分特征,从海量物品库快速找到小部分用户感兴趣的物品交给精排,重点是强调快。主要有两大类召回方式,一类是策略规则,一类是监督模型+embedding。其中策略规则,往往和业务场景是强相关,不同的场景会有不同的召回方式,对于这种"特异性"较强的知识,会放到后期讲。目前打算先讲解普适的方法,就是模型+embedding。上图梳理出了目前给用户和物品打embedding的主流方法, 比如FM系列(FM,FFM等), 用户行为序列,基于图和知识图谱系列,经典双塔系列等。这些方法看似很多很复杂,其实本质上还是给用户和物品打embedding而已,只不过考虑的角度方式不同。这一块的内容,几乎每个模型都对应着经典paper,所以会采用解读论文的方式给大家分享。在解读的过程中,对于一些重要模型,会进行代码复现,并应用到一些真实的实践任务中。至于粗排,有时候召回环节返回的物品数量还是太多,怕精排速度跟不上,所以可以在召回和精排之间加一个粗排环节,通过少量用户和物品特征,简单模型,来对召回的结果进行个粗略的排序,在保证一定精准的前提下,进一步减少往后传送的物品数量,粗排往往是可选的。因此粗排用到的很多技术与召回重合,所以先暂且归并到召回里,等后面把整体的基础知识都补充完毕了,再看情况要不要展开这块。
精排精排阶段使用你能想到的任何特征,可以上你能承受速度极限的复杂模型,尽可能精准地对物品进行个性化排序,强调准确性。这一块关键技术主要分为三大块:
CTR预估:LR、FM家族、自动特征交叉的DNN家族。 多任务学习(Multi-Task Learning,也称为多目标学习)。多任务是很常见的,比如视频推荐中,用户喜欢、收藏、评论。而不同的任务可能会互相冲突,互相影响,造成模型学习起来十分困难。所以这一块是重难点,也是很多大公司的研究重点,更是未来的一大发展趋势。但好在这里每个模型或者技术有对应paper,所以和召回一样,这里依然可以利用解读paper的方式,把这些模型和技术娓娓道来。 排序打分公式融合。
考虑到上面的两块是核心,这块没有详细的展开整理,并且这块和业务场景策略强相关,很依赖工作经验,目前了解的也不是很多。后续先解读几篇重排模型的经典论文,等学习了相关技术,再来不断完善这块。
冷启动冷启动问题是指对于新用户和新商品,他们没有历史交互数据,无法分析历史喜好,这个时候我们应该如何做推荐。冷启动技术会穿插到召回或者重排中,有时也会和上面推荐系统做成并行的两路,专门应对冷启动场景。
参考资料:
首先当然是后续自己写的文章啦哈哈哈。主要是因为搞算法的人学习模型都是参考论文,这也是为什么我后面分享这一块内容都是以解读论文的形式。 一定要推荐一本书籍的话,我选王喆的《深度学习推荐系统》。这本书高屋建瓴的介绍了推荐系统整体架构,发展历史以及未来趋势,还有各种推荐模型的演化之路,很适合前期用来当做科普。但是具体的模型并没有深入讲解,还是得自己去看论文解读。 再就是一些我认为很优秀的开源项目: 强子整理的 https://github.com/zhongqiangwu960812/AI-RecommenderSystem 我的另一个好友潜心整理,star已过千 https://github.com/ZiyaoGeng/Recommender-System-with-TF2.0
推荐系统实战项目
理论一定要与实践结合,否则就是空中楼阁。为此我们打造了一个新闻推荐项目:基于我们之前的开源项目(fun-rec:https://github.com/datawhalechina/fun-rec)做了一个完整升级。实现了从前端、后端、数据库、推荐模型等整个流程。项目规划图如下:
阶段一物料池的构建:
Mysql基础及python调用(简介、安装、简单的命令行基础、python如何调用mysql数据(增删改查,排序)) MongoDB基础及python调用 Redis基础及python调用 Scrapy基础及新闻爬取 新闻画像构建(存入MongoDB)
前端展示:
Vue简介及基本使用(对于我们做推荐算法的,了解一些前后端交互之类的就够了) 前后端如何交互 用户注册界面 新闻展示(内容、时间、点赞次数,收藏次数) 可以保留用户的行为(user_id, news_id, action(点赞、收藏、阅读),time)
有了前端及物料池后,就需要设计简单的冷启动规则来收集用户的行为数据以及用户的基本属性特征。这一部分数据可能需要参加开源学习的同学来一起帮忙完善这个数据集,这样数据才是有意义的。
收集数据 在服务器上部署数据收集的系统(新闻数据+用户行为数据) 冷启动策略 冷启动 用户侧 物品侧 系统侧
这个阶段就是推荐算法大展身手的地方啦。我们可以把上一节学到的推荐算法,在这里尽情尝试,吹拉弹唱任你挑选。
离线评估指标 多路召回 特征工程 规则类 模型类 召回评估 排序 DeepFM 排序评估 规则+重排
最后就是一些运营类知识,保证系统的高可用性
推荐服务,前后端交互(flask) 任务调度 系统部署 规范类修改
结束语
本文作为推荐系统的开篇,不仅讲解了入门推荐系统所需前置知识、基础、进阶、实战等全部知识点,还为后续推荐算法理论知识与实战项目定下计划。希望大家多多关注交流,我会按时更新后续系列文章。
万字总结个性化推荐系统入门指南
在这场娱乐的搏杀中,每个人终将是杀死自己的凶手。
前言
从最初接触个性化推荐系统已过去六天。今天是第七天,完全可以对前六日的学习做出复盘。推荐系统并没有如同网络上那般盛传的玄秘深晦,而是直白到令人一眼看穿,当然如果你看完本文的话,你也会有与我一样的想法。
个性化推荐系统的出现,是为了解决信息超载
这颗毒瘤。已经算不清从什么时候开始,互联网资源开始指数性地爆发,我们每个人穷尽一生,都无法窥到其冰山一角,更遑论坐拥十万大山的互联网全貌。这个时候开始有人提出要建立一个个性化推荐系统,根据用户概貌自动推荐用户最感兴趣的内容。
本文整体分为六个部分:
-
用户对象建模 -
推荐对象建模 -
推荐策略算法 -
推荐系统体系结构 -
推荐系统性能评价 -
推荐系统研究方向
至于章节细分,请看目录,不再过多赘述。
1. 用户对象建模
构建个性化推荐系统的目的是为了解决信息超载
的信息难题,实际上有前辈们做的搜索引擎也可以算作是一种推荐系统,它会将用户输入的信息与数据库进行配对,然后做出一个排序显示,对现今的搜索引擎,我是更倾向于按照用户的兴趣偏好对用户的搜索结果进行值的排序。那么首当其冲的就是针对用户对象进行建模。
1.1 用户对象建模前的思考
对用户建模之前,我们需要做好充足地考虑,一般来说有六点是较为重要的。
-
模型的输入数据有哪些? -
怎么样获取用户输入数据? -
怎么考虑用户的兴趣偏好变化? -
建模对象是谁? -
怎么建模? -
模型输出的样子是什么?
1.2 模型输入数据有哪些
一般来说,模型的输入数据包括用户属性、用户主动输入的信息、用户产生的浏览行为和浏览内容、推荐对象的属性特征。但是我现在还不想把最后一类放进去,因为当前还没讲到推荐对象的建模。
从用户属性来说,就有社会属性,比如说从事什么职业;学历是什么;有哪些社会关系等等。还有一类是自然属性,比如说身高、体重等等。就人而言,所谓自然属性指的是人的肉体以及其衍生出来的相关特征,而社会属性则是表示在人在社会中的关系,人之所以为人,不是因为他的自然属性决定的,而是他的社会属性决定了他是人。因此在推荐系统中权重占比会更倾向于社会属性,尤其是在协同过滤中,这点被放至极大。
从用户主动输入的信息来说,就有搜索栏中主动键入的信息等等。
当用户在浏览项目时,可能会产生评论、点赞、转发等等浏览行为;以及浏览项目的内容特征是什么,诸如此类的相关属性,当推荐系统将一些极为契合当前用户的推荐对象推介给用户时,它的属性特征也可以视作一类输入数据。
1.3 如何获取用户输入数据
如何获取用户输入数据,当前业内的主流方案不吝是以下三种:
-
显式获取 -
隐式获取 -
启发式获取
现在对这三种方案进行描述。
显式获取:在用户刚开始使用推荐系统的时候,让用户主动地输入自己感兴趣的领域或方向,这种方法的代表是 Quora,当初我刚开始用它的时候,就要我选择很多兴趣方向,点的我头都大了。从我的体验种能够表明显式获取数据这种方案,其优点是简单直接、相对准确、具体全面、客观可靠;但是缺点是侵袭性很大、实时性与可操作性低,灵活性较差。如果使用这种方式,就要好好考虑一下如何解决侵袭性问题;同时用户能够接受多少次这样的操作;并且如果出现五级积分制的评分,用户有多少耐心能够去进行评价;用户所能够接受的评价方式是什么等等。
隐式获取:使用这种方案会极大地减少对用户的侵袭性,通过 Web 日志挖掘或者是跟踪用户浏览行为等相关办法,可以在不打扰用户正常生活的情况下,获取用户概貌。虽然这种办法在一定程度上减少了用户不必要的负担,但是也可能会存在信息走样,并且用户也很难意识到自己的兴趣偏好是什么,甚至当系统长期过度地挖掘用户的 Web 日志,会引起用户的极大反感,致使用户弃用该系统。
启发式获取:当系统使用这种方案时,是希望尽可能地利用专家意见或者是领域术语抽取出用户的兴趣偏好以得到用户个人信息概貌。这样子做的好处是,能够尽系统所能为用户提供建议,实现领域知识的复用,提高用户兴趣的获取质量。
1.4 怎么考虑用户的兴趣偏好变化
上小节的三种获取用户输入数据的方案,有一个不好的地方在于,很难跟踪用户的长短期兴趣变化,比如说我作为一个用户,我很喜欢游泳,可能会在长时间内喜欢这项运动,但与此同时,我爱上了甜品,可这只是一个短期的兴趣偏好,那应该如何来跟踪用户的长短期?目前业界有两种策略,时间窗方法与遗忘机制,这两种方法都可以反应用户的长短期兴趣变化。
1.5 建模对象与建模方法
一般来说,建模的对象有两大类,一个是针对单用户建模,一般采用基于内容的推荐策略;另一个是对群组建模,一般采用基于协同过滤的推荐策略。对于这两种类型的推荐策略,本文会在第三章中详细讲到,此处做个大致的介绍,这俩都挺重要的。对于建模方法,可以分成两种分支,使用进化算法中的遗传算法,通过不断地子孙迭代得到用户的最新概貌情况,我认为是一种蛮好的策略;当然也可以使用机器学习中的一些方法,比如 TF-IDF 词向量分析、贝叶斯分类器、决策树分析、决策树归纳、神经网络与聚类分析。这些就留到专栏再展开讲具体好啦。
1.6 模型输出数据的表示
在用户模型的输出表示上,很多时候系统会使用主题表示法;在进行协同推荐的时候,更多的是采用用户-项目评价矩阵来表示模型的输出形式,下表就是一个用户-项目评价矩阵的范例。
当然也有一些推荐系统使用案例表示法或者本体论表示法。就目前来说,研究较多的是细粒度模型表示法。
2. 推荐对象建模
准备完对用户对象的模型之后,接着是推荐对象建模。所谓推荐对象建模,就是将某一内容的多媒体文件通过某些计算方法得到一个配对值,然后看看这个值和哪些用户之间是有较高关联性的,这样就可以把这个多媒体文件推送给目标用户。
2.1 推荐对象建模前的思考
在进行推荐对象建模之前,我们首先要思考一些问题,比如说这个模型是用来提取推荐对象的什么特征,怎么提取这些特征,提取完特征之后用于何种目的?再比说推荐对象的特征描述与用户的概貌描述之间存在何种关联?一个推荐对象可能会有多维特征,那么每一维的特征对推荐结果有什么影响?能不能让推荐对象的特征描述文件自动更新,如果能,那应该怎么做?
2.2 推荐对象的描述方法
当我们进行对推荐对象的描述时,一般用两种办法,基于内容和基于分类,现在对这两个方向展开来说。
基于内容的描述方法,不吝乎就是计算加权关键词矢量了。业界有蛮多的办法来计算这种加权关键词,但就特征计算来说,可以计算每个特征的熵值,然后选择具有最大熵值的若干特征;也可以计算每个特征的信息增量或者是互信息,也就是特征-文档之间的关系;在统计上,还经常使用 统计方法。除了特征计算之后外,还有一个方向是权值计算,就是要计算每个特征的权重,权重越大,影响越大。
基于分类的描述方法,其实也就是机器学习那套把式,使用朴素贝叶斯或者是 KNN、SVM 等方法提取出对象的分类信息之后,再展开描述。但是当对象数据比较少的情况下,手动分类是蛮可行的办法;如果数据较多,推荐使用聚类自动化的进行分类描述。
2.3 推荐对象有哪些亟待解决的问题
一开始我有提到“某一内容的多媒体文件”。我们都知道如果这个多媒体文件单纯只是文档类型的,比如说小说、新闻等等文字型对象,那提取特征的方法挺简单的,但是,实际生活中不单纯只有文档类型,还有千千万万的音频、视频等等多媒体类型,那么提取特征就不是那么容易的了。这是推荐系统要解决的第一大难点,如何提取多媒体对象的特征。
其次我们也希望系统推荐给用户的内容不要与以前看过的内容重复,甚至是完全不搭边,这是要解决推荐系统的过拟合问题,其本质是数据不完备,就举个例子来说,国家图书馆里有数不清的书籍文献,但是真被读者看过的也就那 1%~2%,还有很多的书没被读过,那么这些东西的数据就是不完备的。针对这一问题,目前是已经有解决方案了,就是引入随机性,可以是全局随机也可以是局部随机,比如说使用遗传算法或者是模拟退火使得其收敛至最优或者近似最优。
最后就是冷启动问题,当一个新的对象进入推荐系统时,它本身还没有被用户查看过,那系统如何把它推荐给用户呢?这个问题截止目前,方法有很多种,我们在 6.2 稀疏性与冷启动研究 这一小节会简要提及。
3. 推荐策略算法
这一章可以说是推荐系统的精髓所在,几乎全文的公式都是集中在此处,可能有些读者看着会比较吃力一些,但不要紧,解释一下会懂的。本章节会提到五种主流推荐模式——基于内容的、基于协同过滤的、基于网络结构的、组合推荐、其他混合推荐。
3.1 基于内容的推荐策略
使用基于内容的推荐策略,首先需要计算当前用户喜爱的内容的特征,然后依据这个特征在系统中寻找与之相近的内容,再按照相似度高低推荐给当前用户。
就基于内容的推荐策略而言,其优势是明显的。
-
可以很简单很有效地就将接近用户概貌的内容推送给目标用户,推荐结果直观,容易理解,也不需要有什么领域知识。 -
不需要用户的历史数据。 -
没有关于新产生的推荐对象有任何冷启动的弊端。 -
没有稀疏问题,也就是数据不完备问题。 -
有很多种业界成熟的分类学习方法为此推荐方案提供支持,例如自动聚类分析、数据挖掘。
但是有好的就有坏的地方。正是因为这种策略基于内容推荐,因此它受限程度非常大,例如所需推荐的对象是多媒体文件,音频或者视频,那么这类多媒体的特征提取就非常不便。
而且又由于用户喜欢的兴趣点不断地被推荐系统所匹配推荐,这就导致了用户只能一直在这个兴趣点内不断被深挖,很难出现新的推荐结果。
之前在优点方面我们提到推荐对象不会出现冷启动的问题,是因为这颗丑恶的毒瘤被踢到用户这边过来了。当出现一个新用户时,除非使用显示获取,否则很难获得用户的兴趣偏好,这是因为不知道要推荐什么给新用户。
目前较为普遍的计算用户描述文件与推荐内容相似度的方法是使用下面这个公式:
其中 可以使用向量夹角余弦代替,这是最简单的代入模式:
3.2 协同过滤
所谓协同过滤,它假设你朋友喜欢的东西,你也会喜欢,于是乎推广到推荐系统时,就是把和当前用户最近邻的若干用户的喜欢内容通过一些计算方法得出相似度之后推送给当前用户。目前的协同过滤策略主要有基于用户的协同过滤、基于项目的协同过滤、基于模型的协同过滤,接下来就开始讲述这三种不同策略的相关思路。
3.2.1 基于用户的协同过滤策略
所谓基于用户的协同过滤(UBCF),它的思路蛮清晰的,大体上分为两步走,第一步计算用户之间的相似性得到用户的最近邻;第二步把符合当前用户概貌的内容推送给当前用户。
在第一步的相似性计算中,最简单的方法是计算两者的余弦相似性,形如下式:
也可以计算两者之间的相关相似性,会比较提高些,形如下式:
或者是两者之间的修正余弦函数弦相似性,更改善一些关系内容,形如下式:
当得到当前用户的最近邻时,就可以开始进行第二步,使用下式:
计算推荐得分,把分数高的内容呈现给当前用户。
3.2.2 基于项目的协同过滤策略
基于项目的协同过滤策略(IBCF),是假设大部分用户对于一些推荐对象的评分很接近,那么就认为当前用户对这些项目的评分也会很接近。比如说有很多用户对某个品牌非常认可,由于从众心理,其他用户也会对这个品牌产生认可,从而选择这个品牌的相关产品。
其基本思路与基于用户的协同过滤模型有些类似,同样是先找到目标用户的最近邻,然后使用当前用户对最近邻的评分,预测到当前用户对目标推荐对象的评分,最后再选择若干得分最高的推荐对象作为结果推送给当前用户。
在这个策略中,第一步查询最近邻的相似性计算函数可以使用在 3.2.1 基于用户的协同过滤策略 中使用的三种相似性函数;第二步产生推荐的得分计算则使用下式:
3.2.3 基于模型的协同过滤策略
最后是基于模型的协同过滤策略(MBCF)。这种方案相对于前两种的不同之处在于本策略针对用户已有数据应用了统计学与机器学习的方法,计算出一个用户模型,随后对已有数据之外的对象进行预测打分,把得分高的对象推荐给用户。
很显然,建立一个用户模型是这个策略的核心所在。在业界,我们通常是使用机器学习方法或者是统计学上的一些模型方案,去不断地调整处理,最终得到一个较为不错的用户模型。当然除了上述两种方案之外,我们还能够使用基于马尔科夫链模型法、潜层语义分析、语义生成或者是输入选择技术来对用户模型进行创建。
3.3 基于网络结构的推荐策略
基于网络结构的推荐策略是认为用户和对象可以形成二部分图,当用户选择某一对象时,则两者直接产生一条边,并对任一用户他当前没有选择的对象按照其兴趣偏好进行排序,把排序结果靠前的若干对象推荐给该用户。有研究者就此策略提出一种基于资源分配的推荐算法,该算法认为推荐系统中的所有对象都具备某种可以分配的资源,并且会把这类资源分配自己喜欢的对象。
如果使用 来表示对象 愿意给 对象 一定的资源量,那么 可以使用下式计算:
其中 表示用户 的度, 表示用户 和 对象 之间是否存在一条边,如果存在,则 ,反之为零。
假设此前已经存在一个具备了n
个对象的系统,如果用户i
选择了对象j
,则对象j
的初始资源为1
,否则为0
,据此可以得到用户i
的n
维向量,把它标记为当前用户初始资源分配构型,记作
,然后通过下式计算新的资源分配构型
:
对于用户没看过的对象,就要按照 中的值从大到小进行排序,把排在靠前的若干对象推荐给用户。
当然还有一些其他的算法策略,此刻不多做赘述。
3.4 组合推荐策略
无论是基于内容还是基于协同过滤或者是基于网络结构,它们都存在着各自的优劣性,当我们使用组合推荐时,就可以在实际问题种针对具体问题采用合理的推荐策略组合进行推荐。最后通过不同的组合方式,能够尽可能地扬长避短,从而产生更符合用户需求的推荐。目前的组合思路主要是推荐结果混合和推荐算法混合。
如果是推荐结果混合的话,开发者可以采用投票机制来组合推荐结果,投票高者优先;也可以采用一定的标准对推荐结果进行判断,最后选择其中之一;当然也有利用线性组合进行推荐结果混合;也有计算推荐结果队列的逐一可信度,然后选择其中之一。
要是推荐算法混合的话,那可就多多了,你总能够以某种推荐策略作为框架,混合其他的推荐策略,比如把协同过滤做底子,衬上内容推荐或是社交网络的皮囊。
4. 推荐系统体系结构
这章要讲推荐系统的体系结构。纵观推荐系统的体系结构,其中最为重要的问题是——用户个人信息概貌与整体描述文件应该放在哪里?
就存放地点来说,用户概貌文件可以存放在服务器、客户端、代理服务器【介于服务器与客户端两者之间的中转站】、分布式集群【一般小系统不考虑】。
如果一个推荐系统将用户概貌文件存放在服务器端,那么会导致整个 Web 服务器系统开销变得非常大,因为要不断地在计算用户描述;而且对于用户信息的采集也会受到来自 Web 服务器的限制;最为重要的是,Web 服务器很容易遭受外部攻击,这对存放在其内的用户隐私有极大的威胁性。
要是推荐系统把用户概貌文件存放在客户端,则喜忧参半,喜在于用户的个人隐私基本上不会受到外部攻击而泄露,并且就在本地收集和处理的用户信息,因而能准确地获得用户的个人信息,从而创建高质量的用户模型;忧的部分在于,每个用户的个人概貌都存放在自己的本地客户端,对于使用协同过滤策略的系统不友好,需要重新设计系统的推荐算法,并且可能会有小部分的数据需要同服务器交互,在数据传输的过程中,也许有会被截获的风险。
假如把推荐系统的用户数据存放在代理服务器端,也会面临着被攻击的风险,甚至较之服务器端只多不少,因为数据的传输从客户端到代理端,代理端到服务端,两次的数据传输过程中,被截获的风险太大。
那使用分布式集群来存放总归是好的吧?说好是好,可以极大地提高数据安全性;但是说贵是真的贵,分布式集群本身的搭建成本过高,不适合小微型企业使用。
5. 推荐系统性能评价
本章主要是简单讲下推荐系统的性能评价。当一个推荐系统被开发出来之后,慢慢地有用户开始使用这个系统,那么用户的个人概貌就会开始改变系统对此用户的一个整体构型,有点儿像养成游戏,不断地调教系统,直到系统推荐符合我们想要它推荐的内容。那么就可以引出两个推荐标准——准确度和效果值。
开发者总是希望系统推荐的准确度能够不断地上升,使用最多的指标是平均绝对误差、平均平方误差和标准平均误差。
其次还有效果值,一个推荐系统所推介给用户的内容能够让用户认为是自己喜欢的内容,那么这个效果就很棒,按照指标上来看,召回率是一个不错的评判指标。
当然还有其他的评价标准,比如说系统推荐多样性内容的能力以及推荐新产生内容的能力和冷门内容的能力,这些都应该成为一个好的推荐系统的评价标准。
6. 推荐系统研究方向
最后是关于推荐系统今后研究方向的一些总结。实际上现今的推荐系统还在不断地成长当中,它还有不少的问题需要我们不断地去研究和发现并且解决掉。本章大致讲一下推荐系统的安全性研究和稀疏性与冷启动的问题研究。
6.1 推荐系统的安全性研究
前面我们讲推荐系统的用户个人信息的时候,经常用到一个词用户概貌,它所指的是用户在推荐系统中存放的个人信息,包括了兴趣偏好等等相关数据。我们也提到了养成这一说法,就是把系统当作是一个小白助理,我们不断地对它进行个人信息投喂,直到这个助理把我们想要的内容提供给我们,这个过程我把它叫做养成。有一些恶意用户会通过向推荐系统注入他们恶意编造的用户概貌来改变推荐结果,这种模式,被称为托攻击。
在进行一次托攻击之前,恶意用户需要了解所要攻击的项目信息、用户信息、此推荐系统使用了哪种推荐算法策略以及此推荐系统的评分信息,包括评分的分布与稀疏情况。
当完成好上述准备时,恶意用户开始针对推荐系统进行托攻击。如果是希望提高目标项目的推荐频率,则此次托攻击称为推攻击,可以理解为推广的意思;如果是希望降低目标项目的推荐频率,则成为核攻击。无论是托攻击中的何种,它们的攻击模式无外乎随机攻击、均值攻击、流行攻击与细分攻击。
无论是进行推攻击还是核攻击,恶意用户们组织一场战斗总是需要成本的,而他们的成本就是我们先前提到的所需了解的相关信息。我们把这些成本统称为攻击成本,其内细分为知识成本,即推荐系统与推荐用户的相关信息;执行成本,即展开攻击时所要提交的恶意概貌和提交恶意概貌时同系统的交互情况。倘若所需信息越多,则知识成本越高;若恶意概貌维度越多,则执行成本越高。
最后,我们使用预测值变化和推荐列表变化这两个指标来度量一次托攻击对受攻击推荐系统的攻击情况。
到这里,相信读者们对攻击推荐系统有了一个大致的了解。接下来我们讲下稀疏性和冷启动。
6.2 稀疏性与冷启动研究
稀疏性问题的本质数据的不完备。我们研究稀疏性问题的意义就是使得整个推荐系统中的内容不再沉淀在冗余的空间里,而不被利用。目前推荐系统稀疏性问题的方法主要是使用多级关联规则挖掘方法、ICHM 算法、或者是矩阵聚类、信任度传播策略。其中 ICHM 算法是针对项目采用了传递关联来解决稀疏性,与之类似的还有 UCHM 算法,这个是对用户概貌进行聚类。对于其中所使用到的算法详情,我会再另外开一篇文章进行详解,此处便不再赘述。
而冷启动问题则是由于新进用户或者内容尚未建立起内容关联而导致推荐效果差的情况。目前有两种解决方向,一个是不考虑内容的解决方案,比如说利用随机推荐,当一个新进用户开始使用系统时,给他随机地推荐一些内容,这样子不断地积累此用户概貌,然后慢慢养成,慢慢调教,直到推荐出用户喜欢的内容。除了随机推荐法之外,还有平均值法、众数法、信息熵法等相关解决办法。另一种方案是考虑内容的解决方案,比如说结合机器学习的相关方法或者是统计学上的一些策略模型进行解决。
7. 写在最后
最后,一个真正优秀的推荐系统,是始终将用户的个人隐私视为系统生命的至高存在,保护用户隐私,就是在保护系统自己。
成为 GitChat 会员,优质文章全年免费看,每月还送一张专栏 3 折券!
以上是关于万字入门推荐系统!的主要内容,如果未能解决你的问题,请参考以下文章