8

2019 看山杯算法大赛解析 Live 实录:详解知乎问题路由推荐系统

 3 years ago
source link: https://zhuanlan.zhihu.com/p/93030223
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

2019 看山杯算法大赛解析 Live 实录:详解知乎问题路由推荐系统

攻城狮。仓鼠、金丝熊爱好者

2019 智源-看山杯专家发现算法大赛已经进入白热化阶段,不少选手在竞赛过程遇到诸多疑问或陷入瓶颈。为帮助参赛选手更好理解赛题和做最后冲刺,知乎联合数据评测平台 biendata 于 11 月 12 日进行了 Live 直播。本文是知乎推荐搜索负责人杨向军的直播实录整理。

本次直播根据实际业务场景的工作流程,介绍了知乎推荐系统的原理、基本模块和数据使用,并凭借自身经验在多个关键环节为选手提供特征、模型等方面选择建议。本文末尾转录了答疑环节,希望能解答选手在比赛中遇到的一些疑问,不断提升模型效果,取得更好的成绩。

Live 直播地址如下,可随时回看:

知乎专家推荐系统-问题路由

知乎目前已拥有超过 2.2 亿用户,每天产生海量的提问,传统的手动邀请他人回答问题功能已经不能满足用户的需求。故知乎专家推荐系统即问题路由应运而生。问题路由推荐系统每日可以对 10+ 万的问题进行分发,并保证问题提问后 3 日内的解答率达到 70% 以上;系统对千万级的创作群体进行精准推荐,经由系统智能分发推荐下每日产生的回答数超过 20 万。问题路由同时也是本次看山杯的题目来源,比赛旨在从选手中征集高效精准的推荐算法,挖掘有能力且感兴趣的用户进行问题地精准推荐。

图:知乎路由工作机制

以创作者推荐问题为例,问题路由主要包括排序、召回、特征落地三个流程,系统首先根据用户 ID 向问题路由发起请求,通过用户画像获取用户特征(年龄、兴趣);然后使用召回模块召回用户潜在能够回答的问题,从数百万的问题中找到几百个问题供排序模块使用;接下来通过特征模块获取问题的相关特征,据此对问题进行精准排序,并将头部问题返回至用户,排序中产生落地的特征会记录在日志中和用于训练模型。本次比赛所解决的问题主要与这一流程相关。

图:知乎问题路由内部实践形式

Ranking 模块

Ranking 模块涉及到特征和模型两个角度。特征对于推荐效果至关重要,本次比赛提供了知乎的核心特征,十分接近实际业务场景,选手的发挥空间较大。在知乎的实际操作中,特征可分为问题侧特征、用户侧特征、交叉特征。

##重点预警##

在问题侧特征方面,由于问题本身是一个20个字左右的短文本,可提取的信息有限,所以有必要利用话题、创建时间等相关信息。在文本信息上,选手可以充分使用所提供的 embedding。知乎在实际操作中,也十分看重embedding。由于问题存在话题特征,回答没有,可以将问题的话题特征作为回答的特征

用户特征包括年龄、性别等基本特征,以及根据用户的历史点击、浏览挖掘的用户兴趣。此外最重要的特征则是用户历史回答特征(时间、长度、字数、赞同数等)。这里需要选手花费时间做特征工程,以提取到大量特征,如总历史回答数、总赞同数、上次回答时间、回答频率、擅长领域等。

在实际操作中如何处理交叉特征?首先可以计算问题话题和关键词的 embedding 与用户历史回答话题和关键词的 embedding 的相似度。其次,可以参考问题绑定的话题在用户历史回答中反馈情况,如赞同数、反对数等。也可以直接将 embedding 作为特征让模型学习。

模型方面,由于实际业务场景中,对运行时间有较高要求(如 500 毫秒),很难使用多个模型融合或者复杂模型,所以倾向于单一模型、多目标多任务模型等。GBDT、GBRank 之类树模型可解释性强、训练时间短、相对稳定。知乎也在尝试深度学习模型,初次上线时效果能高出 GBDT5%-10% 左右,但样本需求和资源消耗较大。ESMM 可以用于多目标任务。

对比赛而言,我们建议选手根据实际情况尝试多个模型,或者进行模型融合,可能会有不错的提升。

比赛数据

知乎选出一个月的邀请数据作为训练数据,以及后面一周的数据作为评测数据,并对数据进行抽样,正样本保留,负样本采样一部分。其中,member_info 是数据集中涉及到的所有人的画像信息;answer_info 是所有人近两个月所有的历史回答信息;question_info 是数据集及历史回答中所有涉及到的问题信息;业务环境真实用到的字、词、话题 embedding 也提供给用户使用。

数据正样本定义是指从发出邀请开始 7 天内用户回答的问题。绝大多数情况在用户是在 1 天内回答的。挖掘用户的回答偏好十分重要。对于样本中没有回答过问题用户,可以多使用其兴趣特征;如果模型无法学习多回答用户和无回答用户,可以尝试拆分成多个模型。

Q&A环节

1.本次比赛知乎内部的 baseline 是多少分呢?

A:比赛用的数据和实际生产环境用的数据处理方式不太一样,我们并没有针对这份比赛数据做过测试,所有在我们生产过程中训练的一些结果,对这次比赛来说没有什么可比性。

2.特征穿越的部分不是非常懂,可以请老师指教一下具体怎么处理吗?

A:特征穿越这块我简单的说一下,我们所有数据集都是有时间的,有一部分时间上的重合。比如举个例子,我们从历史回答里挖一个特征叫用户的最后回答时间,假如他是 15 号,我再用 1 号的训练集的时候用这个特征的话就发生了穿越,因为在1号的时候他肯定没有回答这个问题,就是说你不要用到未来的特征。

3.召回使用到的 embedding 会用到排序模块吗?

A:目前召回部分的 embedding 是没有用到排序的,我们的召回和排序是两个独立的模块,但 word、topic 等的 embedding 是用在排序模块之中,且重要度很高。

4.对于一些新创建的问题,它们缺少许多历史特征,请问对于这样的问题有做什么特殊的工作吗?

A:我们问题路由的场景其实很大程度上也都是应用于新问题的,这个也是实际生产环境中经常遇到的问题。所以实际上我们应用的对问题的一些统计特征,用的也不是特别重要,我们用的比较重的其实还是问题的文本、embedding、话题这些工作。

5.数据不平衡问题似乎在数据集里体现得不明显,现实中也是这样的吗?

A:这里说的数据不平衡是指正负样本比吗?比赛数据集我们是剔除了一些负样本的,实际情况中负样本要比现在的数据集多一些。

6. 目前想用推荐算法的思路做做这个比赛,希望能构建 user-item matrix,然后使用协同过滤算法,但不知道 matrix 中填充什么数值比较好,希望能给予指导~!

A:按照正常的协同过滤的逻辑,应该在 matrix 填是否有回答、赞同这样的正向交互行为,但是这个思路可能不适用于本次比赛,而且测试集里大多是新问题,只用协同的效果可能不是很好。

7.问题和话题的 embedding 和实际运用中是一致的吗?或者说是否准确?我们是否还需要自己重新训练 embedding?

A:我们发的embedding就是生产环境真实在用的 embedding,这个 embedding 不是用比赛数据集训练出来的,是我们用知乎全站的数据集训练出来的,大家可以放心使用。

8.能分享一下文本特征怎么用吗?词级别 embedding 的聚合方式?

A:Embedding 的聚合方式很多,像取 average,max,min都可以试一下,我们内部用的比较多的是取 average。

9.请问你们会用到句子的 embedding 吗?比如整个回答,整个问题文本的 embedding,而不是单字单词?

A:相对来说,我们用单字的情况还是比较少的,用词和topic比较多。整个句子 embedding 我们还在尝试。比如话题来说,我们还是对问题的话题取一个平均的 embedding;对于人的历史回答,取一个平均或加权平均。然后两个 embedding 去做相似度计算,算出 cos 的相似度,这样做一个交叉特征,效果是不错的。

10.请问像话题特征这样数万维的稀疏特征应该如何处理比较好呢?

A:如果是用一些传统的机器模型,比如 XGboost,可能就是直接取一些交叉吧,比如说问题的话题和用户的历史回答话题有没有重合,问题的话题和用户的兴趣有没有重合;但对于深度学习的模型来说上万维不算高,应该直接做特征做一个 one-hot 或 multi-hot 都还好。

11.关于 embedding

A:Embedding 聚合方式很多,多个话题 embedding、求 average、或 concat做出长的向量,深度学习适合这种方法;如果用传统,根据平均值求相似度比较合适。

12.请问用户历史回答的文本 embedding如何使用呢?

A:大家可以用回答表,按照用户维度进行聚合,挑选出用户最擅长的话题或者词,字的话效果可能不是很好。挑选出这些话题或者字之后,可以求一个 average pooling,也可以求一些 sum pooling,也可以去除 top3 或者 top5,直接 concat 作为长向量也是可以的。

13.知乎有用到除 pointwise 的排序学习吗?样本顺序标注是怎么做的?

A:pointwise 应该是不需要考虑样本之间的顺序的。

14.邀请数据中许多问题被多次同一时间或不同时间推荐给了相同用户,这个怎么理解?都是脏数据吗,还是含有特殊含义,比如用户追答。

A:这个问题如果真的发生了应该是脏数据,我们确认下数据的比例。如果比例不大的话大家可以自行处理掉。在真正的生产环境下,对于同一个问题我们只会给同一个人发一次。

15.除 pointwise 之外,知乎有没有用到 pairwise 的排序学习?样本顺序标注是怎么做的?

A:Pairwise 我们是有用到的,对于生产环境来说是比较容易做到有顺序的。

16.请问实际业务中训练模型 (gbdt/nn) 的数据量会有多大,是不是数据量增加到什么程度模型效果就不再提升?请问你们有没有通过这种实验来确定用来训练模型的数据量?

A:在实际生产环境中,相对来说数据规模越大效果越好,目前还没法确定规模达到什么程度才是最好。因为数据规模往往受到计算资源的限制,如果计算资源允许的话我们肯定希望数据规模越大越好。

17.那字词话题的 embedding 是用什么方法得到的呢?

A:字词话题的 embedding 使用 doc2vec 的思路做的,原理大家可以在网上搜一下公开的论文。字、词、话题都是在同一个向量空间,可以进行相似度比较。

18.想问一下,用最近几天的数据做验证集好还是随机抽取验证集效果好?

A:按照实际的应用情况来说,验证集最好还是按照时间维度去切分要比随机抽取效果好一些。

附比赛信息

2019 年 9 月,北京智源人工智能研究院联合知乎、数据评测平台 biendata,共同发布了近 200 万用户和 1000 万邀请数据的 Link prediction 大型数据集,并同步开放了评测竞赛(2019 年 9 月-12 月 16 日),总奖金 10 万元。以下是比赛的详细介绍、报名入口和实时排名。

2019 看山杯比赛地址:

2019看山杯赛题简介

2019 看山杯实时排行榜:

实时排行榜


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK