怎么学习人工智能

怎么学习人工智能,第1张

第一步:复习线性代数。(学渣的线代忘了好多-_-||)

懒得看书就直接用了著名的——麻省理工公开课:线性代数,深入浅出效果拔群,以后会用到的SVD、希尔伯特空间等都有介绍;

广告:边看边总结了一套笔记 GitHub - zlotus/notes-linear-algebra: 线性代数笔记。

第二步:入门机器学习算法

还是因为比较懒,也就直接用了著名的——斯坦福大学公开课 :机器学习课程,吴恩达教授的老版cs229的视频,讲的非常细(算法的目标->数学推演->伪代码)。这套教程唯一的缺点在于没有介绍最近大火的神经网络,但其实这也算是优点,让我明白了算法都有各自的应用领域,并不是所有问题都需要用神经网络来解决;

多说一点,这个课程里详细介绍的内容有:一般线性模型、高斯系列模型、SVM理论及实现、聚类算法以及EM算法的各种相关应用、PCA/ICA、学习理论、马尔可夫系列模型。课堂笔记在:CS 229: Machine Learning (Course handouts),同样非常详细。

广告:边看边总结了一套笔记 GitHub - zlotus/notes-LSJU-machine-learning: 机器学习笔记

第三步:尝试用代码实现算法。

依然因为比较懒,继续直接使用了著名的——机器学习 | Coursera ,还是吴恩达教授的课程,只不过这个是极简版的cs229,几乎就是教怎么在matlab里快速实现一个模型(这套教程里有神经网络基本概念及实现)。这套课程的缺点是难度比较低,推导过程非常简略,但是这也是它的优点——让我专注于把理论转化成代码。

广告:作业参考 GitHub - zlotus/Coursera_Machine_Learning_Exercises: Machine Learning by Andrew Ng from Coursera

第四步:自己实现功能完整的模型——进行中。

还是因为比较懒,搜到了cs231n的课程视频 CS231n Winter 2016 - YouTube ,李飞飞教授的课,主讲还有Andrej Karpathy和Justin Johnson,主要介绍卷积神经网络在图像识别/机器视觉领域的应用(前面神经网络的代码没写够?这门课包你嗨到爆~到处都是从零手写~)。这门课程的作业就更贴心了,直接用Jupyter Notebook布置的,可以本地运行并自己检查错误。主要使用Python以及Python系列的科学计算库(Scipy/Numpy/Matplotlib)。课堂笔记的翻译可以参考 智能单元 - 知乎专栏,主要由知友杜客翻译,写的非常好~

在多说一点,这门课对程序员来说比较走心,因为这个不像上一步中用matlab实现的作业那样偏向算法和模型,这门课用Python实现的模型同时注重软件工程,包括常见的封装layer的forward/backward、自定义组合layer、如何将layer组成网络、如何在网络中集成batch-normalization及dropout等功能、如何在复杂模型下做梯度检查等等;最后一个作业中还有手动实现RNN及其基友LSTM、编写有助于调试的CNN可视化功能、Google的DeepDream等等。(做完作业基本就可以看懂现在流行的各种风格变换程序了,如 cysmith/neural-style-tf)另外,这门课的作业实现非常推崇computational graph,不知道是不是我的幻觉要注意的是讲师AK的语速奇快无比,好在YouTube有自动生成解说词的功能,准确率还不错,可以当字幕看。

广告:作业参考 GitHub - zlotus/cs231n: CS231n Convolutional Neural Networks for Visual Recognition (winter 2016) (我的在作业的notebook上加了一些推导演算哦~可以用来参考:D)

1不要浮于表面。看过太多略知皮毛便就自以为精通的同学。听说过不代表看过,看过不代表研究过,研究过不代表掌握过,掌握过不代表精通过。数据结构,你真正花过多少时间研究,你琢磨过那些数据结构的关联和区别以及适用场景么。你研究过stl是如何做抽象,将数据结构和算法分离么。你考虑过多线程的安全么。是的,这些和数据分析无关,但是如果你没有其他优势,这些又不擅长,凭什么和科班比。

2你的统计学习基础是否扎实。和1中一样,你自学一堆“基本机器学习算法”,那真的理解了吗?你能讲讲聚类算法和混合模型的关系么?你理解了什么是EM算法么?你能推倒下crf或者hmm的训练过程么。或者推倒下你擅长的后向传播算法?

3又见这种跟科班水过四年的比,你说的没错,我那水过四年的同学,我现在研究生毕业了,人家还在每年去补考拿毕业证呢,c语言就是不如我们学校人文学院的女生,人家无所谓,也不想当程序员。

4前面你说不给你机会,最后一段,给你机会你又说什么都忘记了,你到底想怎样?逗我玩么。。。还可不可以愉快的玩了

句法分析的基本任务是确定句子的 语法结构 或句子中 词汇之间的依存关系 。句法分析不是一个自然语言处理任务的最终目标,但它往往是实现最终目标的关键环节。

句法分析分为 句法结构分析 和 依存关系分析 两种。以获取整个句子的句法结构为目的的称为 完全句法分析 ,而以获得局部成分为目的的语法分析称为 局部分析 ,依存关系分析简称 依存分析 。

一般而言,句法分析的任务有三个:

判断输出的字符串是否属于某种语言

消除输入句子中词法和结构等方面的歧义

分析输入句子的内部结构,如成分构成、上下文关系等。

第二三个任务一般是句法分析的主要任务。

一般来说,构造一个句法分析器需要考虑两部分工作:一部分是语法的形式化表示和词条信息描述问题,形式化的语法规则构成了规则库,词条信息等由词典或同义词表等提供,规则库与词典或同义词表构成了句法分析的知识库;另一部分就是基于知识库的解析算法了。

语法形式化属于句法理论研究的范畴,目前在自然语言处理中广泛使用的是上下文无关文法(CFG)和基于约束的文法,后者又称合一文法。

简单的讲,句法结构分析方法可以分为基于规则的分析方法和基于统计的分析方法两大类。

基于规则的句法结构分析方法的基本思路是,由人工组织语法规则,建立语法知识库,通过条件约束和检查来实现句法结构歧义的消除。

根据句法分析树形成方向的区别,人们通常将这些方法划分为三种类型:自顶向下的分析方法,自底向上的分析方法和两者相结合的分析方法。自顶向下分析算法实现的是规则推导的过程,分析树从根结点开始不断生长,最后形成分析句子的叶结点。而自底向上分析算法的实现过程恰好想法,它是从句子符号串开始,执行不断规约的过程,最后形成根节点。

基于规则的语法结构分析可以利用手工编写的规则分析出输入句子所有可能的句法结构;对于特定领域和目的,利用有针对性的规则能够较好的处理句子中的部分歧义和一些超语法(extra-grammatical)现象。

但对于一个中等长度的输入句子来说,要利用大覆盖度的语法规则分析出所有可能的句子结构是非常困难的,而且就算分析出来了,也难以实现有效的消歧,并选择出最有可能的分析结果;手工编写的规则带有一定的主观性,还需要考虑到泛化,在面对复杂语境时正确率难以保证;手工编写规则本身就是一件大工作量的复杂劳动,而且编写的规则领域有密切的相关性,不利于句法分析系统向其他领域移植。

基于规则的句法分析算法能够成功的处理程序设计语言的编译,而对于自然语言的处理却始终难以摆脱困境,是因为程序设计语言中使用的知识严格限制的上下文无关文法的子类,但自然语言处理系统中所使用的形式化描述方法远远超过了上下文无关文法的表达能力;而且人们在使用程序设计语言的时候,一切表达方式都必须服从机器的要求,是一个人服从机器的过程,这个过程是从语言的无限集到有限集的映射过程,而在自然语言处理中则恰恰相反,自然语言处理实现的是机器追踪和服从人的语言,从语言的有限集到无限集推演的过程。

完全语法分析

基于PCFG的基本分析方法

基于概率上下文无关文法的短语结构分析方法,可以说是目前最成功的语法驱动的统计句法分析方法,可以认为是规则方法与统计方法的结合。

PCFG是CFG的扩展,举个例子:

PCFG

当然,同一个符号不同生成式的概率之和为1。NP是名词短语、VP是动词短语、PP是介词短语。

基于PCFG的句法分析模型,满足以下三个条件:

位置不变性:子树的概率不依赖于该子树所管辖的单词在句子中的位置

上下文无关性:子树的概率不依赖于子树控制范围以外的单词

祖先无关性:子树的概率不依赖于推导出子树的祖先节点

根据上述文法,『He met Jenny with flowers』有两种可能的语法结构:

而且我们可以通过将树中的所有概率相乘,得到两棵子树的整体概率,从中选择概率更大的子树作为最佳结构。

与HMM类似,PCFG也有三个基本问题:

给定一个句子W=w1w2…wn和文法G,如何快速计算概率P(W|G)

给定一个句子W=w1w2…wn和文法G,如何选择该句子的最佳结构?即选择句法结构树t使其具有最大概率

给定PCFG G和句子W=w1w2…wn,如何调节G的概率参数,使句子的概率最大

首先是第一个问题,HMM中我们用的是前向算法和后向算法来计算观察序列O概率,相似的,这里我们用的是内向算法和外向算法来计算P(W|G) 。

首先我们定义内向变量αij(A),与前向变量相似但又有不同,αij(A)即非终结符A推导出W中字串wiw(i+1)…wj的概率。那P(W|G)自然就等于α1n(S)了,S是起始符号,计算的就是由起始符号S推导出整个句子W=w1w2…wn的概率。

所以只要有αij(A)的递归公式就能计算出P(W|G),递归公式如下:

根据定义,αii(A)自然就等同于符号A输出wi的概率;而αij(A)的计算思路是,这个子串wiw(i+1)…wj可以被切成两部分处理,前一部分wiw(i+1)…wk由非终结符号B生成,后一部分wkw(k+1)…wj由非终结符号C生成,而BC由A生成。这样将概率依次相乘,即可将一个大问题划分为两个小问题处理,两个小问题又可以进一步划分直到不能划分为止,然后递归回来得到结果。

这里给一张内向变量计算方法示意图:

这个问题也可以用外向算法来解决。

首先定义外向变量,βij(A)是,初始符号S在推导出语句W=w1w2…wn的过程中,产生符号串w1w2…w(i-1)Aw(j+1)…wn的概率(隐含着A会生成wiw(i+1)…wj)。也就是说βij(A)是S推导出除了以A节点为根节点的子树以外的其他部分的概率。

《统计自然语言处理(第二版)》这本书里讲错了,这里我给出我自己的理解,书里给的算法步骤如下:

很明显的错误,初始化都把结果初始化了,那这个算法还算什么,直接等于1就完了呗。

这是作者对外向变量定义理解模糊的问题,上面给了外向变量的定义,里面有一句话『隐含着A会生成wiw(i+1)…wj』,那问题在于,A会生成wiw(i+1)…wj,这到底算是条件还是推论。

看这个算法的初始化的意思,说β1n(A),在A=S的时候,为1,不等于S为0,意思是什么?意思就是『隐含着A会生成wiw(i+1)…wj』这句话是条件,β1n(S)已经隐含了S生成W=w1w2…wn了,所谓的w1w2…w(i-1)Aw(j+1)…wn也就不存在了,只剩下一个S->S了,所以概率自然为1。

但是在第三步这个地方,作者理解成什么意思了呢?作者又把『隐含着A会生成wiw(i+1)…wj』这句话当成推论了,认为在β1n(S),里S会生成W=w1w2…wn是推论,那真是就正好了,要求的结果就是S生成W=w1w2…wn,这不就结束了吗,结果就导致了这个算法第一步初始化都把结果初始化了。

那我的理解是什么呢,通过这个公式计算出来的β1n(S),确实是正确的,意义实际上也是包含了『隐含着A会生成wiw(i+1)…wj』这句话是推论,但是右侧式子里由于不断递归而产生的β1n(S),是把『隐含着A会生成wiw(i+1)…wj』这句话当条件的,所以计算上没有问题。

我倾向于为第三步中的β1n(S)加一个星号,以表明意义的不同。

书中还给了个外向变量的计算方法示意图,我觉得也是莫名其妙:

他说βij(A)是这两种情况的概率和,这我们知道j比i大,那这图里这个k既比i小又比j大,这不是搞笑吗。只能说图上这俩C就不是一个C,k也不是一个k。

那我为什么会理解成一个呢,除了字母相同,他前面还这么讲『必定运用了形如B->AC或者B->CA的规则』、『运用B->AC或者B->CA两种规则的情况』,这明显就是给人以顺序交换的误解。

另外,还在内向变量的使用上前后不一,可以说这本书里对外向算法的讲解是非常失败的。而且对外向算法的计算仍然需要用到内向算法的递归,那真的直接用内向算法就好了,外向算法还要多定义变量。

然后是第二个问题,选择句子的最佳结构,也即给定一个句子W=w1w2…wn和文法G,

选定拥有最大概率的语法结构树。这一问题与HMM中类似,仍然采用动态规划的思想去解决。最后利用CYK算法去生成拥有最大概率的语法结构树。

第三个问题是给定PCFG G和句子W=w1w2…wn,如何调节G的概率参数,使句子的概率最大,与HMM相对的,PCFG这里采用的算法名叫内外向算法。与前后向算法相同,也属于一种EM算法,其基本思想是,首先给G的产生式随机地赋予一个概率值(满足归一化条件),得到文法G0,然后根据G0和训练数据,可以计算出每条规则使用次数的期望值,用期望值进行最大似然估计,得到语法G的新参数值,新的语法记作G1,然后循环执行该过程,G的参数概率将收敛于最大似然估计值。

PCFG只是一种特殊的上下文无关文法模型,根据PCFG的模型和句子,具体去对句子做语法分析,生成语法结构树,靠的是还是CYK算法。CYK算法是一个用来判定任意给定的字符串W是否属于一个上下文无关文法的算法。

基于PCFG的句法分析模型存在有许多问题,比如因为PCFG没有对词汇进行建模,所以存在对词汇信息不敏感的问题。因此人们提出了词汇化的短语结构分析器,有效的提升了基于PCFG的句法分析器的能力。

而且,我们上面也提到了PCFG的三个独立性假设,这也导致了规则之间缺乏结构依赖关系(就像HMM的三个假设也不完全合理一样),而在自然语言中,生成每个非终结符的概率往往是与其上下文结构有关系的,所以有人提出了一种细化非终结符的方法,为每个非终结符标注上其父节点的句法标记信息。

D Klein提出了带有隐含标记的上下文无关文法(PCFG with latent annotations,PCFG-LA),使得非终结符的细化过程可以自动进行,并且在使用EM算法优化时,为避免到达局部最优,对其进行了改进,提出了一种层次化的『分裂-合并』策略,以期获取一个准确并且紧凑的PCFG-LA模型。基于PCFG-LA的Berkeley Parser作为非词汇化句法分析器的代表,无论是性能表现还是运行速度,都是目前开源的短语结构分析器中最好的。其语法树如下图:

普通句法树与PCFG-LA句法树对照实例

这个x就是隐含标记,xi的取值范围一般是人为设定的,一般取1~16之间的整数。而且PCFG-LA也类似于HMM模型,原始非终结符对应HMM模型中的观察输出,而隐含标记对应HMM模型中的隐含状态。

浅层语法分析(局部语法分析)

由于完全语法分析要确定句子所包含的全部句法信息,并确定句子中各成分之间的关系,这是一项十分苦难的任务。到目前为止,句法分析器的各方面都难以达到令人满意的程度,为了降低问题的复杂度,同时获得一定的句法结构信息,浅层句法分析应运而生。

浅层语法分析只要求识别句子中的某些结构相对简单的独立成为,例如非递归的名词短语、动词短语等,这些被识别出来的结构通常称为语块(chunk)。

浅层句法分析将句法分析分解为两个主要子任务,一个是语块的识别和分析,另一个是语块之间的依附关系分析。其中,语块的识别和分析是主要任务。在某种程度上说,浅层句法分析使句法分析的任务得到了简化,同时也有利于句法分析系统在大规模真实文本处理系统中迅速得到应用。

基本名词短语(base NP)是语块中的一个重要类别,它指的是简单的、非嵌套的名词短语,不含有其他子项短语,并且base NP之间结构上是独立的。示例如下:

base NP识别就是从句子中识别出所有的base NP,根据这种理解,一个句子中的成分和简单的分为baseNP和非base NP两类,那么base NP识别就成了一个分类问题。

base NP的表示方法有两种,一种是括号分隔法,一种是IOB标注法。括号分隔法就是将base NP用方括号界定边界,内部的是base NP,外部的不属于base NP。IOB标注法中,字母B表示base NP的开端,I表示当前词语在base NP内,O表示词语位于base NP之外。

基于SVM的base NP识别方法

由于base NP识别是多值分类问题,而基础SVM算法解决的是二值分类问题,所以一般可以采用配对策略(pairwise method)和一比其余策略(one vs other method)。

SVM一般要从上下文的词、词性、base NP标志中提取特征来完成判断。一般使用的词语窗口的长度为5(当前词及其前后各两个词)时识别的效果最好。

基于WINNOW的base NP识别方法

WINNOW是解决二分问题的错误驱动的机器学习方法,该方法能从大量不相关的特征中快速学习。

WINNOW的稀疏网络(SNoW)学习结构是一种多类分类器,专门用于处理特征识别领域的大规模学习任务。WINNOW算法具有处理高维度独立特征空间的能力,而在自然语言处理中的特征向量恰好具有这种特点,因此WINNOW算法也常用于词性标注、拼写错误检查和文本分类等等。

简单WINNOW的基本思想是,已知特征向量和参数向量和实数阈值θ,先将参数向量均初始化为1,将训练样本代入,求特征向量和参数向量的内积,将其与θ比较,如果大于θ,则判定为正例,小于θ则判定为反例,将结果与正确答案作比较,依据结果来改变权值。

如果将正例估计成了反例,那么对于原来值为1的x,把它的权值扩大。如果将反例估计成了正例,那么对于原来值为1的x,把它的权值缩小。然后重新估计重新更改权重,直到训练完成。

这其实让我想到了LR算法,因为LR算法也是特征向量与参数向量的内积,最后将其送到Sigmoid函数中去拿到判定结果,然后大于05的为正例,小于05的为反例,实际上只要反过来,Sigmod函数输出05时候的输入就是WINNOW算法里的那个实数阈值θ。但是区别在于WINNOW算法只判定大小,不判定概率,而LR利用Sigmoid函数给出了概率。LR利用这给出的概率,通过使训练集的生成概率最大化来调整参数,而WINNOW则是直接朴素的错误情况来增大或缩小相关参数。目测LR因为使用了梯度下降,它的收敛速度要快于WINNOW,而WINNOW的优势则在于可以处理大量特征。

基于CRF的base NP识别方法

基于CRF的base NP识别方法拥有与SVM方法几乎一样的效果,优于基于WINNOW的识别方法、基于MEMM的识别方法和感知机方法,而且基于CRF的base NP识别方法在运行速度上较其他方法具有明显优势。

依存语法理论

在自然语言处理中,我们有时不需要或者不仅仅需要整个句子的短语结构树,而且要知道句子中 词与词之间的依存关系 。用词与词之间的依存关系来描述语言结构的框架成为依存语法,又称从属关系语法。利用依存语法进行句法分析也是自然语言理解的重要手段之一。

有人认为,一切结构语法现象可以概括为关联、组合和转位这三大核心。句法关联建立起词与词之间的从属关系,这种从属关系由 支配词 和 从属词 联结而成, 谓语中的动词是句子的中心并支配别的成分,它本身不受其他任何成分支配 。

依存语法的本质是一种结构语法,它主要研究以谓词为中心而构句时由深层语义结构映现为表层语法结构的状况及条件,谓词与体词之间的同现关系,并据此划分谓词的词类。

常用的依存于法结构图示有三种:

计算机语言学家J Robinson提出了依存语法的四条公理:

一个句子只有一个独立的成分

句子的其他成分都从属于某一成分

任何一个成分都不能依存于两个或两个以上的成分

如果成分A直接从属于成分B,而成分C在句子中位于A和B之间,那么,成分C或者属于成分A,或者从属于B,或者从属于A和B之间的某一成分。

这四条公理相当于对依存图和依存树的形式约束:单一父节点、连通、无环和可投射,由此来保证句子的依存分析结果是一棵有根的树结构。

这里提一下可投射,如果单词之间的依存弧画出来没有任何的交叉,就是可投射的(参考上面的两个有向图)。

为了便于理解,我国学者提出了依存结构树应满足的5个条件:

单纯结点条件:只有终结点,没有非终结点

单一父结点条件:除根节点没有父结点外,所有的结点都只有一个父结点

独根结点条件:一个依存树只能有一个根结点,它支配其他结点

非交条件:依存树的树枝不能彼此相交

互斥条件:从上到下的支配关系和从左到右的前于关系之间是相互排斥的,如果两个结点之间存在着支配关系,它们就不能存在于前于关系

这五个条件是有交集的,但它们完全从依存表达的空间结构出发,比四条公理更直观更实用。

Gaifman 1965年给出了依存语法的形式化表示,证明了依存语法与上下文无关文法没有什么不同

类似于上下文无关文法的语言形式对被分析的语言的投射性进行了限制,很难直接处理包含非投射现象的自由语序的语言。20世纪90年代发展起来了约束语法和相应的基于约束满足的依存分析方法,可以处理此类非投射性语言问题。

基于约束满足的分析方法建立在约束依存语法之上,将依存句法分析看做可以用约束满足问题来描述的有限构造问题。

约束依存语法用一系列形式化、描述性的约束将不符合约束的依存分析去掉,直到留下一棵合法的依存树。

生成式依存分析方法、判别式依存分析方法和确定性依存分析方法是数据驱动的统计依存分析中具有代表性的三种方法。

生成性依存分析方法

生成式依存分析方法采用联合概率模型生成一系列依存语法树并赋予其概率分值,然后采用相关算法找到概率打分最高的分析结果作为最后输出。

生成式依存分析模型使用起来比较方便,它的参数训练时只在训练集中寻找相关成分的计数,计算出先验概率。但是,生成式方法采用联合概率模型,再进行概率乘积分解时做了近似性假设和估计,而且,由于采用全局搜索,算法的复杂度较高,因此效率较低,但此类算法在准确率上有一定优势。但是类似于CYK算法的推理方法使得此类模型不易处理非投射性问题。

判别式依存分析方法

判别式依存分析方法采用条件概率模型,避开了联合概率模型所要求的独立性假设(考虑判别模型CRF舍弃了生成模型HMM的独立性假设),训练过程即寻找使目标函数(训练样本生成概率)最大的参数θ(类似Logistic回归和CRF)。

判别式方法不仅在推理时进行穷尽搜索,而且在训练算法上也具有全局最优性,需要在训练实例上重复句法分析过程来迭代参数,训练过程也是推理过程,训练和分析的时间复杂度一致。

确定性依存方法

确定性依存分析方法以特定的方向逐次取一个待分析的词,为每次输入的词产生一个单一的分析结果,直至序列的最后一个词。

这类算法在每一步的分析中都要根据当前分析状态做出决策(如判断其是否与前一个词发生依存关系),因此,这种方法又称决策式分析方法。

通过一个确定的分析动作序列来得到一个唯一的句法表达,即依存图(有时可能会有回溯和修补),这是确定性句法分析方法的基本思想。

短语结构与依存结构之间的关系

短语结构树可以被一一对应地转换成依存关系树,反之则不然。因为一棵依存关系树可能会对应多棵短语结构树。

利用sqoop将数据从MySQL导入到HDFS中,利用mahout的LDA的cvb实现对输入数据进行聚类,并将结果更新到数据库中。数据流向图如下

mahout算法分析

输入数据格式

为<IntegerWritable, VectorWritable>的matrix矩阵,key为待聚类文本的数字编号,value为待聚类文本的单词向量Vector, Vector的index为单词在字典中的编号, value为TFIDF值。

算法相关参数详解(不包含hadoop运行参数)

项目中所有参数设置均与mahout-09目录下的examples/bin/cluster-reuterssh的147-172行设置一样,即

$SCOUT cvb -i ${WORK_DIR}/${ROWID_MATRIX_DIR}/matrix -o ${WORK_DIR}/${LDA_DIR} -k 20 -ow -x 20 -dict ${WORK_DIR}/${DICTIONARY_FILES} -dt ${WORK_DIR}/${LDA_TOPICS_DIR} -mt ${WORK_DIR}/${LDA_MODEL_DIR}

input -- 输入数据的hdfs路径,这里是/home/hadoop-user/scout_workspace/scout/dataset/reuters-out-matrix-debug/matrix

dt -- 文档主题输出路径,保存了每个文档的相应topic的概率,这里是/home/hadoop-user/scout_workspace/scout/dataset/reuters-lda-topics

mt -- model的路径,这里是/home/hadoop-user/scout_workspace/scout/dataset/reuters-lda-debug

k -- number of topics to learn,这里设置成20

x -- 模型迭代次数,也就是需要多少次迭代来生成最后的Model,默认值20

seed -- Random seed,生成初始readModel时的种子,默认值SystemnanoTime() % 10000

dict -- 字典路径,这里是/home/hadoop-user/scout_workspace/scout/dataset/reuters-out-seqdir-sparse-lda/dictionaryfile-

a -- Smoothing for document/topic distribution, document/topic分布的平滑系数,默认为10E-4

e -- Smoothing for topic/term distribution, topic/term分布的平滑系数,默认为10E-4

关于a和e,根据描述,a和e的合适取值为k/50(k为topic数量),但是这个网页还保留着mahout ldatopics的命令介绍,而mahout 08,09均没有该命令,推测应该是比较陈旧的内容,因此还是根据cluster-reuterssh中的设置来,也就是采取默认值。

mipd -- 这个参数非常重要,对于每个文档程序是先用RandomSeed来生成一个初始的readModel然后进行mipd次迭代,算出最终的model进行更新,这里选默认值10次

LDA算法程序分析

算法的大致流程如下

1解析参数与Configuration设置

2读取Model(第一次运行时没有这个过程)

如果hfds上面已经有部分model,那么程序将读取最后一个model,并以这个model作为初始readModel来继续进行算法迭代,也就是说有类似于断电-重启的机制

3运行算法迭代(Mapper过程)生成LDA模型

这个过程是最为复杂的阶段,许多地方我也不是很明白,我将尽最大努力进行解释

首先分析Mapper,即CachingCVB0Mapper,顾名思义就是能够缓存的Mapper,表现在其readModel的选取上面,如果目录里面不存在任何model则用RandomSeed初始化一个readModel,否则读取最近的一个model。程序将model划分为readModel和writeModel,这两个都是TopicModel类,并由ModelTrainer来进行调度和管理

CachingCVB0Mapper整个过程如下图所示(清晰大图见附件)

在上面这个整体框架下,mahout程序应用了CVB0 Algorithm来计算LDA模型, 在map过程中通过对向量docTopic和矩阵docTopicModel的反复迭代求解,算出每个document的docTopicModel并且在update writeModel阶段将docTopicModel矩阵进行向量的相加 *** 作,经历完所有的map过程后得到整个corpus的docTopicModel矩阵,最终在cleanup过程中将topic的index作为key,矩阵docTopicModel作为value写入reduce。该过程涉及到的算法如下所示

CVB0算法分析图解(清晰大图见附件)

4利用生成的LDA模型推导出topic的概率分布

算法总结

可以看出算法本质上面就是bayes公式和EM算法的结合

E过程就是首先假定一个均匀分布且归一化的topic概率分布向量docTopics,利用该值通过贝叶斯公式算出单词 - 主题的概率分布矩阵 docTopicModel(见CVB0算法分析图解中的第一步)

M过程就是根据生成的docTopicModel进行CVB0算法分析图解中的2,3,4,5步重新计算得到新的docTopics

然后反复重复 E - M 过程n次,得到收敛后的docTopics和docTopicModel,其中docTopicModel可以用于lda模型的更新,而docTopics就是我们聚类需要的topic概率分布向量

算法后记

几点问题还没有得到解决

1在mahout中是按照下面的式子计算docTopicModel的

double termTopicLikelihood =

(topicTermRowget(termIndex) + eta) (topicWeight + alpha)/ (topicSum + eta numTerms);

疑问就是该式子比贝叶斯公式添加了几个平滑系数项,这样写的理论依据在哪里,来源于哪篇著作或者论文,平滑系数eta和alpha分别是代表什么含义,如何选取这两个系数。

2CVB0算法分析图解中第2步进行归一化的理论依据,即为什么要进行归一化

3update writeModel过程中对于topicTermCounts的计算

即为什么要在每次map时候对p(topic | term)进行累加,还没有完全想明白

项目运行环境

hadoop-121

sqoop-144

mahout-09

关于环境的安装部署请参考相关文章,这里不多加赘述。上面三个软件在我本机的都是部署在/home/hadoop-user/mahout_workspace/目录下。另外自己写的scout项目部署在/home/hadoop-user/scout_workspace/目录下

项目代码

项目代码已经放到Github上有兴趣的同学可以下载下来看下,重点查看bin目录下的脚本文件以及driver,export,analyzer等几个包下的java文件

整个项目架构分析

该项目的初始数据保存在MySQL中, 算法分析需要map/reduce过程以及hdfs文件系统的参与, 最后将结果更新至MySQL,整个过程如图所示

我们描述潜在的狄利克雷分配(LDA),它是一种用于离散数据集合(如文本语料库)的生成概率模型。 LDA是一个三层次的贝叶斯模型,其中一个集合中的每个项目都被建模为一组潜在的话题(主体)类型的有限混合。反过来,每个主题都被建模为一组潜在主题概率的无限混合。 在文本建模的背景下,主题概率提供了文档的明确表示。我们提出了基于变分方法和经验贝叶斯参数估计的EM算法的高效近似推理技术。 我们会报告LDA在文档建模,文本分类和协作过滤上的实验结果,并与一元混合模型( unigrams model)和概率LSI模型相比较。

在本文中,我们考虑建模文本语料库和其他离散数据集合的问题。我们的目标是找到对一个集合的成员的简短描述,它不仅可以高效处理大型集合,同时保留对分类,异常检测,摘要(概括)以及相似性和相关性判断等基本任务有用的必要统计关系。

信息检索(IR)领域的研究人员已经在这个问题上取得了重大进展(Baeza-Yates和Ribeiro-Neto,1999)。IR研究人员为文本语料库提出的基本方法 (一种在现代互联网搜索引擎中成功部署的方法)将语料库中的每个文档变为实数表示的向量,每个实数都表示(词汇的)计数比率。流行的tf-idf方案(Salton和McGill,1983),对于文集中的每个文档选择了“词”或“术语”作为基本单位,并且计数由每个词的出现次数。在适当的归一化之后,将该术语频率计数与逆向文档频率计数进行比较,该逆向文档频率计数度量整个语料库中的词的出现次数(通常以对数刻度,并且再次适当标准化)。 最终结果是文档术语矩阵X,其列包含文档集中每个文档的tf-idf值。 因此,tf-idf方案将任意长度的文档缩减为固定长度的数字列表。

尽管tf-idf规约具有一些吸引人的特征 - 特别是(在对集合中的文档进行区分的)单词集合的基本识别中,但是在(对文档的)描述长度上,该方法并没有减少多少,并且揭示出很少的文档内或文档间的统计结构。为了解决这些缺点,IR研究人员提出了其他几种降维技术,其中最著名的是潜在语义索引(LSI)(Deerwester等,1990)。LSI使用X矩阵的奇异值分解来标识tf-idf特征空间中的线性子空间,该子空间捕获集合中的大部分变异数(variance)。这种方法可以在大型集合中实现显着压缩。此外,Deerwester等人 认为LSI的衍生特征(即原始tf-idf特征的线性组合),可以捕捉基本语言学概念的某些方面,比如同义词和多义词等。

为了证实关于LSI的主张,并研究其相对的优缺点,开发文本语料库的生成概率模型和研究LSI从数据中恢复生成模型方面的能力是有用的(Papadimitriou et al。,1998)。然而,目前尚不清楚,考虑文本的生成模型的时候,为什么应该采用LSI方法 - (其实)可以尝试更直接地进行,(比如)使用最大似然法或贝叶斯方法将模型与数据相匹配(即得到数据的模型)。

Hofmann(1999)在这方面迈出了重要的一步,他将LSI的概率LSI(pLSI)模型(也称为特征模型aspect model)作为LSI的替代品。我们在第43节中详细描述的pLSI方法将文档中的每个单词作为混合模型中的样本进行建模,其中混合组件是多项随机变量,可以将其视为“主题topics”的表示。因此,每个单词都是从单个主题生成的,而文档中的不同单词可以从不同的主题生成。每个文档都被表示为这些混合组件的混合比例列表,从而将其简化为一组固定主题的概率分布。 这种分布是与文档相关的“简化描述”。

虽然霍夫曼的工作是向文本概率建模迈出的有用的一步,但它并不完整,因为它没有提供文档层面的概率模型。在pLSI中,每个文档都被表示为一个数字列表(数字的值是主题的混合比例),并且这些数字没有生成概率模型。这导致了几个问题:(1)模型中参数的数量与语料库的大小成线性增长,这导致过度拟合的严重问题;(2)不清楚如何将概率分配给训练集之外的文档。

要了解如何超越pLSI,让我们考虑包括LSI和pLSI在内的一类降维方法的基本概率假设。所有这些方法都基于“词袋”的假设 - 文档中的单词顺序可以忽略不计。此外,尽管不经常正式说明,但这些方法也假定文档是可相互交换的; 文集中文档的具体排序也可以忽略不计。

受益于Finetti(1990),一个经典表示理论认为:任何可交换随机变量的集合都具有混合分布(通常是无限混合)的表示。因此,如果我们想考虑文件和单词的可交换表示,我们需要考虑能捕获单词和文档的可交换性的混合模型。这一思路促使我们在当前论文中提出潜在狄利克雷分配(LDA)模型。

需要强调的是,可交换性的假设并不等同于随机变量独立同分布的假设。相反,可交换性本质上可以被解释为“条件独立且分布相同”,其中的条件是与概率分布的潜在隐参数有关的。在一定条件下,随机变量的联合分布是简单的,但如果围绕隐参数考虑,联合分布可能相当复杂。因此,虽然可交换性的假设是文本建模领域的一个主要的简化假设,并且其主要理由是它是一种会导致计算效率较高的方法,但可交换性假设对简单频率的计数或线性 *** 作并不是一个必要的条件。在当前的论文中,我们的目标是,通过认真考虑de Finetti定理,可以通过混合分布获取重要的文档内统计结构。

同样值得注意的是,可交换性的基本概念有大量的总结概括,包括各种形式的部分可交换性,并且上面提到的表示法也可用于部分可交换的情况(Diaconis,1988)。因此,虽然我们在当前论文中讨论的工作集中在简单的“词袋”模型上(这表现为单个单词(unigrams)的混合分布),但我们的方法也适用于涉及较大结构混合的更丰富的模型,如n-grams或段落。

本文的结构如下: 在第2节中,我们介绍基本的表示法和术语。 LDA模型在第3节中介绍,并与第4节中的相关潜变量模型进行比较。我们在第5节讨论LDA的推理和参数估计。第6节提供了LDA拟合数据的一个说明性例子。文本建模,文本分类和协作过滤的实验结果在第7节中给出。最后,第8节给出我们的结论。

我们在整篇论文中使用 文本集合 的说法,指的是诸如“单词”,“文档”和“语料库”等实体。这很有用,因为它有助于指导靠直觉来感知的知识的处理(intuition),特别是当我们引入旨在捕捉抽象概念(如主题)的潜在变量时(潜在变量和隐变量说的是一回事)。然而,需要指出的是,LDA模型不一定与文本相关,并且可应用于涉及数据集合的其他问题,包括来自诸如协同过滤,基于内容的图像检索和生物信息学等领域的数据。 事实上,在73节中,我们将呈现在协同过滤领域的实验结果。

在形式上,我们定义下列术语:

• 单词是离散数据的基本单位,假设有一个V个词组成的词汇表(词典),索引通过{1V}表示,里面每一项代表一个单词。我们使用单位向量表示单词,它里面一项等于1其他项等于零。我们使用上标来表示第几个成分,因此第v个词在V维向量w中表示为:w v = 1 and w u = 0 for u ≠ v

• 文档中的词来自一个包含N个词的词典,一个文档可以表示成N个词组成的序列,可以表示为 w = (w 1 ,w 2 w N ),下标表示第几个词。(注意,每个词用一个V维的向量表示,每篇文档有最多有N个不同的词,不要搞混了)

• 一个语料库是含有M个文档的集合,用 D = ( w 1 , w 2 w M )----注意有加粗

我们希望找到一个语料库的概率模型,它不仅为语料库成员分配高概率,而且为其他“类似”文档分配高概率。(意思就是说,语料库中某一文档的某个topic概率比较高,那么测试相似文档。也能得到相同的概率分布)

隐在狄利克雷分配(LDA)是语料库的生成概率模型。 其基本思想是文档被表示为潜在主题的随机混合,每个主题都是有不同的文字(词)分布特征的。

LDA为语料库 D 中的每个文档 w 假定以下生成过程:

在这个基本模型中做了几个简化的假设,其中一些我们在后面的章节中会删除。首先,Dirichlet分布的维度k(以及主题变量z的维度)被假定为已知并且是固定的。其次,单词概率通过k×V矩阵 β 进行参数化,其中 β ij = p(w j = 1 | z i = 1)(猜测:它表示在某个主题中索引为i的词出现的条件下,文档中第j个词出现的概率),现在我们将其视为待估计的固定量。最后,泊松假设对随后的任何事情都不是关键的,并且可以根据需要使用更真实的文档长度分布。此外,请注意,N与所有其他数据生成变量(θ和z)无关。 因此它是一个辅助变量,我们通常会忽略它在随后发展中的随机性。

一个k维Dirichlet随机变量θ可以从(k − 1)-simplex(单形或单纯形)中取值,并且在这个单纯形中有以下概率密度:

α 参数是一个k维向量,并且 α 的每一项都满足α i > 0,另外Γ(x)是 伽马函数 。狄利克雷分布在单形(属于指数族)上是一种实用的分布,具有有限维数的充分统计量,并且与多项分布共轭。

在第5节中,这些属性将有助于开发LDA的推理和参数估计算法。

给定参数α和β,主题混合分布θ、主题 z 和文档 w 的联合分布为:

上式表示给定参数α和β的条件下,文档的概率分布。

最后,利用单个文档边际概率的乘积,得到一个语料库的概率分布:

区分LDA和简单的Dirichlet多项式聚类模型很重要。 经典的聚类模型会涉及到一个两层模型:其中,一个Dirichlet为一个语料库抽样一次,一个多项式聚类变量为语料库中的每个文档选择一次,并且以聚类变量为条件,为文档选择一组词语 。与许多聚类模型一样,这种模型将文档限制为与单个主题相关联。另一方面,LDA涉及三个层次,特别是主题节点在文档中被重复采样。在这种模式下,文档可以与多个主题相关联。

图1所示类似结构通常在贝叶斯统计建模中研究,它们被称为分层模型(Gelman等,1995),或者更准确地说,是条件独立的分层模型(Kass和Steffey,1989)。这种模型通常也被称为参数经验贝叶斯模型(parametric empirical Bayes models),这个术语不仅指特定的模型结构,而且还指用于估计模型参数的方法(Morris,1983)。事实上,正如我们在第5节中讨论的那样,我们采用经验贝叶斯方法来估计一个LDA简单实现中的参数(比如,α和β等),但我们也考虑了更充分的贝叶斯方法。

如果联合分布对于置换是不变的,那么一个有限的随机变量集{z 1 z N }被认为是可交换的。 如果π(此π非彼π)表示某种整数从1到N的置换规则,则:

p(z 1 z N ) = p(z π(1) z π(N) )

如果每个有限的子序列是可交换的,则无限序列的随机变量是无限可交换的。

De Finetti的表示定理指出,随机变量的无限可交换序列的联合分布就好像从一些分布中抽取的一个随机参数,以该参数为条件,所讨论的随机变量是独立同分布的。

在LDA中,我们假设单词是由主题(通过固定的条件分布)生成的,而且这些主题在文档中是无限可交换的。根据菲内蒂定理,一组词汇和话题的概率必须具有以下这种形式:

θ是关于主题的多项式的随机参数。通过边缘化主题变量并赋予θ狄利克雷分布,在公式(3)中,我们获得了文档的LDA分布。

图1所示的LDA模型比传统分层贝叶斯文献中经常研究的两层模型要复杂得多。然而,通过边缘化隐藏的主题变量z,我们可以将LDA理解为两层模型。

特别是,让我们来构造单词分布p(w|θ,β):

请注意,这是一个随机量,因为它取决于θ。

我们现在为文档 w 定义下面的生成过程:(对每篇文档)

该过程将文档的边际分布定义为连续混合分布:(注意下式表示的是语料库,而非一篇文档 的分布)

图2说明了LDA的这种解释。 它描绘了LDA模型的一个特定实例引发的p(w| θ,β)的分布。请注意,在(V-1) - simplex中的这种分布仅通过k + kV个参数实现,但展现出非常有趣的多模式结构。

在本节中,我们将LDA与文本的简单潜(隐)变量模型(一元模型,一元模型的混合模型和pLSI模型)进行比较。 此外,我们提出了这些模型的统一几何解释,突出了它们的主要区别和相似之处。

在一元模型下,每个文档的单词都是独立的按照某个多项分布而绘制的,生成文档的概率为:

如果我们用一个离散的随机主题变量z(图3b)来扩充一元模型,我们就可以得到一个混合一元模型(Nigam et al,2000)。在这个混合模型下,首先选择一个主题z,然后从条件多项式p(w | z)独立的生成N个单词,从而生成每个文档(该文档中的所有词都来自一个主题)。一篇文档的概率分布:

在每个文档仅显示一个主题的假设背景下,当从语料库做概率估计时,可以将词语分布视为主题的表示。正如第7节的实证结果所示,这种假设通常限制性太强,以至于无法有效地建模量大的文献。

相反,LDA模型允许文档在不同程度上展示多个主题。这是以(增加)一个额外参数为代价实现的:在混合一元模型中有与p(z)相关的参数有k-1个,而在LDA中与p(θ | α)有关的参数有k个。

概率潜在语义索引(pLSI)是另一个广泛使用的文档模型(Hofmann,1999)。 如图3c所示,给定了未知的主题z,pLSI模型假设文档标签d和单词w n 是条件独立的:

使用pLSI的另一个困难(也是来自于通过训练文档进行索引的分布的使用)是必须估计的参数数量与训练文档的数量呈线性增长。k-主题pLSI模型的参数是在k个未知主题上,V和M混合大小的k个多项式分布。这给出了kV + kM个参数,因此在M中线性增长。参数的线性增长表明该模型容易出现过度拟合,并且根据经验确定,过拟合确实是一个严重的问题(参见第71节)。在实践中,使用回火试探来平滑模型的参数以获得可接受的预测性能。 然而,已经表明,即使在使用回火时也可能发生过度拟合(Popescul et al,2001)。

LDA通过将主题混合权重视为一个k个参数的隐藏的随机变量,而不是大量与训练集明确关联的单个参数,来克服这两个问题。如第3节所述,LDA是一个良好定义的生成模型,可轻松推广到新文档。此外,k-topic LDA模型中的k + kV个参数不会随着训练语料库的大小而增长。我们将在71节看到,LDA不会遇到与pLSI相同的过度拟合问题。

说明LDA和其他潜在主题模型之间差异的一种好方法是考虑潜在空间的几何形状,并了解每个模型下文档在该几何体中的表示方式。

上述所有四种模型(unigram, mixture of unigrams, pLSI, and LDA)都是在单词分布空间中进行 *** 作的。每个这样的分布可以被看作是(V-1) - simplex上的一个点,我们称之为词单纯形(the word simplex)。

一元模型在词单纯形上找到一个单一的点,并假定文集中的所有单词来自相应的分布。潜变量模型考虑词单纯形上的k个点,并根据这些点构成子单形体,我们称之为主题单纯形。请注意,主题单纯形上的任何一点也是单词单纯形上的一个点。不同的潜在变量模型以不同的方式使用主题单纯形来生成文档。

• 混合一元模型假设,对于每个文档,词单纯形中的k个点(即,主题单纯形的那些角中的一个)中的一个一旦随机选择后,文档的所有单词都从对应于那一点的分布中获取。

• pLSI模型假定训练文档的每个单词来自随机选择的主题。这些主题本身来自于文档在主题上的特征分布,也就是主题单纯形上的一个角点。每个文件有一个这样的分布,训练文档集因此定义了关于主题单纯形的经验分布。

• LDA假定观察到的(训练集)和未看到的(验证集)文档中的每个词都是由随机选择的主题生成的,该主题是从具有一个随机选择参数的分布中抽取的。 从主题单纯形的平滑分布中,每个文档对此参数进行一次采样。

这些差异在图4中突出显示。

我们描述了使用LDA背后的动机,并说明了其与其他潜在主题模型相比的概念优势。在本节中,我们将注意力转向LDA下的推理和参数估计。

为了使用LDA我们需要解决的关键推理问题是计算给定文档的隐藏变量的后验分布:

不幸的是,这种分布通常难以计算。 实际上,为了规范化分布,我们将忽视隐藏变量并根据模型参数重写方程(3):

这是一个由于在潜在主题的总和中θ和β之间的耦合,而难以处理的函数(Dickey,1983)。Dickey表示这个函数是在Dirichlet分布的特定扩展下的期望,可以用特殊的超几何函数表示。它在贝叶斯环境中可用于删除(或审查,censored 暂时不明白怎么翻译)离散数据,以表示θ的后验(在该设置中,θ是随机参数)(Dickey等,1987)。

尽管后验分布对于精确推断是难以处理的,但是对于LDA可以考虑各种各样的近似推理算法,包括拉普拉斯近似,变分近似和马尔可夫链蒙特卡罗(Jordan,1999)。在本节中,我们描述了一个简单的基于凸性的变分算法,用于推断LDA,并讨论了第8节中的一些替代方案。

基于凸性的变分推理的基本思想是利用Jensen不等式来获得对数似然的可调下界(Jordan et al。,1999)。本质上,人们考虑一系列下界,它们由一组变分参数索引。变分参数由优化程序选择,该程序试图找到最可能的下限。

获得易处理的下界族的简单方法是考虑原始图形模型的简单修改,原始图形模型中一些边和节点已被移除。特别考虑图5(左)中所示的LDA模型。 θ和β之间的有问题的耦合是由于θ,z和w之间的边界而产生的。 通过丢弃这些边和w节点,并赋予所得到的简化图形模型以及自由变分参数,我们获得了潜在变量的一个分布族。这个分布族以下面这个变分分布为特征:

已经指定了简化的概率分布族,下一步是建立一个确定变分参数γ和Φ的值的优化问题。 正如我们在附录A中所示,找到对数似然的紧密下界的期望直接转化为以下优化问题:

因此,通过最小化变分分布和真实后验p(θ, z | w,α,β)之间的KullbackLeibler(KL)发散来找到变分参数的优化值。这种最小化可以通过迭代定点方法实现。 特别是,我们在附录A3中表明,通过计算KL散度的导数并将它们设置为零,我们得到以下一对更新方程:

最近有新的项目做,没时间翻译啦,以后有时间再填坑,此处省略3000字

矩阵g太小,所以不明显。

一般用于大一点的矩阵实验效果会更好,例如:

h=imread('photojpg'); %读入彩色

c=rgb2gray(h); %把彩色转化成灰度,256级

figure,imshow(c),title('原始图象'); %显示原始图象

g=imnoise(c,'gaussian',01,0002); %加入高斯噪声

figure,imshow(g),title('加入高斯噪声之后的图象'); %显示加入高斯噪声之后

上面倒数第二句就是在原图加上高斯噪声的效果。

以上就是关于怎么学习人工智能全部的内容,包括:怎么学习人工智能、为什么非科班这么难进数据挖掘这一行、NLP第九篇-句法分析等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/9282359.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-26
下一篇 2023-04-26

发表评论

登录后才能评论

评论列表(0条)

保存