深度学习入门与自然语言理解

时间:2022-04-24
本文章向大家介绍深度学习入门与自然语言理解,主要内容包括小序、CNN、卷积神经网络、NLP与CNN、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

小序

深度学习是机器学习领域的一个分支,也可以说是该领域近些年来的最大突破之一。

在了解深度学习之前,我们应当回顾一下历史,同时也搞明白当前最火爆的几个概念到底有着什么样的关系。

AI,ML,DL

这些年来随着科技的发展和国家政策的推进,人工智能、机器学习还有深度学习这几个词就不断充斥于耳,但是这些概念却常常被我们所混淆。

简单的来讲,我们可以认为 AI > ML > DL,也就是说他们之间是包含关系:

  • 人工智能(AI)是计算机科学的一个重要研究领域,拥有许多的分支,例如专家系统、进化计算、计算机视觉等等。重点在于,如何使用计算机构建复杂的、能够拥有与人类智慧相同本质的东西。
  • 机器学习(ML)是实现人工智能的一种方法,或者说一种思路。ML之所以能够在人工智能领域鹤立鸡群,主要是因为它和普通的弱人工智能实现不同,可以使得机器拥有一定的“自适应”能力。
机器学习的主要思路是,用算法来对大量的数据进行解析、从中提取特征并学习(称这个过程为“训练”),然后对真实的世界进行预测和判断。
目前机器学习方法的大分类主要有监督学习、半监督学习、无监督学习、集成学习、强化学习和深度学习。传统的算法包括决策树、聚类、贝叶斯分类等等。
  • 深度学习(DL)是一种实现机器学习的技术。近几年该领域发展迅速,带动机器学习领域向许多不同的新领域发展(无人车、图像识别、自然语言理解等)。当然这也并不意味着深度学习就比其他的学习方式优秀,它只是在特定情况和特定领域下能展现出巨大的优势,并且实现了一定的通用性而已。

CNN

看完了这些概念,我们就进入深度学习领域一窥究竟。首先要说明的是,深度学习是基于人工神经网络的,这是一种由人脑结构启发而来的网络结构,而今天要介绍的CNN(卷积神经网络)正是其中应用最为广泛的一种,目前在计算机视觉、自然语言理解等领域都是首选的训练网络。

首先先说一下什么是人工神经网络,你可以类比人类的神经元,就是许许多多的神经元组成了我们复杂的神经系统。神经网络也是一样,它由许许多多的人工神经元(简单的说就是有一个输入,一个输出的单元)组成,上层的神经元的输出连接到下层神经元的输入,这样多层的连接最终就形成了一个复杂的网络。

你也可以把它抽象地想成一个非常非常复杂的函数,拥有许多许多(数以万计的)参数,我们说训练网络,就是在调整这些参数(当然,怎么调整的人类自己心里也没数,全靠机器自己学习),直到它的输出尽可能地拟合我们想要的结果为之,这也是我们常把深度学习比喻成黑箱的原因之一。

好了,现在我们正式的开始讲解CNN网络,看看神经网络究竟是如何工作的:

卷积

既然是要讲卷积神经网络,我们就必须先知道什么是卷积。先想象一个矩阵,以其中的某一个元素为中心,然后和它相邻的所有元素进行某种运算(比如求和),然后移动(滑动)这个中心,直到把整个矩阵都覆盖一遍,我们得到的最终结果的和就是一个卷积。

这么干说真是太抽象了,不如直接看这个图来的实在:

这个矩阵很可能就代表了一个灰度图像,每个元素就是一个像素,数字代表着这个像素的灰度值(一般在0~255)。这个滑动的窗口又被叫做内核或是特征检测器,大小可以变化。当窗口在整个矩阵里滑动了一遍之后所得到的所有结果的和,就是我们对这个矩阵所求的卷积。

卷积的应用

  1. 计算每个像素和其相邻像素的平均值可以模糊化一张图片。
  2. 计算像素和其相邻元素的差值可以进行边缘检测。
因为边缘往往是灰度(或者说RGB)变化最明显的地方,所以相邻元素间差值比较大的地方往往就是边缘。如下图
![](http://of1deuret.bkt.clouddn.com/18-1-11/12025490.jpg)

卷积神经网络

卷积神经网络基本上就是几层使用非线性激活函数(比如ReLU和tanh)的卷积来得到结果的神经网络。

在传统的反馈型神经网络中,我们把每个神经元的输入分别连接到另外的神经元的输出上,这个被称为全连接层。但在CNN中,我们把输入层的卷积当做输出,这就意味着,我们是把许多个神经元的输出(一个矩阵的卷积)连接到了一个神经元的输入上。

每一层的筛都不同,往往他们把成百上千个元素结合计算得到一个结果,浓缩给下一层。

需要留意的是,CNN中,不同的卷积层之间并不是直接相连的,他们中间夹着一个称为池化层(Pooling)的特殊的处理层,用于进行结果的规范化(后面详解)。

在训练的过程当中,CNN会自动地根据你的目的来学习每一层筛的作用(计算方法)。举个例子,在一个图像识别的CNN中,第一层可能进行边缘检测,然后在第二层用这些边缘作为数据来推断简单的形状,最后在更高的层里,用这些形状来推断更高级的特性(比如人脸检测),最后一层则是使用这些高级特性来进行分类的分类器。

下面是一个典型的CNN网络的结构:

在计算过程中有两点需要特别重视的:定位不变性复合性。我们假设要检测一张图片里有没有大象,因为你的窗口总是要滑动过整个图像,所以并不必在意大象会出现在图像的哪个位置,在实际训练中,池化层可以保持数据的一致性,让你不用担心转换、旋转或是缩放这样的操作影响数据本身。而每个筛都提供了一种使用本层数据表示高层数据的方法(映射),这就提供了复合性(多个数据复合成一个数据)。这就是CNN在计算机视觉中表现优异的原因:这和你本能认知图像的过程是一样的,从点构建轮廓,再从轮廓抽取形状,最后从形状中提取更多复杂的对象。

NLP与CNN

我们说了很多CNN在计算机视觉方面的应用(这也是它最擅长的领域),现在我们看看NLP又是如何与CNN挂钩的。

在语言理解这个领域,矩阵的单元不再是图像的像素,而是以矩阵形式表示的句子和文档。矩阵的每一行相当于一个符号(文法中的token),通常会是一个单词,但也可以是一个字母。

这样,每一行就是一个表示单词的向量。一般这个向量可以用或者的方式转换得到,当然也可能是将单词索引到词汇表里的实数向量。一个有10个单词的句子,我们使用一个100维的向量来表示每个词的话,就会得到一个10*100的矩阵,这就是我们在NLP里的“图像”了。

有关如何用向量表示单词,可以参考此文章

在视觉处理中,我们的筛往往是在一张图片上四处滑动,但是NLP中,我们用的筛一般和矩阵同宽,因此它只需要上下滑动,至于高度,通常为2-5个词。综合上述,一个用于NLP的CNN网络可能像下面这样:

跟视觉处理中很不一样的是,你并不会在意单词会在句子的什么地方出现,而相邻的单词之间也不一定有语义的联系(这跟图片是不一样的)。在很多语言中,一个短语的组合可以被拆分成很多新的词,复合并不明显。显然,单词是以某种方式组合的,比如一个形容词修饰名词,但这在更高的层次里到底“意味”着什么并不像在视觉处理上那么显而易见。

根据上面分析的,看起来CNN并不能很好的去适应NLP的任务,相比之下递归神经网络(RNN)要更加直观一点,它和我们处理语言的过程(至少是我们所认为的)很相似:从左到右地读取一个序列。不过这并不意味着CNN就没有用了,有些模型还是能够起到一定作用的。CNN适用于具有局部相关性的样本,语言是满足这一条件的。

使用CNN的一个很大的目的是因为它很快,在GPU的加速下,卷积的计算更加迅速。比起n元语法,CNN在表达上也更有效一些。当词汇量变的巨大时,计算超过三元的语法的代价就会变得昂贵起来。卷积能够很好的自动学习表达,而不用获取整个词汇表。