前面讲到一些文本基本处理方法。一个文本串,对其进行分词和重要性打分后(当然还有更多的文本处理任务),就可以开始更高层的语义分析任务。
首先介绍主题模型。说到主题模型,第一时间会想到pLSA,NMF,LDA。关于这几个目前业界最常用的主题模型,已经有相当多的介绍了,譬如文献[60,64]。在这里,主要想聊一下主题模型的应用以及最新进展(考虑到LDA是pLSA的generalization,所以下面只介绍LDA)。
LDA的推导这里略过不讲,具体请参考文献[64]。下面我们主要看一下怎么训练LDA。
在Blei的原始论文中,使用variational inference和EM算法进行LDA推断(与pLSA的推断过程类似,E-step采用variational inference),但EM算法可能推导出局部最优解,且相对复杂。目前常用的方法是基于gibbs sampling来做[57]。
对文档d中词w的主题z进行重新采样的公式有非常明确的物理意义,表示为P(w|z)P(z|d),直观的表示为一个“路径选择”的过程。
图10. gibbs sampling过程图
以上描述过程具体请参考文献[65]。
对于LDA模型的更多理论介绍,譬如如何实现正确性验证,请参考文献[68],而关于LDA模型改进,请参考Newman团队的最新文章《Care and Feeding of Topic Models》[12]。
首先主题模型自PLSA, LDA后,又提出了很多变体,譬如HDP。LDA的topic number是预先设定的,而HDP的topic number是不固定,而是从训练数据中学习得到的,这在很多场景是有用的,具体参考hdp vs lda。想了解更多LDA模型的升级,请参考文献[73,74]。
深度学习方面,Geoff Hinton及其学生用Deep Boltzmann Machine研究出了类似LDA的隐变量文本模型[82],文章称其抽取的特征在文本检索与文本分类上的结果比LDA好。heavenfireray在其微博评论道:lda结构是word-hidden topic。类lda结构假设在topic下产生每个word是条件独立而且参数相同。这种假设导致参数更匹配长文而非短文。该文章提出word-hidden topic-hidden word,其实是(word,hidden word)-hidden topic,增加的hidden word平衡了参数对短文的适配,在分类文章数量的度量上更好很自然。
其次,随着目前互联网的数据规模的逐渐增加,大规模并行PLSA,LDA训练将是主旋律。大规模主题模型训练,除了从系统架构上进行优化外,更关键的,还需要在算法本身上做升级。variational方法不太适合并行化,且速度相对也比较慢,这里我们着重看sampling-base inference。
在文献[67]中,Newman团队提出了LDA算法的并行化版本Approximate distributed-LDA,如下图所示:
图11. AD-LDA算法
在原始gibbs sampling算法里,N(w,t)这个矩阵的更新是串行的,但是研究发现,考虑到N(w,t)矩阵在迭代过程中,相对变化较小,多个worker独立更新N(w,t),在一轮迭代结束后再根据多个worker的本地更新合并到全局更新N(w,t),算法依旧可以收敛[67]。
那么,主题模型的并行化(不仅仅是主题模型,其实是绝大部分机器学习算法),主要可以从两个角度来说明:数据并行和模型并行。
数据与模型并行,可以形象的描述为一个棋盘。棋盘的行按照数据划分,棋盘的列按照模型划分。LDA的并行化,就是通过这样的切分,将原本巨大的,不可能在单机存储的矩阵切分到不同的机器,使每台机器都能够将参数存储在内存。再接着,各个worker相对独立计算,计算的过程中不时按照某些策略同步模型数据。
最近几年里,关于LDA并行化已有相当多的开源实现,譬如:PLDA,PLDA+Yahoo LDAParameter server
最近的并行LDA实现Peacock[70,65]和LigthLda[13]没有开源,但我们可以从其论文一窥究竟,总体来说,并行化的大体思路是一致的。譬如LightLDA[13],下图是实现架构框图,它将训练数据切分成多个Block,模型通过parameter server来同步,每个data block,类似于sliding windows,在计算完V1的采样后,才会去计算V2的采样(下图中V1,V2,V3表示word空间的划分,即模型的划分)。
图12. LightLda并行结构图
在文本分析的vector space model中,是用向量来描述一个词的,譬如最常见的One-hot representation。One-hot representation方法的一个明显的缺点是,词与词之间没有建立关联。在深度学习中,一般用Distributed Representation来描述一个词,常被称为“Word Representation”或“Word Embedding”,也就是我们俗称的“词向量”。
词向量起源于hinton在1986年的论文[11],后来在Bengio的ffnnlm论文[3]中,被发扬光大,但它真正被我们所熟知,应该是word2vec[14]的开源。在ffnnlm中,词向量是训练语言模型的一个副产品,不过在word2vec里,是专门来训练词向量,所以word2vec相比于ffnnlm的区别主要体现在:
图13. word2vec的训练算法
上图是word2vec的两种训练算法:CBOW(continuous bag-of-words)和Skip-gram。在cbow方法里,训练目标是给定一个word的context,预测word的概率;在skip-gram方法里,训练目标则是给定一个word,预测word的context的概率。
关于word2vec,在算法上还有较多可以学习的地方,例如利用huffman编码做层次softmax,negative sampling,工程上也有很多trick,具体请参考文章[16][17]。
词向量的应用点:
除了产生词向量,word2vec还有很多其他应用领域,对此我们需要把握两个概念:doc和word。在词向量训练中,doc指的是一篇篇文章,word就是文章中的词。
分析完word distributed representation,我们也许会问,phrase,sentence是否也有其distributed representation。最直观的思路,对于phrase和sentence,我们将组成它们的所有word对应的词向量加起来,作为短语向量,句向量。在参考文献[34]中,验证了将词向量加起来的确是一个有效的方法,但事实上还有更好的做法。
Le和Mikolov在文章《Distributed Representations of Sentences and Documents》[20]里介绍了sentence vector,这里我们也做下简要分析。
先看c-bow方法,相比于word2vec的c-bow模型,区别点有:
图14. sentence2vec cBow算法
sentence2vec相比于word2vec的skip-gram模型,区别点为:在sentence2vec里,输入都是paragraph vector,输出是该paragraph中随机抽样的词。
图15. sentence2vec Skip-gram算法
下面是sentence2vec的结果示例。先利用中文sentence语料训练句向量,然后通过计算句向量之间的cosine值,得到最相似的句子。可以看到句向量在对句子的语义表征上还是相当惊叹的。
图16. sentence2vec 结果示例
介绍卷积神经网络(convolutional neural network,简记cnn)之前,我们先看下卷积。
在一维信号中,卷积的运算,请参考wiki,其中的图示很清楚。在图像处理中,对图像用一个卷积核进行卷积运算,实际上是一个滤波的过程。下面是卷积的数学表示:
f(x,y)是图像上点(x,y)的灰度值,w(x,y)则是卷积核,也叫滤波器。卷积实际上是提供了一个权重模板,这个模板在图像上滑动,并将中心依次与图像中每一个像素对齐,然后对这个模板覆盖的所有像素进行加权,并将结果作为这个卷积核在图像上该点的响应。如下图所示,卷积操作可以用来对图像做边缘检测,锐化,模糊等。
图17. 卷积操作示例
卷积神经网络是一种特殊的、简化的深层神经网络模型,它的每个卷积层都是由多个卷积滤波器组成。它最先由lecun在LeNet[40]中提出,网络结构如下图所示。在cnn中,图像的一小部分(局部感受区域)作为层级结构的最低层的输入,信息再依次传输到不同的层,每层通过多个卷积滤波器去获得观测数据的最显著的特征。
图18. Lenet5网络结构图
卷积神经网络中的每一个特征提取层(卷积层)都紧跟着一个用来求局部平均与二次提取的计算层(pooling层),这种特有的两次特征提取结构使网络在识别时对输入样本有较高的畸变容忍能力。如下图所示,就是一个完整的卷积过程[21]。
图19. 一次完整的卷积过程
它的特殊性体现在两点:(1)局部感受野(receptive field),cnn的神经元间的连接是非全连接的;(2)同一层中同一个卷积滤波器的权重是共享的(即相同的)。局部感受野和权重共享这两个特点,使cnn网络结构更类似于生物神经网络,降低了网络模型的复杂度,减少了神经网络需要训练的参数的个数。
接下来结合文献[25],再讲讲卷积神经网络的一些注意点和问题。
卷积神经网络在image classify和image detect上得到诸多成功的应用,后文将再详细阐述。但除了图片外,它在文本分析上也取得一些成功的应用。
基于CNN,可以用来做文本分类,情感分析,本体分类等[36,41,84]。传统文本分类等任务,一般基于bag of words或者基于word的特征提取,此类方法一般需要领域知识和人工特征。利用CNN做,方法也类似,但一般都是基于raw text,CNN模型的输入可以是word series,可以是word vector,还可以是单纯的字符。比起传统方法,CNN不需要过多的人工特征。
图20.基于CNN的文本分类
利用cnn做文本分类,还可以考虑到词的顺序。利用传统的”bag-of-words + maxent/svm”方法,是没有考虑词之间的顺序的。文献[41]中提出两种cnn模型:seq-cnn, bow-cnn,利用这两种cnn模型,均取得state-of-the-art结果。
文本分类应该是最常见的文本语义分析任务了。首先它是简单的,几乎每一个接触过nlp的同学都做过文本分类,但它又是复杂的,对一个类目标签达几百个的文本分类任务,90%以上的准确率召回率依旧是一个很困难的事情。这里说的文本分类,指的是泛文本分类,包括query分类,广告分类,page分类,用户分类等,因为即使是用户分类,实际上也是对用户所属的文本标签,用户访问的文本网页做分类。
几乎所有的机器学习方法都可以用来做文本分类,常用的主要有:lr,maxent,svm等,下面介绍一下文本分类的pipeline以及注意点。
图21. 层次类目体系
接着重复上述步骤。
举一个例子:以前在做page分类器时,先对每一个类人工筛选一些特征词,然后根据这些特征词对亿级文本网页分类,再然后对每一个明确属于该类的网页提取更多的特征词,加入原有的特征词词表,再去做分类;中间再辅以一定的人工校验,这种方法做下来,效果还是不错的,更关键的是,如果发现那个类有badcase,可以人工根据badcase调整某个特征词的权重,简单粗暴又有效。
图22.文献[45]训练数据获取流程图
参考文献