关于推荐策略的一些思考

自信息大爆炸的时代开始,每天人们接受的信息都是海量的。如何高效地获取有效信息,对每个人来说都是挑战。在 PC 互联网时代,搜索引擎很好地承担了这一任务。人们通过搜索引擎,可以很快找到自己需要的信息。随着智能手机和移动互联网的发展和普及,人们获取信息的习惯随之发生了变化。人们不再习惯于通过搜索引擎寻找自己需要的信息,而希望能从推荐系统中自动地获取有价值的信息。

这些推荐类的产品,以信息流产品最为火爆。信息流产品中,新闻资讯类产品比如有今日头条、一点资讯、趣头条等;短视频类产品有抖音、爱奇艺、微视和美拍等;知识问答类产品有知乎和悟空问答。

对于这样的产品,个性化推荐算法的精准度是非常重要的。这个产品能不能精准定位用户的喜好和偏爱的方向,并且将正确的内容准确无误地推送到相应用户的客户端上,从而给用户带来极好的体验,是用户会否继续使用该产品的关键且重要的因素。

对信息流产品的这些基本的认识,激发了我对推荐策略的兴趣,也引起了我的一些思考。

推荐系统是做什么的?

我首先想到的是这样一个问题:推荐系统是做什么的?这个问题有很多种回答,从最简单的「就是推荐呗」,到极具专业性的定义,不一而足。但是我希望寻找到的,是一个足够具体能够描述清楚推荐系统的任务,又足够抽象以便抓住它的核心特征的描述。

在我看来,推荐系统是一个能根据用户的喜好,在内容池中选取合适的内容,推送给用户的系统。

怎样才算是一个好的推荐系统?

「细节总是藏在模糊的用词中」。

在这样一个对推荐系统的阐述中,有两个模糊的用词:「喜好」与「合适」。显而易见,推荐系统是在内容池和用户群体之间架起了一座桥梁。而这座桥梁架得好不好,就要看内容是否「合适」了用户的「喜好」。因此,一个好的推荐系统,要能够判断用户的喜好,并且要能判断内容是否能匹配用户的喜好。这就意味着,推荐系统需要能在一个可以相互比较的体系中,准确地评判用户与内容两个方面,并对他们进行匹配。二者的匹配程度越高,或者说相似程度越高,那么这个推荐系统就越好。

怎样评判用户与内容?

用户与内容本是两个维度的事物。现在推荐系统要在同一套体系中可比较地描述用户与内容,这无疑是个难题。站在产品经理的角度,我认为可以用「标签化」的方式来描述用户与内容。

一个人可能会有多种喜好。比如说他可能喜欢 NBA,喜欢汽车,喜欢美女。那么就可以说他有这三个标签。同样,一个内容(可以是文章或是视频或是其他有内容的东西)可能涉及多个方面,比如可能涉及 NBA,也可以同时涉及美女(比如 NBA 场上的篮球宝贝)。这样一来,我们就可以在一个统一的标签体系中,对用户和内容进行比较了。

怎样的标签体系才能算是一个好的标签体系?

既然确定了要用标签来描述用户和内容,接下来的问题自然就是:「怎样的标签体系才能算是好的标签体系」。

在我看来,一个好的标签体系至少应当有以下几个特征:

  • 全面;
  • 树状结构;
  • 数值化。

「全面」很好理解。如果一个标签体系只能描述 50% 的内容,剩余的 50% 内容只能标记为「其他」。那么显然这个标签体系不堪使用。因此我们说,一个好的标签体系应当足够全面,以便能够覆盖尽可能多的内容和用户。

「树状结构」的概念则需要一番解释。

仔细想想,我们不难发现,标签应当是分级的。比如「体育」这个标签下,可以有「篮球」、「足球」等各种运动;「篮球」这个标签下,又可以有「NBA」、「CBA」等各种联盟;「NBA」这个标签下又可以有各支球队,比如「湖人」、「火箭」等;球队下又可以有各个队员,比如「湖人」下可以有「科比布莱恩特」。再举一个例子,「汽车」下可以有「宝马」、「奔驰」等品牌;宝马下可以有「宝马 3 系」、「宝马 5 系」等系列;「宝马 5 系」下可以有「宝马 X 530」等具体型号。

这样一来,标签体系应当是一种树状的结构,即同一个标签下可以有多个同级的子标签;多个子标签可能有同一个父标签。我们认为,如果一个用户或者内容被打上子标签,则他同时具有各级父标签。

我们可以通过这样的例子来说明树状结构的好处。比方说一个用户被打上了「宝马 X 530」的标签,那么他同时具有了「宝马 5 系」、「宝马」、「汽车」等各级父标签。考虑到同一时间段描述「宝马 X 530」的内容不会很多,如果一味地给该用户推荐「宝马 X 530」的内容,则很快会陷入没有内容可推的状态。但由于我们的标签是树状的,于是我们可以假定用户对宝马 5 系旗下其他车型感兴趣,或者对宝马旗下其他系列感兴趣,又或者也可能对汽车这一标签下其他话题感兴趣。据此,我们就可以做更丰富的推荐了。

「数值化」可能是最重要的一个特点了。

我们注意到,标签是一个文字性的东西。它一不方便比较,二没办法计算。这样一来,我们就很难用计算机对它们进行高效、有效的处理。因此,我们需要将标签数值化,具体来说是给各个标签附上权值,来方便处理。

举例来说,A、B 两篇文章都是关于车展的。那么显然,两篇文章都不可避免地会跟「汽车」和「美女」相关。我们假定它们都有这两个标签。但是不同小编写的文章,会有不同的侧重。比如说 A 文章大概 80% 的内容跟汽车相关,剩下 20% 的内容跟美女有关;反过来 B 文章大概 30% 的内容是关于汽车的,剩下 70% 的内容在描写美女车模。这样一来,相较于用纯粹的文字描述,A、B 两篇文章的面貌就清晰多了。

继续举例,假设有 a、b 两个用户。根据用户画像,a 对汽车很有兴趣,兴趣值大概有 75%;对美女则兴趣缺缺,兴趣值只有 25%。用户 b 则相反,对汽车没太大兴趣,兴趣值只有 15%;却对美女异常感冒,兴趣值达到了 85%。

根据这样数值化的权重,显然,我们将文章 A 推荐给 a 用户以及将文章 B 推荐给 b 用户是比较合适的。

再深刻一点,我们可以建立一个直角坐标系,以横轴表示汽车这一标签的权值,以纵轴表示美女这一标签的权值。在这样的坐标系中,同时具有内容(红色矢量)和用户(蓝色矢量)。推荐系统需要做的事情,就可以简化为寻找夹角最小的红蓝矢量了(也就是夹角余弦值最大的两个红蓝矢量)。显而易见,应当将内容 A 推送给用户 a;相较而言,不应当将内容 B 推送给用户 a。

怎样为内容打标签?

站在产品经理的角度,有了思路,就要想办法实现。那么现在的问题是,怎样为内容打标签?

最粗浅地,我们可以召集大量人手,用人工的方式逐一检阅所有内容,然后为它们打上合适的标签。显然,这种方式准确度较高,但是费时费力,成本也高。

高级一点,我们可以通过各种算法,探寻文章或视频的主题,然后为内容打标签。这种方式自动化程度高了不少,成本自然就会降低很多;但这种方式依赖于算法的能力,不可能达到特别高的准确度;或者达到高准确度的代价很大。

站在产品的角度,我们还可以采用众包众审的方式给内容打标签。这种方式成本较低,同时可以收获较高的准确度。

举个例子,Bilibili 上的视频默认是没有标签的,而 B 站允许用户自己给用视频打标签。比如某个视频是关于「炮姐」的,用户看过这个视频之后,就会给它打上这一标签。站在产品后台,我们可以看到很多用户都给视频打上了标签,并且统计到有 80% 的用户都给它打上了「炮姐」这一标签。那么我们就可以认为这个视频具有「炮姐」这一标签的可能性很大。

这种做法也会有一些令人担忧的地方。比如说,有可能 80% 的用户觉得这个视频很搞笑,于是顺手就给这个视频打下了「哈哈哈」这样的标签,那么系统可能会认为「哈哈哈」就是一个标签;但这显然是不合适的。这种情况,就需要人工或者算法介入,及时纠正这种标签。

怎样为用户打标签?

同样,我们也需要为用户打标签。

用户标签反应的是用户内在的喜好。这种内在的喜好我们是无法观察的。我们能观察到的,只有用户主动暴露在外的行为,然后通过这些行为,去推测确定用户的喜好。

用户主动暴露在外的行为可以分为两类。一类是我们主动出击去探寻的,比如我们可以采取问卷调查或者访谈的方式,主动去询问用户的喜好。二类是我们被动去收集,比如可以收集用户点击内容、对内容点赞点踩、对内容进行转发、对内容评论等行为,以此来推测用户的喜好。通常而言,主动探寻的方式成本较高,且难以大规模收集数据;被动收集的方式成本较低,能够大规模收集数据,但是往往在「冷启动」阶段会遇到困难。

假定我们在冷启动之后,有能力通过用户行为给用户打标签。那么一个需要我们解决的问题就是在冷启动阶段,如何留存住用户,同时暴露尽可能多的用户行为?这里有几个可能的办法。

在用户注册或者初次登录时,在 App 界面弹出一些常见的标签,供用户选择。这实际上是通过问卷调查的方式,主动收集用户的偏好。借此,我们就能够对用户的喜好有基本的了解,进而给用户推送相对合适的信息,尝试在留住用户之后,收集其行为数据,再进行精准推荐。

有些用户可能会选择跳过这些问卷调查。此时,在主动的方面我们没有探寻到用户偏好,在被动的方面我们没有任何数据可供参考。于是,我们只能推荐一些用户普遍具有点击欲望的内容;比如一些「三俗」内容,比如一些新奇的、反常规的内容以抓住用户眼球,以图后续对用户行为的数据进行收集、分析,进而去做推荐。

关于推荐系统,还有一些站在产品经理的角度需要考虑的问题。比如用户是在哪里查看我们的推荐的(App 还是 Web 端?),会否对偏好造成影响?用户是用手机、iPad 还是 PC 观看的?用户使用的是流量还是 Wi-Fi?用户使用的设备是什么品牌型号的?这些都有可能暗示着用户的观看偏好,需要在推荐策略上进行调整。