CMU NLP课程笔记(一)

最近开始学习卡耐基梅隆大学的NLP课程——CMU CS 11-747,感觉这门课相对初学者来说是比较友好的,它结合了很多实际的NLP的任务来教授很多NLP的基础知识,前提是要阅读过它指定的教材。之前我已经学习过著名的斯坦福大学的cs224n的NLP课程,那门课程也是不错的,不过已经有大牛整理了该课程的笔记,有兴趣的同学可以参考CS224n-码农场

备注:我这个笔记并没有严格按照其课程讲解顺序,只是将我认为比较重要的知识点总结出来,顺序可能也会有不一样。做这个笔记的原因一个是方便自己的知识回顾,还有一个就是希望能帮助那些英语不好的同学从整体了解该课程的知识体系。如有不足的地方,请指正。

Lecture1

关于CMU的这门课程有一点比较特别的是它使用的是dynet深度学习框架来完成所有的实例。这个框架与tensorflow这种静态图框架不同,是一种动态图框架,和pytorch是一个类型的。众所周知,对于动态图框架来说,最大的好处就是可以为每个训练样本动态定义一个计算图,在训练过程中可以修改计算图,且允许单步调试,这是tensorflow,theano等静态图框架不能做到的,举个例子来说就是在tensorflow中,定义了一个add(a,b)操作,想知道该计算得到的值,必须使用session.run()之后,才能获取结果。但是dynet则直接就能读取该计算操作的结果。(当然,tensorflow在引入了Fold特性后,也具备了动态计算图的能力,有兴趣的同学可以参考pytorch dynet – 搜索结果 – 知乎)。当然动态计算图的缺点也很明显,就是每个样本都定义不同的动态计算图,整个模型训练的效率会很不好,因此dynet提供了automatic batching机制来提升训练效率,即根据实际情况给一个计算图喂一个minibatch的数据,或者给一个样本喂一个样本的数据。

备注:其实课程老师 Graham Neubig说的几个使用dynet的优点,个人感觉可能没有那么明显,对于NLP任务来说,使用tensorflow等静态计算图框架可能确实比较麻烦,但是为啥不用pytorch或者其他框架呢?可能是因为dynet由CMU参与开发并提出的吧。我之前只用过tensorflow做过文本分类任务,在开发调试上确实有点别扭。准备通过这个课程学习pytorch(因为pytorch相对dynet来说比较成熟)。

NLP的难题

首先NLP是做什么的?

简单说就是设计算法来处理一些自然语言数据任务。人类的自然语言二义性很严重,相近的表示很有可能其表达的含义会不同。同时人类的自然语言也在不停的更新,例如各种网络用语、俚语等的出现。然而相对的,却很少有人能够完全掌握整套语言系统规则,大家只是凭感觉去处理文本。因此涌现了很多不同的方向来研究人类语言,比如有监督的机器学习方法,通过输入大量的已经标记过的样本数据,来学习样本中包含的一些语言特性和规则。比如文本分类,主题提取等。

文本处理有很多先天的难度:

  1. 离散型,因为文本多是由各种语言里面的元字符组合成词、句得到,每个字符就是一个离散的特征,组成的词也是离散型的,这个与其他机器学习任务是不同的。因此要建立字符与字符或者词语词之间的联系是很难的,反面例子就是关于颜色特征,可以根据色调值和强度值来精确区分两个不同的颜色。
  2. 理解语言,需要会的东西太多了:语法、词语形态、语义、自然界的常识、修辞、叙述手法、多语言间的翻译知识等。
  3. 数据的稀疏性。由1和2可知,对自然语言文本直接建立特征矩阵,很容易就得到一个稀疏矩阵,无法遍历所有可能的特征的值。光是词的组合就有接近无限种可能。更何况人类还在不断造词。

本课程主要是运用深度学习中的深度神经网络来解决一些NLP的问题,后面的课程可以不断了解到Neural Network是如何帮助我们解决上面的问题。

First Example——Sentence Classification

课程首先举了一个句子分类的例子。两个句子的情感分类:

《CMU NLP课程笔记(一)》
《CMU NLP课程笔记(一)》

这个问题可以看成是一个多分类任务,一个样本句子对应五个标签有5个对应的概率 《CMU NLP课程笔记(一)》 ,在五个标签中选择一个作为 《CMU NLP课程笔记(一)》 最大的那个作为其最终标签。那么如何对文本进行特征矩阵化呢?

方法一:Bag of Words词袋模型

相信搞NLP的同学对词袋模型都比较熟悉,这是对自然文本进行特征向量化的基本操作。最简单的词袋模型将所有语料中的词进行one-hot编码,表示了一个词是否出现在所处理的文本中。它不考虑词序以及其他任何特征,只是一个词查找的功能。在课程中提到的BOW词袋模型,应该是更高级一点的,如图:

《CMU NLP课程笔记(一)》
《CMU NLP课程笔记(一)》

首先,它已经建立了词袋,然后每个词也训练得到了一些词向量,词向量每个维度的含义如图所示。模型的主要原理为将一个句子的所有词的“词-分类score向量”(姑且这么描述)相加,同时增加偏值bias,得到一个句子的分数。然后使用softmax函数,将分数转换成概率。

这种方法简单,也在一定程度上解决了问题,但是有一定缺陷,如句子中出现复杂的词组、或者语法关系、或者其他复杂语义,那么简单得将词分数向量相加就会失去其本身的作用,举例:

《CMU NLP课程笔记(一)》
《CMU NLP课程笔记(一)》

图中用红框标出来的就是较为复杂的语义,don’t love中,don’t在neutral或者bad类型分数高的,love在very good上分数高,最后相加,可能得到一个good或者neutral的结果,显然是不对的,下面的句子中,含有两个negative的词,如果相加,可能会得到一个negative的结果,显然也是不对的。

那么解决方法是什么呢?课程里面提出了一个概念叫combination Feature,表示对不同词的组合建立的复杂特征关系。举例:对诸如“don’t””love”两个词同时存在,则其对应的bad上的分数会高一点。其实说白了就是对特征进行组合与关联,建立复杂的特征。这不就是神经网络擅长的事情吗?神经网络的本质工作之一就是能够找到数据中的一些复杂的组合特征,这个工作由人工来做既费时,也需要一定的专家知识,但是语言学家毕竟少,至此我们又找到一个使用神经网络来解决NLP任务的理由了。

因此,课程中对上述BOW模型进行了改进,取名为Continuous Bag of Words(CBOW)。(注意一下这个东西目前跟word2vec的CBOW不是一回事。)模型如图:

《CMU NLP课程笔记(一)》
《CMU NLP课程笔记(一)》

这个CBOW模型能够学习到一些较为高级的特征,如主题、情感等,但是它仍然只是简单得将句子里面词的scores相加,简单的线性模型仍然无法学到复杂的combination feature。因此可以在模型增加一个非线性变换,来达到学习组合特征的目的,deep CBOW的基本原理就是这个,如图所示:

《CMU NLP课程笔记(一)》
《CMU NLP课程笔记(一)》

Computation Graph

计算图这个是属于开发框架的内容,不管是动态图框架还是静态图框架,他们有个共同的特点就是都需要设计神经网络的计算图。

神经网络的计算图是一个有向图,本质上是按照神经网络训练时的forward Propagation的步骤来定义图的架构。其中,图的节点有两种,一种是没有指针指向的,这种节点一般表示输入数据X,还有一种节点通常由一个有向边指向,表示一个函数操作,例如 《CMU NLP课程笔记(一)》 ,而图的有向边表示它指向的节点的函数参数或者是一个数据依赖。

我们只需要定义好这个图结构,那么这些开发框架将会自动帮我们执行forward propagation(FP)以及backward propagation(BP)。FP的实现就按照我们定义的图结构来依次计算,课程里给了个例子: 《CMU NLP课程笔记(一)》 ,其计算图以及FP过程如图:

《CMU NLP课程笔记(一)》
《CMU NLP课程笔记(一)》

那么BP是如何实现的呢,一般深度学习开发框架中,已经为每个图中的函数节点实现了求偏导的运算,如节点 《CMU NLP课程笔记(一)》 ,其对x和A的偏导已经实现,为: 《CMU NLP课程笔记(一)》 ,以及 《CMU NLP课程笔记(一)》 .那么框架只需要从图的终点从后往前依次计算对参数的偏导就可以了。

(具体的BP过程就不描述了,有兴趣的同学可以去吴恩达的DeepLearning课程上去学习,个人觉得里面的推导还是对初学者比较友好的。当然斯坦福的cs231课程也不错。)

    原文作者:邱震宇
    原文地址: https://zhuanlan.zhihu.com/p/36309497
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞