深度学习入门与自然语言的理解
扫描二维码
随时随地手机看文章
深度学习是机器学习领域的一个分支,也可以说是该领域近些年来的最大突破之一。
在了解深度学习之前,我们应当回顾一下历史,同时也搞明白当前最火爆的几个概念到底有着什么样的关系。
AI,ML,DL这些年来随着科技的发展和国家政策的推进,人工智能、机器学习还有深度学习这几个词就不断充斥于耳,但是这些概念却常常被我们所混淆。
简单的来讲,我们可以认为 AI 》 ML 》 DL,也就是说他们之间是包含关系:
人工智能(AI)是计算机科学的一个重要研究领域,拥有许多的分支,例如专家系统、进化计算、计算机视觉等等。重点在于,如何使用计算机构建复杂的、能够拥有与人类智慧相同本质的东西。
机器学习(ML)是实现人工智能的一种方法,或者说一种思路。ML之所以能够在人工智能领域鹤立鸡群,主要是因为它和普通的弱人工智能实现不同,可以使得机器拥有一定的“自适应”能力。
机器学习的主要思路是,用算法来对大量的数据进行解析、从中提取特征并学习(称这个过程为“训练”),然后对真实的世界进行预测和判断。
目前机器学习方法的大分类主要有监督学习、半监督学习、无监督学习、集成学习、强化学习和深度学习。传统的算法包括决策树、聚类、贝叶斯分类等等。
深度学习(DL)是一种实现机器学习的技术。近几年该领域发展迅速,带动机器学习领域向许多不同的新领域发展(无人车、图像识别、自然语言理解等)。当然这也并不意味着深度学习就比其他的学习方式优秀,它只是在特定情况和特定领域下能展现出巨大的优势,并且实现了一定的通用性而已。
CNN看完了这些概念,我们就进入深度学习领域一窥究竟。首先要说明的是,深度学习是基于人工神经网络的,这是一种由人脑结构启发而来的网络结构,而今天要介绍的CNN(卷积神经网络)正是其中应用最为广泛的一种,目前在计算机视觉、自然语言理解等领域都是首选的训练网络。
首先先说一下什么是人工神经网络,你可以类比人类的神经元,就是许许多多的神经元组成了我们复杂的神经系统。神经网络也是一样,它由许许多多的人工神经元(简单的说就是有一个输入,一个输出的单元)组成,上层的神经元的输出连接到下层神经元的输入,这样多层的连接最终就形成了一个复杂的网络。
你也可以把它抽象地想成一个非常非常复杂的函数,拥有许多许多(数以万计的)参数,我们说训练网络,就是在调整这些参数(当然,怎么调整的人类自己心里也没数,全靠机器自己学习),直到它的输出尽可能地拟合我们想要的结果为之,这也是我们常把深度学习比喻成黑箱的原因之一。
好了,现在我们正式的开始讲解CNN网络,看看神经网络究竟是如何工作的:
卷积既然是要讲卷积神经网络,我们就必须先知道什么是卷积。先想象一个矩阵,以其中的某一个元素为中心,然后和它相邻的所有元素进行某种运算(比如求和),然后移动(滑动)这个中心,直到把整个矩阵都覆盖一遍,我们得到的最终结果的和就是一个卷积。
这么干说真是太抽象了,不如直接看这个图来的实在:
这个矩阵很可能就代表了一个灰度图像,每个元素就是一个像素,数字代表着这个像素的灰度值(一般在0~255)。这个滑动的窗口又被叫做内核,筛或是特征检测器,大小可以变化。当窗口在整个矩阵里滑动了一遍之后所得到的所有结果的和,就是我们对这个矩阵所求的卷积。
卷积的应用计算每个像素和其相邻像素的平均值可以模糊化一张图片。
计算像素和其相邻元素的差值可以进行边缘检测。
因为边缘往往是灰度(或者说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在表达上也更有效一些。当词汇量变的巨大时,计算超过三元的语法的代价就会变得昂贵起来。卷积能够很好的自动学习表达,而不用获取整个词汇表。