mirror of
https://github.com/cheetahlou/CategoryResourceRepost.git
synced 2025-10-21 01:13:45 +08:00
mod
This commit is contained in:
79
极客时间专栏/AI技术内参/自然语言处理及文本处理核心技术/097 | LDA模型的前世今生.md
Normal file
79
极客时间专栏/AI技术内参/自然语言处理及文本处理核心技术/097 | LDA模型的前世今生.md
Normal file
@@ -0,0 +1,79 @@
|
||||
<audio id="audio" title="097 | LDA模型的前世今生" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/f8/a0/f81d650df1c048e2b8942d248d45aaa0.mp3"></audio>
|
||||
|
||||
在文本挖掘中,有一项重要的工作就是分析和挖掘出文本中隐含的结构信息,而不依赖任何提前标注的信息。今天我要介绍的是一个叫做**LDA**(Latent Dirichlet Allocation)的模型,它在过去十年里开启了一个领域叫**主题模型**。
|
||||
|
||||
从LDA提出后,不少学者都利用它来分析各式各样的文档数据,从新闻数据到医药文档,从考古文献到政府公文。一段时间内,LDA成了分析文本信息的标准工具。从最原始的LDA发展出来的各类模型变种,则被应用到了多种数据类型上,包括图像、音频、混合信息、推荐系统、文档检索等等,各类主题模型变种层出不穷。下面我来简单剖析一下LDA这个模型,聊聊它的模型描述以及训练方法等基础知识。
|
||||
|
||||
## LDA的背景介绍
|
||||
|
||||
LDA的论文作者是戴维·布雷(David Blei)、吴恩达和迈克尔·乔丹(Michael Jordan)。这三位都是今天机器学习界炙手可热的人物。论文最早发表在2002年的神经信息处理系统大会(Neural Information Processing Systems,简称NIPS)上,然后长文章(Long Paper)于2003年在机器学习顶级期刊《机器学习研究杂志》(Journal of Machine Learning Research)上发表。迄今为止,这篇论文已经有超过1万9千次的引用数,也成了机器学习史上的重要文献之一。
|
||||
|
||||
论文发表的时候,戴维·布雷还在加州大学伯克利分校迈克尔手下攻读博士。吴恩达当时刚刚从迈克尔手下博士毕业来到斯坦福大学任教。戴维 2004年从伯克利毕业后,先到卡内基梅隆大学跟随统计学权威教授约翰·拉弗蒂(John Lafferty)做了两年的博士后学者,然后又到东部普林斯顿大学任教职,先后担任助理教授和副教授。2014年转到纽约哥伦比亚大学任统计系和计算机系的正教授。戴维在2010年获得斯隆奖(Alfred P. Sloan Fellowship,美国声誉极高的奖励研究人员的奖项,不少诺贝尔奖获得者均在获得诺贝尔奖多年之前获得过此奖),紧接着又在2011年获得总统青年科学家和工程师早期成就奖(Presidential Early Career Award for Scientists and Engineers,简称PECASE)。目前他所有论文的引用数超过了4万9千次 。
|
||||
|
||||
吴恩达在斯坦福晋升到副教授后,2011年到2012年在Google工作,开启了谷歌大脑(Google Brain)的项目来训练大规模的深度学习模型,是深度学习的重要人物和推动者之一。2012年他合作创建了在线学习平台Coursera,可以说是打开了慕课(Massive Open Online Course,简称MOOC)运动的大门。之后吴恩达从2014年到2017年间担任百度首席科学家,并创建和运行了百度在北美的研究机构。目前他所有论文的引用数超过8万3千次。
|
||||
|
||||
文章的第三作者迈克尔·乔丹是机器学习界的泰斗人物。他自1998年在加州大学伯克利任教至今,是美国三个科学院院士(American Academy of Arts and Sciences、National Academy of Engineering以及National Academy of Sciences),是诸多学术和专业组织的院士(比如ACM、IEEE、AAAI、SIAM等)。迈克尔可以说是桃李满天下,而且其徒子徒孙也已经遍布整个机器学习领域,不少都是学术权威。他的所有论文有多达12万次以上的引用量。
|
||||
|
||||
值得注意的是,对于三位作者来说,LDA论文都是他们单篇论文引用次数最多的文章。
|
||||
|
||||
## LDA模型
|
||||
|
||||
要描述LDA模型,就要说一下LDA模型所属的**产生式模型**(Generative Model)的背景。产生式模型是相对于**判别式模型**(Discriminative Model)而说的。这里,我们假设需要建模的数据有特征信息,也就是通常说的X,以及标签信息,也就是通常所说的Y。
|
||||
|
||||
判别式模型常常直接对Y的产生过程(Generative Process)进行描述,而对特征信息本身不予建模。这使得判别式模型天生就成为构建分类器或者回归分析的有利工具。而产生式模型则要同时对X和Y建模,这使得产生式模型更适合做无标签的数据分析,比如聚类。当然,因为产生式模型要对比较多的信息进行建模,所以一般认为对于同一个数据而言,产生式模型要比判别式模型更难以学习。
|
||||
|
||||
一般来说,产生式模型希望通过一个产生过程来帮助读者理解一个模型。注意,这个产生过程本质是描述一个**联合概率分布**(Joint Distribution)的分解过程。也就是说,这个过程是一个虚拟过程,真实的数据往往并不是这样产生的。这样的产生过程是模型的一个假设,一种描述。任何一个产生过程都可以在数学上完全等价一个联合概率分布。
|
||||
|
||||
LDA的产生过程描述了文档以及文档中文字的生成过程。在原始的LDA论文中,作者们描述了对于每一个文档而言有这么一种生成过程:
|
||||
|
||||
<li>
|
||||
首先,从一个全局的泊松(Poisson)参数为β的分布中生成一个文档的长度N;
|
||||
</li>
|
||||
<li>
|
||||
从一个全局的狄利克雷(Dirichlet)参数为α的分布中生成一个当前文档的θ;
|
||||
</li>
|
||||
<li>
|
||||
然后对于当前文档长度N的每一个字执行以下两步,一是从以θ为参数的多项(Multinomial)分布中生成一个主题(Topic)的下标(Index)z_n;二是从以φ和z共同为参数的多项分布中产生一个字(Word)w_n。
|
||||
</li>
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/3a/67/3a199f87bc6ebdae0eea8dbe8fbe1467.png" alt="" />
|
||||
|
||||
从这个描述我们可以马上得到这些重要的模型信息。第一,我们有一个维度是K乘以V的主题矩阵(Topic Matrix)。其中每一行都是一个φ,也就是某一个生成字的多项分布。当然,这个主题矩阵我们在事先并不知道,是需要学习得到的。另外,对每一个文档而言,θ是一个长度为K的向量,用于描述当前文档在K个主题上的分布。产生过程告诉我们,我们对于文档中的每一个字,都先从这个θ向量中产生一个下标,用于告诉我们现在要从主题矩阵中的哪一行去生成当前的字。
|
||||
|
||||
这个产生模型是原论文最初提出的,有两点值得注意。
|
||||
|
||||
第一,原始论文为了完整性,提出了使用一个泊松分布来描述文档的长度这一变化信息。然而,从模型的参数和隐变量的角度来说,这个假设并不影响整个模型,最终作者在文章中去除了这个信息的讨论。在主题模型的研究中,也较少有文献专注这个信息。
|
||||
|
||||
第二,原始论文并没有在主题矩阵上放置全局的狄利克雷分布作为先验概率分布。这一缺失在后续所有的主题模型文献中得到修正。于是今天标准的LDA模型有两类狄利克雷的先验信息,一类是文档主题分布的先验,参数是α,一类是主题矩阵的先验,参数是β。
|
||||
|
||||
文章作者们把这个模型和当时的一系列其他模型进行了对比。比如说,LDA并不是所谓的狄利克雷-多项(Dirichlet-Multinomial)聚类模型。这里,LDA对于每个文档的每一个字都有一个主题下标。也就是说,从文档聚类的角度来看,LDA是没有一个文档统一的聚类标签,而是每个字有一个聚类标签,在这里就是主题。这也是LDA是**Mixed-Membership模型**的原因——每个字有可能属于不同的类别、每个文档也有可能属于不同的类别。
|
||||
|
||||
LDA很类似在2000年初提出的另外一类更简单的主题模型——概率隐形语义索引(Probabilistic Latent Semantic Indexing),简称**PLSI**。其实从本质上来说,LDA借用了PLSI的基本架构,只不过在每个文档的主题分布向量上放置了狄利克雷的先验概率,以及在主题矩阵上放置了另外一个狄利克雷的先验概率。
|
||||
|
||||
尽管看上去这是一个非常小的改动,但是这样做的结果则是LDA的参数个数并不随着文档数目的增加而增加。那么,相对于PLSI来说,LDA并不容易对训练数据**过度拟合**(Overfitting)。
|
||||
|
||||
值得注意的,原始文章说过度拟合主要是指,对于PLSI而言,文档的主题分布向量是必须需要学习的,而这个向量对于LDA是可以被忽略或者说是并不需要保存的中间变量。然而在实际的应用中,我们其实常常也需要这个向量的信息,因此这部分对于过度拟合的讨论在后来的应用中并没有特别体现。
|
||||
|
||||
## LDA模型的训练和结果
|
||||
|
||||
LDA虽然从某种意义上来说仅仅是在PLSI上增加了先验信息。然而,这一个改动为整个模型的训练学习带来了非常大的挑战。应该说,整个LDA的学习直到模型提出后近10年,才随着**随机变分推理**(Stochastic Variational Inference)的提出以及基于**别名方法**(Alias Method)的抽样算法(Sampling Method)而得以真正的大规模化。一直以来,LDA的训练学习都是一件很困难的事情。
|
||||
|
||||
不像PLSI可以依靠**最大期望(EM)算法**得以比较完美的解决,传统上,LDA的学习属于**贝叶斯推理**(Bayesian Inference),而在2000年代初期,只有**马尔科夫蒙特卡洛**(Markov chain Monte Carlo),简称MCMC,以及迈克尔·乔丹等人推崇的**变分推理**(Variational Inference),简称VI,作为工具可以解决。这篇文章因为出自迈克尔的实验室,当仁不让地选择了VI。比较有意思的是,后续大多数LDA相关的论文都选择了MCMC为主的**吉布斯**(Gibbs)采样来作为学习算法。
|
||||
|
||||
VI的完整讲解无法在本文涵盖。从最高的层次上来理解,VI是选取一整组简单的、可以优化的所谓变分分布(Variational Distribution)来逼近整个模型的后验概率分布。当然,由于这组分布的选取,有可能会为模型带来不小的误差。不过好处则是这样就把贝叶斯推理的问题转化成了优化问题。
|
||||
|
||||
从LDA的角度来讲,就是要为θ以及z选取一组等价的分布,只不过更加简单,更不依赖其他的信息。在VI进行更新θ以及z的时候,算法可以根据当前的θ以及z的最新值,更新α的值(这里的讨论依照原始的LDA论文,忽略了β的信息)。整个流程俗称**变分最大期望(Variational EM)算法**。
|
||||
|
||||
文章在TREC AP的文档数据中做了实验。首先,作者们使用了一个叫**困惑度**(Perplexity)的评估值来衡量文档的建模有效程度,这个值越低越好。LDA在好几个数据集中都明显好于PLSI以及其他更加简单的模型。从这篇文章之后,主题模型的发展和对比都离不开困惑度的比较,也算是开启了一个新时代。
|
||||
|
||||
然后,作者们展示了利用LDA来做文档分类,也就是利用文档主题向量来作为文档的特征,从而放入分类器中加以分类。作者们展示了LDA作为文档分类特征的有力证据,在数据比较少的情况下优于文本本身的特征。不过总体说来,在原始的LDA论文中,作者们并没有特别多地展现出LDA的所有可能性。
|
||||
|
||||
## 小结
|
||||
|
||||
今天我为你梳理了LDA提出的背景以及这篇论文所引领的整个领域的情况。你需要掌握的核心要点:第一,论文作者们目前的状态;第二,LDA模型本身和它的一些特点;第三,LDA的训练流程概况以及在原始文章中的实验结果。
|
||||
|
||||
最后,我为你留一个思考题:LDA的产生过程决定了对于一个文本而言,每个字都可能来自不同的主题,那么如果你希望,对于某一个段落,所有的文字都来自同一个主题,你需要对LDA这个模型进行怎么样的修改呢?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
|
63
极客时间专栏/AI技术内参/自然语言处理及文本处理核心技术/098 | LDA变种模型知多少.md
Normal file
63
极客时间专栏/AI技术内参/自然语言处理及文本处理核心技术/098 | LDA变种模型知多少.md
Normal file
@@ -0,0 +1,63 @@
|
||||
<audio id="audio" title="098 | LDA变种模型知多少" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/fb/11/fbec4fb9f5b4e3f0454bda00bcf8c811.mp3"></audio>
|
||||
|
||||
我们在之前的分享中曾经介绍过文本挖掘(Text Mining)中的重要工具LDA(Latent Diriclet Allocation)的基本原理。在文本挖掘中,有一项重要的工作就是分析和挖掘出文本中隐含的结构信息,而不依赖任何提前标注(Labeled)的信息。也就是说,我们希望能够利用文本挖掘技术来对无标签的数据进行挖掘,这是典型的无监督学习。
|
||||
|
||||
LDA就是一个出色的无监督学习的文本挖掘模型。这个模型在过去的十年里开启了主题模型(Topic Model)这个领域。不少学者都利用LDA来分析各式各样的文档数据,从新闻数据到医药文档,从考古文献到政府公文。在一段时间内,LDA成为了分析文本信息的标准工具。而从最原始的LDA发展出来的各类模型变种,则被应用到了多种数据类型上,包括图像、音频、混合信息、推荐系统、文档检索等等,可以说各类主题模型变种层出不穷。
|
||||
|
||||
今天我们就结合几篇经典论文,来看一看**LDA的各种扩展模型**。当然,在介绍今天的内容之前,我们首先来回顾一下LDA模型的一些基本信息。
|
||||
|
||||
## LDA模型的回顾
|
||||
|
||||
LDA模型是一个典型的**产生式模型**(Generative Model)。产生式模型的一大特点就是通过一组概率语言,对数据的产生过程进行描述,从而对现实数据建立一个模型。注意,这个产生过程的本质是描述的一个**联合概率分布**(Joint Distribution)的分解过程。也就是说,这个过程是一个虚拟的过程,真实的数据往往并不是这样产生的。这样的产生过程是模型的一个假设,一种描述。任何一个产生过程都可以在数学上完全等价一个联合概率分布。
|
||||
|
||||
LDA的产生过程描述了文档以及文档中文字的产生过程。在原始的LDA论文中,作者们描述了对于每一个文档而言的产生过程。
|
||||
|
||||
[LDA模型的前世今生](https://time.geekbang.org/column/article/376)
|
||||
|
||||
相比于传统的文本聚类方法,LDA对于每个文档的每一个字都有一个主题下标,也就是说,LDA是没有一个文档统一的聚类标签,而是每个字有一个聚类标签,在这里就是主题。
|
||||
|
||||
LDA模型的训练一直是一个难点。传统上,LDA的学习属于**贝叶斯推断**(Bayesian Inference),而在2000年初期,只有**MCMC算法**(Markov chain Monte Carlo,马尔科夫链蒙特卡洛)以及 **VI**(Variational Inference,变分推断)作为工具可以解决。在最初的LDA论文里,作者们采用了VI;后续大多数LDA相关的论文都选择了MCMC为主的吉布斯采样(Gibbs Sampling)来作为学习算法。
|
||||
|
||||
## LDA的扩展
|
||||
|
||||
当LDA被提出以后,不少学者看到了这个模型的潜力,于是开始思考怎么把更多的信息融入到LDA里面去。通过我们上面的讲解,你可以看到,LDA只是对文档的文字信息本身进行建模。但是绝大多数的文档数据集还有很多额外的信息,如何利用这些额外信息,就成为了日后对LDA扩展的最重要的工作。
|
||||
|
||||
第一个很容易想到的需要扩展的信息就是作者信息。特别是LDA最早期的应用,对于一般的文档来说,比如科学文档或者新闻文档,都有作者信息。很多时候我们希望借用作者在写文档时的遣词造句风格来分析作者的一些写作信息。那么,如何让LDA能够分析作者的信息呢?
|
||||
|
||||
这里我们分享一篇论文《用于作者和文档信息的作者主题模型》(The author-topic model for authors and documents)[1],这是最早利用额外信息到LDA模型中的扩展模型。文章提出的模型叫作“**作者LDA**”(Author LDA)。这个模型的主要思想是,每篇文档都会有一些作者信息,我们可以把这些作者编码成为一组下标(Index)。对于每一个文档来说,我们首先从这组作者数组中,选出一个当前的作者,然后假定这个作者有一组相对应的主题。这样,文档的主题就不是每个文档随机产生了,而是每个作者有一套主题。这个时候,我们从作者相对应的主题分布中取出当前的主题,然后再到相应的语言模型中,采样到当前的单词。
|
||||
|
||||
可以看到,作者LDA和普通的LDA相比,最大的不同就是**主题分布不是每个文档有一个,而是每个作者有一个**。这个主题分布决定着当前的单词是从哪一个语言模型中采样的单词。作者LDA也采用吉布斯采样的方法学习,并且通过模型的学习之后,能够看得出不同作者对于文档的影响。
|
||||
|
||||
从作者LDA之后,大家看出了一种扩展LDA的思路,那就是**依靠额外的信息去影响主题分布,进而影响文档字句的选择**。这种扩展的方法叫作“**上游扩展法**”(Upstream)。什么意思呢?就是说把希望对模型有影响的信息,放到主题分布的上游,去主动影响主题分布的变化。**这其实是概率图模型的一种基本的思路,那就是把变量放到这个产生式模型的上游,使得下游的变量受到影响**。
|
||||
|
||||
那你可能要问,有没有把需要依赖的变量放到下游的情况呢?答案是肯定的。我们再来看一篇论文《同时进行图像分类和注释》(Simultaneous image classification and annotation)[2],这篇文章就发明了一种方法。具体来说,文章希望**利用LDA到多模数据领域**(Multiple Modal)。也就是数据中可能有文字,也可能有图像,还可能有其他信息。在这样的多模数据的情况下,如何让LDA能够对多种不同的数据进行建模呢?
|
||||
|
||||
这里面的基本思路就是认为**所有的这些数据都是通过主题分布产生的**。也就是说,一个数据点,我们一旦知道了这个数据点内涵的主题(比如到底是关于体育的,还是关于金融的),那么我们就可以产生出和这个数据点相关的所有信息,包括文字、图像、影音等。
|
||||
|
||||
具体到这篇文章提出的思路,那就是这组数据的图像标签以及图像所属的类别都是主题产生的。我们可以看到,和之前的作者LDA的区别,那就是其他信息都是放在主题变量的下游的,希望通过主题变量来施加影响。
|
||||
|
||||
这两种模型代表了一系列丰富的关于LDA的扩展思路,那就是**如何把扩展的变量设置在上游或者是下游,从而能够对主题信息产生影响或者是受到主题信息的影响**。
|
||||
|
||||
除此以外,LDA的另外一大扩展就是**把文档放到时间的尺度上,希望去分析和了解文档在时间轴上的变化**。这就要看经典的论文《动态主题模型》(Dynamic topic models)[3]。这篇论文最后获得了ICML 2010年的最佳贡献奖。那么,我们怎么修改LDA使其能够理解时间的变化呢?很明显,还是需要从主题分布入手,因为主题分布控制了究竟什么文字会被产生出来。因此,我们可以认为主题分布会随着时间的变化而变化。
|
||||
|
||||
在之前的模型中,我们已经介绍了,每个文档的主题分布其实来自一个全局的狄利克雷(Diriclet )先验分布。那么,我们可以认为不同时间的先验分布是不一样的,而这些先验分布会随着时间变化而变化。怎么能够表达这个思想呢?作者们用到了一个叫“**状态空间**”(State-Space)的模型。简而言之,状态空间模型就是把不同时间点的狄利克雷分布的参数给串起来,使得这些分布的参数会随着时间的变化而变化。**把一堆静态的参数用状态空间模型串接起来**,可以说是这篇文章开创的一个新的思维。
|
||||
|
||||
## 总结
|
||||
|
||||
今天我为你梳理了LDA的扩展模型。LDA的扩展当然还有很多,我们今天讨论了几个非常经典的扩展思路,分别是基于上游、下游和时间序列的LDA扩展模型。
|
||||
|
||||
一起来回顾下要点:第一,我们回顾了LDA这个模型的核心思想;第二,我们聊了如何把文档的其他信息融入到LDA模型中去,以及如何对时间信息进行建模。
|
||||
|
||||
最后,给你留一个思考题,如果我们希望利用LDA来对“用户对商品的喜好”进行建模,应该怎么对模型进行更改呢?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
**参考文献**
|
||||
|
||||
1. Michal Rosen-Zvi, Thomas Griffiths, Mark Steyvers, and Padhraic Smyth. [The author-topic model for authors and documents](https://mimno.infosci.cornell.edu/info6150/readings/398.pdf). Proceedings of the 20th conference on Uncertainty in artificial intelligence (UAI '04). AUAI Press, Arlington, Virginia, United States, 487-494, 2004.
|
||||
|
||||
2. C. Wang, D. Blei., and L. Fei-Fei. Simultaneous image classification and annotation. Computer Vision and Pattern Recognition, 2009.
|
||||
|
||||
3. D.Blei and J.Lafferty. [Dynamic topic models](https://mimno.infosci.cornell.edu/info6150/readings/dynamic_topic_models.pdf). Proceedings of the 23rd International Conference on Machine Learning, 2006.
|
||||
|
||||
|
63
极客时间专栏/AI技术内参/自然语言处理及文本处理核心技术/099 | 针对大规模数据,如何优化LDA算法?.md
Normal file
63
极客时间专栏/AI技术内参/自然语言处理及文本处理核心技术/099 | 针对大规模数据,如何优化LDA算法?.md
Normal file
@@ -0,0 +1,63 @@
|
||||
<audio id="audio" title="099 | 针对大规模数据,如何优化LDA算法?" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/91/3c/91e33dc6ec1145a02cc4e696ae80093c.mp3"></audio>
|
||||
|
||||
周一,我们分享了LDA(Latent Diriclet Allocation)的各种扩展模型,介绍了基于上游的和下游的两种把额外信息融入到LDA模型中的方法。同时,我们也讨论了在时间尺度上如何把LDA模型扩展到可以“感知”不同的时间段对于模型的影响。以LDA为代表的主题模型在过去的十年间发展出了一整套的扩展,为各式各样的应用场景提供了有力的工具。
|
||||
|
||||
尽管LDA在模型的表达力上给研究者们提供了把各种场景和模型结合的可能性,但是LDA的训练过程比较复杂,而且速度也比较慢。因此,如何能够把LDA真正应用到工业级的场景中,对于很多人来说,都是一件煞费苦心的事情。今天我们就来聊聊**LDA的算法优化问题**。
|
||||
|
||||
## LDA模型训练
|
||||
|
||||
我们首先来回顾一下LDA模型的训练过程,从高维度上为你分析一下为什么这个过程很困难。
|
||||
|
||||
LDA模型中最重要的未知变量就是每个单词对应的**主题下标**(Index)或者说是**主题“赋值”**(Assignment)。这个主题下标是从每个文档对应的主题分布中“采样”得来的。每个文档的主题分布本身也是一个未知的多项式分布,用来表达当前这个文档的所属主题,比如有多少百分比属于运动、有多少百分比属于金融等等。这个分布是从一个全局的狄利克雷(Diriclet)分布中产生的。狄利克雷分布在这里起到了**超参数**的作用,其参数的取值往往也是未知的。但是我们可以根据一些**经验值**对其进行设置。除了每个文档的主题分布和主题赋值以外,我们还需要对全局的主题语言模型进行估计。这些语言模型直接决定了,各类词语出现的概率是多少。
|
||||
|
||||
流行的LDA训练方法有两个,一个是基于**吉布斯采样**(Gibbs Sampling)的随机方法,一个是基于**变分推断**(Variational Inference)的确定性方法(Deterministic)。这两种方法的初始形态都无法应对大型数据。这里我们来简要介绍一下这两种方法。
|
||||
|
||||
**吉布斯采样**主要是针对主题赋值进行采样,最开始是完全随机的结果,但是慢慢会收敛到参数的后验概率的真值。这里面比较慢的一个原因,是这个收敛过程可能需要几百到几千个不等的迭代。同时,吉布斯采样只能一个文档一个文档进行,所有的数据结构都需要在采样的过程中进行更改。这个过程比较慢的另外一个原因,是吉布斯采样的核心是如何对一个离散分布进行采样。而离散分布采样本身,如果在分布的参数变化的情况下,最好能够达到O(KlogK),这里K是主题的数目。因此,从原理上来说,这也是阻碍吉布斯采样能够扩展到大型数据的一个原因。
|
||||
|
||||
**变分推断**的思路则和吉布斯采样很不一样。它是把对隐含参数的估计问题变成一个确定性的优化问题,这样我们就可以**利用种种优化算法来解决贝叶斯推断的问题**。不过和吉布斯采样相比,变分推断存在一个问题,因为这种方法并不是解决原来的优化问题,因此新的优化问题可能并不能带来原来问题的解。同时,变分推断也需要一个文档一个文档单独处理,因此推广到大规模数据上有其局限性。
|
||||
|
||||
## LDA的大规模优化算法
|
||||
|
||||
顺着我们刚才提到的问题,为了把吉布斯采样和变分推断扩大到大规模数据上,学者们有针对性地做了很多探索。我们下面就分别对这两种思路展开简要的介绍。
|
||||
|
||||
首先,我们来看吉布斯采样。吉布斯采样慢的一个核心就是我们刚才说的,需要从一个离散分布中采样出一个样本,在我们这个例子中也就是每个单词的主题赋值。那么,有没有什么方法让这个步骤加速呢?答案是,有的。
|
||||
|
||||
在KDD 2009上发表了一篇论文《应用于流文档集合的主题模型推断的高效方法》(Efficient methods for topic model inference on streaming document collections)[1],算是在这方面取得突出成绩的一个重要参考文献。这篇论文的主要贡献就是,对原有的采样公式进行了一个比较仔细的分析。
|
||||
|
||||
作者们发现,原来的吉布斯采样公式可以被分解为几个部分:和全局的语言模型有关、和文档有关以及和当前需要采样的单词有关。这是一个非常有价值的观察,之后很多加速吉布斯采样的工作基本上都采用了类似的思路,也就是**试图把原始的吉布斯采样公式拆分成好几个组成部分,并且每一个部分所代表数据的变化率是不一样的**。
|
||||
|
||||
以这篇文章提出的方法来说,全局语言模型在每个文档的采样过程中是不变的,于是这部分的计算不需要每个单词都重算。同理,只与文档相关的部分,也可以每个单词的采样过程中,只算一次,而不需要每个主题算一次。在这样一个简化了的流程里,采样速度得到了极大的提升。
|
||||
|
||||
在这篇文章之后,通过吉布斯采样这个方法,LDA的采样速度还是没有得到明确的提升,直到《降低主题模型的采样复杂度》(Reducing the sampling complexity of topic models)[2]这篇论文的出现。这篇论文获得了KDD 2014年的最佳论文奖。文章的思想还是针对吉布斯采样的公式,不过这一次,拆分的方法略不一样。作者们把采样的公式拆分成了与当前文档有关系的一部分,以及和当前文档没关系的全局语言模型的部分。
|
||||
|
||||
同时,作者们提出了一个“**Alias方法**”(Alias Method),简称**A算法**,来加速采样。这个A算法其实并不是作者们为了LDA发明的,而是一个普遍的可以对离散分布采样的一个算法。A算法的核心思想是,如果我们要针对一个分布进行反复采样,那么就可以建立一种数据结构,使得这种采样只有在第一遍的时候有一定的计算成本,而后都会以O(1)的成本进行采样。这个方法极大地加速了LDA通过吉布斯采样的效率。值得一提的是,在这篇论文之后,很多研究者发布了一系列的后续工作。
|
||||
|
||||
那么在变分推断的道路上,有没有什么方法能够加速呢?答案依然是肯定的。
|
||||
|
||||
这方面的代表作无疑就是论文《LDA的在线学习》(Online learning for Latent Dirichlet Allocation)[3]。
|
||||
|
||||
我们回到变分推断的场景中,把一个贝叶斯推断的问题变成了优化的问题。那么,在优化的场景里,是怎么针对大规模数据的呢?
|
||||
|
||||
在优化的场景里,特别是基于梯度(Gradient)的优化方法中,大数据的应用往往需要SGD(Stochastic Gradient Descent,随机梯度下降)的方法。通俗地讲,就是在计算梯度的时候,我们不需要处理完所有的数据之后才计算一次梯度,而是针对每一个文档,都可以计算一次梯度的估计值。
|
||||
|
||||
作者们其实就是把这个思想给搬到了变分推断里。总的来说,新发明出来的变分推断其实就是希望能够**推演出一种类似SGD的变分方法**,这种方法在后来的很多论文中都有所应用。
|
||||
|
||||
## 总结
|
||||
|
||||
今天我为你梳理了LDA优化算法的相关知识。
|
||||
|
||||
一起来回顾下要点:第一,我们聊了聊LDA这个模型的优化算法为什么会有难度,特别是针对吉布斯采样和变分推断这两种思路来说难点在哪里;第二,我们分享了当前加速LDA算法的两种思路,主要讨论了两种思路的一些核心思想,希望能够起到抛砖引玉的作用。
|
||||
|
||||
最后,给你留一个思考题,除了在算法层面希望能够加速LDA以外,我们能否利用并行化对LDA进行加速呢?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
**参考文献**
|
||||
|
||||
1. Limin Yao, David Mimno, and Andrew McCallum. [Efficient methods for topic model inference on streaming document collections](https://core.ac.uk/download/pdf/21747811.pdf). Proceedings of the 15th ACM SIGKDD international conference on Knowledge discovery and data mining (KDD '09). ACM, New York, NY, USA, 937-946, 2009.
|
||||
|
||||
2. Aaron Q. Li, Amr Ahmed, Sujith Ravi, and Alexander J. Smola. [Reducing the sampling complexity of topic models](http://www.sravi.org/pubs/fastlda-kdd2014.pdf). Proceedings of the 20th ACM SIGKDD international conference on Knowledge discovery and data mining (KDD '14). ACM, New York, NY, USA, 891-900, 2014.
|
||||
|
||||
3. Matthew D. Hoffman, David M. Blei, and Francis Bach. [Online learning for Latent Dirichlet Allocation](https://www.di.ens.fr/~fbach/mdhnips2010.pdf). Proceedings of the 23rd International Conference on Neural Information Processing Systems - Volume 1 (NIPS’10), 2010.
|
||||
|
||||
|
53
极客时间专栏/AI技术内参/自然语言处理及文本处理核心技术/100 | 基础文本分析模型之一:隐语义分析.md
Normal file
53
极客时间专栏/AI技术内参/自然语言处理及文本处理核心技术/100 | 基础文本分析模型之一:隐语义分析.md
Normal file
@@ -0,0 +1,53 @@
|
||||
<audio id="audio" title="100 | 基础文本分析模型之一:隐语义分析" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/21/f1/2162ebdc23278e21d5df49271d5930f1.mp3"></audio>
|
||||
|
||||
本周我们分享了文本挖掘中的一个重要工具LDA(Latent Diriclet Allocation),这是一个出色的无监督学习的文本挖掘模型。
|
||||
|
||||
今天,我们沿着文本分析这一方向继续展开。我们首先回到一个最基础的问题,那就是文本分析的基础模型都有哪些,这些最早的模型对后面的发展都有哪些贡献和启发?
|
||||
|
||||
带着这些问题,我们一起来看一个叫“**隐语义分析**”(Latent Semantic Indexing)的技术。
|
||||
|
||||
## 隐语义分析的背景
|
||||
|
||||
为什么需要隐语义分析呢?隐语义分析到底发挥了怎样的历史性作用呢?
|
||||
|
||||
对于数据挖掘而言,文本数据算是大规模数据中,研究人员最早接触到的一类数据了。长久以来,大家都有一种直观的想法,那就是在这些看似没有头绪的文字中,究竟有没有隐含着某些规律呢?我们到底能不能从文字中提取出一些更加有用的结构性的内容呢?
|
||||
|
||||
**对于文本分析,有一类是基于“显式”的标签来进行的**。也就是说,我们可以把文本分析当作是**监督学习的任务**来看待。这一类文本分析的一大特点,往往是针对某一种任务建立分类器,然后对不同类别的文本进行鉴别,从而达到更加深入理解文本的目的。比如,我们需要理解不同情感的文字的时候,通常情况下,我们需要有一个数据集,能够告诉我们哪些文档是“正面情绪”的,哪些是“负面情绪”的。
|
||||
|
||||
然而,并不是所有的文本分析任务都是建立在有数据标签的基础之上。实际上,对于绝大多数文本数据而言,我们事先是并没有标签信息的。那么,**在没有标签信息的场景下,如何对文本提取关键信息就成为了研究人员长期面对的一个关键挑战**。
|
||||
|
||||
如果我们用今天的眼光来看,**隐语义分析的核心其实就是用无监督的方法从文本中提取特性**,而这些特性可能会对原文本的深层关系有着更好的解释。
|
||||
|
||||
其实,从20世纪80年代发展出来的隐语义分析,一直到今天利用深度学习技术来对文本的内涵进行分析,其实质都是一样的,都是看如何能够用无监督的方法提取文本特性,一个重要的区别当然是在提取办法的差异上。
|
||||
|
||||
## 隐语义分析
|
||||
|
||||
对隐语义分析的一个简单直白的解释就是:**利用矩阵分解的概念对“词-文档矩阵”(Term-Document Matrix)进行分解**。
|
||||
|
||||
在前面介绍推荐系统的时候,我们已经看到了矩阵分解可以认为是最直接的一种针对矩阵数据的分析方式。
|
||||
|
||||
那么,为什么我们需要对矩阵进行分解呢?
|
||||
|
||||
这里面的一个隐含的假设就是,**“词-文档矩阵”是一个稀疏矩阵**。什么意思?意思就是从大规模的文字信息来说,文字服从一个叫“**幂定律**”(Power Law Distribution)的规律。那就是绝大多数的单词仅出现很少的次数,而少数的单词会出现在很多文档中。我们也可以理解成一种变形的“20/80”原理,也就是20%的单词出现在80%的文档中。当然,文字的幂定理规则的一个直接结果就是“词-文档矩阵”是稀疏矩阵。这个矩阵里面有大量的零,代表很多单词都没有出现在那些文档中。
|
||||
|
||||
对一个稀疏矩阵,我们往往假设原有的矩阵并不能真正表示数据内部的信息。也就是说,我们认为可能会有一个结构存在于这个矩阵之中。而这个假设,就是我们经常会在矩阵分解这个语境中提到的“**低维假设**”(Low-rank Approximation)。你不必去担心这个低维假设的本质意义,我们只需要理解这个低维假设的核心,就是我们**可以用比较少的维度来表达原来的这个稀疏的矩阵**。
|
||||
|
||||
试想我们拥有一个N乘M的“词-文档矩阵”,也就是说我们有N个单词,M个文档。在这个稀疏矩阵的数据中,矩阵分解的基本思想是希望得到一个N乘以K的单词矩阵,以及一个K乘以M的文档矩阵。K是一个事先指定好的参数,这也是矩阵分解的一个核心问题,那就是如何选择这个K。我们可以看到,这种分解能够还原之前的N乘以M的“词-文档矩阵”。
|
||||
|
||||
那么,这两个新的矩阵有什么“含义”呢?人们通过对很多数据的分解以后发现,单词矩阵往往能够把一些在某种语境下的单词给聚拢。比如我们会发现,很多和体育相关的词会聚拢在某个维度下,而很多和金融相关的词会聚拢在另外一个维度下。慢慢地,大家就开始把每一个维度认定为一个“主题”。那么,**基于矩阵分解的隐语义分析其实就是最早的主题模型**。而文档矩阵则描述了不同文档在我们K个主题下的强度。
|
||||
|
||||
值得注意的是,我们这里为了介绍隐语义模型的实际意义而隐藏了一些实际的技术细节。从历史上看,比较流行的隐语义模型其实是基于“**奇异值分解**”(Singular Value Decomposition),也就是我们常常听到的**SVD分解**。由于篇幅有限,我们这里就不针对SVD分解展开讨论了。即便是SVD分解,其核心思想依然是我们刚才讲到的分解出来的主题矩阵。
|
||||
|
||||
基于矩阵分解的隐语义模型也有其局限性,最大的一个问题就是分解出来的矩阵本身都是实数,也就是有负数和正数,这也限制了我们真正用这些数来进行一些含义的推断。然而,即便如此,**在很长的一段时间里,基于SVD的隐语义模型可以说是标准的无监督文本挖掘的核心算法**。
|
||||
|
||||
## 总结
|
||||
|
||||
今天我为你介绍了基于矩阵分解的隐语义模型的相关知识。
|
||||
|
||||
一起来回顾下要点:第一,我们聊了聊为什么需要隐语义模型;第二,我们聊了一下基于矩阵分解的隐语义模型的核心思想及其局限。
|
||||
|
||||
最后,给你留一个思考题,如果我们要限制矩阵分解的结果是非负数,我们应该怎么做呢?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
|
47
极客时间专栏/AI技术内参/自然语言处理及文本处理核心技术/101 | 基础文本分析模型之二:概率隐语义分析.md
Normal file
47
极客时间专栏/AI技术内参/自然语言处理及文本处理核心技术/101 | 基础文本分析模型之二:概率隐语义分析.md
Normal file
@@ -0,0 +1,47 @@
|
||||
<audio id="audio" title="101 | 基础文本分析模型之二:概率隐语义分析" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/56/74/56b326e56283779c8afe0385aaa74074.mp3"></audio>
|
||||
|
||||
在上一篇的分享里,我们展开了文本分析这个方向,讨论了“隐语义分析”(Latent Semantic Indexing)这个模型。隐语义分析的核心是基于矩阵分解的代数方法。这种方法的好处自然是能够直接利用代数计算方法对文本进行分析,而短板则是无法很好地解释结果。而“解释性”是很多概率模型的一大优势,因此,自然就有很多研究者想到是否能够把概率的语言移植到隐语义分析上。
|
||||
|
||||
今天,我们就来分享“**概率隐语义分析**”(Probabilistic Latent Semantic Indexing)的一些基本内容。概率隐语义分析有时候又被简称为 **PLSA**(Probability Latent Semantic Analysis)。
|
||||
|
||||
## 隐语义分析核心思想
|
||||
|
||||
上周我们介绍过隐语义分析的核心思想,首先来简要回顾一下。
|
||||
|
||||
隐语义分析的核心其实就是用无监督的方法从文本中提取特性,而这些特性可能会对原来文本的深层关系有着更好的解释。
|
||||
|
||||
简单来说,隐语义分析就是利用了“矩阵分解”的概念,从而对“词-文档矩阵”(Term-Document Matrix)进行分解。
|
||||
|
||||
## 概率隐语义分析
|
||||
|
||||
既然概率隐语义分析是利用概率的语言,那么我们就来看看概率隐语义分析是如何对文档进行建模的。
|
||||
|
||||
首先,**PLSA是对文档和里面单词的联合分布进行建模**。这个文档和单词的联合分布其实就是类似隐语义分析中的那个文档和单词的矩阵。只不过,在PLSA里,我们不是直接对数据进行建模,而是认为数据是从某个分布中产生的结果。那么,对于这个联合分布该如何建模呢?
|
||||
|
||||
一种方法就是对这个联合分布**直接进行建模**,但是这往往会遇到数据不足的情况,或者无法找到一个合适的已知参数的分布来直接描述我们需要建模的这个联合分布。另外一种经常使用的方法就是**简化这个联合分布**,从而找到我们可以建模的形式。
|
||||
|
||||
那么,如何简化联合分布呢?一种方法就是**把一个联合分布进行分解**。
|
||||
|
||||
**一种分解分布的方法就是假定一些隐含的变量,然后数据又是从这些隐含变量中产生而来**。在我们现在的情况里,我们从文档和单词的联合分布入手,可以做出这样的假设:这个文档和单词的联合分布是,我们首先从文档出发,产生了当前所需要的主题(比如金融、运动等),然后再从主题出发,产生相应的单词。很明显,这里的主题是我们并不知道的隐含变量,是需要我们从数据中估计出来的。这就是PLSA模型的基本假设。
|
||||
|
||||
PLSA还有一个**等价的模型描述**,也是对文档单词联合分布的另外一种分解,那就是,我们首先假设有一个主题的先验概率,然后根据这个主题的分布,产生了一个文档,同时,也产生了这个文档里面的所有单词。这种假设观点非常类似我们之前在介绍高级的主题模型时谈到的“下游方法”(Down-Stream)。这里,文档变量和单词变量都成为了隐变量,也就是主题变量的下游变量。
|
||||
|
||||
通过一定的代数变形,我们可以得到这两种方法其实就是等价的。
|
||||
|
||||
如果我们按照第一种分解方法来认识文档单词分布,有一种更加通俗的解释:我们其实是给每一个单词都联系了一个未知的主题变量,这个主题变量是从一个文档级别的主题分布得来的,实际上,这是一个多项分布(Multinomial Distribution);然后,根据这个主题变量,我们又从相应的一个语言模型中,抽取出了当前的单词,这又是另外的一个多项分布。如果从这个角度来看待这个模型,你会发现,**PLSA其实和LDA非常相似**。
|
||||
|
||||
**实际上,从模型的根本特征上来说,PLSA和LDA都是对文档单词分布的一种分解,或者叫作产生解释**。只不过,LDA针对刚才我们所说的两个多项分布,一个是每个文档的主题分布,另外一个是K个语言模型,都外加了先验分布,使得整个模型更加符合贝叶斯统计的观点。然而**在建模的核心思想上,PLSA和LDA是一样的**。
|
||||
|
||||
关于如何学习PLSA这样的隐变量模型,我将会在后面的分享中和你详细讨论。
|
||||
|
||||
## 总结
|
||||
|
||||
今天我为你介绍了基于概率模型的隐语义模型的相关知识。
|
||||
|
||||
一起来回顾下要点:第一,我们简要回顾了隐语义模型的重要性;第二,我们讨论了基于概率语言的隐语义模型的核心思想,以及PLSA和LDA的联系和区别。
|
||||
|
||||
最后,给你留一个思考题,PLSA的建模流程有没有什么局限性?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
|
55
极客时间专栏/AI技术内参/自然语言处理及文本处理核心技术/102 | 基础文本分析模型之三:EM算法.md
Normal file
55
极客时间专栏/AI技术内参/自然语言处理及文本处理核心技术/102 | 基础文本分析模型之三:EM算法.md
Normal file
@@ -0,0 +1,55 @@
|
||||
<audio id="audio" title="102 | 基础文本分析模型之三:EM算法" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/32/bc/32c78d8415ff8b1375610605cc06aebc.mp3"></audio>
|
||||
|
||||
周一我们分享的模型是“概率隐语义分析”(Probabilistic Latent Semantic Indexing),或者简称为PLSA,这类模型有效地弥补了隐语义分析的不足,在LDA兴起之前,成为了有力的文本分析工具。
|
||||
|
||||
不管是PLSA,还是LDA,其模型的训练过程都直接或者间接地依赖一个算法,这个算法叫作“**期望最大化”**(Expectation Maximization),或简称为 **EM算法**。实际上,EM算法是针对隐参数模型(Latent Variable Model)最直接有效的训练方法之一。既然这些模型都需要EM算法,我们今天就来谈一谈这个算法的一些核心思想。
|
||||
|
||||
## EM和MLE的关系
|
||||
|
||||
EM算法深深根植于一种更加传统的统计参数方法:**最大似然估计**(Maximum Likelihood Estimation),有时候简称为 **MLE**。**绝大多数的机器学习都可以表达成为某种概率模型的MLE求解过程**。
|
||||
|
||||
具体来说,MLE是这样构造的。首先,我们通过概率模型写出当前数据的“似然表达”。所谓的“似然”表达,其实也就是在当前模型的参数值的情况下,看整个数据出现的可能性有多少。可能性越低,表明参数越无法解释当前的数据。反之,如果可能性非常高,则表明参数可以比较准确地解释当前的数据。因此,**MLE的思想其实就是找到一组参数的取值,使其可以最好地解释现在的数据**。
|
||||
|
||||
针对某一个模型写出这个MLE以后,就是一个具体的式子,然后看我们能否找到这个式子最大值下的参数取值。这个时候,整个问题往往就已经变成了一个优化问题。从优化的角度来说,那就是针对参数求导,然后尝试把整个式子置零,从而求出在这个时候的参数值。
|
||||
|
||||
对绝大多数相对比较简单的模型来说,我们都可以根据这个流程求出参数的取值。比如,我们熟悉的利用高斯分布来对数据进行建模,其实就可以通过MLE的形式,写出用高斯建模的似然表达式,然后通过求解最优函数解的方式得到最佳的参数表达。而正好,这个最优的参数就是样本的均值和样本的方差。
|
||||
|
||||
然而,并不是所有的MLE表达都能够得到一个“**解析解**”(Closed Form Solution),有不少的模型甚至无法优化MLE的表达式,那么这个时候,我们就需要一个新的工具来求解MLE。
|
||||
|
||||
**EM算法的提出就是为了简化那些求解相对比较困难模型的MLE解。**
|
||||
|
||||
有一点需要说明的是,EM算法并不能直接求到MLE,而只能提供一种近似。多数无法直接求解的MLE问题都属于**非凸(Non-Convex)问题**。因此,**EM能够提供的仅仅是一个局部的最优解,而不是全局的最优解**。
|
||||
|
||||
## EM算法的核心思想
|
||||
|
||||
理解了EM和MLE的关系后,我们来看一看EM的一些核心思想。因为EM算法是技术性比较强的算法,我建议你一定要亲自去推演公式,从而能够真正理解算法的精髓。我们在这里主要提供一种大体的思路。
|
||||
|
||||
EM算法的一种解释是这样的。首先,我们可以通过代数变形,为每一个数据点的似然公式找到一个新的概率分布,而这个概率分布是通过一个隐含变量来达到的。很明显,在理论上,我们可以通过把这个隐含变量积分掉来达到恢复原始的MLE公式的目的。
|
||||
|
||||
然而,这里遇到的一个大的阻碍就是,在MLE公式里面,有一个求对数函数(log)在这个积分符号外面。这就导致整个式子无法进行操作。通俗地讲,EM就是要针对这样的情况,试图把这个在积分符号之外的求对数函数拿到积分符号里面。能够这么做,是因为有一个不等式,叫“**杨森不等式**”。你不需要去理解杨森不等式的细节,大体上这个不等式是说,函数的期望值要大于或等于先对函数的变量求期望然后再对其作用函数。
|
||||
|
||||
于是,在这样的一个不等式的引领下,我们刚才所说的积分,其实就可以被看作是对某一个函数求期望值。而这个函数,恰好就是模型的似然表达。通过杨森不等式,我们可以把对数函数拿到积分符号里面,这样当然就无法保持等号了,也就是说,这一步的操作不是一个等值操作。利用杨森不等式之后的式子其实是原来的式子,也就是含有隐含变量的MLE式的一个“**下限**”(Lower Bound)。
|
||||
|
||||
**利用杨森不等式,从而写出一个原始的MLE的下限,是标准的EM算法以及一系列基于变分EM(Variational EM)算法的核心思想。这么做的目的其实就是把对数函数从积分的外面给拿到里面。**
|
||||
|
||||
当我们有了这个下限之后,我们就可以套用MLE的一切流程了。注意,这时候,我们有两组未知数。一组未知数是我们**模型的参数**,另外一组未知数就是**模型的隐含变量**。于是,当得到下限之后,我们就需要对这两组未知数分别求导,并且得到他们的最优表达。
|
||||
|
||||
当我们按照当前的模型参数,对模型的隐含变量所对应的概率分布求解后,最优的隐含变量的概率分布就等于隐含变量基于数据的后验概率。什么意思呢?意思就是说,如果我们把隐含变量的取值直接等于其后验概率分布,就得到了当前的最优解。这个步骤常常被叫作“**E步**”。
|
||||
|
||||
在进行了E步之后,我们再按照当前的隐含变量,求解这个时候最佳的模型参数。这常常被认为是“**M步**”。**一次E步,一次M步则被认为是EM算法的一个迭代轮回**。
|
||||
|
||||
EM算法貌似很神秘,但如果我们理解了整个流程的精髓,就可以把这个算法总结为:EM算法是**利用杨森不等式得到MLE的一个下限,并且优化求解模型参数和模型的隐含变量的一个过程**。
|
||||
|
||||
掌握了这个精髓,我们就可以看到,为什么LDA和PLSA等隐变量模型需要利用EM或者类似EM的步骤进行求解。第一,这些模型的MLE都有一个对数函数在积分符号外面,使得这个过程无法直接求解。第二,这些模型本身就有隐含变量,因此不需要额外制造新的隐含变量。
|
||||
|
||||
## 总结
|
||||
|
||||
今天我为你介绍了一个经常用于求解概率图模型的EM算法。
|
||||
|
||||
一起来回顾下要点:第一,我们回顾了EM算法和MLE算法的关系;第二,我们讨论了EM算法的核心思想。
|
||||
|
||||
最后,给你留一个思考题,EM算法在实际应用中有哪些问题呢?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
|
53
极客时间专栏/AI技术内参/自然语言处理及文本处理核心技术/103 | 为什么需要Word2Vec算法?.md
Normal file
53
极客时间专栏/AI技术内参/自然语言处理及文本处理核心技术/103 | 为什么需要Word2Vec算法?.md
Normal file
@@ -0,0 +1,53 @@
|
||||
<audio id="audio" title="103 | 为什么需要Word2Vec算法?" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/4d/c4/4d4dd2fa71c1458110e9cdc440dd9ec4.mp3"></audio>
|
||||
|
||||
至此,关于文本分析这个方向,我们已经介绍了 **LDA**(Latent Diriclet Allocation),这是一个出色的无监督学习的文本挖掘模型。还有“**隐语义分析**”(Latent Semantic Indexing),其核心是基于矩阵分解的代数方法。接着,我们分享了“**概率隐语义分析**”(Probabilistic Latent Semantic Indexing),这类模型有效地弥补了隐语义分析的不足,成为了在LDA兴起之前的有力的文本分析工具。我们还介绍了**EM**(Expectation Maximization)算法,这是针对隐参数模型最直接有效的训练方法之一。
|
||||
|
||||
今天,我们进入文本分析的另外一个环节,介绍一个最近几年兴起的重要文本模型,**Word2Vec**。可以说,这个模型对文本挖掘、自然语言处理、乃至很多其他领域比如网络结构分析(Network Analysis)等都有很重要的影响。
|
||||
|
||||
我们先来看Word2Vec的一个最基本的形式。
|
||||
|
||||
## Word2Vec背景
|
||||
|
||||
了解任何一种模型或者算法都需要了解这种方法背后被提出的动机,这是一种**能够拨开繁复的数学公式从而了解模型本质的方法**。
|
||||
|
||||
那么,Word2Vec的提出有什么背景呢?我们从两个方面来进行解读。
|
||||
|
||||
首先,我们之前在介绍LDA和PLSA等隐变量模型的时候就提到过,这些模型的一大优势就是在文档信息没有任何监督标签的情况下,能够学习到文档的“隐含特性”。这也是文档领域“**表征学习**”(Representation Learning)的重要工具。遗憾的是,不管是LDA还是PLSA其实都是把文档当作“**词包**”(Bag Of Word),然后从中学习到语言的特征。
|
||||
|
||||
这样做当然可以产生不小的效果,不过,从自然语言处理,或者是文档建模的角度来说,人们一直都在探讨,如何能够把**单词的顺序**利用到学习表征里。什么意思呢?文档中很重要的信息是单词的顺序,某一个特定单词组合代表了一个词组或者是一个句子,然后句子自然也就代表着某种语义。词包的表达方式打破了所有词组顺序以及高维度的语义表达,因此长期以来被认为并不能真正学习到语言的精华。
|
||||
|
||||
然而,在主题模型这个大旗帜下,已经有不少学者和研究员试图把词序和语义给加入到模型中,这些尝试都没有得到很好的效果,或者模型过于复杂变得不适用。于是,大家都期待着新的工具能够解决这方面的问题。
|
||||
|
||||
另外一个思路也是从词包发展来的。词包本身要求把一个词表达成为一个向量。这个向量里只有一个维度是1,其他的维度都是0。因为每个词都表达成为这样离散的向量,因此词与词之间没有任何的重叠。既然两个离散的向量没有重叠,我们自然也就无法从这个离散的词包表达来推断任何词语的高维度语义。这也是为什么大家会利用主题模型从这个离散的词包中抽取主题信息,从而达到理解高维度语义的目的。
|
||||
|
||||
既然我们的目的是从离散的词包中获取更加丰富的信息,那有没有另外的方法或者途径能够达到这个目的呢?一种基本的假设是这样的:如果我们能够从离散的向量里面抽取出每个词组的“连续”(Continuous)信息向量,假设两个词有相近的意思,那么这两个词的联系向量势必就会比较相近,这样我们就能够通过词向量(只不过是连续向量),来得到词汇的高级语义信息。这个假设常常被叫作词的“**分布假设**”(Distributed Assumption)。
|
||||
|
||||
了解了以上这两个方面后,我们再来理解Word2Vec,可能就比较容易明白这个模型究竟想要干什么了。
|
||||
|
||||
## Word2Vec模型摘要
|
||||
|
||||
首先我们需要说明的是,**Word2Vec是一种语言模型**,主要是根据当前的语境,来预测下一个单词出现的概率,也就是和我们之前所说的产生式模型相似,看是否能够从模型中产生单词。这和我们介绍的主题模型是不一样的,在这个模型里,我们并没有假定数据(也就是单词)是从某几个主题中产生的。
|
||||
|
||||
**Word2Vec的核心思想是,当前的单词是从周边单词的隐含表达,或者说是词向量中产生的**。也就是说,每一个单词都依赖于上下文,而这个单词的产生,并不是直接依赖周围单词的离散表达,而是依赖**周边单词的连续表达**。这个连续表达自然是事先不知道的,因此这就是Word2Vec模型需要学习的**未知参数**。
|
||||
|
||||
在具体的操作上,Word2Vec有两个不太一样的模型,但是经常被同等程度地使用。我们这里做一个简单的介绍。
|
||||
|
||||
第一种模型叫作**Skip-Gram**,或者简称**SG模型**。这种模型的输入是一个词,输出是这个词周围的词。这样做的目的是,看我们能否用当前的词来预测周围的词。要想让这个任务有很好的表现,当前词的表征必须能够抓住某种语义的信息。具体来说,我们就是用当前词的表征向量,和所有其他词的表征向量做点积,然后再重新归一。这个过程就能够保证,当前词的表征向量和周围词的表征向量相似。这样,也就解决了我们之前提到的,如何能够把词序影响到词的表征向量中。
|
||||
|
||||
另外一种模型叫作**Continuous-Bag-of-Word**,有时候简称**CBOW模型**。这种模型刚好和SG是相反的,也就是输入是一组词汇,而希望能够通过这组词汇得到中间某个词的预测。和我们刚才所说的一样,这个模型也是基于我们并不知道的表征向量来达到模型学习的目的。
|
||||
|
||||
**不管是SG还是CBOW,本质上,就是希望能够利用文章的上下文信息学习到连续空间的词表达,这是Word2Vec所有模型的核心。**
|
||||
|
||||
SG和CBOW在具体的应用中,常常需要比较复杂的训练算法,我们这里就不展开讨论了。如果你有兴趣可以进一步阅读一些论文。
|
||||
|
||||
## 总结
|
||||
|
||||
今天我为你介绍了Word2Vec模型的基本含义。
|
||||
|
||||
一起来回顾下要点:第一,我们介绍了Word2Vec这个模型是怎么被开发出来的,它背后有哪些原理;第二,我们讨论了SG和CBOW这两种非常典型的Word2Vec模型。
|
||||
|
||||
最后,给你留一个思考题,和LDA相比,Word2Vec好在哪里,又有什么不足的地方?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
|
57
极客时间专栏/AI技术内参/自然语言处理及文本处理核心技术/104 | Word2Vec算法有哪些扩展模型?.md
Normal file
57
极客时间专栏/AI技术内参/自然语言处理及文本处理核心技术/104 | Word2Vec算法有哪些扩展模型?.md
Normal file
@@ -0,0 +1,57 @@
|
||||
<audio id="audio" title="104 | Word2Vec算法有哪些扩展模型?" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/87/18/87882299ce835ebd149e20cdc404d418.mp3"></audio>
|
||||
|
||||
从上一期的分享开始,我们进入到文本分析的另外一个环节,那就是介绍一个最近几年兴起的重要文本模型,Word2Vec。这个模型对文本挖掘、自然语言处理等很多领域都有重要影响。我们讨论了Word2Vec模型的基本假设,主要是如何从离散的词包输入获得连续的词的表达,以及如何能够利用上下文从而学习到词的隐含特性。我们还聊了两个Word2Vec模型,SG(SkipGram)模型和CBOW(Continuous-Bag-of-Word)模型,讨论了它们都有什么特性以及如何实现。
|
||||
|
||||
今天,我们就来看一看**Word2Vec的一些扩展模型**。
|
||||
|
||||
## Word2Vec的扩展思路
|
||||
|
||||
在列举几个比较知名的Word2Vec扩展模型之前,我们首先来看看这个模型怎么进行扩展。
|
||||
|
||||
首先,我们来回忆一下Word2Vec的一个基本的性质,那就是这是一个语言模型。而语言模型本身其实是一个**离散分布模型**。我们一起来想一想,什么是语言模型?语言模型就是针对某一个词库(这里其实就是一个语言的所有单词),然后在某种语境下,产生下一个单词的模型。也就是说,语言模型是一个**产生式模型**,而且这个产生式模型是产生单词这一离散数据的。
|
||||
|
||||
既然是这样,如果我们更改这个词库,变成任何的离散数据,那么,Word2Vec这个模型依然能够输出在新词库下的离散数据。比如,如果我们把词汇库从英语单词换成物品的下标,那Word2Vec就变成了一个对物品的序列进行建模的工具。**这其实就是扩展Word2Vec的一大思路,那就是如何把Word2Vec应用到其他的离散数据上**。
|
||||
|
||||
**扩展Word2Vec的第二大思路,则是从Word2Vec的另外一个特性入手:上下文的语境信息**。我们在之前的介绍中也讲过,这个上下文信息是Word2Vec成功的一个关键因素,因为这样就使得我们学习到的词向量能够表达上下文的关联所带来的语义信息。这也是传统的主题模型(Topic Model)例如LDA或者PLSA所不具备的。那么,我们能不能对这个上下文进行更换,从而使得Word2Vec能够产生完全不一样的词向量呢?答案是肯定的,这也是Word2Vec扩展的重要思路。
|
||||
|
||||
除此以外,还有一个重要的分支,那就是很多研究者都希望往Word2Vec里增加更多的信息,比如文档本身的信息,段落的信息以及其他的辅助信息。**如何能够让Word2Vec对更多信息建模也是一个重要的扩展思路**。
|
||||
|
||||
## Word2Vec的三个扩展
|
||||
|
||||
我们要介绍的第一个扩展是由Word2Vec作者本人提出的,就是**把学习词向量的工作推广到句子和文章里**,在论文《句子和文档的分布表示》(Distributed representations of sentences and documents)[1]里进行了详细的阐述。这个扩展主要是解决如何能够更加“自然”地学习到比词这个单位更大的单位(比如段落或者文档)的隐含向量。
|
||||
|
||||
当Word2Vec被发明之后,很多研究者都发现这是一个**能够把离散的词表达成连续向量的利器**。然而,一个应用场景很快就成为了大家的拦路虎,那就是Word2Vec仅仅是在词一级数据上进行建模,却无法直接得到文档一级的隐含信息。
|
||||
|
||||
有一种做法是这样的,比如针对一个句子或者一个段落,我们就把这个句子里的词所使用的词向量加权平均,认为这个加权平均过的结果就是段落的向量了。很明显,这是一种非常不精确的处理方法。
|
||||
|
||||
那么,这篇文章的核心则是如何能够在模型本身上进行修改,从而可以学习到比词更加高一层级单元的隐含向量。具体的做法,就是修改原始Word2Vec的上下文信息。我们回忆一下SG模型和CBOW模型都有一个关键的信息,那就是利用上下文,也就是一个句子周围的词来预测这个句子或者上下文中间的一个词。这就是Word2Vec能够利用上下文信息的原因。那么这里的修改就是让这个上下文始终都有一个特殊的字符,也就是当前段落或者文章的下标,从而这个下标所对应的隐含向量就是我们所要学习到的段落或者文档的向量。在这样的情况下,作者们通过实验发现,学到的段落向量要比单独用加权平均的效果好得多。
|
||||
|
||||
我们要看的第二个扩展,来自论文《线:大规模信息网络嵌入》(LINE: Large-scale Information Network Embedding)[2],就是**把Word2Vec的思想扩展到了另外一种离散数据图(Graph)的表达上**。
|
||||
|
||||
刚才我们提到,只要是离散的数据,Word2Vec都有可能被应用上。那么,图的数据建模的场景是什么呢?我们设想一个社交网络(Social Network)的数据。每一个用户都有可能和其他用户相连,而两两相连的用户所组成的整个网络就是社交网络的庞大的用户信息。很明显,如果我们把用户看作单词,那么整个社交网络就是一个单词和单词的网络。如果我们把两个单词(在这里是用户)之间的连线看成是单词出现在一起的上下文,那么,我们其实就可以利用Word2Vec这样的模型对社交网络所表达图进行建模。这就是这篇文章里作者们利用Word2Vec对社交网络建模的核心思想。
|
||||
|
||||
当然,和在文档中不同,在图里面,上下文这一关系其实是比较难以定义的。因此,很多后续的工作都是关于如何更加有效地定义这一上下文关系。
|
||||
|
||||
最后,我们结合论文《用于支持搜索中查询重写的上下文和内容感知嵌入》(Context- and Content-aware Embeddings for Query Rewriting in Sponsored Search)[3]来看另一个Word2Vec的扩展。这个扩展是**尝试在查询关键词和用户点击的网页之间建立上下文关系,使得Word2Vec模型可以学习到查询关键词以及网页的隐含向量**。
|
||||
|
||||
这也就是我们提到的,巧妙地搭建上下文关系,使得模型可以学习到离散数据的隐含表达。你可能比较好奇,这里的离散数据是什么呢?这里有两组离散数据:第一组就是每一个查询关键词,这完全可以按照Word2Vec原本的定义来走;第二组离散数据,就是每一个网页。注意,这里不是网页的内容,而是某一个网页作为一个下标。那么,从模型的角度上来说,这里我们要做的就是利用查询关键词来预测网页出现的概率。
|
||||
|
||||
## 总结
|
||||
|
||||
今天我为你介绍了Word2Vec模型扩展的一些基本思路和一些实际的案例。
|
||||
|
||||
一起来回顾下要点:第一,我们讨论了Word2Vec这个模型需要扩展的思路,比如从离散数据入手或者从上下文入手;第二,我们分享了三个比较经典的Word2Vec扩展。
|
||||
|
||||
最后,给你留一个思考题,Word2Vec能否扩展到连续数据中呢?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
**参考文献**
|
||||
|
||||
1. Quoc Le and Tomas Mikolov. [Distributed representations of sentences and documents](https://cs.stanford.edu/~quocle/paragraph_vector.pdf). Proceedings of the 31st International Conference on International Conference on Machine Learning - Volume 32 (ICML’14), Eric P. Xing and Tony Jebara (Eds.), Vol. 32. JMLR.org II-1188-II-1196, 2014.
|
||||
|
||||
2. Jian Tang, Meng Qu, Mingzhe Wang, Ming Zhang, Jun Yan, and Qiaozhu Mei. [LINE: Large-scale Information Network Embedding](http://www.www2015.it/documents/proceedings/proceedings/p1067.pdf). Proceedings of the 24th International Conference on World Wide Web (WWW '15). International World Wide Web Conferences Steering Committee, Republic and Canton of Geneva, Switzerland, 1067-1077, 2015.
|
||||
|
||||
3. Mihajlo Grbovic, Nemanja Djuric, Vladan Radosavljevic, Fabrizio Silvestri, and Narayan Bhamidipati. [Context- and Content-aware Embeddings for Query Rewriting in Sponsored Search](https://astro.temple.edu/~tua95067/grbovic2015sigirconf.pdf). Proceedings of the 38th International ACM SIGIR Conference on Research and Development in Information Retrieval (SIGIR '15). ACM, New York, NY, USA, 383-392, 2015.
|
||||
|
||||
|
41
极客时间专栏/AI技术内参/自然语言处理及文本处理核心技术/105 | Word2Vec算法有哪些应用?.md
Normal file
41
极客时间专栏/AI技术内参/自然语言处理及文本处理核心技术/105 | Word2Vec算法有哪些应用?.md
Normal file
@@ -0,0 +1,41 @@
|
||||
<audio id="audio" title="105 | Word2Vec算法有哪些应用?" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/10/19/10b9eb5d1d1ee2f3db43b4b9a30dca19.mp3"></audio>
|
||||
|
||||
周一,我们分享了三个比较有代表意义的Word2Vec的扩展模型,主要有两种思路,从词的上下文入手重新定义上下文,或者对完全不同的离散数据进行建模。
|
||||
|
||||
今天,我们来看一看**Word2Vec在自然语言处理领域的应用**。如果我们已经通过SG模型、CBOW模型或者其他的算法获得了词向量,接下来我们可以把这些词向量用于什么样的任务中呢?
|
||||
|
||||
## Word2Vec的简单应用
|
||||
|
||||
**最直接的也是最常见的Word2Vec应用就是去计算词与词之间的相似度**。当我们的数据还是原始的“词包”(Bag of Word),这时候是没法计算词与词之间的相似度的,因为每个词都被表示为某个元素为1其余元素都为0 的离散向量。按照定义,两个离散向量之间的相似度都是0。因此,从词包出发,我们无法直接计算词与词之间的相似度,这是从定义上就被限制了的。
|
||||
|
||||
Word2Vec就是为了跨越这个障碍而被发明的,这一点我们在前面就已经提到过了。所以,当我们可以用Word2Vec的词向量来表示每一个单词的时候,我们就可以用“**余弦相关度**”(Cosine Similarity)来对两个词向量进行计算。**余弦相关度其实就是计算两个向量的点积,然后再归一化**。如果针对已经归一化了的向量,我们就可以直接采用**点积**来表达两个向量的相关度。不管是余弦相关度还是点积,我们都假设计算结果的值越大,两个词越相关,反之则不相关。
|
||||
|
||||
既然我们可以计算两个词的相关度,那么很多依赖相关度的任务就都能够轻松完成。比如,我们希望把词进行聚类,也就是说把相关的词都聚合在一起。通常的聚类算法都可以直接使用,比如我们熟悉的“K均值”算法。这些算法的核心是计算两个数据点的距离,就可以利用我们刚刚讲的余弦相关度来实现。
|
||||
|
||||
我们在谈Word2Vec扩展模型的时候,曾经提到了一些扩展模型,可以用于表达比词这个单位更大的文本单元,比如段落和文档向量的获取。其实,当时我们就提到了一种可以得到这些单元向量的简单方法,那就是**直接利用Word2Vec来进行加权平均**。在获得了词向量之后,我们就可以用一个文档里所有词的加权平均,甚至是简单的叠加来达到表达文档的目的。这个时候,我们也就可以利用诸如余弦相关度来计算文档之间的相关度了。
|
||||
|
||||
另外一个随着Word2Vec的推出而大放异彩的应用则是“**词语的类比**”。Word2Vec的原作者们用类比来表达,这种词向量能够完成一些与众不同的任务。词向量本质上就是一个连续空间的向量,因此从数学上来说,这种向量其实可以进行任何“合规”的运算,比如加、减、乘、除。于是,作者们就利用向量的加减关系,来看能否得到有意义的结果,而得到的结果令人吃惊。
|
||||
|
||||
比如,如果我们把“国王”(King)这个单词的向量减去“男人”(Man)这个向量然后加上“女人”(Woman)这个向量,得到的结果,竟然和“王后”(Queen)这个向量非常相近。类似的结果还有“法国”(France)减去“巴黎”(Paris)加上“伦敦”(London)等于“英格兰”(England)等。对于传统的方法来说,这样的行为是无法实现的。因此,Word2Vec的流行也让这种词语的类比工作变得更加普遍起来。
|
||||
|
||||
## Word2Vec的其他使用
|
||||
|
||||
在自然语言处理中有一系列的任务,之前都是依靠着“词包”这个输入来执行的。当我们有了Word2Vec之后,这些任务都可以相对比较容易地用“词向量”来替代。
|
||||
|
||||
一类任务就是利用词来进行某种分类任务。比如,我们希望知道某些文档是属于什么类别,或者某些文档是不是有什么感情色彩,也就是通常所说的“基于监督学习的任务”。**词向量会成为很多文本监督学习任务的重要特性**。在诸多的实验结果中,得到的效果要么好于单独使用词包,要么在和词包一起使用的情况下要好于只使用词包。
|
||||
|
||||
在进行监督学习的任务中,词向量的重要性还体现于其**对深度学习架构的支持**。众所周知,即便是最简单的深度学习架构,比如多层感知器,都需要输入的数据是连续的。如果我们直接面对离散的文本数据,常常需要把这些离散的文本数据学习成为连续的向量,其实就是在学习Word2Vec。经过了这一层的转换之后,我们往往再利用多层的神经网络结果对这些信号进行处理。
|
||||
|
||||
在很多实践中人们发现,与其利用不同的任务来学习相应的词向量,还不如直接拿在别的地方学好的词向量当做输入,省却学习词向量这一个步骤,而结果其实往往会有效果上的提升。这种使用词向量的方法叫作“**提前训练**”(Pre-trained)的词向量。其实,不仅仅是在简单的多层感知器中,甚至是在RNN等更加复杂的深度架构中,也都更加频繁地利用提前训练的词向量。
|
||||
|
||||
## 总结
|
||||
|
||||
今天我为你介绍了Word2Vec模型在各种实际任务中的应用。
|
||||
|
||||
一起来回顾下要点:第一,我们聊了Word2Vec这个模型的一些简单应用,比如如何计算词与词之间的相关度,以及如何进行词的类比计算;第二,我们讨论了如何利用词向量进行更加复杂的自然语言任务的处理。
|
||||
|
||||
最后,给你留一个思考题,Word2Vec和主题模型提供的向量,是互补的还是可以相互替换的呢?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
|
61
极客时间专栏/AI技术内参/自然语言处理及文本处理核心技术/106 | 序列建模的深度学习利器:RNN基础架构.md
Normal file
61
极客时间专栏/AI技术内参/自然语言处理及文本处理核心技术/106 | 序列建模的深度学习利器:RNN基础架构.md
Normal file
@@ -0,0 +1,61 @@
|
||||
<audio id="audio" title="106 | 序列建模的深度学习利器:RNN基础架构" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/fa/01/fab1fbe45f6d5e1c1cebb697e73fe001.mp3"></audio>
|
||||
|
||||
前面我们介绍了一个重要的文本模型,Word2Vec,我们聊了这个模型的基本假设,模型实现,一些重要的扩展,以及其在自然语言处理各个领域的应用。
|
||||
|
||||
接下来,我们来讨论更加复杂的**基于深度学习的文本分析模型**。这些模型的一大特点就是更加丰富地利用了**文字的序列信息**,从而能够对文本进行大规模建模。
|
||||
|
||||
今天,我们首先来看一看,序列建模的深度学习利器 **RNN**(Recurrent Neural Network,递归神经网络)的基本架构。
|
||||
|
||||
## 文本信息中的序列数据
|
||||
|
||||
我们在之前介绍Word2Vec的时候,讲了为什么希望能够把上下文信息给融入到模型当中去。一个非常重要的原因,就是在最早的利用“词包”(Bag of Word)的形式下,离散的词向量无法表达更多的语义信息。那么,从文本的角度来讲,很多研究人员都面对的困扰是,如何对有序列信息的文本进行有效的建模?同时,对于广大文本挖掘的科研工作者来说,这也是大家心中一直深信不疑的一个假设,那就是**对文字的深层次的理解一定是建立在对序列、对上下文的建模之中**。
|
||||
|
||||
你可能有一个疑问,文字信息中真的有那么多序列数据吗?
|
||||
|
||||
其实,从最简单的语义单元“句子”出发,到“段落”,到“章节”,再到整个“文章”。这些文字的组成部分都依赖于对更小单元的序列组合。例如,句子就是词语的序列,段落就是句子的序列,章节就是段落的序列等等。不仅是“词包假设”无法对这样的序列进行建模,就算是我们之前提到的Word2Vec等一系列学习词向量或者段落向量的方法,也仅仅能考虑到一部分的上下文信息。
|
||||
|
||||
还有更加复杂的文字序列,比如对话。人与人的对话很明显是有顺序的。两个人之间进行对话,当前所说的字句都是根据对方的回应以及整个对话的上下文所做出的选择。如果要对这样复杂的文字序列进行建模,传统的不考虑序列的模型方法是肯定不能奏效的。
|
||||
|
||||
那么,传统的机器学习领域,有没有能够对时序信息建模的工具或者模型呢?
|
||||
|
||||
## 传统机器学习中的序列模型
|
||||
|
||||
在传统的机器学习领域当然有不少模型是针对序列进行建模的。最经典的要数“**隐马尔科夫模型**”(Hidden Markov Model),有时候又简称为 **HMM**。在比较长的一段时间里,HMM都是常用的对序列建模的缺省(Default)模型。我们今天的分享不是专门针对HMM模型,但是对HMM的一个简单介绍,有助于我们理解为什么需要RNN。
|
||||
|
||||
HMM的一个最基本的假设是:当前的序列数据是根据一些隐含的状态产生的。具体来说,HMM的架构是这样的。我们认为每个时间点都有一个对应的隐含状态。这个隐含状态只与当前这个时间点之前的时间点所对应的隐含状态有关联。更加简单的假设,也是经常使用的假设,则认为**当前时间点的隐含状态,仅仅与之前最直接相邻的一个时间点的隐含状态有关**,而和之前所有时间点的隐含状态都没有关系了。这类似于说今天的天气仅仅与昨天有关,和昨天之前的天气状态都没有任何关系,显然这是一个很强的假设。
|
||||
|
||||
从时间轴这个角度来说,HMM是构建了一个隐含状态的一阶马尔科夫链条。这里,“一阶”是指每个状态仅与当前最邻近的状态有关。当我们构建好了隐含状态以后,就可以在这个基础上对数据进行建模了。
|
||||
|
||||
HMM假定,每个时间点的数据都是从这个时间点的隐含状态产生的,而时间点所对应的数据之间并不直接产生关系。也就是说,我们假定产生数据的原因是隐含状态,而隐含状态已经通过一个链条给串联起来了,这样我们就不需要针对数据进行串联了。
|
||||
|
||||
HMM虽然理解起来相对比较直观,但在实际应用中存在不少问题。比如,**这个模型的表现力有限**。我们刚才说了,一个普通的HMM假定了隐含状态的一阶性质,使得我们不能对比较长的序列进行建模,因为模型无法对其中所有的隐含状态的转换进行建模,一阶无法表达这样的关系。当然,HMM有一阶以上的表达,但这也就带来了HMM的一个普遍的问题,就是**训练方法比较复杂**。对于一个现实问题而言,HMM的建模会相对比较复杂,从而让训练方法更加繁复。这也就是为什么HMM不能适用于大规模问题的一个主要的原因。
|
||||
|
||||
## RNN的基本架构
|
||||
|
||||
在HMM的基础上,我们再来看一下RNN的基本思想。
|
||||
|
||||
首先,我们需要指出的是,RNN并不是一个模型的称呼,而是一个框架。具体在这个框架内部,根据不同的需求,我们可以构造出非常不一样的模型。
|
||||
|
||||
第二,RNN的一大优势是它根植于深度学习的大范畴中。RNN的模型都可以算是特殊的深度学习模型。所以,深度学习模型的很多优化算法或者整体的计算方式也都可以无缝嫁接到RNN上。从这一点来看,RNN比传统的HMM就有很大的相对优势。
|
||||
|
||||
通常来说,一个RNN有一个输入序列X和输出序列Y,这两个序列都随着时间的变化而变化。也就是说,每一个时间点,我们都对应这一个X和一个Y。和HMM类似的是,RNN也假定X和Y都不独立发生变化,而他们的变化和关系都是通过一组隐含状态来控制的。
|
||||
|
||||
具体来说,时间T时刻的隐含状态有两个输入,一个输入是时间T时刻之前所有的隐含状态,一个输入是当前时刻,也就是时间T时刻的输入变量X。时间T时刻的隐含状态根据这两个输入,会产生一个输出,这个输出就是T时刻的Y值。也就是说,T时刻的输出是根据之前所有的隐含状态和这个时刻的输入决定的。
|
||||
|
||||
在一些简化的情况下,并不是每一个时刻都有输出的信息。比如我们需要对一个句子进行分类,这个时候,一个输出变量只在整个句子结束的时候出现。那么,在这样的情况下,Y仅仅在最后的一个时刻出现。
|
||||
|
||||
这个RNN的参数也就是这些隐含状态。从原理上来说,可以根据标准的深度学习框架的流程加以学习。
|
||||
|
||||
**RNN的整个框架还可以看作是一个加码解码的过程**。从已知的序列到中间隐含状态,这是一个加码的流程,而从隐含状态到最后的输出序列,这是一个解码的过程。具体的RNN针对这个加码解码的过程有更加详细的分工,我会在今后的分享中为你慢慢解读。
|
||||
|
||||
## 总结
|
||||
|
||||
今天我为你介绍了文本序列建模利器RNN的一个概况。
|
||||
|
||||
一起来回顾下要点:第一,我们讨论了为什么需要对文本的序列数据进行建模;第二,我们聊了聊传统机器学习模型是如何对序列进行建模的;第三,我们分享了RNN的基本的加码解码的框架。
|
||||
|
||||
最后,给你留一个思考题,对比HMM,RNN的优势有哪些?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
|
55
极客时间专栏/AI技术内参/自然语言处理及文本处理核心技术/107 | 基于门机制的RNN架构:LSTM与GRU.md
Normal file
55
极客时间专栏/AI技术内参/自然语言处理及文本处理核心技术/107 | 基于门机制的RNN架构:LSTM与GRU.md
Normal file
@@ -0,0 +1,55 @@
|
||||
<audio id="audio" title="107 | 基于门机制的RNN架构:LSTM与GRU" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/38/58/38a0036f2c0dcbb8e38d6a39f7fa9858.mp3"></audio>
|
||||
|
||||
这周,我们继续来讨论基于深度学习的文本分析模型。这些模型的一大特点就是更加丰富地利用了文字的序列信息,从而能够对文本进行大规模的建模。在上一次的分享里,我们聊了对序列建模的深度学习利器“递归神经网络”,或简称RNN。我们分析了文本信息中的序列数据,了解了如何对文本信息中最复杂的一部分进行建模,同时还讲了在传统机器学习中非常有代表性的“隐马尔科夫模型”(HMM)的基本原理以及RNN和HMM的异同。
|
||||
|
||||
今天我们进一步展开RNN这个基本框架,看一看在当下都有哪些流行的RNN模型实现。
|
||||
|
||||
## 简单的RNN模型
|
||||
|
||||
为了能让你对今天要进一步介绍的RNN模型有更加深入的了解,我们先来回顾一下RNN的基本框架。
|
||||
|
||||
一个RNN通常有一个输入序列X和一个输出序列Y,这两个序列都随着时间的变化而变化。也就是说,每一个时间点,我们都对应着一个X和一个Y。RNN假定X和Y都不独立发生变化,它们的变化和关系都是通过一组隐含状态来控制的。具体来说,时间T时刻的隐含状态有两个输入,一个输入是时间T时刻之前的所有隐含状态,一个输入是当前时刻,也就是时间T时刻的输入变量X。时间T时刻的隐含状态根据这两个输入,会产生一个输出,这个输出就是T时刻的Y值。
|
||||
|
||||
那么,在这样的一个框架下,一个最简单的RNN模型是什么样子的呢?我们需要确定两个元素。第一个元素就是在时刻T,究竟如何处理过去的隐含状态和现在的输入,从而得到当前时刻的隐含状态,这是一个需要建模的元素。第二,如何从当前的隐含状态到输出变量Y,这是另外一个需要建模的元素。
|
||||
|
||||
最简单的RNN模型对这两个建模元素是这样选择的。通常情况下,在时间T-1时刻的隐含状态是一个向量,我们假设叫St-1,那么这个时候,我们有两种选择。
|
||||
|
||||
第一种选择是用一个线性模型来表达对当前时刻的隐含状态St的建模,也就是把St-1和Xt当作特性串联起来,然后用一个矩阵W当作是线性变换的参数。有时候,我们还会加上一个“偏差项”(Bias Term),比如用b来表示。那么在这样的情况下,当前的隐含状态可以认为是“所有过去隐含状态以及输入”的一阶线性变换结果。可以说,这基本上就是最简单直观的建模选择了。
|
||||
|
||||
第二种选择是如何从St变换成为Y。这一步可以更加简化,那就是认为St直接就是输出的变量Y。这也就是选择了隐含状态和输出变量的一种一一对应的情况。
|
||||
|
||||
在这个最简单的RNN模型基础上,我们可以把第一个转换从**线性转换**变为任何的深度模型的**非线性转换**,这就构成了更加标准的RNN模型。
|
||||
|
||||
## LSTM与GRU模型
|
||||
|
||||
我们刚刚介绍的RNN模型看上去简单直观,但在实际应用中,这类模型有一个致命的缺陷,那就是实践者们发现,在现实数据面前根本没法有效地学习这类模型。什么意思呢?
|
||||
|
||||
所有的深度学习模型都依赖一个叫作“**反向传播**”(Back-Propagation)的算法来计算参数的“梯度”,从而用于优化算法。但是,RNN的基本架构存在一个叫作“**梯度爆炸**”或者“**梯度消失**”的问题。对于初学者而言,你不需要去细究这两种梯度异常的细节,只需要知道在传统的RNN模型下,这两种梯度异常都会造成优化算法的迭代无法进行,从而导致我们无法学习到模型的参数这一结局。
|
||||
|
||||
想要在现实的数据中使用RNN,我们就必须解决梯度异常这一问题。而在解决梯度异常这个问题的多种途径中,有一类途径现在变得很流行,那就是**尝试在框架里设计“门机制”**(Gated Mechanism)。
|
||||
|
||||
这个门机制的由来主要是着眼于一个问题,那就是在我们刚才介绍的简单的RNN模型中,隐含变量从一个时间点到另一个时间点的变化,是“整个向量”变换为另外的“整个向量”。研究人员发现,我们可以限制这个向量的变化,也就是说我们通过某种方法,不是让整个向量进行复制,而是让这个隐含向量的部分单元发生变化。
|
||||
|
||||
如果要达到这样的效果,我们就必须设计一种机制,使得这个模型知道当前需要对隐含向量的哪些单元进行复制,哪些单元不进行复制而进行变化。我们可以认为,进行复制的单元是它们被屏蔽了“进行转换”这一操作,也可以认为它们被“门”阻挡了,这就是“门机制”的来源。
|
||||
|
||||
从逻辑上思考,如何设计“门机制”从而起到这样的作用呢?一种方式就是为隐含变量引入一个**伴随变量**G。这个伴随变量拥有和隐含变量一样的单元个数,只不过这个伴随变量的取值范围是0或者1,0代表不允许通过,1代表可以通过。这其实就是门机制的一个简单实现。我们只需要利用这个向量和隐含向量相应单元相乘,就能实现控制这些单元的目的。当然,这只是一个逻辑上的门机制,实际的门机制要有更多细节,也更加复杂。
|
||||
|
||||
基于门机制的RNN架构都有哪些呢?这里介绍两个比较流行的,分别是LSTM和GRU。我们这里不对这些模型展开详细的讨论,而是给你一个直观的介绍,帮助你从宏观上把握这些模型的核心思想。
|
||||
|
||||
**LSTM**的思路是把隐含状态分为两个部分。一部分用来当作“**存储单元**”(Memory Cells),另外一部分当作“**工作单元**”(Working Memory)。存储单元用来保留信息,并且用来保留梯度,跨越多个时间点。这个存储单元是被一系列的门控制,这些门,其实是数学函数,用来模拟刚才我们说的门的机制。对于每一步来说,这些门都要决定到底需要多少信息继续保留到下一个时间点。
|
||||
|
||||
总体来说,LSTM模型的细节很多,也很复杂。虽然LSTM已经成为了一种典型而且成功的RNN模型,但是实践者们还是觉得这个模型可以简化,于是就催生了GRU模型。
|
||||
|
||||
**GRU模型的核心思想其实就是利用两套门机制来决定隐含单元的变化**。一个门用于决定哪些单元会从上一个时间点的单元里复制过来,并且形成一个临时的隐含状态,另外一个门则控制这个临时状态和过去状态的融合。GRU在结构上大大简化了LSTM的繁复,在效果上依然能够有不错的表现。
|
||||
|
||||
## 总结
|
||||
|
||||
今天我为你介绍了文本序列建模利器RNN的几个实例。
|
||||
|
||||
一起来回顾下要点:第一,我们复习了RNN的基本概念和框架;第二,我们聊了两个带有门机制的经典的RNN模型,分别是LSTM和GRU。
|
||||
|
||||
最后,给你留一个思考题,RNN需要门机制,你认为到底是建模的需要,还是需要解决梯度异常的问题从而能够让优化算法工作?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
|
49
极客时间专栏/AI技术内参/自然语言处理及文本处理核心技术/108 | RNN在自然语言处理中有哪些应用场景?.md
Normal file
49
极客时间专栏/AI技术内参/自然语言处理及文本处理核心技术/108 | RNN在自然语言处理中有哪些应用场景?.md
Normal file
@@ -0,0 +1,49 @@
|
||||
<audio id="audio" title="108 | RNN在自然语言处理中有哪些应用场景?" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/c6/fa/c6669ffb09c001238ed6891719b892fa.mp3"></audio>
|
||||
|
||||
周一我们进一步展开了RNN这个基本框架,讨论了几个流行的RNN模型实现,从最简单的RNN模型到为什么需要“门机制”,再到流行的LSTM和GRU框架的核心思想。
|
||||
|
||||
今天,我们就来看一看RNN究竟在自然语言处理的哪些任务和场景中有所应用。
|
||||
|
||||
## 简单分类场景
|
||||
|
||||
我们首先来聊一种**简单的分类场景**。在这种场景下,RNN输入一个序列的文字,然后根据所有这些文字,做一个决策,或者叫作输出一个符号。这类应用是文本挖掘和分析中最基本的一个场景。
|
||||
|
||||
在绝大多数的“简单分类”任务中,传统的文字表达,例如“**词包**”(Bag of Word)或者“**N元语法**”(Ngram),经常都能有不错的表现。也就是说,在很多这类任务中,文字的顺序其实并不是很重要,或者说词序并没有携带更多的语义信息。
|
||||
|
||||
然而,实践者们发现,在一些场景中,如果利用RNN来对文字序列进行建模,会获得额外的效果提升。比如有一类任务叫作“**句子级别的情感分类**”(Sentence-Level Sentiment Classification),这类任务常常出现在分析商品的评论文本(Review)这个场景。这时候,我们需要对每一个句子输出至少两种感情色彩的判断,褒义或者贬义,正面或者负面。比如,我们在分析电影评价的时候,就希望知道用户在某一个句子中是否表达了对电影“喜爱”或者“不喜爱”的情绪。
|
||||
|
||||
面对这样句子级别的情感分析,一种比较通行的利用RNN建模的方式是:**把每一个单词作为一个输入单元,然后把一个句子当作一个序列输入到一个RNN中去,RNN来维持一个隐含的状态**。
|
||||
|
||||
对于这类应用,不是每一个隐含状态都有一个输出,而是在句子结束的时候,利用最后的隐含状态来产生输出。对于这类任务而言,输出的状态就是一个二元判断,那么我们需要利用最后的隐含状态来实现这个目的。一般来说,在深度模型的架构中,这个步骤是利用最后的隐含状态,然后经过多层感知网络,最后进行一个二元或者多元的分类。这其实是一个标准的分类问题的构建。
|
||||
|
||||
在有的应用中,研究者们发现可以**利用两个RNN建立起来的链条**,从而能够更进一步地提升最后的分类效果。在我们刚才描述的建模步骤里,RNN把一个句子从头到尾按照正常顺序进行了输入并归纳。另外一种建模方式是利用RNN去建模**句子的逆序**,也就是把整个句子倒过来,学习到一个逆序的隐含状态。接下来,我们把顺序的最后隐含状态和逆序的最后隐含状态串联起来,成为最终放入分类器需要学习的特性。这种架构有时候被称作“**双向模型**”。
|
||||
|
||||
当我们从句子这个层级到文档这个层级时,比如希望对文档进行情感分类,仅仅利用我们刚才讲的RNN的结构就会显得有点“捉襟见肘”了。一个重要的阻碍就是RNN很难针对特别长的序列直接建模。这个时候,就需要我们把整个文档**拆分**成比较小的单元,然后针对小的单元利用RNN进行建模,再把这些小单元的RNN结果当作新的输入串联起来。
|
||||
|
||||
在实际拆分的时候,我们可以把文章分成一个一个的句子,然后每个句子可以用刚才我们在句子层级的建模方式进行建模;在句子的层级下,还可能再把句子拆分成比如短语这样的单元。这种把一个比较大的文档进行拆分,并且通过RNN对不同级别的数据进行建模的形式就叫作**“层次式”(Hierarchical)RNN建模**。
|
||||
|
||||
## 特性提取器
|
||||
|
||||
在更多的场景中,RNN其实已经扮演了**文本信息特性提取器**的角色,特别是在很多监督学习任务中,隐含状态常常被用来当作特性处理。尤其要说明的是,如果你的任务对文字的顺序有一定要求,RNN往往就能成为这方面任务的利器,我们这里举几个例子。
|
||||
|
||||
首先可以想到的一个任务就是,在自然语言处理中很常见的“**词类标注**”(Part-Of-Speech Tagging),或者简称**POS标注**。简单来说,POS标注就是针对某一个输入句子,把句子里的词性进行分析和标注,让大家知道哪些是动词,哪些是名词,哪些是形容词等等。我们可以很容易地想到,在这样的标注任务中,一个词到底是名词还是动词,在很多的语言场景中,是需要对整个句子的语境进行分析的,也就是说,整个句子的顺序和词序是有意义的。
|
||||
|
||||
针对POS标注这类任务,一种已经尝试过的架构,就是利用我们刚才介绍过的**双向RNN**来对句子进行建模。双向RNN的好处是,我们可以构建的隐含信息是包含上下文的,这样就更加有助于我们来分析每个词的词性。
|
||||
|
||||
和句子分类的任务类似的是,利用双向RNN对句子进行扫描之后,我们依然需要建立**分类器**,对每一个位置上的词语进行分类。这个时候,依然是同样的思路,我们把当前的隐含状态当作是特性,利用多层感知网络,构建多类分类器,从而对当前位置的词性进行决策。
|
||||
|
||||
除了POS标注这样的任务以外,针对**普通的文档分类**,RNN也有一定的效果。这里我们所说的文档分类,一般是指类似把文档分为“艺术”、“体育”或“时政”等主题类别。人们从实践中发现,在这样的通用文档分类任务中,RNN和另外一类重要的深度模型,“**卷积神经网络**”(CNN)结合起来使用效果最好。我们这里不展开对CNN的原理进行讲解,只是从大的逻辑上为你讲一下这种分类方法的核心思路。
|
||||
|
||||
在计算机视觉中,通常认为CNN可以抓住图像的“位置”特征。也就是说,CNN非常善于挖掘一个二维数据结构中局部的很多变化特征,从而能够有效形成对这些数据点的总结。那么,如果我们把文档的文字排列也看作是某种情况下的一种图案,CNN就可以发挥其作用来对文字的上下文进行信息提取。然后当CNN对文字的局部信息进行提取之后,我们再把这些局部信息当作输入放入RNN中,这样就能更好地利用RNN去对文章的高维度的特征进行建模。
|
||||
|
||||
## 总结
|
||||
|
||||
今天我为你介绍了文本序列建模利器RNN的几个应用场景。
|
||||
|
||||
一起来回顾下要点:第一,我们讲了用RNN对句子层级进行分类任务的处理;第二,我们聊了如何把RNN当作普遍使用的特性提取器来进行分类任务的训练,特别是POS标签任务。
|
||||
|
||||
最后,给你留一个思考题,利用RNN提取的信息能否完整捕捉文档里的内容,这一点我们怎么来判断呢?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
|
57
极客时间专栏/AI技术内参/自然语言处理及文本处理核心技术/109 | 对话系统之经典的对话模型.md
Normal file
57
极客时间专栏/AI技术内参/自然语言处理及文本处理核心技术/109 | 对话系统之经典的对话模型.md
Normal file
@@ -0,0 +1,57 @@
|
||||
<audio id="audio" title="109 | 对话系统之经典的对话模型" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/5e/20/5edb738406be8317e08cb57b740a0820.mp3"></audio>
|
||||
|
||||
在文本分析这个重要的环节里,我们已经分享了Word2Vec模型,包括模型的基本假设、模型实现以及一些比较有代表意义的扩展模型。我们还讨论了基于深度学习的文本分析模型,特别是对序列建模的深度学习利器RNN,包括RNN的基本框架,流行的RNN模型实现,以及RNN在自然语言处理中的应用场景。
|
||||
|
||||
今天,我们要来看另外一类和文字相关的人工智能系统——**对话系统**的一些基础知识。
|
||||
|
||||
## 浅析对话系统
|
||||
|
||||
对话系统在整个人工智能领域、甚至是计算机科学领域都占据着举足轻重的地位。著名的人工智能测试,“图灵测试”,其实就是建立在某种意义的对话系统上的。在经典的图灵测试场景中,一个最主要的论述就是:看一个人和一个机器进行对话,在和这个机器系统的问答过程中,能否猜出这个系统是一个真人还是一个计算机程序系统。从这一点可以看出,即便是在计算机科学的早期,对话系统或者说是智能的对话能力,就已经成为了计算机科学家衡量智能水平的一个重要标准。
|
||||
|
||||
实际上,从上个世纪50~60年代开始,研究人员就致力于研发早期的对话系统。即便是在今天看来,在一些简单的应用中,早期的对话系统也表现出了惊人的“智能”。比如,麻省理工大学的约瑟夫·维森鲍姆(Joseph Weizenbaum)教授研发了一款叫“伊丽莎”(Eliza)的早期对话系统。尽管这个对话系统只能对语言进行最肤浅的反馈,但是在“伊丽莎”系统的使用者中,有人真的产生了这个系统有智能的幻觉。这说明对于如何界定“智能”,如何理解对话以及语言能力,这些的确是非常深邃的计算机科学乃至哲学问题。
|
||||
|
||||
**早期的对话系统多是基于“规则”(Rule)的系统**。这些系统的一大特征就是,并不只是真正的去“理解”对话,“理解”文字,而是针对某一种模式,或者说是预定好的模板,对对话进行简单的模仿。不过,如果你认为这样基于规则的系统在今天的对话系统中毫无用武之地的话,那就大错特错了。实际上,**通过机器学习的手段辅以规则的方式**,这样的系统能够在绝大多数的场景下表现出惊人的水平。很多机器学习背景的工程师在接触对话系统研发的时候,其实往往有轻视规则系统的这种情况。
|
||||
|
||||
从基于统计学习的机器学习崛起以后,研发人员就开始希望利用自然语言处理和机器学习的一系列方法,从根本上来改变对话系统的构建方式,其中有一个核心的想法,就是**真正理解对话的内容,从而达到真正的智能**。在实际的应用中,**真正基于机器学习的系统**在很长时间里都并不能完全代替基于规则的系统,直到最近几年出现了更加复杂的基于深度学习的模型,我们也会在之后的分享中对这样的系统进行一些介绍。
|
||||
|
||||
## 对话系统的类别
|
||||
|
||||
从方法上,对话系统可以大致分为“**基于规则的系统**”和“**基于机器学习的系统**”。除此之外,从应用场景上,对话系统也可以分为“**基于任务的对话系统**”和“**非任务的对话系统**”。
|
||||
|
||||
基于任务的对话系统其实很容易理解,比如我们打电话到航空公司查询订票,打电话到酒店查询订房信息,抑或打电话到餐厅预定晚餐等。这样的对话系统有一大特点,就是我们的对话基本上都有一个明确的目的,或者说我们要完成一个“任务”(Task)。比如对于查询机票而言,通常情况下,我们的任务可以是成功查询到机票信息,或者成功预订了到某个目的地的机票。
|
||||
|
||||
对于基于任务的对话系统而言,整个对话的“范畴”是限定好的,很多任务其实都有流程或者叫作“套路”可以参考。因此,从本质上来说,基于任务的对话系统还是相对比较容易的场景。在对话系统发展的历史中,很长时间里,基于规则的系统其实就已经可以对于基于任务的对话系统提供很高质量的服务了。很多用户针对基于规则的系统来应对任务型对话系统,往往会觉得系统缺乏一定的灵活度,但其实已经可以完成任务了。实际上,即便是今天的各类智能对话系统,对于任务型对话系统的支持依然是这些智能系统的核心业务能力。
|
||||
|
||||
另外一类对话系统,就是非任务型对话系统,这类系统的一个代表就是“**聊天机器人**”(Chatbot)。聊天机器人,取决于我们构建这类系统的目的,可以非常接近于任务型的对话系统,也可以是非常难以模仿的,真正具有一定语言理解能力的系统。
|
||||
|
||||
典型的聊天机器人,需要对一定的**知识库进行建模**。比如,当用户问到今天的天气,喜马拉雅山的高度,现在美国的总统是谁等问题,聊天系统要能从某种先前存储的知识库中提取信息。这一部分的功能其实和**数据库信息查询**很类似。
|
||||
|
||||
更加复杂的模式无疑是我们不仅需要对已经有的信息进行直接的查询,还需要进行“**推论**”(Inference)。这就是“智能”的某种体现,往往是能对现有的数据进行简单推导。比如,如果用户问这样的问题:比纽约现在气温高的美国西海岸城市有哪些?这时,就需要理解比较词“高”的含义,并能够把这个词汇的含义转换成对气温数值的比较。从这些林林总总的情况来看,非任务型的对话系统更加难以建模,对研发者的挑战也更加艰巨。
|
||||
|
||||
## 对话系统的基本架构
|
||||
|
||||
尽管不同的对话系统有不同的目的,但是从大的架构上来看,所有的对话系统都有一些基本共同的组件。
|
||||
|
||||
首先,一个对话系统需要有一个模块对人的语音进行识别,转换成计算机能理解的信号。这个模块常常叫作“**自动语音识别器**”(Automatic Speech Recognition),简称**ASR**。比如,现在很多手机终端、或者是智能家居都有一些简单的对话系统可以根据你的指令来进行回应。
|
||||
|
||||
第二,在通过了语音识别之后,就是一个“**自然语言理解器**”,也简称为NLU。在这个组件里,我们主要是针对已经**文字化了的输入**进行理解,比如提取文字中的关键字,对文字中的信息,例如数字、比较词等进行理解。
|
||||
|
||||
第三,对话系统往往有一个叫“**对话管理器**”,简称是DM的组件。这个组件的意义是能够管理对话的上下文,从而能够对指代信息,上下文的简称,以及上下文的内容进行跟踪和监测。
|
||||
|
||||
第四,在任务型的对话系统中,我们还需要一个叫“**任务管理器**”,简称是TM的模块,用于管理我们需要完成的任务的状态,比如预定的机票信息是否完备,酒店的房间预定是不是已经完成等等。
|
||||
|
||||
第五,我们需要从管理器的这些中间状态中产生输出的文本,也简称是**NLG**。这个部分是需要我们能够产生语言连贯、符合语法的**有意义的自然语言**。
|
||||
|
||||
最后,在一些产品中,我们还需要把自然语言能够用语音的方法回馈给用户,这个组件往往简称为**TTS**。
|
||||
|
||||
## 总结
|
||||
|
||||
今天我为你介绍了对话系统的一些基础的背景信息。
|
||||
|
||||
一起来回顾下要点:第一,我们讲了什么是对话系统,对话系统从方法论上来说有什么流派;第二,我们聊了对话系统的分类;第三,我们分析了对话系统的基本架构。
|
||||
|
||||
最后,给你留一个思考题,你认为,让对话系统能够真正智能的最大挑战是什么?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
|
59
极客时间专栏/AI技术内参/自然语言处理及文本处理核心技术/110 | 任务型对话系统有哪些技术要点?.md
Normal file
59
极客时间专栏/AI技术内参/自然语言处理及文本处理核心技术/110 | 任务型对话系统有哪些技术要点?.md
Normal file
@@ -0,0 +1,59 @@
|
||||
<audio id="audio" title="110 | 任务型对话系统有哪些技术要点?" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/65/a9/6595bd13e1401b1d3636a6e5d7559ca9.mp3"></audio>
|
||||
|
||||
在上一期的分享中,我为你开启了另外一种和文字相关的人工智能系统——对话系统的一些基础知识。我重点和你分享了对话系统的由来,以及对话系统分为“任务型”和“非任务型”两种类型的概况。同时,我们也聊了聊早期的基于规则的对话系统的构建,以及这样的系统对后来各式系统的影响。最后,我为你简单介绍了对话系统的各个基本组件以及这些组件的主要目标。
|
||||
|
||||
在今天的分享里,我们就来看一看**任务型对话系统**的一些技术要点。
|
||||
|
||||
## 任务型对话系统的基本架构
|
||||
|
||||
首先,我们来回顾一下任务型对话系统的一些基本架构。尽管不同的对话系统有着不同的目的,但是从大的架构上来看,所有的任务型对话系统都有一些基本共同的组件。
|
||||
|
||||
第一个组件是“自动语音识别器”(ASR),这个组件是把人的语音进行识别,转换成为计算机能够理解的信号。
|
||||
|
||||
第二个组件是“自然语言理解器”(NLU)。在这个组件里,我们主要是针对已经文字化了的输入进行理解,比如提取文字中的关键字,对文字中的信息进行理解等。
|
||||
|
||||
第三个组件是“对话管理器”(DM)。这个组件的意义是能够管理对话的上下文,从而能够对指代信息,上下文的简称,以及上下文的内容进行跟踪和监测。
|
||||
|
||||
第四个组件是“任务管理器”(TM),用于管理我们需要完成的任务的状态。
|
||||
|
||||
第五个组件是NLG,既从管理器的这些中间状态中产生输出的文本,也就是自然和连贯的语言。
|
||||
|
||||
最后一个组件是TTS。在一些产品中,我们还需要把自然语言能够用语音的方法回馈给用户。
|
||||
|
||||
在我们今天的分享里,因为ASR和TTS都并不是对话系统的特殊组件,我们就不对这两个部分进行更加深入的探讨了。
|
||||
|
||||
## 任务型对话系统组件详解
|
||||
|
||||
我们先来看一下NLU这个组件。这个组件的目的是把用户输入的文字信息给转换成为任务型对话系统可以理解的内部的表征(Representation)形式。
|
||||
|
||||
我们试想一个餐馆的对话系统,当用户输入了一个句子“看一下北京西单附近今晚7点左右的西餐厅”,这个时候,我们都需要了解哪些信息呢?
|
||||
|
||||
首先,我们需要知道这个输入的“**意图**”(Intent)。作为一个餐馆的对话系统来说,我们有可能需要处理好几种不同的意图,比如“订餐”的意图,“查询菜品”的意图等。那么对于我们刚才的这个句子来说,很有可能是一个订餐的意图。也就是说,我们针对一个输入的句子来判断当前的意图,而**意图其实就是一个离散的输出结果**。这其实就是一个**多类的分类问题**,或者可以看作是**句子的分类问题**。
|
||||
|
||||
当我们知道了整个句子的意图之后,我们就需要进一步理解这个输入句子的细节。而进一步的理解其实就是希望能够从输入的句子中获得可以“执行”(Execution)的信息。
|
||||
|
||||
当我们真实进行餐馆预定的时候,餐馆的名字,预定的时间,用餐人数等信息就显得尤为重要。我们可能需要这样的操作,能够提取出餐馆名字、预定时间、用餐人数等信息,执行餐馆预定的动作,并且能够在餐馆的后台系统中记录下来。于是,我们需要对刚才的语句进行这样的分析。这种分析有时候也被叫作“**填空**”(Slot Filling)。
|
||||
|
||||
“填空”其实也可以看作是一个**分类问题**。比如,需要知道“北京西单”是一个地点,要把这个地点给识别出来,而且能够知道我们已经填了一个叫“地点”的空。再比如,“今晚7点”也需要被识别出来,让我们知道时间的空也被填好了。在这方面有很多方法,有基于传统模型比如“条件随机场”(Conditional Random Field),简称CRF的;也有基于“递归神经网络”RNN的。
|
||||
|
||||
经过了NLU这个组件之后,我们就来到了对话系统的中枢大脑的位置,就是DM这个组件。这个组件重点的是对**对话进行跟踪和管理**。从整个对话的角度来看,DM的主要职责就是监控整个对话的状态目前到达了一个什么情况,下一步还需要进行什么样的操作。
|
||||
|
||||
还是以刚才我们的输入句子为例,通过NLU的分析,我们知道已经有地点和时间两个“空”(Slot)被补齐了,但是很明显有一些最核心的信息依然缺失,比如就餐的人数,订餐人的联系电话等。DM的一大作用就是对所有的“空”都进行管理,并且决定下面还有哪些“空”需要填写。在传统的系统中,DM大多是基于规则的,不过在最近的发展中,DM逐渐变成了基于分类问题的,利用CRF或者RNN来对DM进行建模的也越来越多。
|
||||
|
||||
下一个模块就是TM。这其实是整个任务型对话系统中**执行任务的部分**。对于一个“订单”意图的餐馆对话系统来说,当必要的“空”都已全部填齐的时候,TM就会去触发当前需要进行动作,比如真正对数据库进行操作,从而完成订餐的流程。
|
||||
|
||||
在很多现在的系统中,DM和TM都是结合在一起进行构建的。在此之上往往有一个叫作“**协议学习**”(Policy Learning)的步骤。总体来说,协议学习的目的是让对话系统能够更加巧妙和智能地学习到如何补全所有的“空”并且能够完成模块动作。比如,有没有最简化的对话方法能够让用户更加快捷地回答各种信息,这都是协议学习需要考虑的方面。目前来说,**在协议学习方面比较热门的方法是利用深度强化学习来对DM和TM进行统一管理**。
|
||||
|
||||
最后一个组件叫作NLG,也就是希望对话系统可以产生自然和连贯的语言。比较传统的方法当然就是利用“**填写模板**”的形式,事先生成一些语句的半成品。目前比较流行的办法是使用RNN,特别是RNN中的LSTM来对NLG进行建模。
|
||||
|
||||
## 总结
|
||||
|
||||
今天我为你介绍了任务型对话系统的基本技术要点。
|
||||
|
||||
一起来回顾下要点:第一,我们复习了任务型对话系统的基本组件;第二,我们进一步聊了这些组件的一些最基础的技术要点和背后的模型思想。
|
||||
|
||||
最后,给你留一个思考题,任务型对话系统需要每个组件单独进行学习还是尽可能把所有组件连在一起进行训练?这两种方法的优劣在什么地方呢?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
|
57
极客时间专栏/AI技术内参/自然语言处理及文本处理核心技术/111 | 聊天机器人有哪些核心技术要点?.md
Normal file
57
极客时间专栏/AI技术内参/自然语言处理及文本处理核心技术/111 | 聊天机器人有哪些核心技术要点?.md
Normal file
@@ -0,0 +1,57 @@
|
||||
<audio id="audio" title="111 | 聊天机器人有哪些核心技术要点?" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/e2/60/e2ed31b68c66335b3a4bab942e468b60.mp3"></audio>
|
||||
|
||||
对话系统分为“任务型”和“非任务型”两种基本类型。周一的分享里,我们讨论了任务型对话系统的一些技术要点,重点介绍了任务型对话系统的各个组件及其背后的模型支撑。
|
||||
|
||||
今天,我们就来看一看**非任务型对话系统**的主要技术要点。非任务型的对话系统有时候又会被称作是“**聊天机器人**”。
|
||||
|
||||
## 基于信息检索的对话系统
|
||||
|
||||
我们前面讲过,对话系统,特别是非任务型对话系统,也就是聊天机器人,有一个很重要的功能,就是在一个知识库的基础上和用户进行对话。这个知识库可以是海量的已经存在的人机对话,也可以是某种形式的知识信息。
|
||||
|
||||
比如,一个关于篮球的聊天机器人,那就需要这个系统能够访问有关篮球球队、运动员、比赛、新闻等有关篮球信息的知识库。同时,在这个对话系统运行了一段时间之后,我们就会慢慢积累很多有关篮球的对话。这些对话就成为了系统针对当前输入进行反应的基础。
|
||||
|
||||
**针对当前的输入,利用之前已经有过的对话进行回馈,这就是基于信息检索技术的对话系统的核心假设**。一种最基本的做法就是,找到和当前输入最相近的已有对话中的某一个语句,然后回复之前已经回复过的内容。
|
||||
|
||||
比如,当前的问话是“迈克尔·乔丹在职业生涯中一共得过多少分?”如果在过去的对话中,已经有人问过“迈克尔·乔丹为芝加哥公牛队一共得过多少分?”。那么,我们就可以根据这两句话在词组上的相似性,返回已经回答过的答案来应对当前的输入。
|
||||
|
||||
当然,上面这种对话系统可能会显得比较原始。但是,一旦我们把整个问题抽象成广义的搜索问题,其实就可以建立非常复杂的检索系统,来对我们究竟需要回复什么样的内容进行建模。
|
||||
|
||||
比如,我们**可以把输入当作查询关键词**,只不过从性质上来说,当前的输入语句往往要长于传统的查询关键词,但是在技术上依然可以使用各种搜索技术,例如通常的排序学习等方法都适用于这样的场景。
|
||||
|
||||
从理论上来讲,基于检索的对话系统有很多先天的问题。比如,从根本上,搜索系统就是一个“无状态”(Stateless)的系统。特别是传统意义上的搜索系统,一般没有办法对上下文进行跟踪,其实从整个流程上讲,这并不是真正意义上的对话,当然也就谈不上是“智能”系统。
|
||||
|
||||
## 基于深度学习的对话系统
|
||||
|
||||
那么,如何能够让对话系统真正**对状态进行管理**,从而能够对上下文的信息进行回馈呢?
|
||||
|
||||
最近一段时间以来,**基于深度学习的对话系统逐渐成为了对话系统建模的主流**,就是因为这些模型都能够比较有效地对状态进行管理。
|
||||
|
||||
那么,在这么多的深度对话系统中,首当其冲的一个经典模型就是“**序列到序列**”(Sequence To Sequence)模型,简称**S2S**模型。S2S模型认为,从本质上对话系统是某种程度上的“翻译”问题,也就是说,我们需要把回应输入的句子这个问题看作是把某种语言的语句翻译成目标语言语句的一个过程。S2S模型也广泛应用在机器翻译的场景中。
|
||||
|
||||
具体来说,S2S把一串输入语句的字符,通过学习转换成为一个中间的状态。这其实就是一个“编码”(Encode)的过程。这个中间状态,可以结合之前字句的中间状态,从而实现对上下文进行跟踪的目的。这个部分,其实就成为很多具体模型各具特色的地方。总的来说,中间状态需要随着对话的演变而产生变化。然后,我们需要一个“解码”(Decode)的过程,把中间的状态转换成为最后输出的字句。
|
||||
|
||||
从整个流程上来说,S2S其实非常像我们已经介绍过的深度序列模型,例如RNN和LSTM。从实现上来说,很多S2S模型,其实都是直接利用RNN或者LSTM而得以实现的。因此,很多深度序列模型的技术都可以直接应用到对话系统中来。
|
||||
|
||||
另外,我们可以看到,相比于基于信息检索的系统来说,S2S模型并没有一个“显式”的搜索过去信息的步骤,因此可以更加灵活地处理语言上的多样性,以及不是完全匹配的问题。因此,从实际的效果中来看,S2S模型在对话系统中取得了不小的成功。
|
||||
|
||||
## 实际系统的一些问题
|
||||
|
||||
在实际的开发中,非任务型对话系统会有一系列的实际问题需要解决。
|
||||
|
||||
首先,因为是开放性的对话系统,其实并没有一个标准来衡量这些聊天机器人式的系统的好坏。究竟什么样的系统是一个好的聊天系统,依旧是一个非常具有争议的领域。
|
||||
|
||||
其次,人们在实际的应用中发现,基于深度学习的序列模型,虽然常常能够给出比较“人性化”的语句回答,但是很多回答都没有过多的“意义”,更像是已经出现过的语句的“深层次”的“翻译”。因此在最近的一些系统中,人们又开始尝试把信息检索系统和S2S模型结合起来使用。
|
||||
|
||||
最后,我们需要提出的就是,非任务型对话系统和任务型对话系统有时候常常需要**混合使用**。比如,在一个订票系统中,可能也需要掺杂一般性的对话。如何能够有效地进行两种系统的混合,肯定又是一种新的挑战。
|
||||
|
||||
## 总结
|
||||
|
||||
今天我为你介绍了非任务型对话系统的基本技术要点。
|
||||
|
||||
一起来回顾下要点:第一,我们讲了基于信息检索,也就是搜索技术的对话系统;第二,我们聊了聊如何利用RNN或者是序列模型对对话系统进行建模。
|
||||
|
||||
最后,给你留一个思考题,你觉得在什么样的条件下,非任务型聊天机器人可以展现出真正的“人工智能”呢?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
|
55
极客时间专栏/AI技术内参/自然语言处理及文本处理核心技术/112 | 什么是文档情感分类?.md
Normal file
55
极客时间专栏/AI技术内参/自然语言处理及文本处理核心技术/112 | 什么是文档情感分类?.md
Normal file
@@ -0,0 +1,55 @@
|
||||
<audio id="audio" title="112 | 什么是文档情感分类?" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/c4/aa/c4fa7016236175b68d8e52fc22f628aa.mp3"></audio>
|
||||
|
||||
到目前为止,我们讲完了对话系统的基础知识。一般来说,对话系统分为“任务型”和“非任务型”这两种基本类型。针对任务型对话系统,我们重点介绍了其各个组件的任务,以及这些组件都有哪些模型给予支撑。针对非任务型对话系统,也就是“聊天机器人”,我们主要介绍了如何利用深度学习技术来对一个聊天机器人进行建模,以及非任务型对话系统所面临的挑战都有哪些。
|
||||
|
||||
今天,我们转入文本分析的另外一个领域,同时也是在实际系统中经常会使用的一个子领域,那就是**文本“情感分析”**(Sentiment Analysis)。所谓情感分析,就是指我们要针对一段文本来判断这段文本的文字“色彩”,到底是褒义,还是贬义,到底是抒发了什么情感。
|
||||
|
||||
文本情感分析是一个非常实用的工具,比如,我们需要分析用户对于商品的评价带有什么样的情感,从而能够更好地为商品的推荐和搜索结果服务。再比如,通过文本的情感分析,我们可以了解到用户针对某一个时事的观点异同,以及观点分歧在什么地方,从而能够更加清晰地了解新闻的舆情动态。
|
||||
|
||||
今天,我们首先从最基础的**文档情感分类**(Document Sentiment Classification)这个问题说起。
|
||||
|
||||
## 基于监督学习的文档情感分类
|
||||
|
||||
文档情感分类属于文本情感分析中最基本的一种任务。这种任务的假设是,一段文本的作者通过这段文本是想对某一个“**实体**”(Entity)表达一种情绪。这里的实体其实包括很多种类型的对象,比如可能是商品,某个事件,也可能是某个人物。我们这里讨论的文本单元可以是一个文档,也可以是一个句子等其他的文本段落。
|
||||
|
||||
值得注意的是,我们在这一类任务中,限制一个文本单元只表达,或者主要表达一种情感。很明显,这种假设是比较局限的。一般来说,在实际的应用中,一个文本单元,特别是比较长的单元例如文章,则往往包含多于一种的情绪。因此,我们可以看到**文档情感分类其实是一种简化了的情感分析任务**。
|
||||
|
||||
同时,一个文本单元还可能对多个“实体”进行情感表达。比如一个用户针对某种款式相机的多个方面进行了评价,那么每一个方面都可以作为一个实体,而这种时候,用户的情感可能就更难仅以一种情感来加以概括了。
|
||||
|
||||
在最基本的文档情感分类的情况下,我们往往把这类任务转化成为一种**监督学习任务**,也就是说,我们希望通过一个有标签的训练集学习到一个分类器(Classifier)或者回归模型(Regression),从而能够在未知的数据上预测用户的情感。
|
||||
|
||||
这里往往有两种形式的监督学习任务。一种是把文档分类为几种,最简单的情况下是两种情感。这就是**二分或者多类分类问题**。另外一种则是认为文档会有一种情感,但是每一种情感之间有好坏的顺序区分,比如,评分“好”,就比“一般”要好,也就是说,这些评分之间有一个次序问题。那么,很多时候,这种问题会被归结为一种**“次序回归”(Ordinal Regression)问题**。
|
||||
|
||||
在明确了我们需要构建什么样的监督学习任务以后,对于这些任务而言,如何选取“特性”(Feature)就是一个很重要的工作了。诚然,对于每一个具体的任务而言,我们往往需要选取不同的特性,但是在过去的很多实践中,经过反复验证,有一些特性可能会有比较好的效果。我在这里做一个简单的总结。
|
||||
|
||||
首先,我们曾经多次提到过的“**词频**”(Term Frequency)以及更加复杂一些的**TF-IDF词权重法**都是经常使用的文字特性。在文档情感分类中,这一类特性被认为非常有效。
|
||||
|
||||
另外一种使用得比较频繁的特性就是“**词类**”(Part of Speech)。词类提供了句子中每个词的成分,比如哪些词是动词,哪些词是名词等等。这些词性可以跟某种特定的情感有很密切的联系。
|
||||
|
||||
还有一种很直观的特性就是“**情感词汇**”。比如,我们已经知道了“好”、“不错”等词表达了正向的情感,而“差”、“不好”、“不尽人意”等词表达了负向的情感。我们可以事先收集一个这类情感词汇的集合。这个集合里的词汇可以跟最后文档的情感有很直接的联系。
|
||||
|
||||
最后,需要指出的是,如何开发一个合适的特性往往是文档分类的重点工作。
|
||||
|
||||
除了特性以外,在文档情感分类这个任务中,传统上经常使用的文字分类器有“**朴素贝叶斯**”(Naïve Bayes)分类器、“**支持向量机**”(Support Vector Machines)等。
|
||||
|
||||
## 基于非监督学习的文档情感分类
|
||||
|
||||
情感词汇已经为我们对大段文字乃至整个文档的分类有了很强的指导意义,因此,也有一些方法寻求利用**非监督学习的方式**来对文档进行情感分类。注意,这里所谓的非监督学习,是指我们并不显式地学习一个分类器,也就是说,不存在一个训练数据集,不需要我们提前收集数据的标签。
|
||||
|
||||
这一类思想的核心其实就是设计一套“**打分机制**”(Scoring Heuristics),来对整个文档做一种粗浅的判断。当然,这种打分机制背后都有一种理论来支撑。
|
||||
|
||||
比如,有一种打分模式依靠首先识别的“词类”进行分析,特别是大量的相邻的两个词的词性,诸如“特别好”。这里,“特别”是副词,“好”是形容词,然后就可以得出在某些情况下,副词和形容词的这种搭配特别多的时候,并且在正向的情感词比较多的时候,整个文档也许就是比较偏向正向的情感。
|
||||
|
||||
我们需要指出的是,这种方法虽然听上去比较“山寨”,但是对于很多产品和项目来说,获取大量高质量的标签信息往往是非常耗时,甚至是不可能的,例如上百万的用户对产品的评价数据。因此,在没有训练数据的情况下,利用某种打分机制,可以通过最简单的一些情感词库开发出文档情感分类的算法,这其实也不失为一种**快速迭代的方式**。
|
||||
|
||||
## 总结
|
||||
|
||||
今天我为你介绍了一类基础的文字情感分析任务——文档情感分类的基本技术要点。
|
||||
|
||||
一起来回顾下要点:第一,我们讲了基于监督学习的文档情感分类任务以及这类任务下的重要特性和模型;第二,我们聊了如何在没有大规模训练数据的基础上进行非监督的文档情感分类。
|
||||
|
||||
最后,给你留一个思考题,如何把文档情感分类任务扩展到可以针对多种实体多种情感的分析呢?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
|
51
极客时间专栏/AI技术内参/自然语言处理及文本处理核心技术/113 | 如何来提取情感“实体”和“方面”呢?.md
Normal file
51
极客时间专栏/AI技术内参/自然语言处理及文本处理核心技术/113 | 如何来提取情感“实体”和“方面”呢?.md
Normal file
@@ -0,0 +1,51 @@
|
||||
<audio id="audio" title="113 | 如何来提取情感“实体”和“方面”呢?" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/4e/ba/4ed251c1025d7f1c605bd60436cb1fba.mp3"></audio>
|
||||
|
||||
从上一篇分享开始,我们转入文本分析的另外一个领域,文本“情感分析”(Sentiment Analysis),也就是指我们要针对一段文本来判断其文字“色彩”。文本情感分析是一个非常实用的工具。我们从最基础的文档情感分类这个问题说起,这个任务是把一个单独的文档给分类为某种情感。在绝大多数情况下,我们可以把这个任务看作监督学习的问题。另外,我们也聊了聊如何通过建立情感词来进行简单的非监督学习的步骤。
|
||||
|
||||
今天,我们来看文本情感分析中的另一个关键技术,**情感“实体”和“方面”的提取**。
|
||||
|
||||
## “实体”和“方面”的提取
|
||||
|
||||
对于文本情感分析而言,“**实体**”(Entity)和“**方面**”(Aspect)是两个非常重要的概念。很多情感分析的任务都是围绕着这两个概念而产生的。在谈论如何对这两个概念提取之前,我们先来看看这两个概念的意义。
|
||||
|
||||
“实体”其实就是文本中的某一个对象,比如产品的名字、公司的名字、服务的名字、个人、事件名字等。而“方面”则是实体的某种属性和组建。
|
||||
|
||||
比如这么一个句子:“我买了一部三星手机,它的通话质量很不错”。在这里,“三星手机”就是一个实体,而“通话质量”则是一个方面。更进一步,“很不错”则是一个情感表达,这里是针对“三星手机”这个实体的“通话质量”这个方面。很明显,如果我们想要精准地对文本的情感进行分析,就一定得能够对实体和方面进行有效提取。
|
||||
|
||||
从广义的范围来说,实体和方面的提取都属于“**信息提取**”(Information Extraction)的工作。这是一个非常大的任务类别,用于从大量的非结构化文本中提取出有价值的信息。实体和方面的提取可以利用一般性的信息提取技术,当然往往也可以利用句子中的一些特殊结构。
|
||||
|
||||
## 常用的提取技术
|
||||
|
||||
接下来,我们来聊一聊有哪些最直观最简单的提取技术。
|
||||
|
||||
第一种最简单的技术是**基于“频率”(Frequency)的提取**。在这样的技术中,我们先对文本进行“词类”(Part Of Speech)分析,分析出每个词的词性。然后主要针对句子中的“名词”,计算这些“名词”出现的频率。当这些频率达到某一个阈值的时候,我们就认为这些名词是一个实体或者方面。
|
||||
|
||||
这里的假设是,在一个例如产品评论的文本集合中,如果一个名词反复出现在这个集合的很多文档中,那么这个名词很有可能就是一个独立的实体或者方面。为了达到更好的效果,更加复杂的词频技术,例如TF-IDF也经常被用在计算名词的频率上,从而提取它们作为实体和方面的候选词。
|
||||
|
||||
另一种比较常见的针对情感分析开发的技术,就是**利用句子中的一些特殊的结构从而达到信息提取的目的**。
|
||||
|
||||
比如,回到刚才的那句话:“我买了一部三星手机,它的通话质量很不错”。在这句话中,“很不错”作为一个情感词汇,一定和某一个方面,甚至是某一个实体成对出现的。那么这个**成对出现的情况**就是我们可以利用的情感句子的有利特征。
|
||||
|
||||
比如“很不错”这个词汇,在一个描述产品情感的文档中,这个词汇很少单独出现。这类不管是褒义还是贬义的词汇出现后,在绝大多数情况下,他们都会描述一个对象。而从句法结构上来说,这个对象往往又离这个情感词汇很近,因为这个情感词需要对这个对象进行描述。因此,我们就可以利用这种配对结果,来计算这样的结构是否大量出现。
|
||||
|
||||
这种结构其实可以被反复利用。例如在刚才的句子中,“三星手机”这个实体,一定会和很多不同的方面反复同时出现,如“通话质量”、“操作”、“售后服务”等。我们可以利用这两种不同的配对结构,实体和方面之间的,方面和情感词之间的,更好地提取这些词汇。
|
||||
|
||||
刚才我们说的不管是基于词频的还是利用配对关系的方法,都可以算是**无监督的学习方法**。这些方法的本质,其实就是**利用某种之前定义好的规则或者是某种洞察**来针对文本进行提取。另外一种思维其实就是**把信息提取转换成为监督学习任务**。
|
||||
|
||||
回到例子“我买了一部三星手机,它的通话质量很不错”这句话。这句话的文本作为输入,我们需要的输出是“三星手机—实体”、“通话质量—方面”这样的标签信息。那么,一个基本的想法就是,我们其实可以针对这句话构建一些特征,然后学习出一个分类器,从而可以得到这样的标签。
|
||||
|
||||
值得注意的是,这一类的监督学习任务和我们常见的例如分类一个文档是不是垃圾信息不一样,这里我们**需要输出多个标签**。这种需要输出多个标签的任务,特别是这些标签之间可能还有一定关系的情况,往往被称作是“**结构化预测**”(Structural Prediction)任务。
|
||||
|
||||
在结构化预测这个领域,“**条件随机场**”(Conditional Random Field),或者简称是**CRF**的模型,是对这方面任务进行运作的一个经典模型。然而,需要指出的是,把实体和方面提取当作监督任务以后,很明显,我们就需要有一个训练集和标签,这个训练集的匮乏常常成为CRF产生理想效果的瓶颈。
|
||||
|
||||
## 总结
|
||||
|
||||
今天,我为你介绍了一类基础的文字情感分析任务——情感“实体”和“方面”的提取。
|
||||
|
||||
一起来回顾下要点:第一,我们介绍了什么是情感“实体”和“方面”;第二,我们聊了目前在这个方向上比较通行的一些方法,比如基于“频率”的提取,利用句子的一些特殊结构等。
|
||||
|
||||
最后,给你留一个思考题,除了我们介绍的这些方法,你还能想到其他方法来提取实体和方面的关键词吗?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
|
55
极客时间专栏/AI技术内参/自然语言处理及文本处理核心技术/114 | 文本情感分析中如何做意见总结和搜索?.md
Normal file
55
极客时间专栏/AI技术内参/自然语言处理及文本处理核心技术/114 | 文本情感分析中如何做意见总结和搜索?.md
Normal file
@@ -0,0 +1,55 @@
|
||||
<audio id="audio" title="114 | 文本情感分析中如何做意见总结和搜索?" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/c3/21/c37402a91e357169946e5b65506d9521.mp3"></audio>
|
||||
|
||||
在文本“情感分析”(Sentiment Analysis)这个领域,我们首先介绍了最基础的文档情感分类这个问题。在绝大多数情况下,这是一个监督学习的问题。当然,我们也可以通过建立情感词库来进行简单的非监督学习的步骤。紧接着,我们讨论了文本情感分析中的另一个关键技术,即情感“实体”和“方面”的提取。这个任务可以说是很多情感分析的根基,我们需要从无结构的文本中提取实体和方面等结构信息,便于进一步的分析。我们讲了如何通过词频、挖掘配对信息以及利用监督学习来对实体和方面进行挖掘。
|
||||
|
||||
今天,我们来看文本情感分析的另外一个主题——**意见总结**(Opinion Summarization)和**意见搜索**(Opinion Search)。
|
||||
|
||||
## 意见总结
|
||||
|
||||
为什么“意见总结”这个任务会很重要的呢?
|
||||
|
||||
假如你希望在电商网站上购买一款数码相机。这个时候,你可能需要打开好几款相机的页面进行比较。对于相机的硬件指标,能够从这些页面上相对容易地直接得到,除此以外,你可能还比较关心对这些相机的评价。
|
||||
|
||||
在这个场景下,“意见总结”的重要性就凸显出来了。因为优秀的相机款式往往有上百甚至上千的用户评价,这些评价包括了用户对产品很多方面的评价,有褒义和贬义的情绪。如果对这些评价逐一进行浏览,很明显是一种非常低效的做法。因此,从购物网站的角度来说,如果能够为用户把这些评论进行总结,从而让用户看到总体的有代表性的评论,无疑能够帮助用户节省不少时间和精力,让用户获得更好的体验。
|
||||
|
||||
简单来说,意见总结就是从无结构的文本中提取出来的各种情感信息的综合表达。我们这里聊的意见总结主要是指“**基于方面的意见总结**”(Aspect-based Opinion Summarization)。也就是说,意见的总结主要是围绕着产品的种种方面来产生的。
|
||||
|
||||
概括一下,基于方面的意见总结有两个特点。第一,这样的总结主要是针对物体的**实体**以及对应的**方面**来进行的。第二,意见总结需要提供**数量化的总结**。什么是数量化的总结?就是总结里需要指出,持有某种意见的用户占多少百分比,又有多少百分比的用户有其他意见。很明显,这里还牵涉到如何表达和显示这些意见总结的步骤。
|
||||
|
||||
可以说,基于方面的意见总结成为了意见总结的主要任务。另外,基于方面的意见总结还可以**与其他文本技术相结合**,从而能够延展这个技术的效果。比如,总结语句的生成可以分为“**句子选择**”和“**人工句子生成**”这两种方案。
|
||||
|
||||
首先来说一下句子选择这个想法。句子选择的思路是,我们希望在最后的意见总结里,能够利用已有的非常有代表性的句子,这样用户看到的最后的总结会显得更加真实。那么这里有两个问题:一个问题是如何对所有的句子进行筛选;第二个问题是如果有重复多余的字句,又如何进行进一步的选择。
|
||||
|
||||
通常情况下,我们通过对句子打分来筛选,这个时候,一般需要设计一个打分机制,这个机制往往是看这个句子对某一个实体的方面是否进行了有情感的评价。然后,对所有句子进行聚类,这样所有评价类似的句子就可以被聚集到一起,从而能够过滤掉重复多余的字句。
|
||||
|
||||
那么,人工句子生成又是怎么运作的呢?首先,我们必须知道这个物品的哪些方面得到了用户的评价,而且都是什么样的评价,比如是正面评价还是负面评价。然后,把这些信息和一个语言模型,也就是语句生成器相连接,从而能够“生成”最后的总结语句。值得注意的是,这样生成的总结语句并不会出现在所有用户的原始评价中,因此也可能会对用户的最终体验有一定的影响。
|
||||
|
||||
除了基于方面的意见总结以外,还有一些类似的但是并不完全一样的总结方案。比如,有一种总结方案叫“**针对性观点总结**”(Contrastive View Summarization)。这个任务更加突出针对同一个主题的两种截然相反的观点。这种意见总结不仅可以针对商品,也针对新闻事件,比如某一个政策法规、选举结果等往往比较有争议的话题事件,“针对性观点总结”往往会有比较好的用户体验。
|
||||
|
||||
## 意见搜索
|
||||
|
||||
我们可以认为“意见搜索”是建立在意见总结之上的一个任务。通常情况下,意见搜索需要完成的任务是用户输入一个主体的名字,我们需要返回和这个主体相关的意见信息,这些意见信息有可能是通过意见总结而呈现给用户的。
|
||||
|
||||
意见搜索的难点,或者说是和传统搜索不一样的地方主要还是在于**针对意见信息的索引和检索**。
|
||||
|
||||
第一,我们需要在索引库中找到有哪些文档和字句包含了我们所需要查询的主体。可以说,这一点和传统的搜索是非常类似的。
|
||||
|
||||
第二,我们需要在找到的文档和字句中检查是否包含主体的某种意见,以及其褒义或者贬义的评价。这就是有别于传统搜索的地方。在找到了所有关于某个主体的情感评价以后,我们需要设计一个评分机制从而返回最有说服力的文档,并且还需要在这些文档的基础上进行意见总结。很显然,这些步骤都是传统的搜索中并没有的。
|
||||
|
||||
按照上面所说的这两点,我们可以把意见搜索分为两个阶段。
|
||||
|
||||
第一个阶段,就是利用现有的搜索技术,比如我们介绍过的文本搜索或者基于排序学习的搜索等方法,得到最初的一个文档的备选集。然后进入下一个阶段,就是通过一个模型,针对所有的文档进行基于意见的打分。这个模型可以是简单的分类器,用于分析当前的字句和主体的意见究竟有没有关系,也可以是一个更加复杂的模型,输出当前的文档和主体的哪一个方面有关系。在这里,任何一种文本分类器都可以被利用起来。
|
||||
|
||||
总体来说,意见搜索可以算是对于意见分析和总结的一个综合体现。
|
||||
|
||||
## 总结
|
||||
|
||||
今天,我为你介绍了一类比较高级的文本情感分析技术:意见的总结和搜索。至此,我们对于文本情感分析的分享就告一段落了。
|
||||
|
||||
一起来回顾下要点:第一,我们讲了意见总结的的重要性,基本概念和技术;第二,我们分享了意见搜索的基本概念和两个阶段的技术。
|
||||
|
||||
最后,给你留一个思考题,除了常见的观点和评分以外,用户对于产品的评价一般还在意哪些信息呢?
|
||||
|
||||
欢迎你给我留言,和我一起讨论。
|
||||
|
||||
|
64
极客时间专栏/AI技术内参/自然语言处理及文本处理核心技术/复盘 3 | 自然语言处理及文本处理核心技术模块.md
Normal file
64
极客时间专栏/AI技术内参/自然语言处理及文本处理核心技术/复盘 3 | 自然语言处理及文本处理核心技术模块.md
Normal file
@@ -0,0 +1,64 @@
|
||||
|
||||
到目前为止,我们讲完了人工智能核心技术的第三个模块——**自然语言处理及文本处理核心技术**。
|
||||
|
||||
整个模块**共18期**,**6大主题**,希望通过这些内容,能让你对自然语言处理及文本处理核心技术有一个全面系统的认识和理解,为自己进一步学习和提升打下基础。今天我准备了 18 张知识卡,和你一起来对这一模块的内容做一个复盘。
|
||||
|
||||
点击知识卡跳转到你最想看的那篇文章,温故而知新。如不能正常跳转,请先将App更新到最新版本。
|
||||
|
||||
## LDA模型
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/d2/b0/d2b20852afd828403050812715cb44b0.png" alt="" />](https://time.geekbang.org/column/article/376)
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/e8/9b/e8acfa9088e8531e5d6384af44eae99b.png" alt="" />](https://time.geekbang.org/column/article/5998)
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/d8/b2/d885cec604069f9cb8c85f4ebfe2f2b2.png" alt="" />](https://time.geekbang.org/column/article/6024)
|
||||
|
||||
## 基础文本分析
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/93/40/93b2c2969cd39605e3e5699cd50c1840.png" alt="" />](https://time.geekbang.org/column/article/6190)
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/4b/8d/4b701dfcdd64af6aaa161c89ccda748d.png" alt="" />](https://time.geekbang.org/column/article/6274)
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/87/97/87a8a66051291b718babf0815c7d0897.png" alt="" />](https://time.geekbang.org/column/article/6366)
|
||||
|
||||
## Word2Vec
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/f4/cc/f468146b7b806b28ba482f40e3e429cc.png" alt="" />](https://time.geekbang.org/column/article/6430)
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/42/24/4217b8fec84d0ffb9d9c32a7e6710324.png" alt="" />](https://time.geekbang.org/column/article/6578)
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/9a/e6/9a0a810db7faa9c11be2b1b6a5ee7fe6.png" alt="" />](https://time.geekbang.org/column/article/6586)
|
||||
|
||||
## 基于深度学习的语言序列模型
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/fc/5d/fc31c5d883318ba258611e0293e8305d.png" alt="" />](https://time.geekbang.org/column/article/6681)
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/cf/e2/cf3b5519efa55aae3e12aa9a32b5c0e2.png" alt="" />](https://time.geekbang.org/column/article/6840)
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/e0/06/e07f43289823797784651ace6d1db306.png" alt="" />](https://time.geekbang.org/column/article/6925)
|
||||
|
||||
## 基于深度学习的聊天对话模型
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/1d/c5/1df98ed3f33314f696f124ee4f034cc5.png" alt="" />](https://time.geekbang.org/column/article/7144)
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/01/29/01d81a7c92a1802848f8dc5ffbc49f29.png" alt="" />](https://time.geekbang.org/column/article/7326)
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/f3/e7/f33f23856b040bf4dac7db9f0262cfe7.png" alt="" />](https://time.geekbang.org/column/article/7423)
|
||||
|
||||
## 文本情感分析
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/f5/36/f581e845830a1ba101031bac27517f36.png" alt="" />](https://time.geekbang.org/column/article/7649)
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/37/3f/3731e28f9af2f6e6975272fb1ee27f3f.png" alt="" />](https://time.geekbang.org/column/article/7757)
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/be/f2/be65b1a4c0d4c19a794ad075fd987bf2.png" alt="" />](https://time.geekbang.org/column/article/7954)
|
||||
|
||||
## 积跬步以至千里
|
||||
|
||||
最后,恭喜你在这个模块中已经阅读了**37690字**,听了**120分钟**的音频,获得一张新的通关卡,这是一个不小的成就。在人工智能领域的千里之行,我们又往前迈出了一步。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/59/c4/595581f953c55e2066baf9a181db85c4.png" alt="" />
|
||||
|
||||
感谢你在专栏里的每一个留言,给了我很多思考和启发。期待能够听到你更多的声音,我们一起交流讨论。
|
||||
|
||||
|
Reference in New Issue
Block a user