编程技术网,编程语言,IT新闻,code,代码审查

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

2019-03-13 12:47

cad 2007,腋下脱毛方法,桂林现天价鱼,股本总额,北京375,乞力马扎罗的雪txt,租办公室,itunes同步

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

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

内容分析——领域分类

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

>

模型展开来讲主要分为两部分,模型左边的输入是问题标题中的词(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等端到端的方法,这些方法都有一个问题,模型倾向于去预测偏高频 话题,低频、长尾话题的效果较差。

上一篇:编程语言:开发人员的所爱与所恨

下一篇:泛在电力物联网概念再爆发:NB