搜档网
当前位置:搜档网 › AI、深度学习与计算机视觉

AI、深度学习与计算机视觉

AI、深度学习与计算机视觉
AI、深度学习与计算机视觉

AI、深度学习与计算机视觉

筑博智慧建筑研究中心

1.前言

人工智能的兴起、人工智能技术的突破给人类社会带来了深刻的变革,人工智能是犹如内燃机一样的“使能”技术,具有赋能其他技术的潜力。中国拥有世界最大的人口数量、市场容量、多维度的数据资源,人工智能的发展潜力得天独厚。然而,由于人工智能的原理涉及认知科学、数学、神经生理学、心理学、计算机科学、信息论、控制论等众多学科,其相关论文论著等又涉及大量的专业术语、数学公式、程序代码和外语,往往让人视为畏途、高不可及。本文旨在为有志于了解与学习人工智能的读者搭建一条栈道,助力登攀。计算机视觉是人工智能最重要和最成功的领域,因此本文以此为切入点。

2.如何训练机器去学习

2.1电脑与人脑

传统上如果我们想让计算机工作,我们给它一串指令,然后它遵照这个指令一步步执行下去。有因有果,非常明确。但这样的方式在机器学习中行不通。机器学习接受的并不是你输入的指令,相反,它接受你输入的数据!也就是说,机器学习是一种让计算机利用数据而不是指令来进行各种工作的方法。这听起来非常不可思议,但结果上却是可行的。相关而不是因果的概念将是支撑机器学习能够工作的核心概念。

机器学习与人类思考的经验过程是类似的,不过它能考虑更多的情况,执行更加复杂的计算。事实上,机器学习的一个主要目的就是把人类思考归纳经验的过程转化为计算机通过对数据的处理计算得出模型的过程。经过计算机得出的模型能够以近似于人的方式解决很多灵活复杂的问题。

首先,我们需要在计算机中存储历史的数据。接着,我们将这些数据通过机器学习算法进行处理,这个过程在机器学习中叫做“训练”,处理的结果可以被我们用来对新的数据进行预测,这个结果一般称之为“模型”。对新数据的预测过程在机器学习中叫做“预测”。“训练”与“预测”是机器学习的两个过程,“模型”则是过程的中间输出结果,“训练”产生“模型”,“模型”指导“预测”。

人类在成长、生活过程中积累了很多的历史与经验。人类定期地对这些经验进行“归纳”,获得了生活的“规律”。当人类遇到未知的问题或者需要对未来进行“推测”的时候,人类使用这些“规律”,对未知问题与未来进行“推测”,从而指导自己的生活和工作。

机器学习中的“训练”与“预测”过程可以对应到人类的“归纳”和“推测”过程。通过这样的对应,我们可以发现,机器学习的思想并不复杂,仅仅是对人类在生活中学习成长的一个模拟。由于机器学习不是基于编程形成的结果,因此它的处理过程不是因果的逻辑,而是通过归纳思想得出的相关性结论。

图1机器学习与人类学习比较

2.2神经元

我们模仿人类大脑,把人工神经网络看成是一种运算模型,由大量的节点(或称神经元)相互连接构成。一个生物的神经元通常具有多个树突,主要用来接受传入信息;而轴突只有一条,轴突尾端有许多轴突末梢可以向其他多个神经元传递信

息。轴突末梢与其他神经元的树突产生连接,从而传递信号。该连接紧密程度是动态可变的,可称之为权重。近似地,我们可以用著名的“艾宾浩斯遗忘曲线”去理解,轴突与树突连接因信号传递而被激活,轴突与树突之间信号传递越频密则权重逐渐提高,反之则逐渐降低。

人工神经网络的每个节点(神经元)代表一种特定的输出函数。每两个节点间的连接都代表一个通过该连接信号的加权值,称之为权重,这相当于人工神经网络的记忆。网络的输出根据网络的连接方式、权重值和激励函数的不同而不同。

神经元是人工神经网络的基本单元,是一个包含输入、输出与计算功能的模型。输入可以类比为神经元的树突,输出可以类比为神经元的轴突,而计算则可以类比为细胞核。图2所示的是一个典型的神经元模型:包含3个输入,1个输出,以及2个计算功能。注意中间的箭头线,这些线称为“连接”,每条连接线上都有一个“权重值”。

图2简单神经元

如图3所示,一个神经网络的训练算法就是让权重的值调整到最佳,以使得整个网络的预测(或者分类)效果最好。

图3训练网络

激活函数

我们知道在未加激活函数之前,基本神经元的输出值是各输入值的线性函数,其功能可以近似的理解为对输入数据的简单线性分类(在二维平面中体现为由一条分割线将二类数据分隔开;多维空间中体现为采用超平面(体)将不同类型的数据分隔)。然而,现实中的数据往往是非线性可分的。激活函数的引入使得简单神经元整体具备非线性特征,从而具备对输入数据的非线性处理能力。常用的激活函数包括Sigmoid函数和线性整流函数ReLU(RectifiedLinearUnit),近几年使用Sigmoid函数的人已经越来越少,主要原因是sigmoid函数会造成梯度消失。

ReLU是目前应用较为广泛的激活函数,其优点为在随机梯度下降的训练中收敛很快,在输入为正数的时候,不存在梯度饱和问题,ReLU函数只有线性关系,不管是前向传播还是反向传播都比Sigmoid函数要快很多。

图4Relu函数的图像和求导后的图像

ReLU函数其实是分段线性函数,其表达式非常简单,就是y=max(x,0)。把所有的负值都变为0,而正值不变,这种操作被成为单侧抑制。(也就是说:在输入是负值的情况下,它会输出0,那么神经元就不会被激活。这意味着同一时间只有部分神经元会被激活,从而使得网络很稀疏,进而对计算来说是非常有效率的。)正因为有了这单侧抑制,才使得神经网络中的神经元也具有了稀疏激活性。

2.3人工神经网络

介绍完神经元我们再来看神经网络。

图5人工神经网络的构成

上图中最左边的原始输入信息称之为输入层,最右边的神经元称之为输出层(上图中输出层只有一个神经元),中间的叫隐藏层。

输入层(Input layer),众多神经元(Neuron)接受大量非线形输入讯息。输入的讯息称为输入向量。

输出层(Output layer),讯息在神经元链接中传输、分析、权衡,形成输出结果。输出的讯息称为输出向量。

隐藏层(Hidden layer),简称“隐层”,是输入层和输出层之间众多神经元和链接组成的各个层面。如果有多个隐藏层,则意味着多个激活函数。

在神经网络中,每个处理单元事实上就是一个逻辑回归模型(线性回归+sigmoid激活函数=逻辑回归),逻辑回归模型接收上层的输入,把模型的预测结果作为输出传输到下一个层次。通过这样的过程,神经网络可以完成非常复杂的非线性分类。事实上,神经网络的本质就是通过参数与激活函数来拟合特征与目标之间的真实函数关系。

那么对深度神经网络而言,增加更多的层次有什么好处?答案是更深入的表示特征,以及更强的函数模拟能力。

更深入的表示特征可以这样理解,随着网络的层数增加,每一层对于前一层次的抽象表示更深入。在神经网络中,每一层神经元学习到的是前一层神经元值的更抽象的表示。例如,在进行图像处理的深度神经网络中,第一个隐藏层学习到的是“边缘”的特征,第二个隐藏层学习到的是由“边缘”组成的“形状”的特征,第三个隐藏层学习到的是由“形状”组成的“图案”的特征,最后的隐藏层学习到的是由“图案”组成的“目标”的特征。通过抽取更抽象的特征来对事物进行区分,从而获得更好的区分与分类能力。

更强的函数模拟能力是由于随着层数的增加,整个网络的参数就越多。而神经网络其实本质就是模拟特征与目标之间的真实关系函数的方法,更多的参数意味着其模拟的函数可以更加的复杂,可以有更多的容量(capcity)去拟合真正的关系。然而,随着神经网络层数的增加,参数也增加了,在表示能力大幅度增强的同时,很容易出现过拟合现象,这点我们将在后续探讨。

2.4模型训练

构建神经网络之后,还需教导它如何工作。机器学习模型训练的目的,就是使得参数尽可能的与真实的模型逼近。具体做法是这样的,首先给所有参数赋上随机值,我们使用这些随机生成的参数值,来预测训练数据中的样本。

一般来说解决这个优化问题使用的是梯度下降算法。梯度下降算法每次计算参数在当前的梯度,然后让参数向着梯度的反方向前进一段距离,不断重复,直到梯度接近零时截止。一般这个时候,所有的参数恰好达到使损失函数达到一个最低值的状态。

梯度下降法的基本思想可以类比为一个下山的过程。假设这样一个场景:一个人被困在山上,需要从山上下来(找到山的最低点,也就是山谷)。但此时山上的浓雾很大,导致可视度很低;因此,下山的路径就无法确定,必须利用自己周围的信息一步一步地找到下山的路。这个时候,便可利用梯度下降算法来帮助自己下山。怎么做呢,首先以他当前的所处的位置为基准,寻找这个位置最陡峭的地方,然后朝着下降方向走一步,然后又继续以当前位置为基准,再找最陡峭的地方,再走直到最后到达最低处;

图6.梯度下降法示意(二维与三维)

在神经网络模型中,由于结构复杂,每次计算梯度的代价很大,因此还需要使用反向传播算法。反向传播算法是利用了神经网络的结构进行的计算。不一次计算所有参数的梯度,而是从后往前。首先计算输出层的梯度,然后是第二个参数矩阵的梯度,接着是中间层的梯度,再然后是第一个参数矩阵的梯度,最后是输入层的梯度。计算结束以后,所要的两个参数矩阵的梯度就都有了。

优化问题只是训练中的一个部分。机器学习问题之所以称为学习问题,而不是优化问题,就是因为它不仅要求数据在训练集上求得一个较小的误差,在测试集上也要表现好。因为模型最终是要部署到真实数据场景。提升模型在测试集上的预测效果的主题叫做泛化(generalization),相关方法被称作正则化(regularization)。神经网络中常用的泛化技术有数据集扩增、dropout(节点失活)、正则化(Regularization)包括L1、L2正则化(L2regularization也叫权重衰减)等。

一般来说更多神经元的神经网络可以表达更复杂的函数。然而这既是优势也是不足,优势是可以分类更复杂的数据,不足是可能会造成对训练数据的过拟合。过拟合(Overfitting)是指网络对数据中的噪声有很强的拟合能力,过度重视细节和特例。过拟合的后果就是使得训练模型丧失了泛化能力(对实际数据的适应性),因而丧失了正确处理能力。

在图像处理领域,数据集扩增常用方法包括图像旋转、缩放、平移、镜像、亮度变化等;正则化会给所有参数乘以一个系数,共同计算损失函数,为了避免损失函数过高,模型参数的数量、数值都会缩小;节点失活(Dropout)(见图7)指的是在训练过程中,每次更新参数时将会随机断开一定百分比的输入神经元。而这里使用Dropout随机断开连接,就等于是削减了参数的数量,这种方式可以用于防止过拟合。

图7节点失活示意

2.5迁移学习

迁移学习指的是利用预训练模型(神经网络的权重和参数都已经被其他人利用更大规模的数据集训练好了)并用自己的数据集将模型「微调」的过程。在这种思路中,预训练模型扮演着特征提取器的角色。你将移除网络的最后一层并用你自有的分类器置换(取决于你的问题空间)。然后冻结其他所有层的权重并正常训练该网络(冻结这些层意味着在梯度下降/最优化过程中保持权值不变)。

3.卷积神经网络与计算机视觉

3.1计算机视觉

计算机视觉(computer vision),顾名思义,是分析、研究让计算机智能化的达到类似人类的双眼“看”的一门研究科学。即对于客观存在的三维立体化的世界的理解以及识别依靠计算机去实现。确切地说,计算机视觉技术就是利用了摄像机以及电脑替代人眼使得计算机拥有人类的双眼所具有的分割、分类、识别、跟踪、判别决策等功能。总之,计算机视觉系统就是创建了能够在2D的平面图像或者3D 的三维立体图像的数据中,以获取所需要的“信息”的一个完整的人工智能系统。

当计算机看到一张图像(输入一张图像)时,它看的是一大堆像素值。根据图片的分辨率和尺寸,它将看到一个nxnx3的数组。假设我们有一张JPG格式的480x480大小的彩色图片,那么它对应的数组就有480x480x3个元素(3指代的是RGB值,既红、绿、蓝三原色)。其中每个数字的值从0到255不等,其描述了对应那一点的像素灰度。为了讲清楚这一点,当我们人类对图像进行分类时,这些数字毫无用处,可它们却是计算机可获得的唯一输入。其中的思想是:当你提供给计算机这一数组后,它将输出描述该图像属于某一特定分类的概率的数字(比如:80%是猫、15%是狗、5%是鸟)。

我们想要计算机能够区分开所有提供给它的图片,以及搞清楚猫猫狗狗各自的特有特征。这也是我们人类的大脑中不自觉进行着的过程。当我们看到一幅狗的图

片时,如果有诸如牙齿、爪子、舌头或四条腿之类的明显特征,我们便能将它归类为狗。同样地,计算机也可以通过寻找诸如边缘和曲线之类的低级特点来分类图片,继而通过一系列卷积层级建构出更为抽象的概念,逐层逐步地由“边缘”归纳出“形状”的特征,再由“形状”逐步地归纳出“图案”的特征,最后学习到的是由“图案”组成的“目标”的特征。这是CNN(卷积神经网络)工作方式的大体概述。

图8:直观理解CNN机器视觉——由抽象到具象

3.2卷积神经网络概述

卷积神经网络CNN是从视觉皮层的生物学上获得的启发。视觉皮层有小部分细胞对特定部分的视觉区域敏感,瑞典生物学家维瑟尔(Wiese)、美国生物学家休伯尔(Hubel)于1962年进行的一项动物试验详细说明了这一观点,他们验证出大脑中的一些个体神经细胞只有在特定方向的边缘存在时才能做出反应(即放电)。例如,一些神经元只对垂直边缘兴奋,另一些对水平或对角边缘兴奋。这种一个系统中的特定组件完成特定任务的观点(视觉皮层的神经元细胞寻找特定特征)在机器中同样适用,这就是CNN的基础。

卷积神经网络是一种带有卷积结构的深度神经网络,卷积结构可以减少深层网络占用的内存量,其三个关键的要素,局部感受野、权值共享、降采样(pooling)

有效地减少了网络的参数个数,缓解了模型的过拟合问题。它在二维图像的处理过程中有很大的优势,如网络能够自行抽取图像的特征包括颜色、纹理、形状及图像的拓扑结构,在处理二维图像的问题上,特别是识别位移、缩放及其他形式扭曲不变性的应用上具有良好的鲁棒性和运算效率等。

卷积神经网络结构通常包括:卷积层,降采样层,全连接层。卷积神经网络的低隐层是由卷积层和最大池化降采样层交替组成,高层是全连接层,对应传统多层感知器(神经网络)的隐含层和逻辑回归分类器。

图9:卷积神经网络的典型结构

输入图像由滤波器(感受野)进行卷积之后,提取该局部特征,生成多个特征图。紧跟一个降采样层进行降维处理,降维后的特征图作为后续卷积层的输入图像,如此循环若干次后接入全连接层与逻辑回归分类器。

3.3卷积层及卷积运算

理解卷积神经网络的关键是搞懂卷积层,卷积的本质就是加权叠加。

3.3.1一维卷积

图10:一维卷积

图中有3个常数数列,我们将其分别命名为M、N、P向量。图中的M向量作为卷积核,N向量作为输入,P向量作为输出,P向量由M向量与N向量进行卷积运算生成。也即是在N向量上取与M向量(卷积核)等长的一段子向量与M向量作内积(对应数字两两相乘再求和),生成P向量的某个单元值。如图所示,

P[2]=N[0]*M[0]+...+N[4]*M[4]=3+8+15+16+15=57。等长子向量从左向右依次滑动,逐次与M向量作内积求出P向量的其余的单元值。

因为实际图像是二维的,所以我们用到的一般是下面的二维卷积。

3.3.2二维卷积

图11二维卷积运算过程(1)

首先我们需要了解卷积层的工作机制。解释卷积层的最佳方法是想象有一束手电筒光正从图像的左上角扫过。如上图所示,输入内容为一个5x5的像素值数组,假设手电筒光可以覆盖3x3的区域,想象一下手电筒光从左到右逐次扫射照过输入图像的所有区域。在机器学习术语中,这束手电筒光被叫做过滤器(filter,有时候也被称为神经元(neuron)或核(kernel)),被照过的区域被称为感受野(receptive field)。过滤器同样也是一个数组(其中的数字被称作权重或参数,是神经网络需要训练和学习的要素)。现在,以过滤器所处在的第一个位置为例,即图像的左上角。当过滤器在图像上滑动(卷积运算)时,过滤器中的数组(筛选值)会与图像中的原始像素值两两相乘(又称为计算点积)。这些乘积被加在一起得到了一个数字4。我们在输入图像数组的每一感受野位置重复该过程(下一步将是将过滤器右移1单元,接着再右移1单元,以此类推。)输入内容上的每一特定位置都会产生一个数字。过滤器滑过所有位置后将得到一个3x3的数组,我们称之为激活映射(activation map)或特征图(feature map)。

图12:二维卷积运算过程(2)

图13:二维卷积运算过程(3)

以上是卷积计算的原理,是简化版,目的在于便于理解。实际工程应用当中,往往采用多通道多个卷积核的卷积计算。

不同的卷积核filter会得到不同的输出数据,比如颜色深浅、轮廓。相当于如果想提取图像的不同特征,则用不同的卷积核filter,提取想要的关于图像的特定信息:颜色深浅或轮廓。

图14:不同卷积核提取同一图像的不同特征

3.3.3多通道多个卷积核的卷积计算

下面举例的是3通道(RGB),2个卷积核的计算过程。

图15:3通道2个卷积核的卷积计算示例(1)上图中,左边是输入(7*7*3中,7*7代表图像的像素/长宽,3代表R、G、B 三个颜色通道)。中间部分是两个不同的滤波器Filter w0、Filter w1。

最右边则是两个不同的输出(即2个特征图,该隐藏层深度为2,提取2类特征),随着左边数据窗口的平移滑动,卷积核Filter w0/Filter w1对不同的局部数据进行卷积计算。其中每个卷积核有3个3*3的矩阵分别与三个通道的扫描窗口做卷积,然后将这3个卷积结果求和作为输出。

a.深度depth:神经元个数,决定输出的depth厚度。同时代表滤波器个数,本例中深度值depth=2。

b.步长stride:即扫描框步进距离,决定滑动多少步可以到边缘,本例中步长值stride=2。

c.填充值zero-padding:在外围边缘补充若干圈0,方便从初始位置以步长为单位可以刚好滑到末尾位置,通俗地讲就是为了总长能被步长整除。本例中填充值zero-padding=1。

我们可以看到:

数据窗口滑动,导致输入在变化,但中间滤波器Filter w0的权重(即每个神经元连接数据窗口的权重)是固定不变的,这个权重不变即所谓的CNN中的参数(权重)共享机制。

打个比方,某人环游全世界,所看到的信息在变,但采集信息的双眼不变。采用多个滤波器是为了获取图像内在的不同特征,好比不同人的双眼看同一个局部信息所获得的感受不同,即一千个读者有一千个哈姆雷特,所以不同的滤波器就像不同的双眼,不同的人有着不同的反馈结果。

类似神经元的矩阵算式wx+b,w对应滤波器Filter w0,x对应不同的数据窗口,b对应偏置Bias b0,相当于滤波器Filter w0与一个个数据窗口相乘(内积)再求和后,最后加上偏置值Bias b0得到输出结果1然后滤波器Filter w0固定不变,数据窗口向右移动2步,继续做内积计算,得到0的输出结果。Filter w0卷积过程完成后,换做另外一个不同的滤波器Filter w1、采用不同的偏置值Bias b1,再跟图中左侧输入图像的数据滑动窗口做卷积,可得到另外一个不同的输出。

图16:3通道2个卷积核的卷积计算示例(2)

3.4.下采样层

下采样层/子采样层(Subsample Layer)又叫池化层(Pooling Layer),缩减输入数据的规模。实现子采样的方法有很多种,最常见的是最大值合并、平均值合并及随机合并。

输入图像数组通过与一个卷积核做卷积操作,每次移动步长为1,则相邻的结果会非常接近,正是由于结果接近,有很多信息是冗余的。因此,最大池化(Max Pooling)就是一种减少模型冗余程度的方法。以2×2MaxPooling为例。图中如果输入图像数组片是一个4×4的输入矩阵,则这个4×4的矩阵会被分割成由两行、两列组成的2×2子矩阵,然后每个2×2子矩阵取一个最大值作为代表,由此得到一个两行、两列的结果,如下图所示。

图17最大池化降采样示意

可以形象地理解为对输入图像等比例缩小而不失真。

平均池化和最大池化唯一的不同是,它计算的是区域内的平均值而最大池化计算的是最大值。在日常应用使用最多的还是最大池化。

3.5全连接层

在检测高级特征之后,网络最后的完全连接层就更是锦上添花了。简单地说,这一层处理输入内容(该输入可能是卷积层、ReLU层或是池化层的输出)后会输出一个N维向量,N是该程序必须选择的分类数量。例如,如果你想得到一个数字分类程序,如果有10个数字,N就等于10。这个N维向量中的每一数字都代表某一特定类别的概率。例如,如果某一数字分类程序(确定这个图形是0~9之间的某个数字)的结果矢量是[0.10.10.750000000.05],则代表该图片有10%的概率是1、10%的概率是2、75%的概率是3、还有5%的概率是9。大体上来说,完全连接层将观察高级特征和哪一分类最为吻合及拥有怎样的特定权重,因此当计算出权重与先前层之间的点积后,你将得到不同分类的正确概率。

比较卷积层和全连接层,卷积层在输出特征图维度实现了权值共享,这是降低参数量的重要举措,同时,卷积层局部连接特性(相比全连接)也大幅减少了参数量。因此卷积层参数量占比小,但计算量占比大,而全连接层是参数量占比大,计

算量占比小。所以在进行计算加速优化时,重点放在卷积层;在进行参数优化、权值剪裁时,重点放在全连接层。

3.6小结

卷积神经网络CNN的输入层读入经过规则化(统一大小)的图像,每一层的每个神经元将前一层的一组小的局部近邻的单元作为输入,也就是局部感受野和权值共享,神经元抽取一些基本的视觉特征,比如边缘、角点等,这些特征之后会被更高层的神经元所使用。CNN通过卷积操作获得特征图,每个位置,来自不同特征图的单元得到各自不同类型的特征。一个卷积层中通常包含多个具有不同权值向量的特征图,使得能够保留图像更丰富的特征。卷积层后边会连接池化层进行降采样操作,一方面可以降低图像的分辨率,减少参数量,另一方面可以获得平移和形变的鲁棒性。卷积层和池化层的交替分布,使得特征图的数目逐步增多,而且分辨率逐渐降低,是一个双金字塔结构。高层是全连接层对应传统多层感知器的隐含层和逻辑回归分类器,第一个全连接层的输入是由卷积层和子采样层进行特征提取得到的特征图像,最后一层输出层是一个分类器,可以采用逻辑回归、Softmax回归或者是支持向量机对输入图像进行分类。

相关主题