存储 频道

黄波:AI技术在知乎的应用实践

  【IT168 技术】导语:本文根据知乎AI团队技术负责人黄波于第十届中国系统架构师大会(SACC 2018)的现场演讲《知乎如何利用AI理解内容和用户》内容整理而成。

  讲师介绍

  黄波,知乎AI团队技术负责人。负责知乎NLP与用户画像相关技术与业务。硕士毕业于北京大学智能科学系,曾在JMLR、ICLR等国际顶级期刊及会议发表多篇学术论文。在加入知乎前,曾任百度自然语言处理部门高级算法工程师,从事智能交互、语义表示、语义标签、内容质量的研发工作,参与了度秘、百度feed流等产品的关键技术突破。

  正文:

  大家下午好,非常感谢SACC大会的邀请,我今天演讲的主题是AI技术在知乎的应用,内容重点介绍偏底层的相关技术,包括知识图谱、内容分析与用户分析。最后会简单介绍这三块技术在相关业务线的应用。

  一、知识图谱的构建与应用

  我们先来看一下知识图谱,知识图谱的构建包括三个核心要素:本体、本体属性以及本体间的关系。其构建过程大概分三步:第一步基于互联网上结构化和半结构化数据抽取本体信息,再通过知识融合构建统一的本体库,这里本体通常包括实体、概念、事件等;第二步我们会挖掘本体的属性以及本体间的关系,比如本体“勒布朗 詹姆斯”的类型属性是”人物”、领域属性是”体育“,与本体”德怀恩 韦德“有较强的相似性,与本体”NBA“属于上下位关系等;第三步是知识图谱的表征,我们可以利用离散如 RDF 规则语言和基于神经网络的 embedding 方式来表示知识图谱。

  我们在构建知识图谱时主要以知乎话题为核心,将百科词条与话题进行融合构建本体库,并丰富本体的内容信息,包括名字、描述、解释等,同时会挖掘本体相关的属性,例如本体的类型是人物还是地点,以及对应领域属于互联网还是体育。

  本体关系的构建分为两种,第一种是话题的上下位关系,上图中可见,韦德的上位话题是NBA球员;另外是话题的相似关系,比如说话题“韦德”和话题“詹姆斯”的相似度就非常高,话题上下位为有向关系,相似关系为无向的。另外也有本体和属性之间的关系,“詹姆斯”对应一级领域为“体育”、二级领域为“NBA”,对应的类型为“人物”。

  对于知识图谱的表示,主要有两类方法,一类是离散表示,通过各种规则语言如RDF等描述结构化的知识,离散表示的优点是直观,可解释性强,此外通过规则语言也能很好地支持较为复杂的结构化知识,当然缺点也比较明显,比如离散表示存在的稀疏性问题,可扩展性也相对较差。另一类是近几年比较流行的连续表示,通过神经网络等方法学习结构化知识的 embedding,将结构化知识映射到低位稠密的空间,最大的优点能够很方便被用于各种上层计算,比如作为神经网络模型的输入等,缺点是可解释性没有离散表示强,表示能力也稍微弱一点,对于较复杂的知识结构不能很好地支持。

  下面简单介绍知乎知识表示的模型,我们主要围绕话题为核心来做语义表示。下图是一个例子,问题标题是“科比和詹姆斯的区别在哪里?”,相应的会打上相关的多个话题,包括“NBA”、“科比”,“詹姆斯”等。模型输入层包括话题的 embedding 表示,同时加上窗口对应词的embedding,预测目标为窗口的中心词,此外模型预测目标还加了其他两个任务,一个目标是用话题的embedding去预测其对应的领域,另一个是预测其对应的类型。

  模型训练完之后,可以将话题“詹姆斯”和其他话题以及所有的词映射到同一个语义空间里。有什么用呢?既然大家都在同一个语义空间里了,基于话题之间的相似度我们可以构造一个话题的相关性图谱,这里有一个相关性图谱的例子,输入给定话题“Facebook”,相关性图谱可以输出 与其相关的话题,例如 “扎克伯格”、“Facebook广告”、“Twitter”等,相关性图谱可以用在用户潜在感兴趣话题推荐,用户兴趣图谱构建等场景。

  二、内容分析实践

  讲完知识图谱,接下来讲内容分析。什么是内容分析呢?简单来说就是给内容打上各种各样的标签,包括语义层面的一二级领域、话题、实体、关键词等标签。这里有一个例子,关于物理的一个问题——“有哪些看似荒谬的事,却有着合理的物理解释?”,这个问题对应的一级领域是 “自然科学”,二级领域是“物理学”,另外还有粒度更细的话题,包括 “科普”、“物理科普”、“冷知识”等等。在语义维度标签基础上,我们还会打上内容的质量标签,内容质量包括专业性分析和题文相关性分析,专业性分析是通过文本分析模型判断某个回答/文章内容的专业性,并给出判断其专业性程度的打分,题文相关性模型则是给出回答与问题的相关性打分。最后会基于文本分析模型来判断内容的时效性,时效性标签是上层推荐系统很重要的一个特征,比如低时效的优质内容可以一直在推荐系统里流通被用户消费,而如果是高时效性的优质内容则应该短时间加大其分发量,并且过期之后就不能再让它流通了。

  关于语义标签,我们由粗到细构建了一个完整的语义标签体系,包括一二级领域领域、话题到实体/关键词等。为什么要做这种多粒度的语义标签?不同应用场景对语义标签粒度需求不一样,另外对不同粒度的语义标签要求也不一样,比如一二级领域我们希望它是一个粒度相对较粗并且尽量完备正交的分类体系,以尽可能保证任何一篇内容都能被分到对应的一二级领域,话题粒度的标签我们希望模型能够高准确度地打上相关话题,类似地,针对实体/关键词,要求模型的准确度比较高,优先保证热门的实体/关键词被召回就可以。

  接下来通过具体展开来讲几个模型来介绍我们怎么做内容分析。

  内容分析——领域分类

  首先是领域分类,当时做的时候面临最大的问题是没有训练数据,在梳理出分类体系后,对应的分类体系没有相应训练数据,短期内通过人工标注也不太现实,那要怎么构建训练数据呢?我们基于知乎数据每个问题都带有相关话题的特点,再结合以话题为核心的知识图谱,构建了一个带噪声的训练数据集。可以看下面这个例子,对于问题“零基础如何学绘画?”,其对应的话题有“绘画”和“自学”,而“绘画”在知识图谱里面所属的一级领域是“艺术”;“自学”所属的一级领域是“教育”。这样的话,这条训练数据就会同时有“艺术”和“教育”这两个类别,但对于这条数据来说教育在这个类别是错的,也就是属于噪声标签。为了降低噪声对模型效果的影响,我们在模型训练时加入了降噪层来进行降噪,同时预测阶段通过 ensemble 模型的方法进行预测。

  对于传统的文本分类方法,一般是预处理后,结合人工特征和浅层分类器为主的方法。最近几年比较流行基于神经网络的 end2end 文本分类模型,比如说 FastText,TextCNN和RNN/LSTM等文本分类模型。我们选取 LSTM 作为 baseline 模型,但 LSTM 包括上述其他模型都不能很好地降低噪声数据对于模型的影响。

  模型展开来讲主要分为两部分,模型左边的输入是问题标题中的词(question title),每个词会对应一个 embedding,词的 embedding 经过一个LSTM层后再过一个Attention 得到问题的表示;右边部分的输入是问题自带的话题(question topic),同样话题也会有对应的embedding层,把话题表示加起来再通过一个 Identity+ L1 Noise 的降噪层得到这个话题降噪后的表示。损失函数层面,我们没有采用常用的交叉熵作为 loss,因为在构建训练数据时,我们发现同一个数据可能会出现多个标签,有时候一个问题确实可以属于多个领域,而有时是噪声数据,采用交叉熵损失较难降低噪声数据的影响。我们采用了 sigmoid 损失加最小熵正则约束的方式来训练模型,sigmoid 损失是多标签任务常用的损失,尽量让模型把多个正例标签都预测为1,但是标签之间没有竞争关系,我们又加上最小熵正则来让标签之间产生竞争以增加模型的降噪能力。在模型预测阶段,我们采用了多模型ensemble的方式,考虑知乎数据带有话题的特点,并且话题都是用户打的,用户打的好处就是可以引入额外知识,当然也会带来一些噪声,我们单独训练了一个基于话题的文本分类模型,会和基于标题的模型ensemble起来进行在线预测。

  内容分析——话题匹配

  我们再看一下话题匹配。话题匹配是一个文本多标签任务,它的定义是给定一段文本,从给定话题集合中匹配出相应的话题,以自动给问题、文章、Live等进行相关话题标注。这里有个例子,对于问题:“如何评价美剧西部世界”,模型会打上“西部世界”、“西部世界第二季”、“美剧”、“人工智能”等话题,大家平时用知乎提问,问题提出后模型就会推荐出相应的候选集。另外对用户搜索Query模型也能打上相关话题,可以用作搜索特征或用户兴趣画像的沉淀等。

  我们在分析时,发现话题匹配这个问题非常难,到底难在哪?难点可以拆成以下三点:第一,话题本身语义粒度的差异特别大,大到领域级别的“娱乐”这种话题,小到“吴亦凡”这种实体级别话题,这种语义粒度差异特别大的情况会让模型很难去学习;第二,话题集合数非常大,大概有10万量级,长尾话题(出现次数小于10)特别多,占比大概80%以上;第三,部分话题之间语义相似度特别高,例如“Python”和“Java”,“插画”和“绘画”这种,通过深度学习模型较难去捕捉这种细微的差异。我们尝试过很多端到端的深度学习方法,包括经典的 FastText、Matching CNN和LSTM+Attention等端到端的方法,这些方法都有一个问题,模型倾向于去预测偏高频 话题,低频、长尾话题的效果较差。

  针对上述问题,我们将话题匹配进行了拆解,类似推荐系统一样,包括召回+排序两部分。召回的逻辑是给定候选问题,我们先从标签库里找出数十个最有可能相关的候选话题,在对这候选的数十个话题进行精细的排序打分,最终得到1到5个相关话题。模型效果还算不错,准确是93%,召回是83%。

  接来下具体展开讲下召回和排序的策略,召回层分三个策略,第一个是比较简单的AC多模匹配,直接把匹配的话题作为候选集合;第二个比较有意思,我们在经典的点互信息(PMI)算法上做了优化,提出了一个两趟对齐算法的PMI算法,解决了传统PMI不能很好区分 “Python”和“Java”这种经常共现的兄弟节点的问题;最后我们会利用之前构建的知识图谱,把话题的上位话题也作为候选集合召回。

  在排序的时候,刚才也有提到单一的端到端模型不能很好地解决话题匹配任务中的问题,我们在深度学习的模型基础上,引入了一些规则策略,最终是一个多策略融合的排序模型。如上图,我们采用了基于LSTM的 pair wise 排序模型。左侧输入是文本的词,词上面接一个 embedding 层,过一个 LSTM层后再过一个Attention层来得到一段文本的表示,右侧分别是正负话题标签,话题上同样接了一个embedding层,再过一个全连接层后得到话题的表示,再将其和该段文本的表示计算相似度,分别计算正负样本与文本的相似度后,最后再计算 pair wise的损失。此外我们还加三个基于规则的排序打分,第一个利用了当前话题与召回阶段得到的数十个话题的相似度得分,思路是正确的话题会倾向于跟召回阶段的大部分话题都比较像,第二个规则我们利用了话题图谱权重来进行打分,最后一个规则比较直观,会对完全匹配的话题进行加权。

  内容分析——专业性

  最后再讲讲内容的专业性分析,知乎鼓励大家去生产专业性的内容,同时也希望专业内容在知乎得到更多的流通,但难点是机器怎么知道内容是否具有专业性,或者说推荐算法怎么知道内容的专业性程度,通过文本分析模型判断内容专业性是非常必要的。专业性识别的难点主要在于定义比较模糊,针对具体的一条数据很容易判断它的专业性,却很难制定出一个具体的标准,因为不同领域内容判断其是否为专业性的标准差异很大,另一个难点是缺少高质量的训练数据。

  专业模型大概分了两个阶段,第一阶段主要利用用户行为,我们分析发现针对专业性内容,用户更倾向于收藏,很直观地思路是,我们利用hits算法对用户创建的收藏夹和收藏夹的内容进行建模,计算出的每个收藏夹权重及对应收藏夹里的内容权重,在此基础上计算出内容的专业性得分。

  这个方法优点是准确度非常高,缺点是覆盖相对较低,因为是基于用户行为会有一定的滞后性,没法判断新内容的专业性。在第二个阶段,我们采用了基于文本语义分析的分类模型。这里采用了传统文本分类的人工特征加浅层模型的思路,为什么不用深度学习呢?刚才也提到训练数据获取成本很大,我们大概只有几万条训练数据,而专业性的回答和文章又特别长,直接上深度学习,模型大概率会过拟合。我们的人工特征主要包括两个层面。第一个是文本风格的特征,包括词性,还有标点之类的。另一个是非常重要的语义特征,我们基于全量语料对词进行聚类,并把词的类簇当作专业性模型的一个基本特征,最终专业性的效果准确是84%,召回是60%,应用于首页推荐页也取得了收藏率和点赞率等指标显著提升的正向效果。

  三、用户分析实践

  在理解完内容后,我们也需要对用户进行分析,简单来说就是给用户打上各种各样的标签,同时也会对用户社交关系的进行挖掘与建模,比如用户聚类、用户亲密度等。用户分析首先会分析用户的基本属性,像性别年龄以及用户本身的一些登陆地、设备信息等基本属性。然后就是用户兴趣的建模,兴趣计算主要来源于用户对推荐系统的交互行为,我们构建了基于不同粒度语义标签的用户兴趣以灵活支持多种场景,并且时间上也分为长期兴趣和实时短期兴趣,另外也可以根据内容的专业性标签和用户的交互行为判断其对于专业性内容的偏好。这里是一个用户分析的例子,对于“程序员张三”这个用户,我们能获取他的以下画像信息:性别 “男”,兴趣标签有“AI”、“机器学习”,更喜欢看专栏文章这种内容类型的资源,对回答、视频等类型偏好度较弱,另外也更偏好阅读专业性的内容,说明“程序员张三”喜欢在知乎学习计算机和机器学习相关的专业性知识。另一个用户 “运营小丽” 则区别很大,她喜欢看综艺和电视剧相关的讨论,对专业性内容偏好较弱。

  用户分析主要依赖于用户和推荐系统的交互行为数据,这里就要求我们能处理好大数据量的离线计算和快速实时计算等大数据相关工作,并且还需提供高并发低延时的在线服务,我们设计了一套完善的离线与在线计算架构,以支撑策略更新和上层业务调用需求。整体架构上分了三大块,第一部分是实时计算,包括用户实时行为存储,用户实时兴趣计算等。第二部分是离线计算,包括模型迭代后的数据批量更新,包括用户基本属性、用户长期兴趣建模、用户聚类等工作。

  最后是在线服务这一块,离线计算通常是批量计算的逻辑,比如模型天级别更新去批量预测所有用户的性别或者兴趣标签等,但是离线计算的结果需要“灌到”线上服务的储存供业务方调用,如果直接批量将离线计算的结果导入线上服务会导致线上业务请求失效,在线服务也就崩了。我们在流程上先把批量数据灌到离线集群,再通过kafak消息异步流式地同步到在线集群,以保证线上服务的稳定性。另外也会有缓存请求的相关工作,以支持线上高并发的请求。

  下面再介绍下基于spark streaming的用户实时兴趣计算流程。首先我们需要把用户的点击行为、展现以及搜索行为对应的实时数据流打通并进行实时处理,组成一个三元组 <用户、内容、行为类型>。三元组抽取完之后,我们会对内容进行进一步的分析,主要是提取内容对应的领域、话题、关键词等语义标签。为了增加实时处理效率,对问题、文章、回答等内容,可以直接通过 token 到内容画像服务去获取之前已经缓存好的计算结果,而搜索query没法提前算好,需要去调用语义理解模块实时计算获取其对应的标签,比如关键词抽取服务、话题匹配服务等。提取内容标签之后,我们会得到一个 <用户, 标签,行为类型>三元组数据,再以<用户、标签> 进行聚合后,作为最终用户兴趣计算的输入。用户兴趣计算,主要包括新兴趣的叠加,旧兴趣的衰减,策略上会去做一些参数平滑、热门打压等。

  最后是用户表示和聚类,用户表示是指通过神经网络或各种embedding方法得到用户在低维空间的embedding 表示,用户embedding表示可以被灵活应用于各种场景。知乎做用户表示有天然的优势,训练数据非常多,有大量的用户社交关系,即用户间的单向和双向关注行为数据,同时用户也会关注话题、问题、专栏、收藏夹等数据,我们把上述数据揉到一起就组成了一个异构图,再利用graph embedding方法来获取每个用户的表示。

  四、典型业务应用场景

  刚才提到的知识图谱、内容分析以及用户分析,最主要的应用场景是首页信息流推荐。内容分析和用户分析会作为整个推荐系统重要的底层特征,被用作召回、排序阶段。当然召回除了基于内容标签的方式,也有基于协同算法和近几年比较流行的基于神经网络的召回方法。在排序阶段,内容和用户标签也会作为排序模型的输入特征,另外某些标签也可以作为排序模型的目标,比如专业性内容的占比等。

  刚才提到,推荐系统在召回阶段不止可以用基于内容标签的方式,也可以用协同和神经网络的方法,那么用标签来做推荐系统召回有什么优点和缺点?优点我这里列了四点,第一个,可解释性强,粒度越细越准确;第二、会越用越准,能积累长期兴趣;第三、可以对各种标签做比例的精准控制,例如强制要求专业性内容的最小占比等;第四,没有内容冷启的问题,任何打上标签的内容都可以被召回;另一方面基于标签召回也存在泛化性较差、标签不能覆盖所有内容等缺点。

  除了被用在首页推荐的场景,内容和用户标签也可以应用于数据分析以更好地支持业务和产品决策,典型的例子有:分析专业性内容在生产和消费的分布情况、按领域维度对内容生产和消费进行分析、按人群分析比如大学生对于各种内容的生产/消费分布情况。

  最后说下用户表示,它的应用场景很多,典型的场景有受众扩展,简单来说就是可以对种子人群进行扩展;另外就是基于用户表示的用户聚类,还可以进一步对聚类结果进行分析给每一个类打上相应的人群标签,用作人群或者圈子的划分。这里是一个受众扩展的例子,有一些私家课已经有一批点击或者购买的种子人群,现在我们需要找一批用户发优惠券,要保证转化率就要求发给跟这些已经点击或购买用户比较相似的用户, 这里我们就可以基于用户表示计算出与这批种子用户相似的用户。

  以上是我今天讲的内容,欢迎大家进一步交流,谢谢!

0
相关文章