ITBear旗下自媒体矩阵:

Peacock: 大规模主题模型及其在腾讯业务中的应用

   时间:2015-01-07 15:00:56 来源:ITBEAR编辑:星辉 发表评论无障碍通道

大家好,我来自腾讯的效果广告平台部,参与开发的广告平台是广点通,广点通目前是腾讯最大的效果广告平台,每天承接的流量接近150亿PV,未来其实应该会达到200亿PV的流量,这是非常海量的流量。作为技术人员,我们在腾讯的梦想就是希望腾讯变成更加技术型的公司。我们团队在广告部门所负责的主要工作是各种机器学习工具的开发,以及利用机器学习工具处理腾讯的用户数据挖掘。之前互联网广告业务有两大机器学习系统,第一大系统 Logistic Regression,广泛用于广告点击率预估;第二大系统就是隐含主题建模(Latent Topic Model)。这两大系统早期都是由谷歌推动的,然后传播到国内的各个互联网公司。当然,现在由于深度学习的兴起,最近广告业务中又增加了一套基于 DNN 的系统。

在隐含主题模型方向上,我们从 2010 年开始就不断的做一些探索,我今天要讲的Peacock 系统就是我们团队在主题模型建模上的工作。今天的报告主要分成如下几个部分:我先Demo一下我们Peacock系统是如何工作的,随后简单介绍一下主题模型的背景,接着介绍Peacock是怎么来实现大规模并行计算的,最后我们讲一下主题模型在腾讯业务中的应用。

先来讲几个例子。用户在网络上的行为会留下很多的数据,其中最典型是一些文本数据,你搜索的一些文章,你发的微博,我们通过自然语言处理技术理解这些词。第一个例子是用户搜索了“红酒木瓜汤”,这样的Query给它展示什么广告? 单纯的从关健词来说,多是酒或者水果。第二个词是“苹果”,苹果实际上是多义词,可以是水果也可以是手机。第三个词“莫代尔”,在座的估计很多人不知道这个词是什么意思。

如果我们把这些词输入Peacock系统,我们看看系统会产生什么样的输出。我们可以看到Peacock 系统打印出很多行,每一行其实代表一个主题(topic),“红酒木瓜汤”系统给出的第一个主题的语义解释是 "减肥、丰胸、美容" ,从广告系统的角度,如果能够展现跟女性减肥、丰胸更相关广告,这个点击率可能高。我们发现整个Peacock的系统处理文本语义的时候,不同的主题有不同的权重,展现的时候按照主题权重排序,而每个主题用一包词描述。

我们看下一个例子,我们如果把"苹果"输入Peacock,我们打印出来几行,第一行 " 苹果、收集、iphone、电脑..." 基本上讲苹果手机,第二行"范冰冰、苹果、电影、佟大为...",这一行就是讲范冰冰和佟大为拍的《苹果》电影。第三行还是讲手机,第四行" 千克、大米、苹果...",这个是讲水果。 所以系统对"苹果" 给出了多义词的解释。我们改一下输入,比如说输入"苹果大尺度",我们会发现这时候排在第一位不再是苹果手机,排在第一位是范冰冰《苹果》电影。从语义排序来说,传统的排序处理方式很难发现这个语义是跟电影相关的。如果把输入修改为"苹果价格",我们发现,这个系统排在第一位就是苹果手机。

最后一个例子"莫代尔",Peacock 输出的第一个语义是什么?"内衣、饱暖、性感...", 之前我并懂这个词,这个词我们在网络上搜一下才发现,莫代尔是一种内衣的材料,一般男性都不太清楚,女性可能知道。所以对于一些长尾语义,系统也能挖掘出来。

总体上这是我们系统做的事,我们把系统命名为Peacock,孔雀,原因我们是觉得互联网需要挖掘长尾的语义,主题模型能够突破传统处理的一些限制,挖掘数据里面深层的隐含语义。这个系统是由王益博士主导设计的,我们团队从2010年开始陆续折腾了四年,在这个方向有很大投入。

接下来我们讲一下主题模型一些背景。在座的来自各行各业,有可能有人不太清楚什么是隐含主题模型,我用几张幻灯片介绍一下主题模型背后的含义。传统的文本建模,譬如语言模型建模,基本假设是一个词按照概率跳跃到下一个词再跳跃到下一个词,这种 NGram模型解决语音识别、机器翻译的时候非常有效。另外一种文本建模的方式就是隐含主题模型,这个假设是怎么样的?是说人写文章的时候其实先设定主题,然后由主题生成词的,而不是第一个词生成下一个词。举一个例子,假设一个记者想写一篇文章报道我们技术大会,文章可能有不同的几个主题,我们把不同的主题理解为用词的不同,讲到计算机这个主题,可能会用到"内存、硬盘、CPU、编程语言、C++ ..."等这些词,讲到晚宴这个主题的时候,可能会用到 "晚宴、酒..." 这些词。 在建模的时候,主体模型认为,不同的主题是用词的概率分布来描述的。

基于上面的假设,我们实际上是使用一个三层结构(幻灯片上的)在写文章的:黑节点代表文档,中间的不同颜色节点是不同的主题, 蓝色节点代表词。每个词在文档中的生成过程是:文档先选定一个主题,然后由主题选定一个词,这就是最传统的主题模型。这里面问题是这样的:我们做了这个模型假设以后,其实我们观察到是文档和词,左边和右边的节点是我们观察到的,中间这一层节点是隐含层我们观察不到。文档和主题之间的边上有概率分布,主题和词之间的边上也有概率分布,每一条边粗细的区分意思是说概率不一样。

这个模型中我们假设每一条边表示一个概率值,对应一个模型参数。 这个是传统频率派的模型,叫 PLSA 模型,在贝叶斯统计理论框架下,任何一个参数都是随机变量,每一个概率边对应的模型参数都有一个先验分布,引入这个先验后PLSA模型就被改造成了LDA 模型。在主题模型中,整个文档生成过程就是走概率路径选词的过程。譬如,这个词可以从红色这条路径生成,也可以从绿色、蓝色这条路径走。如果说文档生成的时候,中间的隐含主题层能够被观察到,模型训练实际上就变得特别简单:参数预估的时候统计数数就行了,把数数出来频率计数放在每条边上,最后做一个 Normalization 就变成一个参数概率预估值。

问题是中间的隐含层是观察不到的,观察不到的时候应该怎么做?这个模型怎么训练?数学家给我们提供了一种漂亮的方式:分三步就可以把模型训练出来。

第一步,中间的隐含主题我们不知道,那首先每个词的主题随机给。譬如第一篇文章,我们让第一个词走红色这条路径生成出来,第二个词也走红色路径,第三个词走蓝色路径,每一个词走哪个路径先随机给。随机给完以后我们可以数数了。左边的边上数出文档到主题的计数,右边的边上数出主题到词的计数,有了这些计数就可以估计模型的两类参数:文档到主题的概率值和主题到词的概率值。于是每一条边上都有模型参数的概率估计值。

第二步,就是重新的采样每个词对应的主题,物理含义就是按照概率分布重新走路径。对每一个词我重新选一条路径,第一个词刚开始走红色这条路径,现在评估一下走红色这个路径好不好,这个词有三条路径走到这里,走红色、绿色、蓝色,我们把三条路径概率都算出来,原来走红色的路径我重新采样之后变成走蓝色的这条路径。整个模型训练里面就是对每一个词重新走一下路径,如果原来走红色现在走蓝色了,红色路径的频率计数减1,蓝色路径变成加1。

第三步,重复上面的采样过程,这直到模型收敛。 只要不断简单迭代每一个词,确定一下应该走哪个路径,然后整个语料大约迭代200遍,这个模型就能收敛,非常简单。所以这个模型训练我们其实做什么事情?每一个词我们只要随机给完以后,我们对每一个词的主题做重新的采样,确定一下原来路径好不好,不好我就调整一下,唯一做的事情就是在所对应的路径的边的上做统计计数,这个就是LDA 主题模型的直观解释。

就是这么一个简单的模型要把它做大规模并不容易。去年之前没有人把这个模型中间层做大,做到100万的主题,我们实际的工业应用中遇到了很多问题,我们团队遇到很多的问题,有三个问题我们列在这里。

第一个问题就是如何提升采样的速度,也就是说你从一条路径换到另外一条路径的时候,换的速度太慢了,我们需要有一个更好的算法,把这条路径切换到另一条路径。传统的算法里面,我要算每一条路径的概率值,然后从中挑一个路径,如果有100万个主题就需要一百万次计算,这个太慢了,工程上受不了。

第二个如何支持大数据大模型,我们互联网都是以亿、百亿论,左边文档是亿级,右边词汇是百万级,中间我们希望是百万级,两年前学术界最多做到一万,当时我们团队开发Peacock 的时候,定位就是说我们做到一百万主题。

第三个问题就是说如何提升模型的质量,我们做工业的应用一定把这个模型质量提升,超参数 α和β在模型质量提升中有重要影响。

整个Peacock对这三个问题的解答。第一个对于速度,我们用了一个新的算法叫做SparseLDA,速度可以比标准算法快30倍;第二个怎么支持大数据大模块,我们说矩阵分块并行计算。我们支持中间的隐层达到100万个; 第三个问题是模型质量问题,每一个迭代中我们对α和β做一些优化,后期我们做细节讨论会对模型质量有很大提升。

第一个问题我展开讲一下,标准LDA采样,如果有100万个主题我要做100万次计算,但是一个文档通常是10 个词左右,你去随机化的时候每一个词打一个颜色也就是你这个文档有十几个颜色,这是sparse的结构,利用这个 sparse 的结构就可以大大提升计算速度,于是工程应用上就不是问题了。 当然现在 SparseLDA 已经不是最快的算法了,今年研究界又

一次把采样算法提升了。

第二个问题是我们有十亿篇文档、百万的词汇,百万的主题,我们怎么做模型的并行和数据的并行。我们把整个的数据用一个矩阵来表示,我们希望去做数据并行和模型并行,数据并行上在机器学习界早就解决了问题,简单的做法是,整个数据并行的过程当中,数据分块以后每一个数据生成局部模型,然后归并为一个全局模型,最后把全局模型回传回来更新每一个局部模型。这里面有一个问题有可能我们模型太大了,无法存在单机的内存里。所以我们要考虑对模型也并行化。 我们做一个更好的设计就是把模型和数据同时做,切片成 3*3 九宫格的格式,然后我们按照网格对角线的方式进行并行,所以这时候我们发现至少三个worke可以并行工作不相互干扰,没有任何加锁的困扰。我们现在在这边实际上画了三个,在实际的过程当中把数据和模型都切成N份。这条对角线上的三个可以并行工作,同样第二条对角线和第三条对角线上的worker 也是可以并行工作的。所以这就大大提高了计算的并行性,提升了计算效率。

第三个问题我们讲模型质量的优化,标准LDA训练过程中,对于α和β的数参是人工指定的,譬如α= 0.01。 这个代表什么含义?我们做模型训练的时候实际上对每条边做频率计数,数完以后,如果说一条边没有计数那么这个概率就是零。不过在贝叶斯学派认为这个不应该是零,应该填一个很小的值做一个概率平滑,我们可以填一个0.01很小的数值,这样这个路径还是走得通的,这个走得通代表模型具有探索能力。α和β在模型中就是起了这样的作用。给一个α= 0.01使得模型有探索的能力,会探索这个路径好不好,下次更新模型,这个路径好就把老的丢掉了,未来可以重新不断的走这个更好的路径,好的路径概率质量越来越高,差的路径概率越来越低,于是模型质量有自我提升的能力。每个训练迭代中我们对α做一个优化做一个最大似然估计,然后可以观察到整个模型质量非常大的提升。

我最后一部分讲一下Peacock在腾讯业务中的应用,我们把隐含主题模型应用到了腾讯的多个业务中。 腾讯有大量的用户数据,我们在广点通做用户行为的挖掘,从两个角度看用户行为数据,第一个传统的NLP的角度,文本处理的角度;第二个从推荐系统的角度。从文本的角度,我们把Peacock输出放到每个文本里面,使得每个文本可以表示出更好的语义特征,用新的语义特征处理文本的相似度计算,效果会好得多。在腾讯里面我们有NLP的工具,我们开发分词,我们同时要做分类,topic可以认为是一种聚类,把 topic 加到模型中作为特征,提升整个语义处理的能力。在实际业务中的应用,我们曾经优化过广告相关性,把 topic 加到整个相关性计算中,搜索的相关性准确度提升很显著。

另外一点从推荐系统角度理解语义挖掘。腾讯业务中的一个更大的矩阵就是QQ到QQ群矩阵,预处理之后的规模大约是 7亿X2亿。我们用 Peacock 分解这个大矩阵。 可以发现分解出来的很多主题是有意义的。 在这里我们没有做任何文本的处理,我们按照用户加入QQ群的拓扑结构链接关系来做挖掘的。 我们看这3个挖掘到的主题的含义, 这是关于股票的,这是关于游戏的,这些是关于妈妈群的,语义都非常明确。

最后我们再谈一些QQ群的应用。我们把 Peacock分解出来的一些主题作为特征,加入分类器中进行训练,显著提升分类效果。 Peacock 在QQ群的应用中,最后讲一点是 QQ 群推荐。 最早QQ群推荐是基于朋友关系链的方式做的,即把你的朋友喜欢的 QQ 群推荐给你。现在我们用推荐系统的思路,基于Peacock做 QQ-QQ群矩阵分解,然后利用分解后的矩阵做推荐计算。 线上实验效果非常好,原来点击率本来不低可以到20%,我们优化以后提高了接近3 倍。

最后简单总结一下,LDA 是简单、优雅、实用的模型,我们实现Peacock 就是希望这个模型能够应对当今互联网的大数据,同时把它推向产品应用,谢谢!

举报 0 收藏 0 打赏 0评论 0
 
 
更多>同类资讯
全站最新
热门内容
网站首页  |  关于我们  |  联系方式  |  版权声明  |  RSS订阅  |  开放转载  |  滚动资讯  |  争议稿件处理  |  English Version