深度学习Meetup速记(一)——基于深度学习的文本语义分析

浏览: 6672

基于深度学习的文本语义分析

作者:邱锡鹏          

编者按

8月26日,星环科技与深度学习国际交流群举行首次深度学习Meetup,共有四位嘉宾进行了精彩的分享,本文系复旦大学计算机学院邱锡鹏副教授精彩分享内容。活动详情可关注星环科技官方微信,更可免费获取演讲PPT资料。以下为分享内容正文:


今天很荣幸在这里给大家介绍深度学习在NLP(自然语言处理)里的应用。

  • 自然语言处理

  • 首先简单介绍一下自然语言处理。这个名词听着并不陌生,其实它已经在我们生活中有过很多实际应用。自然语言处理最初的来源就是从人工智能开始,人工智能简单的说就是让机器具备智能,但是怎么去评价是很难的。在这里,人与机器是通过自然语言进行交流的,自然语言处理是人工智能下面非常难的一个分支。

    什么是语言。明确的定义是:语言是指在一个有限的字符集上,产生的符合一定规则的字符串集合。这个集合是无限的,所以这里很难运用有限的规则,不像程序语言,它的灵活性是很高的。

  • 自然语言与人工语言区别

  • 自然语言与人工语言最大的区别就是歧义性,这里介绍一下分词的例子。比如交叉歧义,他说的确实在理。这里的“确实”、“在理”和“的确”、“实在”都是词,所以如果只是查字典的话,就会有问题。另外,还有组合歧义的例子,就是在不同的句子环境下,有的是词,有的不是词。另外就是指代消解的问题,所谓指代就是经常会出现一些指向某个实体的代词,最常见的是第三人称代词,“他”、“他们”这种。这里有个例子:

    “我们把香蕉给猴子,因为它们饿了。”

    “我们把香蕉给猴子,因为它们熟透了。”

    这两句话中的“它们”就分别指代的不同的实体“猴子”和“香蕉”。这里我们就没办法通过一些简单的规则来辨识出指代的问题。虽然自然语言处理的问题非常难,但这不妨碍我们已经有一些NLP的技术应用在日常生活中。比如搜索引擎、输入法、文档检索、机器翻译等等。

  •  实际应用

  • 接下来我们要介绍的是自然语言处理技术如何解决实际应用问题。一个比较理想的流程是这样的:拿到一个句子,首先对它进行分词,然后是词性标注、句法分析、语义分析,最后组成所谓的知识,配合特定的知识库,组成上层的应用。这是一个比较理想的流程,其中每个部分会衍生出一些具体的研究题目和研究分支。在这其中的每一步都有可能出现错误,要是我们假设每一步的正确性在90%,那最后总的准确率就很低了。所以,在真实的流程中,我们运用的是端到端的做法。

    那端到端是怎么做的呢?这里举一个简单的例子。

    “我喜欢读书”和“我讨厌读书”

    用情感分析分析出哪个是正面的,哪个是负面的。在真实的情况下,我们并不会运用刚才说道的那个理想流程来分析这个句子的情感,而是运用数据驱动的方法,通过分类模型,机器学习的算法来得到。

    作为分类模型的输入,我们首先要从数据中抽取特征,这一步是很关键的。因为语言的输入是一个个离散的符号,但是在机器学习里面需要的输入是向量,所以我们需要把离散符号转变成向量,所以怎么找到有效的转换方式是一项重要的工作。有了这一步,我们就可以根据大量的语料信息学习里面的参数,并且做解码。解码也是NLP里面比较关键的算法,NLP里很多问题都是结构化学习问题,所以需要解码算法,解空间也是无限大的。这就是一个端到端的流程,总结来说就是,我们需要把一个任务的输入和输出定义好,准备一个分类模型,运用大量的训练数据来训练这个模型。目前多数的NLP任务运用端到端的方法来解决是最有效的。

    现在我们回到刚才那个例子,“我喜欢读书”和“我讨厌读书”。首先我们把这两个句子转化成两个向量,如图,

    Clipboard Image.png

    出现的词就是1,不出现就是0,这样就把他们转化成了4维空间中的一个点。实际情况中的特征词典都是几十万维甚至上百万维的向量。在这样的空间里,大家经常用线性分析,一个重要的原因就是它的空间维数很高。

    包括我们刚才讲的分词问题,我们也把它转化成分类问题。一个比较简单的做法就是确定每个词中间要不要切分。如果不需要切分,就标注为0,需要切分就标注为1。这样我们就把它转化成了在每两个词中间的分类问题。当然还有更复杂的,比如序列标注,它是基于词标签的,就是我们对每个词打上标签。这也算是目前主流的一个做分词的算法,总之就是把自然语言问题转化成机器学习问题,然后用端到端的方法来解决。

  • 结构化学习

  • 那么,自然语言问题很多可以转化成结构化学习问题。结构化学习问题它的输出不太一样,是一个标签序列或者分析树,它的解空间非常大,我们不可能用传统的枚举的方法去找它的解,必须要有解码算法。

    那么,总的来说,自然语言的结构化学习的三个问题就是:第一,怎么用模型表示;第二,解码问题;第三,参数估计。形式化表示的话,其实如图中这个公式就够了。

    Clipboard Image.png

    W是参数估计,就是权重。f是模型表示,而argmax是解码。

  • NLP领域深度学习进展

  • 有了上面的基础,接下来我们可以看一下深度学习最近在NLP里的进展情况。首先,深度学习是来源与多层的人工神经网络,所谓深度,我们认为大于一层的都叫做深度网络。深度神经网络模型具有自动提取特征的优点,就像刚才说的我们去找出有效的特征来做分类。那运用深度学习之后呢,这些特征的抽取就不需要人来找,只要有大量的数据,当层数比较深的时候,可以把特征自动的选出来,所以深度学习在很多方面也叫作表示学习。那么,现在随着人们对深度学习的认识,它现在逐渐的在想人工智能的方向发展,其中主要又两个机制,是记忆网络和注意力机制,其实熟悉的朋友都知道,现在注意力机制也是比较热门的话题,现在很多模型都离不开这个机制。

    接下来我们从另外一个角度来看自然语言处理。在自然语言理解这方面,判断一个句子是否正确是非常困难的,我们基本把它归结为一个概率问题,也就是我去判断一句话它到底是不是属于自然语言的概率是多少,也就是这句话的可能性和合理性的概率是多少。那这里就是一个自然语言处理的概率模型,最终的目标是去判断这个句子是否合理。

    Clipboard Image.png

    这里举个简单的例子,比如图中第一句话“!在报那猫告做只”,我们就觉得这个句子不对。重新排序后的第二句话“把只猫在作报告!”,这句话好像对了,但是有不合理。最后第三句话“那个人在作报告!”,这句话的可能性和合理性就比较高了,所以对应的概率就比较高。这里就是我们运用统计学的方法分别给这三个句子一个概率,那肯定是第一个概率最低,第二个稍高,第三个最高了。所以一切都是概率,比较常见的是简化之后的N元语言模型,就是当前的一个词只依赖于它之前的N-1个词,这样就可以大幅的简化模型。

    Clipboard Image.png

    目前来说,常用的把N取5-7就可以了,当然其实是这个取值也是挺大的了。大家可以想象,如果一个十万的词典,如果取7的话,那就是十万的7次方,其实也是很大的。这个模型的另外一个缺点就是它的泛化能力比较差,例如这边的三个概率,分别是知道鸡、牛、羊,然后求肉的概率。如果我们只知道前两个概率,那最后一个知道羊求肉的概率就是0。但其实,如果我们知道鸡、牛、羊是相同类型的东西的话,就应该使这里的概率平滑。

    那么为了避免以上两个缺点,03年 Bengio提出了提出了一个基于神经网络的语言模型。这是最早的做深度学习的模型。它主要的功能是解决刚才的泛化问题,它把每个词映射到空间中的一个点,通过我们通常所说的嵌入和一个三层的网络,最终输出了下一个词的概率。这样就把一个语言问题变成了分类问题。这样就避免了N元模型中的泛化问题,比如刚才那个鸡、牛、羊的例子,就不会输出差别特别大的概率了。当然,这个模型也有缺点,主要是输出空间大、归一化问题和长距离依赖问题。

    Clipboard Image.png

    总结来说,引入深度学习之后,最大的变化是底层的表示变了,以前就是用0、1的方法表示,每个词都是一个one-hot向量,但是用这种离散表示方法的一个缺点就是词和词之间没有距离的概念,但在实际生活中每个词之间是有关系的。

  • 基于神经网络的语言模型
  • 为了避免这种缺陷,就引入了其他知识模型,比如同义词词典。这里其他的一些词袋模型、N元模型都是离散的表示,都有刚才所说的泛化问题。在加入深度学习之后,单词可以表示成连续的实数向量,就是在低维空间中一些连续的点,点与点之间是有距离概念的,比如同义词的点之间的距离就比较近,可以认为它们的语义也是相近的。这就是深度学习之后的主要的不同。但是,连续表示也不是从这里开始的,早期的时候有一个分布式表示,主要基于分布式假设,运用共现矩阵的矩阵分解等来做分析问题。分散式表示(dustributed)是在深度学习之后出现的,一般也翻译成分布式表示,我这里为了避免歧义翻译成了分散式表示。它的目标是用压缩、低维、稠密的向量去表示一个词,主要是和局部表示相对应的。

    Clipboard Image.pngClipboard Image.png

    形象化的说,例如图中的棋盘,如果要分布100个棋子,原来我们需要建立100维的空间,但是现在,我们只需要建立一个二维的空间,在里面画100个格子就好,每个格子筛选棋子。所以这里我们只要在低维的空间中展示出两个词语的不同就够了,至于如何不同,我们就交给上层的神经网络去做了。提到distributed表示,我的观点是大家不要给它附加太多意义,它就是分散在低维空间中的很多点,只要有一定区别就够了。

  • 循环神经网络模型
  • 接下来要介绍一个非常适合做语言建模的循环神经网络模型。之前有讲到我们可以把语言问题转化成为这样的问题,比如xt依赖于之前的xt-1到x1的概率p,总的就是一个条件概率的连乘,我们可以用一个新的函数g表示该条件概率的连乘结果,这里ht称为内部状态,它涵盖了xt-1到xt的所有信息,之后我们就可以递归的构造如图上的循环神经网络的函数了。

    Clipboard Image.png

    循环神经网络的形式如图,中间的隐藏层,它的输入不光依赖于ht,还依赖于上一个时刻的输入ht-1,这样呢,循环神经网络就非常合适的可以用来建立自然语言模型,它被证明是图灵等价的,可以用来模拟任何程序或计算过程。但它也有一个缺点,就是长距离依赖问题,后来也因此对它做了很多改进。

    Clipboard Image.png

    那么,基于RNN的语言模型就比较简单了,假设h0=0,我们根据图中的样子一步步的产生下一个词。它也可以是一个异步的序列到序列的模型,输入一个序列,最后输出另一个序列,用这机器翻译这些方面。

  •  LSTM模型
  • 接下来是一个LSTM模型,这是一个改进,它引入了内部的memory来做长距离的依赖关系。它主要是解决了序列到序列之间的非线性的依赖关系,因为时间关系,我在这里就不多做解释。

    我这里有目前的机器学习的研究热点,我们可以大概总结一下事情发展的脉搏。如果我们把传统的神经网络看做既带有控制,又带有计算、记忆的网络,那从输入到输出,这三块是不分的,但是我们在写程序的时候会分开的。所以目前有人就在做这样的工作,一个是增加注意力模型,给你一块外存或者内存,你要进行抽取,而不是把所有内容都读出来。另外就是增加外部记忆,就是把控制计算和存储进行分离,这样我就可以把很多东西放在外部记忆,这就不需要增加很多额外的工作量。还有的就是改变记忆结构,比如原来的记忆都是矩阵形式表示,现在用栈、队列的形式来改变记忆的结构。

  • 小结
  • 总结下来,现在的研究大概是这几个方向,希望从神经网络的角度来模拟完整的计算机功能,深度学习从神经网络逐渐走向人工智能。

    除了词的学习模型,当然还有句子和篇章的模型,例如递归组合模型、卷积模型等等,在这里就简单总结一下语言表示模型,不做深究。

    最后,自然语言处理任务可以大概划分为以下四个类别。类别到序列、序列到类别、同步的(每个位置都要产生输出)序列到序列、异步的序列到序列。如今大部分的自然语言处理任务都可以归结到上面的这几类。

    最后的最后,这里是我们目前的工作,大家有兴趣可以去网站了解一下。http://nlp.fudan.edu.cn/xpqiu

    11.png


    (分享内容到此结束)



     

    演讲嘉宾:邱锡鹏   复旦大学计算机学院,副教授

    主要研究方向:深度学习、自然语言处理、自动问答系统以及统计机器学习。其所在团队FNLP也是国内最早从事自然语言处理的课题组之一,学术带头人为吴立德教授和黄萱菁教授,在理论研究和工程实际方面都有非常丰富的成果。不但在相关领域的权威国际会议发表了许多论文外,也和国内外很多单位进行合作,开发了自动问答、舆情分析、车载语音交互等实际应用系统。其带领的团队研发出的一套基于机器学习的中文自然语言文本处理的开发工具包 FNLP,该工具包包含了为实现这些任务的机器学习算法和数据集。



    推荐 3
    本文由 星环科技 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
    转载、引用前需联系作者,并署名作者且注明文章出处。
    本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

    1 个评论

    太高深了,有点看不下去啊

    要回复文章请先登录注册