达观数据 CTO 纪达麒:个性化推荐系统开发实战与效果提升之道
d10 月 26 日,EGO 上海分会会员、达观数据联合创始人兼 CTO 纪达麒作为线上分享第二季嘉宾,与超过 400 位会员交流了个性化推荐系统的实战经验。本文根据当天口述内容整理。
我是纪达麒,达观数据联合创始人兼 CTO 。2008 年我从北邮硕士毕业后在百度和搜狗做网页搜索、广告搜索相关的工作,之后到盛大创新院,再后来是腾讯文学,主要是给盛大和腾讯文学内部的子公司提供一些数据挖掘的服务,包括个性化推荐和站内搜索,还有自然语言处理和文本挖掘。我个人比较擅长的也是大数据挖掘相关的,比如数据挖掘算法、高并发实时在线系统。
盛大和腾讯文学内部一直在提供大数据挖掘的服务,在这个过程中,我们发现很多公司缺乏这方面的技术。成立达观数据的想法很简单,除了给盛大和腾讯文学内部子公司提供服务,我们也向任何需要这方面技术的公司提供服务。现在公司产品包括个性化推荐系统、垂直搜索引擎和文本处理功能,比如自动分类、情感分析、合同提取等等。
个性化推荐系统,简单来说就是根据每个人的偏好推荐他喜欢的物品。个性化推荐系统已经在各行各业普遍应用,亚马逊号称 40% 的收入是来自个性化推荐系统的,淘宝的个性化推荐系统也带来非常大的收益,新闻媒体的个性化推荐系统最典型的就是今日头条,“你关注的才是头条”正是对个性化推荐系统的最好诠释,直播平台给用户推荐喜欢的主播,文学网站给用户推荐喜欢的小说,金融网站给用户推荐需要的理财产品,社交网络给用户推荐他可能关心的大 V 或者朋友……
为什么需要使用个性化推荐系统?
根据用户偏好提供关心的结果,精准运营可以把流量效果最大化。比如你推荐的文章是用户喜欢的,那么点击率就会提高。其他领域,直播的送礼物、电商的购买、新闻的阅读时长等指标都可以得到明显提升。
如果要开发一套这样的个性化推荐系统,会有哪些技术难点?
推荐系统和搜索不一样。在搜索中,用户会主动把意图告诉你,会在搜索框输入;在推荐中,用户往往不告诉你他关心什么,而每个用户的关注点又很不一样,有人喜欢体育,有人喜欢娱乐,有些人喜欢军事点……
在产品层面,有些 APP 会让新用户注册时填写他关心的标签类别。我们的经验是,很多用户都不愿意填或者乱填。而且用户的兴趣经常变化,兴趣发生变化后,几乎没人愿意再到 APP 的设置里重新设定个人偏好。另外,很多时候用户都不知道自己的偏好,不太清楚自己想看什么。
我觉得个性化推荐最难就是用户没有告诉你任何东西,但是你又需要区分每位用户的个性化偏好。
我们有统计过数据,大部分 APP 的新用户留存达到 50% 就相当不错了。换句话说,我们花很多钱或者很多资源从外部引入新用户,可能有一半多明天就再也不会来了。
这给推荐系统带来的难点就是,新用户没有任何用户行为,只会在我们 APP 里面停留几分钟,最多几十分钟,有一半用户明天就再也不会来了。这要求我们快速捕捉他的兴趣,给他感兴趣的东西,把他留下来 —— 而他没有任何历史行为或者数据。这就是冷启动的问题。
比如我们知道某个用户喜欢刘德华,那就一直给他推荐刘德华相关的东西吗?这往往给用户的体验也不好,用户会觉得很单调。
所以推荐系统很重要的一点就是,挖掘用户各个方面的兴趣点,甚至有一些是用户都没意识到的。我们推荐出来让用户来看,会给他很大的惊喜。这也是推荐系统需要解决的问题。
工程实践上,效果和资源会面临很大的挑战。比如我们搭建推荐系统,用户量越来越大,要推荐的物品数据量越来越大,数据冷热不均,数据变化比较快比如用户兴趣经常变化,Hadoop 集群实效性差……那怎么办?
以上就是自建推荐系统时可能面临的问题。
具体怎么做?首先要对推荐物品进行信息挖掘。以新闻资讯为例,需要提前给每一篇文章打标签,比如这是关于刘德华的,这是关于演唱会的,这是体育新闻,这是娱乐新闻……
编辑可以做打标签的工作。如果文章量特别大,那么编辑就忙不过来了,或者很多类别区别不那么大,编辑有时候打得不准。这时候我们会使用自动分类技术比如 SVM 。 当我们把我们要推荐的物品打上标签,就可以来进行用户的个性化推荐。
怎么做呢?
根据用户的行为,比如看了一篇标签是刘德华的文章,如果有新的刘德华演唱会文章或者视频,就可以推荐给这样用户。这就是第一种,用得最普遍,也是相对容易。
协同过滤是一种经典算法,思想比较简单。举个例子,比如说我们发现:
用户 1 喜欢物品 1 、物品 2 、物品 3 ;
用户 2 喜欢物品 1 、物品 2 、物品 3 、物品 4 ;
那我们就可以把物品 4 推荐给用户 1 ;
因为我们通过用户行为可以分析出,用户 1 和用户 2 的行为非常类似,他们很有可能是偏好类似的用户。所以当数据量比较大的时候,我们可以为每个用户找到和他相似的用户,然后根据这些用户的行为来推荐他可能喜欢东西。这是基于物品的协同过滤。
另外还有一种叫做基于 item 的协同过滤,我们发现喜欢物品 1 的用户有 70% 概率会喜欢物品 2 。那么,当新用户对物品 1 喜欢的时候,我们可以给他推荐物品 2 。比如我们发现很多人看了刘德华的演唱会之后还会去看张学友演唱会,我们就给看过刘德华演唱会的用户推荐张学友的演唱会。
我们是基于用户的行为,但并不关注用户看的物品是什么:可以是文章、视频、主播、小说等。这种方法基于用户行为,而且只需要使用正样本,本质就是用户显示的反馈。比如看到哪个视频、给某个主播点赞、转发了某篇文章……我们把这些叫做正样本。基于正样本可以进行算法挖掘,可以用在各行各业。
推荐系统的输入是用户行为,比如看了某篇文章、分享某篇文章等等。推荐系统最重要的核心输出是什么?是用户还没有看过的物品。比如用户还没看过的新文章,他有多大概率会喜欢?知道这个概率后,按照概率排序推荐就行了。
截图右上角是 users-items 矩阵,里面填充了数字。输入用户行为,比如用户查看但是不点击设置为 1 ,点击设置为 2 ,分享设置为 3 ,送礼物设置为 4。所以这个矩阵就表示某个特定 user 对某特定的 item 的情况,比如说某用户点击某篇文章,就是 1 。
推荐系统转化成什么问题呢?
就是要求解矩阵中空缺的元素,就是对于没有过行为的其他 item ,用户有多大的概率会做什么样的行为。这用到矩阵分解,而优化目标很简单,就是让呈现结果和已有数值尽可能接近,同时就能够自动把未知的值求解出来。
这个算法看起来有点复杂,但思想挺朴素的。当我们不用推荐系统时,运营同学做推荐系统是怎么做的?他们往往会先给用户打标签,比如说某个用户的性别“男”、年龄“ 20 - 30 ”、地域“一线城市”。在给用户打好标签之后,再做一些映射规则,比如 20到 30岁的男性会看财经类文章,50 - 60岁的女性会看养生类文章的,这也是很多运营同学常见的方式。
这种方式有几个问题:
首先用户标签往往不准确。你怎么知道用户是男性?你怎么知道他是 20 岁?靠用户自己填写吗?用户往往也都是乱填的。就算是用到了外部数据,外部数据也往往有非常大的噪音。
第二个问题是映射规则也是非常主观的,比如,为什么 20 岁到 30 岁的用户喜欢财经类的文章?也许他还喜欢看娱乐甚至养生的。所以这部分人工的映射条件往往有非常大的误差。
这和前面提到的矩阵分解的思想也是一样的。前面的 user 矩阵纵坐标分成三维,这是通过用户行为自动给每个用户在 N 个维度里面来打上权重。这个维度和上面员工定义的性别年龄是一个概念,只不过这个是通过机器学习用户行为得到的,而这些成果是人为不可解释的。这里每个维度都是为了使结果最优,但没有任何物理含义,这就是不可解释的意思。
这个看起来很复杂的推荐算法,本质上和运营常用的思想是一致的。当然了,这个算法还有很多可以优化的地方。
首先,我们会在矩阵分解中把 user bias 和 item bias 加进去。user bias 做什么?比如某些用户很容易给很多 item 都打高分数,有些用户觉得差不多的文章都愿意分享,有些用户就算是再好的文章都不会分享……不同用户的打分标准不一致,这会影响推荐效果。
item bias 也是类似的,比如文章标题党会很容易带来用户点击,文章写到分享能得到什么好处……文章不一定是用户特别喜欢的,但是看数据,他的点击和分享情况挺好的。这会使矩阵分解效果受影响。
所以前面的公式里讲 user bias 和 item bias 加进去会得到效果的提升。
前面提到多个经典推荐算法,实际应用往往是几种算法的融合。简单的融合就是为各个算法加权重。实践下来,更好的算法是通过机器学习的方式来把几个算法进行融合。
比如某算法在特定场景的效果更好,或者某算法对于某些具体用户效果更好,那对应算法权重可以更高,这就是通过机器学习达到算法优化。
首先,是否可以获取外部数据,比如在其他应用的属性、偏好。这个比较难获得,成本也会比较高。
我重点来说其他的方式。
新用户没有任何历史行为,并不代表我们对这个新用户一无所知。比如,新用户在什么时间访问的,是白天还是晚上,是工作日还是休息日?他的手机是安卓还是 iOS 的?安卓的话,是小米还是华为还是 OPPO ?新用户本身带着这些特征过来的。所以第一步就是根据历史数据得到这些特征,比如说喜欢在工作日深夜第一次访问的新用户,更可能喜欢哪些物品?
这是第一步。我们可以给他通过这种分群的方式大概定位,然后来给他推荐。这个还是太粗了。
第二步,我们叫做秒及反馈。新用户往往不会看第一眼发现不喜欢立马就走,这种概率也是很低的。正常情况下他还是会用几分钟甚至十几分钟,这就给推荐系统带来了机会:根据用户行为快速建模,不管是新用户还是老用户,他这一秒的行为在下一秒的推荐结果里产生作用。换句话说就是,新用户点击了什么,推荐会在下一秒把这个因素考虑进来,继而推荐他可能喜欢的东西。他会觉得这个网站里面的东西有很多是喜欢的,以此增加留存率。
工程方面怎么解决?
数据量越来越大,用户变化也很大,物品变化也很快,用户量也很大……我们会面临工程上的各种问题。我们解决这个问题会分成三级架构:offline 、nearline 、online 。
online 实时处理用户请求,需要快速响应用户推荐结果。online 要快,要支持高并发。我们的平均处理时间控制在 10 毫秒以内,最大延时在 50 毫秒以内。off line 收集大量的用户数据,并且跑一些很复杂的推荐算法,深刻挖掘用户偏好。nearline 位于两者之间,接收用户的新行为,包括新用户的新行为和老用户的新行为。我们通过三级架构解决了性能、计算复杂度、实时性问题。
我们希望通过推荐系统提升某些 KPI ,达到更好的推荐效果。实际的使用中,会有很多人工干预的场景。所谓人工干预指的是,比如说运营需要来强推某些东西 —— 哪怕用户可能并不喜欢 —— 甚至置顶。这是运营方面的需求。而这些需求对推荐系统也是必须要满足的。我们往往会在推荐之上,基于业务规则再实现一套逻辑。
首先,推荐系统一定是一切从用户出发,并不是从 KPI 指标出发。
什么意思呢?比如说推荐系统要优化点击率。标题党和低俗的东西可以得到大量点击,从 KPI 来看是挺好的。但他对用户体验不好,对产品也不好。所以不能只看指标,要从用户出发,把我们想成真正的用户,再去评价到底是不是好的体验。
第二,搭建一套推荐系统并不难,如何持之以恒地提升效果才是关键。
任何算法都需要针对场景做适配和调优。没有一家公司能把算法放到任何场景都是最好的,而是都需要针对场景进行分析,从而提高最终推荐效果。
最后,个性化将会是下一次 IT 浪潮的核心。我个人深刻觉得,推荐系统可以在各行各业发挥作用,让用户真正从 APP 和网站的海量信息中获得他想要的内容。
垂直领域( HR 领域)做内容推荐系统,部分内容抓外网,部分自撰。在人员配备方面有什么推荐吗?
不论是 HR 领域还是其他领域,推荐系统最重要的就是两点,一是信息源,我们要有足够多的好内容,二是做比较好的个性化推荐系统。
人员方面也就是两部分,第一部分去外网爬取数据,第二就是前面提到的个性化推荐系统。前一项的技术难度并不会太高。人员配备方面,我个人建议大部分人员应该是在个性化推荐系统。
比如我们现在的客户招商银行,他的掌上生活资讯系统就包括爬取的外部授权文章和编辑撰写的文章。我们会把两种文章来源进行融合,然后进行推荐。
这个问题挺好。从技术层面上来说,广告和推荐用到很多非常类似的技术。不过我觉得他们两个从基因上区别很大,以 APP 为例,APP 内做广告是要把用户带到另外一套系统,而推荐系统是要给他推荐 APP 内感兴趣的东西,留住用户。
换句话说,大部分广告系统是对用户有干扰的,而推荐系统是想要提高用户体验的。广告和推荐系统合作的话,我觉得更多是把用户画像之类的运用到广告系统:
简单做的话,用户标签,比如刚才提到的用户喜欢某类视频或者文章,这些标签可以让广告系统来使用。
更深度的合作,就是推荐系统可以把用户更加量化地表示,描述更加精准。这些向量不一定是广告系统能看懂的,不一定有真实的含义。这些向量提供给广告系统,这种方式从效果上可能更优,但是实现有难度。
因为在大部分公司,广告系统和推荐系统往往是两拨人在做,如果说推荐系统给广告系统提供的是没人认识的向量,那就无法评价推荐系统到底有没有用。所以,我见到的更多的是推荐系统提供用户偏好等人们可以理解的东西,作为广告系统输入。
通过 EGO 这个平台,认识了很多朋友,从他们身上学到了很多宝贵的经验。在小组讨论中,经常可以非常深入地探讨很多具体的问题,也解决了不少实际工作中碰到的问题。
<完>