大一由于各种原因导致加权成绩是什么意思,也就是学习成绩不太好,现在大二了,十分想考研

- 45分钟理解深度神经网络和深度学习

DL)非常火爆,在各个领域得到了广泛的应用。在笔者所从事的领域,也出现了越来越多的使用深度学习方法来解决各种问题的研究工作。20187月初,笔者首次在第七届上讲授和分享了笔者从数学(函数逼近论)的角度来对基于深度神经网络(Deep Neural Network, DNN)的深度学习的进行理解。之后,不断有学生来向笔者进一步询问和交流有关资料和问题。为了使学生们能够更好、更快理解和使用深度神经网络和深度学习,特撰写此文。

本文的目的是帮助非人工智能领域的学生(主要是计算机图形学领域的学生及笔者的学生)来搞懂深度学习(这里指狭义的深度学习,即基于DNN的深度学习)的基本概念和方法。笔者尝试用通俗的语言,从函数逼近论的角度来阐释深度神经网络的本质。由于笔者的主要研究领域为,而非人工智能领域,因此本文仅仅为笔者从外行的角度对基于DNN的深度学习的粗浅理解,而非人工智能领域对DNN和深度学习的权威解释。因而,笔者对其中的有些内容的理解是有限的,甚至是有误的。如有不当之处,还请读者指正!

在大学的《数学分析》、《微积分》或者《数值分析》中,大家都已学习并熟悉数据拟合问题及求解拟合问题的最小二乘法。

在科学技术的各领域中,我们所研究的事件一般都是有规律(因果关系)的,即自变量集合与应变量集合之间存在的对应关系通常用映射来描述(特殊情况:实数集合到实数集合之间的映射称为函数)。这样能根据映射(函数)规律作出预测并用于实际应用。

有些函数关系可由理论分析推导得出,不仅为进一步的分析研究工作提供理论基础,也可以方便的解决实际工程问题。比如,适合于宏观低速物体的牛顿第二运动定律就是在实际观察和归纳中得出的普适性力学定律。

但是,很多工程问题难以直接推导出变量之间的函数表达式;或者即使能得出表达式,公式也十分复杂,不利于进一步的分析与计算。这时可以通过诸如采样、实验等方法获得若干离散的数据(称为样本数据点),然后根据这些数据,希望能得到这些变量之间的函数关系,这个过程称为数据拟合Data

这里值得提一下,在实际应用中,还有一类问题是输出的结果是离散型的(比如识别图片里是人、猫、狗等标签的一种),此时问题称为分类Classification)。

我们先考虑最简单的情形,即实数到实数的一元函数。假设通过实验获得了个样本点。我们希望求得反映这些样本点规律的一个函数关系,如图1所示。

如果要求函数严格通过每个样本点,即

则求解函数的问题称为插值问题(Interpolation)。

一般地,由于实验数据带有观测误差,因此在大部分情况下,我们只要求函数反映这些样本点的趋势,即函数靠近样本点且误差在某种度量意义下最小,称为逼近问题(Approximation)。若记在某点的误差为

且记误差向量为。逼近问题就是要求向量的某种范数最小。一般采用欧氏范数(范数)作为误差度量的标准(比较容易计算),即求如下极小化问题:

1. 数据拟合。左:输入的样本点;中:插值函数;右:逼近函数。

无论是插值问题还是逼近问题,一个首要的问题就是函数的类型的选择和表示问题,这是《函数逼近论》中的一个比较“纠结”的问题。

函数的表示是函数逼近论中的基本问题。在数学的理论研究和实际应用中经常遇到下类问题:在选定的一类函数中寻找某个函数,使它与已知函数(或观测数据)在一定意义下为最佳近似表示,并求出用近似表示而产生的误差。这就是函数逼近问题称为逼近函数或拟合函数。

在函数逼近问题中,逼近函数的函数类可以有不同的选择;即使函数类选定了,在该类函数中确定的方式仍然是各式各样的;的近似程度(误差)也可以有各种不同的定义。我们分别对这些问题进行理解和讨论。

在实际问题中,首先要确定函数的具体形式。这不单纯是数学问题,还与所研究问题的运动规律及观测数据有关,也与用户的经验有关。一般地,我们在某个较简单的函数类中去寻找我们所需要的函数。这种函数类叫做逼近函数类

逼近函数类可以有多种选择,一般可以在不同的函数空间(比如由一些基函数通过线性组合所张成的函数空间)中进行选择。如下是一些常用的函数类。

次代数多项式,即由次数不大于的幂基的线性组合的多项式函数:

更常用的是由Bernstein基函数来表达的多项式形式(称为Bernstein多项式或Bezier多项式):

阶三角多项式,即由阶数不大于的三角函数基的线性组合的三角函数:

这些是常用的逼近函数类。在逼近论中,还有许多其他形式的逼近函数类,比如由代数多项式的比构成的有理分式集(有理逼近);按照一定条件定义的样条函数集(样条逼近);径向基函数(RBF逼近);由正交函数系的线性组合构成的(维数固定的)函数集等。

在函数逼近论中,如果一组函数成为一组“基”函数,需要满足一些比较好的性质,比如光滑性、线性无关性、权性(所有基函数和为1)、局部支集、完备性、正性、凸性等。其中, “完备性”是指,该组函数的线性组合是否能够以任意的误差和精度来逼近给定的函数(即万能逼近性质)?

对于多项式函数类,我们有以下的“万能逼近定理”:

Weierstrass逼近定理)】上的任意连续函数,及任意给定的,必存在次代数多项式,使得

Weierstrass逼近定理表明,只要次数足够高,次多项式就能以任何精度逼近给定的函数。具体的构造方法有Bernstein多项式或Chebyshev多项式等,这里不详细展开。

类似地,由Fourier分析理论(或Weierstrass第二逼近定理),只要阶数足够高,阶三角函数就能以任何精度逼近给定的周期函数。这些理论表明,多项式函数类和三角函数类在函数空间是“稠密”的,这就保障了用这些函数类来作为逼近函数是“合理”的。

在一个逼近问题中选择什么样的函数类作逼近函数类,这要取决于被逼近函数本身的特点,也和逼近问题的条件、要求等因素有关。

在实际应用中,这里其实存在着两个非常“纠结”的问题。

第一,选择什么样的逼近函数类?一般地,需要用户对被逼近对象或样本数据有一些“先验知识”来决定选择具体的逼近函数类。比如,如果被逼近的函数具有周期性,将三角函数作为逼近函数是个合理的选择;如果被逼近的函数具有奇点,将有理函数作为逼近函数更为合理,等等。

第二,即使确定了逼近函数类,选择多高的次数或阶数?比如,如果选择了多项式函数类,根据Lagrange插值定理,一定能找到一个次多项式来插值给定的个样本点。但如果较大,则这样得到的高次多项式很容易造成“过拟合”(Overfitting)。而如果选择的过小,则得到的多项式容易造成“欠拟合”(Underfitting)。如图2所示。过拟合或欠拟合函数在实际应用中是没有用的,因为它们的预测能力非常差!

2. 用不同次数的多项式拟合样本点(蓝色点)。

左:欠拟合;中:合适的拟合;右:过拟合。

这里有个概念需要提及一下。一个逼近函数“表达能力”体现在该函数的未知参数(即公式(2.1)-(2.3)中的系数)与样本点个数的差,也称为“自由度”。如果逼近函数的未知参数越多,则表达能力越强。然而,在实际的拟合问题中,逼近函数的拟合能力并非越强越好。因为如果只关注样本点处的拟合误差的话,非常强的表达能力会使得样本点之外的函数值远远偏离期望的目标,反而降低拟合函数的预测性能,产生过拟合,如图2

人们发展出各种方法来减缓(不能完全避免)过拟合。比如,剔除样本点中的噪声(数据去噪)、增加样本点数据量(数据增广)、简化预测模型、获取额外数据进行交叉验证、或对目标函数进行适当的正则化等。在此不详细叙述。

在实际应用中,如何选择拟合函数的数学模型(合适的逼近函数类及其阶数),并不是一开始就能选好,往往须通过分析确定若干模型后,再经过实际计算、比较和调整才能选到较好的模型。需要不断的试验和调试(称为“调参”过程),是个需要丰富经验的“技术活”。

假设通过分析我们已经确定了逼近函数类及其次数。记基函数(一般线性无关)为。记为这些基函数所张成的线性空间(函数空间)。则逼近函数可记为

关于最小二乘法的一般提法是:对给定的一组样本点数据,要求在函数类中找一个函数,使误差的模的平方,即式(1.3),达到最小。

对于分析极小化误差(1.3),可得关于系数向量的法方程

由于法方程是一个线性方程组,因此基于最小二乘法的函数求解也称为线性回归。

另外,我们可在误差项中加个权,表示不同点处的数据比重不同,此时称为加权最小二乘方法(Weighted least squares, WLS)。另外,还有移动最小二乘法(Moving least squares, MLS)等其他最小二乘法的改进方法。此处不详细叙述。

在实际应用中, 2.3节中所述的两个“纠结”问题时有发生。人们发展出不同的方法来尝试解决。

当数据量较少的情况下,最小二乘法(线性回归)容易出现过拟合的现象,法方程的系数矩阵会出现奇异(非满秩),此时回归系数会变得很大,无法求解。

这时在最小二乘法的结果(式(2.7))中加一个小扰动,使原先无法求广义逆的情况变成可以求出其广义逆,使得问题稳定并得以求解,即

事实上,这个解对应于如下极小化问题的解:

其中,参数称为正则化参数(岭参数)。上述回归模型称为岭回归,其与最小二乘法的区别在于多了关于参数范数正则项。这一项是对的各个元素的总体的平衡程度,即限制这些权稀疏的方差不能太大。

实际应用中,如果岭参数选取过大,会把所有系数均最小化(趋向于0),造成欠拟合;如果岭参数选取过小,会导致对过拟合问题解决不当。因此岭参数的选取也是一个技术活,需要不断调参。对于某些情形,也可以通过分析选择一个最佳的岭参数来保证回归的效果,在此不详细叙述。

Lasso回归的极小化问题为:

其中,正则项为范数正则项。Lasso回归能够使得系数向量的一些元素变为0(稀疏),因此得到的拟合函数为部分基函数的线性组合。

根据Lasso回归的分析,我们可通过对回归变量施加范数范数为元素中非0元素的个数,在很多时候可以用范数近似)的正则项,以达到对回归变量进行稀疏化,即大部分回归变量为0(少数回归变量非0)。这种优化称为稀疏优化。也就是说,对回归变量施加范数能够“自动”对基函数进行选择,值为0的系数所对应的基函数对最后的逼近无贡献。这些非0的基函数反映了的样本点集合的“特征”,因此也称为特征选择

通过这种方法,为了保证防止丢失一些基函数(特征),我们往往可以多选取一些基函数(甚至可以是线性相关的),使得基函数的个数比输入向量的维数还要大,称为“超完备”基(Over-complete basis)或过冗余基,在稀疏学习中亦称为“字典”。然后通过对基函数的系数进行稀疏优化,选择出合适(非0系数)的基函数的组合来表达逼近函数

这在一定程度上克服了2.3节中所提出的两个“纠结”的问题。因为,这时可以选取较多的基函数及较高的次数,通过稀疏优化来选择(“学习”)合适的基元函数,也称为稀疏学习。另外,基函数(字典)和稀疏系数也可以同时通过优化学习得到,称为字典学习

对于矩阵形式(比如多元函数或图像),矩阵的稀疏表现为矩阵的低秩(近似为核模很小),则对应着矩阵低秩求解问题。在此不详细叙述。

稀疏学习与最近十年来流行的压缩感知(Compressive sensing)理论与方法非常相关,也是机器学习领域的一种重要方法。其深厚的理论基础由华裔数学家陶哲轩(2006年国际数学家大会菲尔兹奖得主)、斯坦福大学统计学教授David Donoho2018年国际数学家大会高斯奖得主)等人所建立,已成功用于信号处理、图像与视频处理、语音处理等领域。在此不详细展开介绍。

近年来,笔者及其团队成功地将稀疏学习的理论和方法推广用于三维几何建模与处理中,在计算机图形学领域已发表十余篇相关论文(包括在顶级期刊ACM Transactions on Graphics上发表了4篇论文)。有兴趣的读者可详细查看

(基于基函数稀疏选择的曲面生成)

(基于字典学习的曲面重建)

(基于特征稀疏选择的三维形状共同分割)

3. 稀疏学习方法用于三维几何的建模与处理(笔者的工作)。

上面讨论了映射为一元函数的情形。上述的有关概念和方法同样可以推广至多元函数()及向量值函数()的情形(如图4)。

4. 不同情形(维数)的逼近函数。

左上:一元函数;右上:多元函数;左下:一元向量值函数;右下:多元向量值函数。

假设有多元函数,即,的一组测量样本数据。设中的一组基函数为。要求函数

的平方和最小。这与式(1.3)2.4节的极值问题完全一样。系数, 同样通过求解法方程得到。上述过程称为多元函数的最小二乘拟合。

在函数论中,高维空间中的基函数的构造也有许多方法。为了简便,在许多时候我们采用张量积形式的基函数,即每个基函数是各个维数的一元基函数的乘积形式。在计算机图形学和计算机辅助几何设计(CG&CAGD)领域经常采用。

如果因变量有多个,即,称为向量值函数。比如空间螺旋线的参数方程

就是一个从一维到三维的向量值函数。如果自变量的维数比应变量的维数低,则自变量可看作为应变量的参数。在式(4.3)中,变量可看作为该螺旋线的参数

对于向量值函数,可以看成是多个一元函数或多元函数(一般共享基函数)即可,所有处理方法(包括最小二乘法)都是对每个函数分别操作的,与前面单个函数的处理方法完全一样。如果用数学方式来表达,前面的很多符号由向量变为矩阵的形式而已。详细可查看《数学分析》。

前面讨论的函数所能表达的曲线比较简单,无法表达封闭和多值的曲线。因此,在计算机图形学和计算机辅助几何设计中常用参数曲线曲面(本质是向量值函数,见4.2节)来表达几何形状,用于几何造型。另外,在计算机图形学中还有一种利用隐函数来表达曲线的方式,也常用于造型中,这里不展开介绍。

从数学来看,一条曲线的本征维度是一维的,不论是从哪个维度的空间来看。从直观来看,该曲线能被“拉”成为一条直线或线段;即,一条有端点的曲线能和一条线段建立1-1对应,如图5(左)所示。因此,嵌入到二维空间中的曲线可由单个参数来表达,即有如下形式的参数形式:

其中为该曲线的参数, 均为的函数,分别表示曲线上对应于参数的点的两个坐标分量。一般参数曲线表达为。本质上,这是一个从的向量值函数

类似地,一张二维流形曲面的本征维度是二维的。一张曲面能与平面上的一块区域建立1-1对应,如图5(右)所示。因此,嵌入到三维空间中的曲面可由两个参数来表达,即有如下形式的参数形式:

其中为该曲面的参数,, 均为的二元函数,分别表示曲面上对应于参数的点的三个坐标分量。一般参数曲面表达为。本质上,这是一个从的向量值函数

5. 参数曲线曲面。左:单参数曲线;右:双参数曲面。

下面我们介绍如何使用参数曲线来拟合2D平面上的一组有序样本点。

参数曲线拟合的问题描述如下:给定平面上一组有序样本点,我们希望寻求一条拟合这些点的参数曲线关系

如需决定一条拟合曲线,首先需要确定每个样本点所对应的参数。对于一组有序的样本点,所确定的一种参数分割,称之为这组样本点的参数化。参数化的本质就是找一组恰当的参数来匹配这一组样本点,以便使这条拟合出来的曲线美观、合理。

在参数曲线拟合中,样本点的参数化是个非常基本而重要的问题。不同的参数化,对拟合曲线的形状会产生很大的影响。图6显示了三种参数化(均匀参数化、弦长参数化和中心参数化)对拟合曲线形状的影响。

6. 不同的参数化导致不同的参数曲线拟合结果。

类似地,如果利用参数曲面来拟合空间中给定的一组样本点,首先也需要确定这些样本点在平面上的参数化,如图7所示。在曲面参数化中,不仅需要建立样本点及其参数的一一对应,我们还希望参数区域的网格保持原始网格的一些重要的几何特性,比如角度、边长等。

7. 三维曲面的参数化。

曲面参数化是计算机图形学中非常基础且重要的一个研究课题,也一直是研究热点之一。笔者及所在的课题组也在这个课题方面作了大量的工作,有兴趣的读者可详细查看

六、   从人工神经网络的观点来看拟合函数

为了讲清楚人工神经网络(Artificial Neural NetworkANN),下面我们先从神经网络的观点来看传统的拟合函数和曲线曲面。

可以看成为如图8的三层神经网络,其中只有一个隐层。隐层上有个节点,激活函数分别为基函数(从这里我们将基函数称为“激活函数”)。输入层到隐层的权设为常值1(图8左),也可以看成为将输入层的值“直接代入”(不做任何变换,用虚线表示)到激活函数(图8右)。隐层到输出层的权为基函数的组合系数

中间隐层的输出节点所形成的向量可看作为输入量的“特征”。

现在我们开始用机器学习的语言来描述数据拟合的过程。整个神经网络就是由中间节点的激活函数及权系数所决定的一个函数(6.1)。我们称样本点, 为训练数据(Training set),称函数在训练数据上的误差度量为损失函数(Loss function)。通过训练数据来极小化损失函数得到权系数的过程称为“训练”或“学习”。如果损失函数取为(1.3)的形式,则网络的训练过程本质上就是前面所讲的最小二乘法(2.4节)。

8. 一元逼近函数的神经网络。左:输入层到隐层的权系数均为常值1

右:输入层到隐层看成为“直接代入”(用虚线表示)。

考虑一般的逼近函数。设中的一组基函数为。则函数可看成为如下图的一个三层的神经网络。注意这里隐层的激活函数都是维函数,从输入层到隐层也是直接代入。输出层的各个分量共享隐层的激活函数。

9. 多元函数和向量值函数的神经网络。从输入层到隐层是变量直接代入到激活函数。

拟合曲线可以看作为一个多层的神经网络,如下图所示。输入层(样本点)到参数化是一个变换,可看成为一个神经网络;参数化到输出层是一个变换(单变量基函数组合),也是一个神经网络。输出层的两个分量共享基函数。

隐层1的激活函数为双变量基函数;隐层3的激活函数为单变量基函数。中间隐层(隐层123)的输出节点所形成的向量均可分别看作为输入量在不同维数空间的“特征”。

10. 拟合曲线的神经网络。输入层(样本点)到参数化是一个神经网络变换;

参数化到输出层是一个神经网络变换。

类似地,拟合曲面也可以看作为一个如下图的多层神经网络。

11. 拟合曲面的神经网络。

从曲线曲面拟合的过程及神经网络结构来看,如果将整个网络进行优化,则拟合的过程是寻求样本点的参数化以及表达函数的基函数,使得拟合误差极小化。在这里,我们是知道给定样本点的“本征维数”,因此,人为设置了第一个隐层的维数为1(曲线)或2(曲面)。然而,在实际应用中,我们并不知道数据的本征维数,此时需要利用其他方法(比如流形学习或降维方法)来“检测”或“猜测”隐层的维数,或者直接根据经验来不断调参和测试。

需要提及的是,在计算机图形学中,传统的大部分方法是将参数化的问题和曲线曲面拟合问题分为两个问题来解决。有些工作专门做参数化,有些工作专门研究拟合问题。其中参数化的工作更为重要,直接决定了拟合曲线曲面的质量。此处不详述。

需要注意的是,本节只是从神经网络的观点来看曲线曲面的参数化和拟合的问题。在计算机图形学中,我们不是简单的通过上述网络来求参数化(单个样本点),而是要考虑更多的样本点一起来求解参数化。这个后面还会详细介绍。

有了上述的理解,我们现在来理解人工神经网络就非常容易了。

回顾前面所述的函数逼近论中的函数拟合问题,始终是存在着两个“纠结”。一是选择什么样的逼近函数类,即选择什么类型的基函数?二是选择多高的次数或阶数?

另一方面,如果从图8或图9的神经网络的观点来看,网络的结构设置都存在着如下两个“纠结”:

在传统逼近论中,上述两个问题就没有好方法来解决(第一个问题针对具体问题可预先设定),是通过不断试错来看结果的好坏来决定的。这是因为,虽然有些基函数的性质很好,但是次数或阶数过高(比如多项式基或三角函数基),就会产生震荡,也容易产生过拟合,使得拟合函数的性态不好。因此,一般不会采用次数或结束太高的基函数。为此,人们发展了分段拟合方法,即将数据分为若干段,每段分别拟合,各段的拟合函数保证一定的光滑性,称为样条函数。在逼近论和计算机图形学领域,人们发展出了很多漂亮的样条的理论与方法。

对于参数类型的高维曲线曲面,还存在着参数化的问题,这时还存在另一个纠结,就是要设置多少个隐层(图10和图11)?

为了克服上述两个纠结的问题,是否可以通过其他形式来生成“基函数”?注意到,对于任意一个非常值的一元函数,这里我们称为元函数,其沿着方向的平移函数以及沿着方向的伸缩函数都与原函数线性无关。也就是说,如果能有足够多的变换所生成的函数,其线性组合所张成的函数空间就能有充分的表达能力。那么这些函数(可能都线性无关)是否能构成逼近一般函数的“基函数”呢?

一个自然的想法就是,我们能否以这个作为激活函数,让网络自动地去学习这些激活函数的变换,或者说去学习一些“基函数”,来表达所需要的拟合函数呢?这就是图12所示的神经元。变量乘以一个伸缩,加上一个平移(称为偏置“bias”),即变量的仿射变换,成为神经元的输入;然后通过激活函数复合后成为该神经元的输出

12. 一元(单变量)函数的神经元结构。

对于多变量的情形(多元函数),神经元的结构如图13所示。变量的线性组合,加上一个平移(称为偏置“bias”),即变量的仿射变换,成为神经元的输入;然后通过激活函数复合后成为该神经元的输出

13. 多元(多变量)函数的神经元结构。

不失一般性,我们下面就直接以多元函数的形式来介绍一般神经网络的结构。对于向量值函数(是多维的),则分别将的各个维数分别看作一个多元函数处理而已,这些函数共享节点(基函数)即可。

一个多元函数的神经网络的结构如图14所示,有一个输入层,一个隐层及一个输出层。输入层除了变量外,还有一个常数节点1;隐层包含多个节点,每个节点的激活函数都是,隐层的输出就是输入层节点的线性组合加偏置(即仿射变换)代入到激活函数的复合函数;输出层是这些复合函数的组合

这个网络的所有权系数(输入层与隐层之间的权及偏置项)及(隐层与输出层之间的权,此层一般不用偏置项)作为这个神经网络的参数变量,需要通过极小化损失函数来求解的。这个过程称为“训练”或“学习”。

与前面所述的逼近论中的拟合函数类似,网络的隐层的节点数是需要通过不断调试和尝试来确定的。隐层的节点输出称为输入数据)的“特征”。

14. 多元(多变量)函数的单隐层神经网络结构。

整个网络的学习过程本质上就是在学习所有的系数参数。最后得到的拟合函数为一些函数的线性组合表达。这些组合函数实质上就是表达函数的“基函数”!

从函数逼近论的角度,我们可以这样来理解神经网络:神经网络的学习过程本质上是在学习基函数!这些基函数是通过激活函数通过平移和伸缩(变量的仿射变换)来得到的!

当然,天下没有免费的午餐。以前函数逼近论无法解决的两个“纠结”这里仍然存在:

第一个纠结是如何选取基函数?这里使用激活函数,然后学习其变换来得到。

第二个纠结是选择多少个基函数?这里为隐层的神经元个数。

从这个观点来看,神经网络本质上就是传统的逼近论中的逼近函数的一种推广。它不是通过指定的理论完备的基函数来表达函数的,而是通过简单的基元函数(激活函数)的不断变换得到的“基函数”来表达函数的。实质上是二层复合函数。

此时,我们当然要问个问题:将函数经过充分多的平移和伸缩(包括它们的组合)所线性张成的函数空间,其表达能力有多强?这个函数空间是否在所有函数空间是稠密的?如果问题是正确的,那么就是说,对于任何一个给定的函数,总能找到函数的多次平移和缩放的函数,其线性组合能够逼近给定的这个函数;也就是说,图14中的神经网络只要隐层的节点数足够多,该网络所表达的函数就能逼近任意的函数。

幸运的是,上述猜想在很多情况下是成立的!有以下的万能逼近定理所保证。

空间中的单位立方体,我们在这个定义域中来描述万能逼近定理。记上的连续函数空间,上的可测函数空间,上相对测度的可积函数空间(即)。

设给定一元激活函数,首先给出如下定义。

【定义7.1】称函数为压缩函数,如果单调不减,且满足

【定义7.2】称函数为可分辨的,若对于有限测度,由

为所有由激活函数变换及线性累加所构成的维函数空间(即具有个节点的单隐层神经网络所表达的维函数)。

【定理7.1】若是压缩函数,则中一致稠密,在中按如下距离下稠密:

【定理7.2】若是可分辨的,则中按连续函数距离下稠密。

【定理7.3】若是连续有界的非常值函数,则中稠密。

【定理7.4】若是无界的非常值函数,则中稠密。

上述定理这里就不详细解释,稍微有些实分析和泛函分析的基础就能看懂。用通俗的话来说,就是:对任意给定的一个中的函数,只要项数足够多,中就存在一个函数,使得在一定精度下逼近。也就是说,图14所表达的单隐层的神经网络所表达的维函数能够逼近中的任意一个函数。

根据上述定理可知,函数只要满足一定条件即可作为一个合适的激活函数。但还是存在着一个巨大的“纠结”,就是隐层中的节点数量该取多大,仍是未知的。在实际中,这个是要不断通过测试和调试来决定的,这个过程称为“调参”。

定理7.1-7.4的详细证明可见以下论文。

将上述的神经网络的隐层进一步推广到多层,即可得到多隐层的神经网络,即深度神经网络(深度的意思就是多层)。其网络结构如图15所示。

由于每相邻的两层的节点都是全部连接的,因此在机器学习领域,也叫做全连接神经网络或多层感知机(Multi-Layer Perceptron, MLP)。

15只是显示了的函数的神经网络的结构。对于一般的的向量值函数,只要将最后输出层多几个节点即可,即,每个维度分量都是一个的函数,共享了前面的所有网络层结构。

每个隐层的输出 都可以看成输入数据在不同维数空间下的 “特征”。

注意不要在输出层使用激活函数。因为最后的输出就是那些基函数的线性组合表达即可。

从数学形式上看,深度神经网络就是一个多层复合函数。可以证明(Kolmogorov–Arnold表示定理),任意一个多元函数可以表示成若干个单变量函数的复合(事实上,只需要三层网络即可)。这为使用深度神经网络用来逼近任意高维函数提供了理论基础。但遗憾的是,该定理只证明了复合函数逼近任意函数的存在性,但具体使用什么样的函数未可知。

15. 多元(多变量)函数的深度神经网络结构。

因此,深度神经网络也能很强地表达中的任意的函数。但在具体应用中,选用多少个隐层,每一隐层选用多少节点,这些都是需要根据损失函数的进行不断调试的。这个过程也称为“调参”。另外,从这个观点可以容易理解各种深度神经网络的工作机制,包括一般深度神经网络、卷积神经网络(CNN)、RBF神经网络、ELM等。

7.4节中的万能逼近定理可知,激活函数的选择可以很多种。常用的激活函数如图16所示。

16. 常用的激活函数。

在早期,Sigmoid函数和tanh函数是人们经常使用的激活函数。近年来,随着神经网络的隐层不断增加后,人们偏向于使用ReLU函数作为激活函数,这是因为ReLU函数的在x轴正向的导数是1,不容易产生梯度消失问题(见8.3节)。这里值得一提的是,如果使用ReLU函数作为激活函数,则最后生成的拟合函数为分片线性函数。

关于激活函数的理解和讨论,机器学习领域及互联网上有很多文章进行过解释,都是解释为“激活函数的主要作用是提供网络的非线性建模能力,提供了分层的非线性映射学习能力”等等。我们从逼近论的角度,将非线性激活函数理解为拟合函数的“基函数”生成器(如果激活函数为线性的,则无法生成表达非线性函数的基!),训练神经网络就是在学习这些基函数,这是一种全新的观点,也是非常容易理解的。

从数学上看,深度神经网络就是一个多层复合函数。在机器学习中,这个复合函数的好坏依赖于对目标函数最大化或者最小化的过程,我们常常把最小化的目标函数称为损失函数(Loss function),它主要用于衡量机器学习模型(此处为深度神经网络)的预测能力。常见的损失函数有均方误差(L2误差)、平均绝对误差(L1误差)、分位数损失、交叉熵、对比损失等。损失函数的选取依赖于参数的数量、异常值、机器学习算法、梯度下降的效率、导数求取的难易和预测的置信度等若干方面。这里就不展开讨论。

给定了一批训练数据,计算神经网络的问题就是通过极小化损失函数来找到网络中的所有权值参数(包括偏置参数)。这个过程本质上就是利用这个神经网络函数来拟合这些数据,这个过程也称为“训练”或“学习”。

误差反向传播算法(Error Back PropagationBP)是神经网络训练时采用的一种通用方法。本质是随机梯度下降法。最早见于如下论文:

由于整个网络是一个复合函数,因此,训练的过程就是不断地应用“复合函数求导”(链式法则)及“梯度下降法”。反向传播算法从神经网络的输出层开始,利用递推公式根据后一层的误差计算本层的误差,通过误差计算本层参数的梯度值,然后将差项传播到前一层。然后根据这些误差来更新这些系数参数。

值得一提的是,梯度下降法并不是唯一的优化方法。也有不少人使用其他优化方法,比如ADMM方法,来作为优化器优化深度神经网络的求解。

由万能逼近定理可知,只要网络规模设计得当,使用非线性函数作为激活函数(比如8.1节中常用的激活函数)的逼近能力都能够得到保证。

然后,由上一节的反向传播算法可知,算法过程中计算误差项时每一层都要乘以本层激活函数的导数,因此,会发生很多次的导数连乘。如果激活函数的导数的绝对值小于1,多次连乘之后误差项很快会衰减到接近于0;而参数的梯度值由误差项计算得到,从而导致前面层的权重梯度接近于0,参数不能得到有效更新,这称为“梯度消失”问题。与之相反,如果激活函数导数的绝对值大于1,多次连乘后权重值会趋向于非常大的数,这称为“梯度爆炸”。长期以来,这两个问题一直困扰神经网络层次无法变得很深。

最近几年,ReLU函数被经常使用作为深度神经网络的激活函数。有两个主要理由:

该函数的导数为sgn(忽略在0处不可导的情形),计算简单,在正半轴导数为1,有效的缓解了梯度消失问题;

2)      虽然它是一个分段线性函数,但它具有非线性逼近能力;使用ReLU激活函数的深度网络的本质是用分段(分片)线性函数(超平面)去逼近目标。

后来,人们在ReLU的基础上又改进得到各种其他形式的激活函数,包括ELUPReLU等。

现在我们已经理解了深度神经网络的本质,就是一个复杂的多层复合函数。训练的过程就是在求激活函数变换得到的“基函数”,因此,训练神经网络的本质就是在“学习基函数”。这跟稀疏学习中的“字典学习”非常类似。殊途同归!

我们来看一下深度神经网络所表达的拟合函数与传统所用的拟合函数(2.1节)的类比与区别:

(1)   传统的拟合函数是在某一函数类(由某些具有良好性质的基函数所张成的函数空间)中进行选择。基函数是预先给定的,个数也是预先设定的(或者稀疏选择的)。系统的求解变量是基函数组合系数;

(2)   神经网络所表达的拟合函数是由某一激活函数对变量的平移和伸缩变换而来,个数是预先设定的(神经元个数)。系统的求解变量是基函数的变换,因此可以看成是在学习基函数;

(3)   传统的拟合函数也是一种神经网络(见第6节),因此也可以拓展成深度网络(复合函数),但问题是次数或阶数经过复合后会变得非常高,更易造成过拟合;

(4)   多层神经网络中的不同层所用的激活函数也可以使用传统的基函数。因此,还可推广为更一般的深度神经网络。

那么为何要用多个隐层呢?事实上,通过6.3节的内容就不难理解了。每个隐层就是将前一层的数据作为输入(当然也包括输入层数据)在当前这个维数的空间中的一种映射,本质上就是在做“参数化”!

如果当前层的维数小于上一层的维数,就相当于将上一层的数据参数化到低维空间中。当然也可以参数化到高维空间,以提高自由度。

6.3节中,对于三维曲面,我们已知它是二维流形,因此,我们知道将其映射到二维作为参数域就很自然了。因此有了图11这样的网络结构。

但对于一般的数据(比如人脸数据),是在背景空间(ambient space)上观测的,可能数据的维数非常高(比如的图像按照像素个数的维数达到100万维)。但这些数据并不会充满整个高维空间,会具有低维的结构(称为本征维数),即数据落在一个低维子空间(或低维流形)上,并呈现一定的概率分布。从数据的角度来看,一个嵌入到高维空间的低维流形本质上就是一个参数曲面,参数域是那个低维空间。因此,将高维数据参数化到低维的空间是可行的。

这里也出现了两个纠结的问题。

第一,对于一个实际数据拟合问题,应该设置多少个隐层?

第二,每个隐层应该设置多少个节点(该隐层的维数)?

在机器学习领域,隐层的层数称为网络的深度,隐层的维数成为网络的宽度。对于基于深度神经网络的学习,到底是越深越好,还是越宽越好?

从数学上来看,网络越深,表示一个复杂的函数可以经过多次参数化的变换,映射到最终的目标。这个是合理的。举个例子,比如我们想将一个三维网格曲面参数化到一个平面,如果这个输入的曲面比较复杂,开口(参数化边界)很小,则要将曲面一次性展开(的映射)比较困难。此时,可以多进行几次从的映射,将曲面先在慢慢张开,每次张开的映射比较容易表达和计算。最后再映射到上就相对容易了,当然还可进行多次从的映射,生成更好的参数化。注意其中任何一个映射都可以是用一个神经网络来表达。

17. 带有特征的曲面的拟合。(a) 原始输入三维数据;(b) (a)的简单参数化(Floater参数化);(c) 为优化过后的参数化;(d) 最后的拟合曲面。

在计算机图形学中,我们针对曲面展开及拟合问题,在如下的工作中用到了这种思想。

为一个带有尖锐特征的输入点云,如果将其简单参数化为(b),在其上构建的拟合曲面很难表现曲面的尖锐特征。这时我们对(b)中的参数化再做一个映射(优化)为(c),这时在其上做的拟合曲面则能很好地表现出尖锐特征。注意,这里生成拟合曲面的基函数中我们采用了非光滑基函数(采用非光滑基函数来表现曲面特征的思想首次在我们的如下论文中所采用)。因此,上述工作本质上是一个使用5层神经网络(3个隐层)来优化拟合曲面。

这里顺便提一下,在计算机图形学中,最近一些年有不少工作在做曲面参数化的优化工作(比如满足无翻转、低扭曲等约束)。从机器学习的观点来看,就是在做更多的参数映射的优化计算。当然,这些工作并不能简单地看成一个深度神经网络来做。这是因为,对参数化的问题,我们是知道曲面(所有数据)的整体结构的,而不只是一些离散的采样点。因此,我们在做参数化优化的时候,我们可以充分利用曲面的整体结构来得到一些几何度量来满足各种约束,而这些是神经网络优化所做不到的!

总之,对于第一个问题,隐层越多,表示网络越深,确实会使得最后的映射带来更好的表现。其数学本质是将输入数据不断在不同的空间中进行参数化映射。最后得到的映射(可能非常复杂的映射)表达为若干个相对简单映射的复合。对于多隐层的解释和讨论,机器学习领域及网上有很多文章进行过解释,大部分都解释为“提取数据的特征”等等。我们从逼近论的角度(结合三维曲面拟合的例子),将多隐层优化看成数据在不同维数空间的参数化,是非常容易直观理解的。

对第二个问题,每个隐层的具体的节点数或维数,该如何设置呢?对于一般的数据这个就很难直观确定了,一般要根据经验。当然,也有一些办法来进行指导,我们将在下一节中理解。

对于一般的数据,我们并不知道其本征维数(即参数域空间),那么映射(参数化)到多少维空间是合适的呢?

事实上,这个也是个非常纠结的问题!这个问题就是寻求高维数据的本征维数,在机器学习领域称为流形学习(Manifold learning),或降维问题(Dimension reduction)。如图18所示,数据是在三维空间给出的(B),每个点是3个坐标,看起来是三维数据;但其本质上位于三维空间的一张曲面上,即二维流形曲面上(A),其本征维数是2。因此,可以将其一一映射到平面上(C)。

18. 流行学习。(图片来自论文[8-5]

提到流形学习,不能不提到如下的两篇开山之作(同时发在Science 2000的文章):

流形学习在本世纪初的前一个十年是一个研究热点(由上面两篇Science论文带起来的)。至今已发展出了许多方法,从简单的线性方法,比如PCA;到后面的非线性方法,比如局部线性嵌入(LLE),等距映射法(Isomap),Laplace特征映射,局部保投影法(LPP)等。这里不详细介绍。

需要指出的是,正如第6节所讲的三维曲面参数化的计算,我们计算数据的本征维数的时候,是需要利用所有数据的信息及其几何或拓扑结构一起来分析的,而不能像神经网络训练那样,仅仅将数据灌到神经网络中去更新权系数。

在传统的机器学习中,很多任务的输入数据的维数都非常大,不易直接处理。往往需要先降到合适的维数,然后再选择合适的预测模型来做拟合。

传统机器学习的流程一般由两个主要的模块组成。第一个模块称为特征工程,将原始输入数据(高维向量)变换为一个低维向量,即,用这个低维向量来作为表达输入数据的特征(或描述子,feature or descriptor)。不同的人有不同的方法来计算这个低维特征,称为特征抽取Feature extraction),如图19显示了不同的图像特征抽取方法。各种计算的特征都有一定的实用范围,因此,有人就提出如何选择或组合各种特征得到更好的特征,这是特征工程的另一个子问题,称为特征选择Feature selection)。针对三维形状分割,我们发现对三维局部块的众多描述子并不是串联起来一起使用更好,而是针对不同的形状的部位使用不同的描述子会更好,于是我们使用稀疏选择的方法来选择形状描述子用于形状分割,详细可见如下论文。

19. 图像的各种特征抽取方法。

由于这种特征是通过人为设计的算法来得到的,因此这种特征称为人工特征Hand-crafted features)。人工特征的抽取需要人们对输入数据的认知或者领域知识(Domain knowledge),因此在很多情况下会局限于人的经验和认知。

第二个模块称为预测模型,即选用什么样的预测方法来拟合给定的数据,我们前面所讲的拟合就是指这个过程。预测模型的目标就是希望学习到的模型在预测未知目标时越精确越好。一般要考虑模型的复杂度及精确度等因素。在机器学习领域有非常多的方法,这里不一一介绍。

上述两个模块中的每个模块都是一个独立的任务,其结果的好坏会影响到下一步骤,从而影响整个训练的结果,这是非端到端的,如图20(上)所示。

特征提取的好坏异常关键,甚至比预测模型还重要。举个例子,对一系列人的数据分类,分类结果是性别(男或女),如果你提取的特征是头发的颜色,无论分类算法如何,分类效果都不会好;如果你提取的特征是头发的长短,这个特征就会好很多,但是还是会有错误;如果你提取了一个超强特征,比如染色体的数据,那你的分类基本就不会错了。

这就意味着,特征需要足够的经验去设计,这在数据量越来越大的情况下也越来越困难。于是就出现了端到端的网络,特征可以自己去学习。所以特征提取这一步也就融入到算法当中,不需要人来干预了。即不需要将任务分为多个步骤分步去解决,而是从输入端的数据直接得到输出端的结果。前面介绍的深度神经网络就是一个端到端的学习方法。如图20(下)所示。

端到端学习的好处在于,使学习模型从原始输入到最终输出,直接让数据“说话”,不需人工设计的模块;给模型更多可以根据数据自动调节的空间,增加模型的整体契合度。

20. 非端到端的学习(上)与端到端的学习(下)。

但端到端学习也有不足。第一,端到端的深度神经网络需要大量的样本数据才能工作得很好,因此很多公司都在花费大量的人力物力去生成标注数据(一般通过人工标注,催生了很多专门做数据标注的外包公司);第二,人工设计的特征并不是都不能用的,有些人工特征还是能代表着人类智能的,是可以用来作为合理的特征的,而端到端的学习无法用这些特征。当然,通过适当的改造和结合,也可以集成人工特征到深度神经网络中,这里就不展开讨论。

基于深度神经网络的端到端学习在最近几年取得很大的成功,被大量应用与计算机视觉、语音识别、自然语音处理、医学图像处理等领域中。从数学本质上来看,神经网络就是一个映射函数而已,在上世纪50年代就有了感知机,但为什么以前没有火呢? 主要有以下的两方面的原因。

第一,之前没有那么大规模的数据量;

第二,以前的工程技术(先进优化算法及支持大规模并行计算的GPU硬件)无法求解的很深的神经网络。

因此,在上个世纪90年代,各种浅层模型大行其道,比如只有一层隐层的支撑向量机(Support Vector MachineSVM)以及没有隐层的逻辑回归方法(Logistic

直到最近几年,随着各种传感器的大量使用以及移动互联网的广泛应用,能够获取和产生海量(PB级甚至ZB级)的数据(比如文本、图像、语音等)。特别是ImageNet图像数据库的诞生以及基于该数据库的各种竞赛,直接将计算机视觉领域中的深度学习的研究与应用推向了“落地”,催生了大量的计算机视觉的人工智能公司。

自从深度学习火了后,各种深度神经网络(或CNN网络)随之产生了,比如2012年的AlexNet8层;2014年的VGG-1919层;2014年的GoogleNet22层;2015年的ResNet152层!甚至还出现了上千层的深度神经网络!

从数学上可知,拟合函数所带的参数的个数与样本数据的个数之间的差代表着这个拟合函数的“自由度”。网络越来越“深”后,拟合模型中的可调整参数的数量就非常大,通常能达到百万计甚至几十亿级。因此,层数很大的深度网络(模型过于复杂)能够表达一个自由度非常大的函数空间,甚至远高于目标函数空间(过完备空间),即自由度远大于0。这样就很容易导致过拟合(Overfitting),如前面所讨论过的图2(右)所示。

过拟合可以使得拟合模型能够插值所有样本数据(拟合误差为0!)。但拟合误差为0不代表模型就是好的,因为模型只在训练集上表现好;由于模型拟合了训练样本数据中的噪声,使得它在测试集上表现可能不好,泛化性能差。为此,人们采取了不同的方法来缓解过拟合(无法完全避免),比如正则化、数据增广、Dropout、网络剪枝等。

在使用深度神经网络来做深度学习的应用中,很多工作都是直接使用现有的深度神经网络,或者改造现有的深度神经网络。如果网络设计不够好,大部分结果都可能有过拟合的现象。

在实际应用中,我们可以挑选样本数据中的一部分作为训练数据集,其他的作为。如果网络在训练数据集上表现好(即损失函数很小),而在测试数据集上表现不够好,那么就可能发生了过拟合,此时就适当减少网络的层数或者节点数。这个过程是需要有耐心,可能需要花费很长时间才能调到一个合适的网络。需要靠感觉、经验和运气。因此,有人戏称调试深度神经网络的过程为“炼丹”。

我们已从函数逼近论的角度来理解了人工神经网络本质是传统逼近函数的一个推广,由人工选取基函数到自动学习基函数,由人工提取特征到自动计算特征(参数化),能够较容易理解人工神经网络学习是如何工作的。

在机器学习领域,人们从生物神经网络的角度来解释和理解人工神经网络的工作原理,将人工神经网络看成为一个可以模拟人脑工作行为的函数。

在生物神经科学(Neuroscience,包括脑科学、认知神经科学等)的研究中,人们发现,人体的神经元通过树突接受信号。这些信息或信号随后被传递到脑细胞或细胞体。在细胞体内部,所有的信息将被加工生成一个输出。当该输出结果达到某一阈值时,神经元就会兴奋,并通过轴突传递信息,然后通过突触传递到其他相连的神经元。神经元间传输的信号量取决于连接的强度。如图21(左)。

我们来类比人工神经网络:如果把树突想象成人工智能网络中基于突触感知器的被赋予了权重的输入。然后,该输入在人工智能网络的“细胞体”(神经元)中相加。如果得出的输出值大于阈值单元,那么神经元就会“兴奋”(激活),并将输出传递到其它神经元,如图21(右)。

21. 左:人脑神经元结构;右:从生物神经网络类比得出的人工神经元结构。

在计算机视觉领域,人们也从视觉神经科学(Visual Neuroscience)中类比来解释了在计算机视觉领域用得最多的卷积神经网络(CNN)的工作机理。

22. 视觉皮层结构。(图片来自互联网)

由视觉机理的研究发现,动物大脑的视觉皮层具有分层结构。眼睛将看到的景象成像在视网膜上,视网膜把光学信号转换成电信号,传递到大脑的视觉皮层(Visual cortex),视觉皮层是大脑中负责处理视觉信号的部分。1959年,有科学家进行了一次实验,他们在猫的大脑初级视觉皮层内插入电极,在猫的眼前展示各种形状、空间位置、角度的光带,然后测量猫大脑神经元放出的电信号。实验发现,当光带处于某一位置和角度时,电信号最为强烈;不同的神经元对各种空间位置和方向偏好不同。这一成果后来让他们获得了诺贝尔奖。

目前已经证明,视觉皮层具有层次结构。从视网膜传来的信号首先到达初级视觉皮层(primary visual cortex),即V1皮层。V1皮层简单神经元对一些细节、特定方向的图像信号敏感。V1皮层处理之后,将信号传导到V2皮层。V2皮层将边缘和轮廓信息表示成简单形状,然后由V4皮层中的神经元进行处理,它颜色信息敏感。复杂物体最终在IT皮层(inferior

卷积神经网络可以看成是上面这种机制的简单模仿。它由多个卷积层构成,每个卷积层包含多个卷积核,用这些卷积核从左向右、从上往下依次扫描整个图像,得到称为特征图(feature map)的输出数据。网络前面的卷积层捕捉图像局部、细节信息,有小的感受野,即输出图像的每个像素只利用输入图像很小的一个范围。后面的卷积层感受野逐层加大,用于捕获图像更复杂,更抽象的信息。经过多个卷积层的运算,最后得到图像在各个不同尺度的抽象表示(由底层到高层的特征表达),如图23所示。

23. 基于卷积神经网络的深度学习所得到的人脸图像的分层特征。

(图片来自于Stanford大学的论文)

笔者认为,利用神经科学的神经元或神经网络来解释深度学习中的人工神经网络,这仅仅是类比而已。从我们的分析可知,深度学习中的人工神经网络并没有真正的认知和学习!如果我们人类对自己的认知系统无法完全了解的话,我们是很难发展出真正的人工智能技术。

我们从数学上理解了深度人工神经网络本质上是表达不同维数空间之间的一个映射(函数)。给了一些样本点后,通过调整网络的参数权系数,不断极小化损失函数,从而达到最好的拟合结果得到了拟合函数。

这个拟合过程只极小化了逐点的误差或者累积逐点误差,而无法考虑点与周围点之间的其他信息(比如邻域几何结构、局部几何度量、流形的整体拓扑结构等)。如果要考虑点之间的几何与拓扑的结构信息,则深度人工神经网络就无能为力(当然一定要改造也是可以的),这时就需要其他的数学方法了。有点像数学分析中,逐点收敛和一致收敛,逐点连续和一致连续的区别。

例如,前面介绍的流形学习中,LLE方法保持每个样本点与它相邻的多个点的线性组合(体现了局部线性)来重构低维空间的点的分布,相当于用分段的线性面片近似代替复杂的几何形状,样本投影到低维空间保持这种线性重构关系,如图24(左)所示。Isomap方法希望保持数据在低维空间的映射之后能够保持流形上的测地线距离,即全局的几何结构,如图24(右)所示。

24. 流形学习。左:保持局部的几何信息(LLE);右:保持全局的距离信息(Isomap)。

(图片分别来自于论文[8-4][8-5]

再如,在计算机图形学和几何处理领域,我们做的很多映射(比如三维网格曲面的参数化),也需要保持曲面上的某些几何性质(保角度、保面积、保形等),也发展出许多不同的求解映射的方法和技巧。例如,以下两个工作是我们做的有关三维曲面参数化到二维平面的工作,第一个工作是曲面参数化工作的经典方法之一,已经被集成到3D Geometry Algorithms Library)中。第二个工作是今年我们最新的一个工作,能快速生成无翻转和低扭曲的网格参数化,论文即将在下周的Siggraph 2018会议上汇报。

在计算机图形学中,有时我们也需要将三维空间的二维流形曲面映射到另一个规则二维流形曲面,比如球面上,这时称为球面参数化。如读者有兴趣可阅读我们如下的3篇有关球面参数化的工作。

另外,在计算机图形学及计算机辅助几何设计领域,我们还有独特的曲线和函数的构造方法,如通过Bernstein基函数构造的Bezier曲线曲面,通过B样条基构造的B样条曲线曲面(分段Bezier曲线曲面),以及更一般的非均有有理B样条曲线曲面,通过控制顶点就能很直观控制曲线曲面的形状,而且发展出非常完备的理论及设计方法,如图25所示。这些独特的曲线曲面的构造方法也是我们领域独特的,已成为现代工业中产品曲面造型的工业标准(标准数学表达)。

25. NURBS曲线曲面:产品曲面造型的工业标准。(图片来源与互联网)

由于本文是面向非机器学习专业介绍深度学习的,因此,笔者在这里只是大致介绍一下各种基于深度神经网络的学习方法的实际技巧,不详细展开讨论,有兴趣的读者可查阅更专业的书籍或论文。

从数学上来看,深度神经网络仅仅是一种函数的表达形式,是复杂的多层复合函数。由于它有大量的可调参数,而且近年来随着大数据、优化算法和并行计算GPU硬件的发展,使得用大规模的神经网络来逼近和拟合大数据成为可能。至今,不同领域的研究工作者及产业界工作者已将深度神经网络应用到各行各业的各个问题,而且提出了各种形式、各种结构的深度网络结构,使人眼花缭乱,似乎难以捉摸。但事实并非如此!

万变不离其宗,神经网络就是一个多层复合函数。网络结构发生改变,就是说函数的复合形式发生了变化。因此,只要掌握了这条原则,各种复杂的神经网络你就能轻松看懂。亦可参考互联网上的“”一文。

26. 多层神经网络所表达的函数:可以看成前面的若干层网络所表达的函数(蓝色)与后面若干层网络所表达的函数(红色)的复合。

简单地说,看懂各种神经网络结构只需看懂如下3个要素(具体解释就不详细展开了):

(1)   神经元与激活函数:神经元接收什么数据,通过什么样的激活函数输出数据。人们发明了许多不同种类的神经元,比如,池化神经元和插值神经元(Pooling and interpolating cells)等。不管什么样形式和名称的神经元,我们只要搞明白神经元是通过什么样的函数来将接收数据变为输出数据,不同之处就在接收数据和激活函数不同而已,如图21(右)所示。

NetworkCNN)就是一种限于局部感受野来改造的神经网络(线性组合特殊化为局部区域的卷积操作,且增加了池化(Pooling)层),特别适合于文本、图像及视频类数据的深度学习。再比如,残差神经网络(Residual Neural NetworkResNet)有一种特殊的连接,可以把数据从某一隐层传至后面几层(通常是25层)。该网络的目的不是要找输入数据与输出数据之间的映射,而是致力于构建输入数据与输出数据+输入数据之间的映射函数。本质上,ResNet 是在学习映射函数的一阶差分(一阶导数),能够有效抑制优化过程中的梯度消失。类似地, DenseNet (CVPR 2017) 实质上是在学习映射函数的高阶差分,因此也能有效抑制梯度消失现象。同样地,其他的各种神经网络结构也很容易看懂的,比如

神经网络的组合:一个多层的神经网络就是一个多次复合的函数。中间的任何一层的输出都可以看成为原始输入数据的一个特征。如图26所示,一个多层神经网络所表达的函数:可以看成前面的若干层网络所表达的函数(蓝色)与后面若干层网络所表达的函数(红色)的复合。因此,在任何的一个中间层,可以修改输出的特征向量、可以插入一个其他的神经网络(将该特征向量作为输入,或与其他网络的特征向量进行叠加、运算等)等等。如果将神经网络看成为积木,整个组合过程就像在“搭积木”。这样就可以发明和产生无穷无尽的网络结构(比如,并行网络、累加网络等等很多网络名称)。在实际应用中,需要根据问题本身的特点来合理设计网络的结构。具体哪种网络结构合理,有无最好,都是组要根据问题本身思考和试验的,主要是要看损失函数的误差以及在应用中的效果来决定的。这个我们在后面还会进一步讨论。

一个深度神经网络所表达的函数具有成千上万个参数,为了让损失函数在训练数据上达到最小,就需要设计合理的网络来拟合这些数据。在优化的过程中,要保证迭代收敛也是必要的。

一般地,调试较大的深度神经网络所花费的时间和劳力比调试传统程序要多,而且要有耐心!因为如果最后的结果不好(损失函数很大或者不收敛),如果确认你的代码无bug,那么原因只有一个,就是你所调的网络还不够好(orz)

在调试神经网络的过程中,有太多不确定的因素需要你去仔细思考并小心翼翼地去调试,而这些大部分都需要靠直觉、经验和少许运气来调试决定的,比如:

(1)   需要选取多大的神经网络(也就是选用什么样的拟合函数)?具体地,网络要多少层?每层多少节点?这个只能凭直觉或经验了。简单点的话,就套用现成的网络结构,或者再经过一些修改即可。从函数的自由度来看,网络的参数个数与数据大小不应相差太大。

(2)   初始化。对于高度非线性的函数的最优化,一个非常重要的因素就是如何挑选一个好的初始化?

(3)   在优化过程中,如何判断优化过程是否收敛?

以下有些简单的小经验分享下:

(1)   一定要可视化你的结果!这样有助于你在训练过程中发现问题。你应该明确的看到这些数据:损失函数的变化曲线、权重直方图、变量的梯度等。不能只看数值,一定要可视化!

(2)   网络不是越深越好!不要一上来就用VGG19, ResNet50等标准的大网络,可能你的问题只要几层就能解决问题。

(3)   先建立一个较小的网络来解决核心问题,然后一步一步扩展到全局问题。

(4)   先用小样本做训练,有了感觉后,再调试大的训练数据。

(5)   如果在几百次迭代后,迭代还没开始收敛,那么就要终止迭代,不要傻等了!要考虑修改你的网络了。

(7)   另外,在互联网上还能找到许多网友们分(tu3)享(cao2)的实用调网络的经验,读者可自行去查找学习。

值得提醒的是,上述分享的各个经验没有绝对的对与错,须将它们当作经验去学习和使用即可。需要根据你自己的实际问题来设计和调试你的深度神经网络。

即便对于行家来说,调试较大的神经网络也是一项艰巨的任务。数百万个参数在一起决定的函数,一个微小的变化就能毁掉所有辛勤工作的成果。然而不进行调试以及可视化,一切就只能靠运气,最后可能浪费掉大把的青春岁月。

正因为这些原因,调试深度神经网络被认为是个不可解释的“黑箱子”,优化网络的过程成为“调参”,也被戏称为“炼丹”,是个需要丰富经验的“技术活”。

要学习和使用基于深度神经网络的深度学习,门槛并不高。你大不必从头开始自己搭建神经网络系统和实现优化算法。近几年来,很多大公司和科研机构都在研究自己的深度学习框架,且推出了不少深度学习开发平台(如图27),深度学习的开发框架和工具也越来越多,使得应用深度学习的入门门槛越来越低。使用好的开发工具,可让使用者减少底层开发的工作量,而将重点关注于深度学习应用逻辑的开发及模型的优化上,提高开发效率。

27. 基于深度神经网络的深度学习的开发工具。(图片来自互联网)

这里简单介绍几款大家常用的深度学习开发工具包,基本都是开源的。

Keras,基于Python语言开发的,底层库使用TheanoTensorFlow。其模块化特性非常适合刚入

我要回帖

更多关于 加权成绩是什么意思 的文章

 

随机推荐