当前位置: 首页 > news >正文

抛开数学,一文了解推荐系统框架及原理

导语:一项技术最终有没有价值,有多高的价值,终究还是看能够解决人的什么问题,这个问题有多高的价值。

作者:木羊同学

来源:华章计算机(hzbook_jsj)

01.

推荐系统的价值在哪里

最近我老琢磨一个问题,一项技术的价值高不高,指标到底是什么?是先进,是复杂,还是创新?技术人聊技术,总是迫不及待一头栽进技术的细节中去,习惯通过技术本身找答案。不过,有句老话叫“技术以人为本”,我的思考是:一项技术最终有没有价值,有多高的价值,终究还是看能够解决人的什么问题,这个问题有多高的价值。推荐系统现在大火,为什么火?答案可能也从技术以外的问题去寻找。

推荐系统解决了人的什么问题呢?我认为三个字——个性化。有了推荐系统,从小的方面看,找到相似视频、相似商品更加容易,从大的方面看,我们看到的内容不再千人一面,而是“按需分配”了。这么说好像很笼统,毕竟整个Web 3.0说的都是个性化的事。举个实际例子吧,以前看首页就像看报纸,甭管男女老少,13亿台手机点开看到的首页内容完全一样,大水漫灌的结果必然是大量无效输出。有了推荐系统,一切都不同了,是真正的一切都不同了,现在每个人看到的都是为你一对一私人订制的内容,相当于为每一个人专门编排了一份报纸:我是木羊,我看到是就是《木羊日报》,你是哈姆雷特,你看到的就是《哈姆雷特日报》,字面意义上的一千个人就有一千种内容,这就是个性化。

记得推荐系统刚开始流行那会,大家打开带有推荐系统的App就像发现了新大陆,看完一条视频觉得挺有意思,正琢磨着去哪找类似的视频看看,结果回头一刷首页,嚯已经全换上了类似的视频。什么叫惊喜?这就叫惊喜。推荐系统成为当下一项不可或缺的技术也是自然而然的事。现在很多自媒体在讨论:自从有了推荐系统,刷App很容易一刷就停不下来,这是不是坏事本文不做讨论,我们先来探讨推荐系统的本事从何而来。

02.

推荐系统的主要架构

那么,推荐系统的本事从何而来呢?

不妨反过来想,现在你要实现一款推荐系统,你都需要做些什么?推荐系统大家肯定都熟,可是要说简意赅又不掉书袋地点出核心关键,一时半会可能还说不清楚。我特别欣赏百度CEO李彦宏去年痛批推荐算法时说的一段话:“Robin说,算法最大的责任是了解挖掘用户的深度目标和需求,而不是养猪式的投喂,用户喜欢啥就一直推送啥。”

我们先不争论这个观点是对是错,Robin对推荐系统到底要做些什么还是把握得十分到位的。从技术的角度看,Robin这句话可以这样分解:现在你手头上已经积攒了一批内容,也许是视频,也许是商品,我们姑且都统称为内容库。内容库的规模可能非常庞大,上百万条记录可能才只是起步价,而推荐系统要做的,就是从内容库的这上百万条记录里面选取一定数量的内容——譬如说十条——推送给用户。

推荐系统通过两个步骤完成上述工作,称为召回排序

首先是召回。推荐系统面对的问题有点像选秀节目,一边是上百万条,一边只有十条,二者规模极其不对等,那怎么办呢?选秀节目的办法同样也是分阶段:第一阶段是海选,从海量报名者中选出一批候选对象,第二阶段才是上节目比赛,决出一二三名。

推荐系统也一样,召回就是海选。这个词,学机器学习的同学不会陌生,听着文绉绉的,其实就是“找到”的意思。假设我们要找到一百条候选内容,那么从内容库的上百万条记录中“找到”这一百条内容,就是召回。

召回这个概念不复杂,难就难在实现:怎样才能知道需要哪十条内容呢?这也是推荐系统最核心的问题,你去翻推荐系统的书,书里又是矩阵又是SVD又是协同过滤的讲一大堆数学,其实就是为了解决召回这个问题。很复杂,我们后面将专门介绍。

接着是排序。选秀节目海选出来的选手当然不是直接就去领奖了,而是同台竞技,请来各种权威大咖举牌也好,拍桌子也好,总之就是给候选对象评出个三六九等。排序也一样,召回已经将待选内容的规模大大缩减,接下来就得把活做得更精细。目前业内主要采用特征选择的办法完成排序。

召回和排序是推荐算法中最重要的两个环节,也很容易让初学者感到疑惑,召回是从全集中找出选集,排序则是从候选集中找出推荐集,从功能上看都是起到缩小规模的作用,好像没什么不同,为什么不合并在一起,非要搞两个概念呢?

这就是实践和理论的不同之处了。前面我举了真人选秀节目作为例子,这个例子很有参考价值,现在我们再具体展开说说。单从理论上看,算法当然是精度越高效果越好,但在现实世界中,精度越高往往意味着模型更复杂,运算量更大,从上百万条内容中选取几千条内容,和从几千条内容选取十条内容,也许理论上没啥区别,但在实践中大规模运算需要投入大量的设备和时间,成本可能高得无法承担,而召回和排序的划分,则使得工作有了不同的侧重,召回要求容量大速度快,求全不求准,出现一些杂质也可以容忍。而到了召回这里,由于内容数量已经大为减少,可以使用更多的特征和更复杂的计算,就可以精益求精,有时排序也能继续给自己加戏,切分为粗排和精排两个环节,有点食不厌精的意思。

在实际应用中,推荐系统会在召回和排序后面再安排一个叫“重排”的环节,这个环节更多是从业务需求上考虑,譬如增加推荐内容的多样性。经过重排以后,推荐内容就最终呈现在用户面前。

03.

基于内容的推荐

现在,难题来了。推荐系统的核心关键是“用户喜欢啥就一直推送啥”,别看自媒体都在炒作“算法比你更懂你”,好像很理所当然,还要顺带制造一些焦虑,可现在我们要面对的问题就是,怎样让算法知道用户喜欢啥呢?

首先有一点,技术应用和考试不同,不要以为怎样做推荐系统会有一些“标准答案”,后面我们会介绍一些当前业界用得较多的方法,但只是因为大家感觉效果挺好,所以慢慢推广开来,也进行了系统的整理,但不是非此不可。我们都听过一个小工战胜博士后的段子,但在推荐算法领域,2018年真的出了个SQL战胜ML的新闻,尼日利亚有位工程师用SQL实现了一个“推荐算法”,非常简单,就是查询3个月未登陆的用户,然后用邮件给这些用户送优惠券,获得了接近25-30%的打开率,远超均值的7-10%,不开玩笑地说,这已经是“state of the art”。

我想,技术最重要的是是三件事,解决问题、解决问题、以及更好地解决问题。

说回推荐系统怎样寻找“喜欢”。前面我们介绍了,推荐系统有召回和排序两个环节,召回这个环节很重要,得把用户可能喜欢的候选对象从内容库里找回来,要是找不到,后面的排序再怎么厉害,也变成了无米之炊。所以,请先记住,下面介绍的内容,都是解决召回环节怎样寻找“喜欢”的问题。

那这么找呢?方法有多种,但核心三个字:找相关。推荐算法五花八门,但无论多复杂,始终是围绕“找相关”这一条主线,只要记住这条主线就不会迷路。常用的方法有两种,第一种叫基于内容的推荐,是根据用户喜欢的内容找相关的内容。

推荐系统刚热起来的时候,我周围好几个不搞技术的小姐姐都分享了调教推荐系统的办法,概括起来就两句话:遇到喜欢的爱豆多停留三秒,以后推荐系统就学会推送爱豆的视频了。技术人都有个爱好:爱推测原理。我当时就根据这个调教办法,反推了推荐算法,认为一共就做了两件事:第一件通过停留时间判断用户是否喜欢某某标签,第二件把同一标签的视频推给用户,觉得“嗯,这推荐系统没啥难的。”

当然,后来学完以后,我知道是“在下浅薄”了,不过上面的推测不算全错,比较接近我们现在要说的基于内容的推荐。这种推荐方式“找喜欢”的主要思路是:你喜欢这个内容,那和它同一类的内容你也很可能会喜欢。

推荐具体分三步,首先会抽取一些特征,你可以理解为制作一个特征表,然后看看用户长时间停留的这条内容都具有哪些特征,譬如说特征A和特征C,那么就在特征表里打钩。最后就是找到同样在特征A和C中打了勾的内容,这就是我们要找的“相关内容”。

基于内容的推荐,优点是直观好懂解释性强,追爱豆的小姐姐和我这样的门外汉都能很快猜到,而且不涉及容易让人很头疼的冷启动问题。但缺点也很突出,光特征这玩意就费时费力,需要大量领域知识。特征这个词,大家可能一时还没反应过来,特征有离散和连续两种,离散的这种就是俗称的“标签”。现在推荐系统做的好的,都有个“不喜欢”的功能,你点“不喜欢”,它就会弹出一个框,里面列出一串标签,问你具体是不喜欢哪个标签。

标签我们都熟,可你也别忘了,标签这玩意是人为贴上去的,并不是天然的客观的存在,要制作一套既能反应内容的不同特点,又能反应内容存在的相同点的标签体系,那真是一场噩梦。就拿今年爆热的《你好,李焕英》来说,你会贴什么标签作为特征?

电影?说了约等于没说。

穿越?好像有但不能算重点。

煽情?这个套子能把一半的电影装进去了。贾玲?这个......很难说错也很难说对。总之就是各种纠结。

04.

基于协同过滤的推荐

现在业界用得最多的是另一种推荐方法,叫基于“协同过滤(Collaborative Filtering

,CF)”的推荐。如果你曾经查过推荐系统的原理,看到了很多数学,具体来说是线性代数,看一会,人就晕了,那你看的有可能就是协同过滤

这里不讲数学,数学只是一种语言,是用来描述内容的,而协同过滤需要描述的内容主要有两个,User-Item矩阵和奇异值分解(Singular Value Decomposition,SVD)。

等会,说好的不讲数学呢?上面这俩内容可全都是数学啊,年轻人你不讲武德……不是,这里我们只是借用一下它们一贯的称谓,下面保证都是挂羊头卖狗。

基于协同过滤的推荐和基于内容的推荐有一个鲜明的区别,就在于它首先得构造一个矩阵,就是这个User-Item矩阵,你要是不乐意,改叫它User-Item表格也没问题,因为这玩意就是一个很大很大很大很大的表格,横的一边是要推荐的全部内容,竖的一边是全部的用户,当然你要反过来也没啥问题。这张表格有多大呢?假设你有五千个用户和十万条物品,那这张表的大小就是五千乘十万。每一格都是一个数值,是行所对应用户对列所对应内容的打分。

有了User-Item矩阵,接下来你就可以推荐了,具体又分为两种方法,称为UserCF和ItemCF。这两种推荐方法的核心仍然是“找相关”,区别只在于找什么的相关。

先说ItemCF,ItemCF是通过找相关物品进行推荐,简单来说就是你对这个物品感兴趣,那你对这个物品的其它同类物品很可能也感兴趣。这个说法是不是有点似曾相识的感觉,没错,基于内容的推荐我们就已经说过类似的话,初学时很容易把二者搞混,区别之处在于怎么实现。ItemCF首先要构造User-Item矩阵,然后通过矩阵分解得到各个物品的特征向量,然后找相似,而基于内容的推荐则没有构造矩阵这一步,是直接根据内容所包含的特征,譬如说标签来进行推荐的。

接下来是UserCF,通过找相关用户进行推荐,这也是我很喜欢的一种方法,核心思想是“你喜欢的,你哥们也会喜欢”,而你哥们喜欢的,你多半也会喜欢,散发出一种难得的人文气息。推荐共分三步:第一步,我知道你喜欢什么东西,但我不直接去找相关的同类物品,而是找你的同好,也就是找同样喜欢这些东西的其它人。第二步,找到你的同好以后,就可以继续看看你同好都喜欢什么,搞一个喜好列表。第三步也是最后一步,把同好喜好列表里你还没关注到的物品推荐给你。

接下来谈谈这个SVD,也就是奇异值分解。SVD本身是一个纯粹的线性代数知识点,内容不展开说,你只需要记住两点:第一,它是一个线代工具,第二,它的作用是将一个矩阵分解成两个。

为什么推荐系统会冒出SVD这个线代工具呢?前面说UserCF和ItemCF都是通过User-Item矩阵来找相似,但中间漏了一步,实际上基于这个矩阵分别生成用户特征矩阵和物品特征矩阵,然后再通过特征来找相似用户特征矩阵和物品特征矩阵怎么生成呢?线性代数有的是将一个矩阵拆分成多个矩阵的方法,但问题在于User-Item矩阵的十分稀疏,这也很好理解,毕竟用户评了分的物品只占少数,因此常用的特征分解没法使用,目前线代还有其它的工具,就是这个SVD。

前面说了一点线代的内容,不过不明白也不要紧,只需要记住SVD能够将User-Item矩阵分解成用户特征矩阵和物品特征矩阵就可以了。有了特征矩阵,后面的事就好办了,现成有很多度量相似性的工具,譬如余弦相似性和欧式距离,可以选择这些度量工具,通过量化的方法来“找相似”。

05.

冷启动问题

推荐系统中有一个高频词叫冷启动问题,如果你看推荐系统的文章,经常会看到这个问题,现在我们就介绍冷启动问题。首先要清楚,不是所有推荐算法都存在冷启动问题,需要利用用户行为信息的,譬如要构造User-Item矩阵才会有冷启动问题,基于内容的推荐就没有这个问题。协同过滤首先需要构造User-Item矩阵,所以有冷启动问题。

冷启动问题很容易理解,用户刚刚注册,推荐系统自然不知道用户喜欢什么,当然就无法“找喜欢”,可是推荐还是得要推荐,那该推荐些什么呢?这就是冷启动问题。冷启动问题的成因很简单,但要解决就困难很多。不过好在应用实践不必遵从理论研究的严格条件限制,可以有很多的选择,譬如基于统计的,把热门的内容推过去,也有利用有限的用户注册信息的,譬如年龄、地域、职业等,还有做的更直接一点的,干脆就把各种标签统统列上,要用户在看到内容前先选一遍。

 

想要更加系统的学习推荐系统,并上手试验,推荐你阅读《智能搜索和推荐系统:原理、算法与应用》这本书,让你零基础掌握搜索和推荐系统原理、架构、算法,以及机器学习、深度学习、NLP在其中应用。

作者简介:

莫凡,网名木羊同学。娱乐向机器学习解说选手,《机器学习算法的数学解析与Python实现》作者,前沿技术发展观潮者,擅长高冷技术的“白菜化”解说,微信公众号“睡前机器学习”,个人知乎号“木羊”。

 

扫码关注作者

 

RECOMMEND

推荐阅读

01

《智能搜索和推荐系统:原理、算法与应用》

推荐理由

资深技术专家撰写,阿里、美团、Hulu多位专家推荐,零基础掌握搜索和推荐系统原理、架构、算法,以及机器学习、深度学习、NLP在其中应用。

02

《深入浅出图神经网络:GNN原理解析》

推荐理由

极验AI&图项目团队倾力之作!从原理、算法、实现、应用4个维度详细讲解图神经网络,理论与实践相结合。白翔、俞栋等学术界和企业界领军人物强烈推荐。

 

03

《推荐系统:技术、评估及高效算法(原书第2版)》

推荐理由

融合不同领域专家学者的理论成果和实践经验,全面介绍推荐系统的主要概念。

04

《统计推荐系统》

推荐理由

由LinkedIn公司的技术专家撰写,着眼于推荐系统的核心—统计方法,不仅讲解理论知识,而且分享了作者在LinkedIn和Yahoo!的实践经验。

推荐阅读

推荐算法为啥这么“灵”,又为啥会“失灵”?

有图有真相——图神经网络到底是什么?

 


扫码关注【图书小编辑】视频号

每天来听华章哥讲书

更多精彩回顾

书讯 | 4月书讯 | 好书和最美四月天一起来了...

资讯 | RedMonk 编程语言排行榜:JS持续霸榜,Dart 快速上升!

书单 | 8本书助你零基础转行数据分析岗

干货 | 数字化转型最致命的5个误区

收藏 | Redis最佳实践:7个维度+43条使用规范,带你彻底玩转Redis | 附实践清单

赠书 | 【第50期】10本金融科技好书为你转行、升职和加薪助力

点击阅读全文了解更多AI好书

相关文章:

  • 恭喜!第十届“吴文俊人工智能科学技术奖”揭晓!华章多位作译者获奖
  • 广告营销行业数据分析入门指导书
  • 五分钟了解互联网Web技术发展史
  • 如何部署一个Knative Service
  • 终于有人把Scrapy爬虫框架讲明白了
  • 超音速亚原子 Java丨Quarkus 开发团队成员打造专为Kubernetes而优化的Java解决方案,助力你快速上手...
  • 河马书来了!线上实验领域的“圣经”火热预售中
  • 【新书速递】深入理解Java虚拟机HotSpot
  • 筑牢“数据基座” 掘金数字经济——5位大咖畅聊金融科技
  • 字节跳动杨震原:A/B测试不是万能的,但不会一定不行 ​
  • 423世界读书日 | 今年的阅读计划完成三分之一了吗?
  • 【技术大会】阿里云 Serverless Developer Meetup 即将亮相上海
  • Pandas最详细教程来了!
  • 文末福利 | 吐血整理!140种Python标准库、第三方库和外部工具都有了
  • 大咖发声 | 聊聊火爆前端圈的“犀牛书”
  • 345-反转字符串中的元音字母
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • iOS 系统授权开发
  • jdbc就是这么简单
  • Mysql优化
  • PermissionScope Swift4 兼容问题
  • PHP的Ev教程三(Periodic watcher)
  • python 学习笔记 - Queue Pipes,进程间通讯
  • ReactNativeweexDeviceOne对比
  • Vue.js 移动端适配之 vw 解决方案
  • vue自定义指令实现v-tap插件
  • 大主子表关联的性能优化方法
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 如何解决微信端直接跳WAP端
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 深度解析利用ES6进行Promise封装总结
  • 数据可视化之 Sankey 桑基图的实现
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 微信支付JSAPI,实测!终极方案
  • 新书推荐|Windows黑客编程技术详解
  • Java总结 - String - 这篇请使劲喷我
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • #pragma once与条件编译
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (12)Hive调优——count distinct去重优化
  • (2.2w字)前端单元测试之Jest详解篇
  • (4)(4.6) Triducer
  • (C语言)fgets与fputs函数详解
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (windows2012共享文件夹和防火墙设置
  • (安卓)跳转应用市场APP详情页的方式
  • (二)hibernate配置管理
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (一)基于IDEA的JAVA基础1
  • **python多态
  • .bat批处理出现中文乱码的情况