神经网络&深度学习基础知识图像的特征计算机图像是由一定数量的点阵像素构成的。如上所示,我们看到的是一辆车,但实际上计算机理解的是一个由各像素点的灰度值组成的矩阵,它并不能直接理解“这是一辆车”。我们需要将“这是一辆车”这个事实用完全逻辑化的语言描述出来,让计算机建立一个函数,这个矩阵自变量x所对应的结果因变量y就是“车”。难度可想而知。我们先看一个简单的例子。一个数字9,我们如何描述它的形状?现在有这么一种描述方法:这个数字的上半部分是一个圆,下半部分是靠右的一撇。用数学语言表达就是,上半部分能够以方程x12+y12=r12(r10)拟合,下半部分能以x22+y22=r22(x20,y20,r20)拟合,那么就能说明这个图形极有可能是数字9。特征:用来描述一个对象具体表现形式的逻辑语言。如前页所述,“上半部分是圆,下半部分是靠右的一撇”就是数字9的形状特征。特征是构成一个对象的必要但不充分条件,因为一个对象是由无数个特征组成的,在有限数量的特征里,我们永远只能预估该对象,而不能100%确定该对象究竟是什么。经典的图像特征之——Haar特征思考:我们一眼就能看出来这幅图像上有一栋房子。但任何一幅图像都是由一定数量的像素点组成的,我们是怎么从这些单纯的像素点里发现了房子的呢?这个问题还可以换一种问法:我们怎么知道一幅图像中是有前景对象的,对于一张纯色画布,我们为什么无法发现任何对象?这涉及到一个现象:颜色突变。上图所圈出的区域中,都是颜色变化较大的区域。而我们就会自然地认为,这是物体的边缘,而由封闭边缘构成的区域就是物体。不仅是房子这个整体,房子里的门、窗户等元素我们都能发现,而原因自然也是颜色突变。思考:人能看见绝对透明(100%透明)的玻璃吗?我们定义一个形状的时候,本质上就是在定义其产生颜色突变的像素点的大致相对位置。比如圆,在一个直角坐标系的图象上上,存在所有满足(x-a)2+(y-b)2=r2条件的坐标点的某个小邻域内有较大的颜色突变,那么这幅图像上就有一个圆的形状。左上方是一幅色盲测试图,不色盲的朋友都能看到左下角有一个蓝色的圆,而且是一个空心圆。思考:我们该如何用颜色突变的方式定义一辆车?(先不考虑前身后身等复杂情况,假设所有的车都是像左下图这样固定角度)Haar特征:对大量同类的图像样本进行学习,找出这些图像所有的产生了颜色突变的相对坐标位置,将这些同类图片作为正样本,同时给出不属于该类的,远多于同类图片的负样本,让机器对这些样本进行学习,并最终生成一个对象识别模型,用来正确寻找一幅图像中你所需要寻找的元素。因此,Haar特征广义上来说就是图像的形状特征。Haar特征对于邻域的规定有三种:边缘特征、中心特征、对角线特征,其中边缘特征又分横向和纵向。通过计算白色区域像素亮度和与黑色区域像素亮度和之差来反映图像的颜色突变区域,即边缘区域。特别地,对于C模型,需要将黑色区域乘以2作为其像素亮度和。Haar特征实例——人脸检测我们用OpenCV中的一个训练得较好的人脸检测Haar模型,对一张照片进行人脸检测。结果如上。Haar特征的不足之处Haar特征本质上是检测图像中的颜色突变的,所以对图像的形状较为敏感,同时对其他的特征(如颜色等)敏感度较低。而且Haar只适用于刚性运动物体的检测,而不适用于物体精细化的识别。人脸检测和人脸识别难度上完全不是一个数量级的。事实上,任何一种单一图像特征都是不全面的,是不能适应所有场景的。其实,图像本身只是由像素点组成的,图像的特征那是我们人为整理出来的,严格地说它并不属于图像的一部分。那我们能不能从图像的像素点本身来寻找一些算法呢?最基本的决策模型——感知器生活中我们经常要对一些事情做出决策。但不论我们最终选择了什么,都一定是有原因的,而且原因往往不止一个。现在我们来玩一个情景游戏。假如周末公司组织员工外出旅游,你是去还是不去呢?这是一个最简单的感知器,最终结果只有两种,Yes和No。只是,结果虽然简单,但是你会考虑诸多因素,最终决定结果。假设你考虑以下三个因素:A.天气如何;B.可否带伙伴一起去;C.费用、伙食、旅馆等条件是否符合个人预期。假设你是这样想的:和同事一块出去玩,是很难得的一件事,能带伙伴一起去那是锦上添花,不能也没关系;但天气是挺重要的,阴雨绵绵玩得不开心;旅馆嘛,这么多人一起,不会太好,但也不会太差,最重要的是享受。那么这时候,你的决策就和当地天气唯一相关,其他两个因素没有任何影响。感知器的本质就是对各个输入量的加权和进行分析,做出YesorNo的决策的模型。上述你考虑的三个因素可以作为感知器的三个输入量x1,x2,x3,并设积极的结果为1,消极的结果为0。三者都有对应的权重量w1,w2,w3。现计算它们的加权和w1x1+w2x2+w3x3,同时加上一个偏差值b。若其为正(大于0),则最终的回答是Yes,否则(小于或等于0)回答No。如果你的想法如前所述,那么你的感知器模型可以是这样的:w1=6,w2=2,w3=2,b=-5,即判断6x1+2x2+3x2–5的正负。在所有的输入量均只能取0和1的前提下,我们可以很明显地看到,唯独当x1=1时,结果才为正,即决策为Yes,只要x1=0,决策就必然为No。思考:若将b改为-3,其他权重量不变,那么决策会变成什么样?较为复杂的感知器——多层感知器《非诚勿扰》,一个非常流行的电视节目。男嘉宾上台后,在场的女嘉宾首先给男嘉宾打印象分,然后通过前后播放的多个不同的AVR以及各种提问对【自己是否愿意跟男嘉宾走】这个问题给出回答。点评:很多事情的决策,并不是评估多个彼此独立的条件,往往某个条件是和之前的一些条件相关的。比如上面这个案例,第一印象好坏算作感知器的输入量x1,只有当它等于1时,后面的输入量才有意义。但也不是它等于1就一定表示最终的结果是Yes,还需要分析其他的输入量才能得出最终结果。那么,这种经过多层判断,得出最终结果的感知器,就叫多层感知器。如下图所示,是一个双层感知器,第二层的神经元的决策是跟第一层的决策相关的。其实,本质上来讲,多层感知器也同样可以展开成单层感知器,任何一个决策都是可以用标准与或式来表达的。而感知器的本质恰恰就是逻辑电路。那么感知器和逻辑电路两者的区别是什么呢?两个字:学习。感知器可以通过给定的数据,通过一定的算法来学习各个输入量的权重,以及全局偏差值。而这是已经固定成型的逻辑电路所做不到的。多层感知器的存在,也是为了建立一个符合常规思考方式的学习模型而存在的,展开成单层感知器后,学习目的不明显,学习效果会下降。学习是靠要大量样本的积累的。每一个样本都有一定数量的输入量(考察条件)和一个理想输出值(理应如此),不必给出各输入量的权重以及最终偏差值,机器通过不断自我调整寻找这些量,使得尽可能多的样本匹配上其理想输出值。(注:有时候样本之间可能会因为各种原因出现矛盾的理想输出值,所以不能保证所有的样本都匹配)但是这里有一个问题,我们目前的决策是非此即彼的,非常机械化的决策。比如一个数字9,如果下方的那一撇写得不弯,变成了一条直线,那是不是这个数字就不是9了呢?我们是不是应该有一个过渡的过程呢?不再非此即彼——Sigmoid神经元回想一下我们以前的数学考试,一道解答题12分,老师批改时重点看的是过程,就算结果错了,只要过程是对的,也绝不会把12分全扣完。但是,现在的感知器,因为结果是非此即彼的,所以它做的就是把12分全扣完的事,俗话叫【一棍子打死】。这样的话,即使我们知道做错了,我们也并不知道错在哪里,也很难修正错误。Sigmoid神经元解决了这样的问题。每一个输入量不再像感知器那样只能是0或1,而可以是0~1之间的实数。最终输出结果也一样,不再是斩钉截铁的Yes(1)或No(0),同样也可以是Notsure(between0~1)。我们的最终输出结果其实是一种概率,结果为积极的概率,通常被叫做Sigmoid函数。它的表达式和图像如上图所示。Sigmoid神经元其实是由如左上所示的感知器函数图像平滑而来的。函数图像平滑,当任何一个输入量x只变化了一点点Δx时,最终输出量y也只会变化一点点Δy。任何时候,当Δx→0时,一定有Δy→0,而这是感知器做不到的。这使得决策不会产生突变,更有利于学习,如右上图所示。多层Sigmoid神经元——神经网络神经网络的本质就是多层感知器/多层Sigmoid神经元。它同样由输入样本、输入量、对应权重、全局偏差值,以及最终决策构成,只是最左端的输入量成为了输入层、最右侧的最终决策成为了输出层,中间的运算量构成了隐藏层。它并不是那么神秘的事物。建立神经网络自学习模型现在,假设我们已经有一个手写体数字图像数据集,并且都已正确归类为0~9中的一种。那么我们要让机器对这些模型进行学习,并能对一个未知的手写体数字尽可能正确分类。这些样本都是28x28大小的黑白图像,也就是说一个样本有28x28=784个输入量,它们非0(黑)即1(白)。输出量一共有10个,分别代表对应输入量的数字是0~9各自的可能性,各输出量之和必为1。如左图所示,这就是我们建立的手写体数字识别神经网络。它有若干个输入样本,每一个输入样本都有784个输入量,隐藏层有15个隐藏神经元,输出量共10个,表示结果为各自对应数字的概率值。最终我们要找的就是输出值最大的那个输出量所对应的数字,这也就是我们的神经网络所识别出的数字值。成本函数我们知道,评价一个网络最重要的是其识别精度。但这里我们引入一个中间量,叫成本函数。如果我们将每个输入量x的理想决策值(即已经规定好的决策值)设为A,将实际决策值(即通过加权计算出的决策值)设为y,这里y可以表示为x的函数,即y=y(x),那么我们可以定义下面这样一种成本函数。这实际上就是均方差。很明显,实际输出值A越接近理想输出值y(x),成本(均方差)就越低,网络的识别性能就越好。我们学习的过程,其实是通过不断微调各权重量和全局偏差值,以至于这样的权重和偏差值可以使得成本函数尽可能小,精度尽可能高。当然了,成本函数不只是均方差这一种,还有很多函数能担当起成本函数的责任。寻找成本函数的极小值——梯度下降算法回归简单,我们将成本函数C简化为和两个自变量相关的形式:C=f(v1,v2)。实际上这里v1就是权重向量,v2就是全局偏差值,只是做了简化而已。那么,当我们对v1及v2做了微小的变化时,成本函数的全微分ΔC可以这样表示:现在定义一个新的概念“梯度”,它是一个函数针对所有自变量的偏导数所组成的矩阵的转置。它和自变量的变化程度息息相关。我们知道,当C减少时,ΔC及C的梯度必然为负,我们也正是要寻找这样一组权重量和全局偏差值,使得ΔC及C的梯度为负。我们之前所说的“颜色突变”,本意就是那个区域内的像素亮度梯度过大。那么怎么才能让梯度不断下降呢?我们不妨设Δv=−η▽C=−η∥▽C∥2,在这里η是一个很小的正数,通常称为学习率。然后,因为∥▽C∥2恒为正,C就会不断下降。依此类推,对于我们的成本函数,则相应的梯度下降规则就应当是下面这样:梯度下降的改良——随机梯度下降在深度学习的过程中,往往伴随着大量训练样本的出现。梯度下降是针对每一个样本都要做一次相应的运算,会浪费掉相当多的宝贵时间。现在我们每次只随机取部分样本,然后对这一部分样本统一进行梯度下降,然后再去抓取其他的样本。等所有样本都抓取完后,再重头开始。这种方法叫做随机梯度下降。很明显,因为每次都不是所有样本均参与训练,所以最终的梯度下降幅度肯定是没有完整梯度下降算法要强的。但我们只要求网络达到一定的精度就行了,不完全要做到理论上的最好。总结——深度神经网络的学习过程1.准备一个拥有明确标签的数据集,并将其拆分为训练集和测试集两部分。2.根据数据集的性质,建立一个合适的神经网络。特别注意,每个样本的输入量个数=该图像的分辨率×彩色通道数;输出量=标签种类数。3.针对网络设置合适的训练参数,如学习率η、随机梯度的小