深度学习概述:从基础概念计算步骤到调优方法|赠书

Posted OneFlow深度学习框架

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深度学习概述:从基础概念计算步骤到调优方法|赠书相关的知识,希望对你有一定的参考价值。

自2012年深度学习崛起以来,这项技术已被应用到计算机视觉、NLP、推荐等各领域,推动了技术发展,创造了巨大的商业价值。同时,深度学习的算法和网络结构在这期间也在不断发展,但不管怎样,它们都遵循深度学习的基础理论。

温故而知新,如今回顾深度学习的基本原理,依然对我们理解它从何发展而来,为什么能发挥作用至关重要,也对我们在下个十年推进深度学习有指导性意义。

因此,本文将重点回顾深度学习相关的基础理论知识。首先介绍深度学习与人工智能的相关概念,然后从感知机等初等神经网络结构出发,阐述深度学习模型的前向传播和反向传播计算理论。同时系统性地介绍常见的前馈神经网络和卷积神经网络,以及深度学习实践中模型常用的调优方法,包括多种权重学习的最优化算法和模型过拟合的调整方法。


(本文节选自热卖书籍《图深度学习:从理论到实践》,为了满足OneFlow读者朋友的学习热情,OneFlow联合清华大学出版社将为读者赠书5本,在文末分享你对深度学习相关领域的见解,获赞最多的5条留言将分别获赠此书一本。活动截止时间到6月20日20:00。)

1

深度学习与人工智能

深度学习(Deep Learning, DL)作为人工智能的一个重要子分支,说到深度学习,不得不提人工智能(Artificial Intelligence, AI)和与之密切相关的机器学习(Machine Learning, ML)。刚接触人工智能、机器学习和深度学习的读者可能比较容易混淆三者之间的关系,它们之间的相互包含关系如图1-1所示。机器学习是一种实现人工智能的方法,深度学习是一种实现机器学习的技术。下面简要介绍相关概念。

图1-1 人工智能、机器学习、深度学习的包含关系

人工智能是在1956年由约翰·麦卡锡提出的概念,研究用于模拟、延伸和扩展人类智能的科学技术,属于现代计算机科学的一个重要分支。人工智能试图让计算机拥有人类的智慧,即具备理解语言、学习、记忆、推理、决策等诸多能力。人工智能延伸出了很多子领域,包括机器人、语音识别、图像识别、自然语言处理和专家系统等。

机器学习是实现人工智能的重要技术,采用算法解析观测到的大量数据,从中学习出更具一般性的规律,然后对真实世界中的事件作出预测。典型的机器学习算法包括决策树、随机森林、逻辑回归、支持向量机、朴素贝叶斯等。机器学习领域有一个经典共识,即数据和特征决定了机器学习性能的上限,而模型和算法只是不断朝着这个上限逼近。

而在模型和算法设计过程中,传统机器学习需要投入大量的人力在特征工程上,而理想的状态是让机器帮助我们自动找出应该使用的特征空间,无须人参与。为此,人们希望设计的机器学习算法能够自动学习特征和任务之间的关联,还能从简单特征中提取复杂特征,深度学习就是满足这个特点的机器学习算法。

深度学习的概念源于人工神经网络的研究,主要通过组合和抽取低层特征,形成更加抽象的高层表示属性类别或特征,以发现数据的分布特征表示。

2

感知机与神经网络

2.1 单层感知机

神经网络的概念源于生命科学中的神经系统。在生命科学中,神经元是动物脑神经系统中最基本的单元,数百亿的神经元相互连接,组成复杂的神经系统,用来完成学习、认知和体内对生理功能活动的调节。

图1-2 生物神经单元与感知机

如图1-2所示,神经细胞按照功能大致可分为树突、细胞体和轴突。按照对逻辑电路的理解,每个神经细胞可被视为一个只有兴奋或者抑制两种状态的器件,当某个神经元从其他神经细胞接收到的信号强度超过某个阈值时,细胞体就会兴奋,产生电脉冲并传递到其他神经元。

受生物神经细胞的启发,计算机科学家提出感知机(Perceptron)来模拟动物神经细胞,对人工神经网络的发展具有里程碑式的意义。感知机可以认为是一种人工神经元,其本质是一种线性模型,它接收多个信号输入,产生一个信号输出,如图1-2(b)所示。其数学含义可以表达为

(1.1)

其中,b 是实数,称为偏置,包含神经细胞信息的阈值,可以视为各个树突传入信息的求和。f(x)为阶跃函数,满足

(1.2)

其函数图像如图1-3所示。

图1-3 单位阶跃函数

感知机输出两个数值结果,因此可以用于解决一些二分类问题。对于输入信息x1x2,…,xn,处理方式为

(1.3)

在几何数学中,式(1.3)可以认为是一个超平面方程。因此,感知机可以认为是采用一个超平面将n 维空间中的数据切分为两部分。当然,现实中大部分的数据并不能够恰好被一个超平面分割。如果一个数据集的正负样本能够被一个超平面区分开,那么称这个数据集是线性可分的。总而言之,感知机已经可以用于解决部分线性问题,但是其结构相对简单,存在不能处理线性不可分问题的缺陷。

2.2 多层感知机

为了进一步挖掘感知机的能力,20世纪80年代,多层感知机(Multilayer Perception, MLP)被提了出来。多层感知机是单个感知机的推广,用来克服感知机不能对线性不可分数据进行识别的弱点。多层感知机在单层感知机的基础上引入了一到多个隐藏层,基本结构由三层组成。第一层为输入层(Input Layer),第二层为隐藏层(Hidden Layer),第三层为输出层(Output Layer),如图1-4所示。

图1-4 多层感知机示例

多层感知机相比单个感知机,除层数多之外,还增加了激活函数(Activation Function)。类似于图1-3中的阶跃函数的作用,神经元节点对上层输入权重求和之后,经历一个函数变换后作为最终输出,这个变换称为激活函数。阶跃函数就是一种激活函数,除此之外,神经网络中常见的激活函数还有 Sigmoid和线性整流(Rectified Linear Unit,ReLU)函数,如图1-5所示。下面分别介绍。

图1-5 激活函数

Sigmoid函数的表达式为

(1.4)

Sigmoid函数的输出值映射在(0,1)之间,单调连续,可求导数,如图1-5(a)所示。但是包含指数计算和除法计算,导致计算复杂度高,同时求导后容易产生梯度趋近于0的问题,不利于神经网络的训练。

ReLU 函数可以有效解决梯度消失问题,其函数形式为

(1.5)

如图1-5(b)所示,当输入为正时,输出为正,当输入为负时,输出为0。

对于激活函数,需要注意的一点是,若每个神经元的激活函数都是线性函数,那么任意层数多层感知机都可被简化成一个等价的单层感知器。下面做简单证明,假设线性激活函数为f1(x)=k1x+c1,f2(x)=k2x+c2,那么隐藏层为

(1.6)

输出层为

(1.7)

下面用矩阵形式简化表达,令

则式(1.6)、式(1.7)可以简化为

(1.8)

                      

                                                     

(1.9)

其中,C 为偏置参数矩阵。由于,则图1-4 中的三层结构可以压缩为两层感知机,采用数学归纳法,可以证明对每个神经元的激活函数都是线性函数的多层神经网络,故压缩为单层感知机。

3

前馈神经网络

前馈神经网络(Feedforward Neural Network, FNN)通常由一个输入层、多个隐藏层和一个输出层构成,典型结构如图1-6所示。每层的神经元可以接收前一层神经元的信号,并产生输出到下一层,信号从输入层向输出层单向传播。其中隐藏层可代替人工特征工程进行自动特征提取,其数量以及每层的神经元个数可根据具体任务设定。前馈神经网络结构简单,能够以任意精度逼近任何连续函数,应用广泛。

图1-6 典型的深度神经网络结构

3.1 前馈神经网络的模型

如图1-6所示,若第(l-1)层神经元为,l层神经元为,其层间权重参数矩阵为,偏置向量为,激活函数为,则两层之间的传递计算关系为

(1.10)

以此迭代关系,可完成隐藏层前向计算。

输出层的激活函数往往需要与具体的任务相结合,深度学习中常见的任务有回归(Regression)任务和分类(Classification)任务。如果函数的输出是一个标量(即一个单独的数),我们定义其为回归任务;如果函数的输出为有限的几种可能(例如图片分类),我们定义其为分类任务;回归任务的激活函数为恒等函数,即直接输出输入信号线性变换后的值。分类任务的激活函数常常采用Softmax函数来实现多分类。

Softmax分类模型会有多个输出,且输出个数与类别个数相等,Softmax 函数定义如下:

(1.11)

其中,为样本属于第 k 类的概率,表示最后的隐藏层神经元值。Softmax函数计算示意图如图1-7所示。

图1-7 Softmax激活函数计算示意图

3.2 前馈神经网络的学习

一般而言,对于已经搭建好的多层神经网络,输入的信息依次通过所有神经网络层,最终得到输出结果的过程称为前向传播(Forward Propagation)。因为神经网络的权重参数往往是随机初始化的,导致预测得到的结果与真实结果会存在误差。

现在我们希望根据误差来调节权重参数和偏置,使得预测值更加接近真实值,这种采用“误差反向传播算法”的方法简称反向传播(Back Propagation, BP)。反向传播是深度神经网络中更新权重参数最常用的方式。反向传播是利用预测值与真实值的误差来反向逐层计算权重梯度并进行权重参数的迭代,最终达到收敛。

1. 前向传播

一个完整的神经网络包括前向传播过程和后向传播过程,如图1-8所示。

图1-8 前向、后向传播过程

其中表示第 l 层的第 i 的神经元的输出值。表示参与计算的第 l 层神经元的参数,对应第l层的第 i 个元素与上一层的第 j 个元素的权重系数。例如,第一层隐藏层的计算公式为

(1.12)

第二层隐藏层的计算公式为

(1.13)

第三层隐藏层的计算公式为

(1.14)

输出层公式为

(1.15)

其中,表示Sigmoid激活函数,指经过激活函数的神经元数值。用矩阵的形式可以表示为

(1.16)

(1.17)

其中,l=1, 2, 3, 4表示网络层数

2. 损失函数

通过前向过程进行结果预测得到,损失函数(Loss Function)用来估量模型的输出与真实值 y 之间的差距。损失函数越好,通常模型的预测效果越好,深度学习过程就是对损失函数求最小化的过程。

所谓真实值,通常指经过人工处理标注数据的值(LabeledData),往往对应为监督学习(Supervised Learning)的任务。损失函数的确定也需要依据具体问题而定,例如,回归问题一般采用欧氏距离(Euclidean Distance),如平方损失(Mean Squared Loss)函数,分类问题常用的损失函数如交叉熵损失(Cross Entropy Loss)函数。

平方损失函数采用均方差(Mean Squared Error, MSE)来衡量预测值与真实值的误差,其基本形式如下:

(1.18)

平方损失函数的导数连续,计算简单。假设模型预测与真实值之间的误差服从标准高斯分布

其中为方差。但是平方损失函数容易受异常点的影响,异常值往往带来极大的平方误差,不利于参数的更新。对于分类问题,均方差分布难以满足高斯分布,因此一般不使用平方损失函数。

交叉熵是信息论中的一个重要概念,主要用于度量两个概率分布间的差异性,往往用于分类问题。对于二分类问题,损失函数

(1.19)

对于多分类问题的损失函数,则可以定义为

(1.20)

其中,C 为类别的数量,等于0或者1,如果预测出的类别和样本标记相同则为1,否则为0,为样本属于类别 c 的概率。

在实际深度学习训练任务中,并不一定能保证所有训练样本都是标注好的,若训练样本只有部分数据被标注,这种训练任务一般称为半监督学习任务(Semi-Supervised Learning),半监督学习只对有标注的训练样本求损失函数;若训练样本都没有标注,这种训练任务称为无监督学习(Unsupervised Learning),用于学习样本数据的统计规律或样本数据的内在结构。

3. 反向传播

损失函数给出了预测值与真实值之间的差异,为模型的优化指引方向,即需要调整模型参数。著名数学家高斯提出的最小二乘法(Least Squares Method)是一个经典的方法,然而对于待定系数太多的问题,最小二乘法需要面对大型矩阵求逆计算量较大的问题,为此前人提出了基于迭代算法的优化方法。

具体而言,为了弥合预测值与真实值y 的差异,将误差进行后向传播,并使用梯度下降算法进行模型参数的调整,即采用反向传播算法,调整权重参数的优化算法可采用随机梯度下降(Stochastic Gradient Descent, SGD)算法。

随机梯度下降算法更新权重参数的具体形式如下

(1.21)

(1.22)

其中,权重矩阵的偏导和偏置导数是计算的核心,是学习率(Learning Rate),表示梯度更新步伐的大小。由于神经网络是逐层搭建的,一般需要反向逐层计算得到。下面举一个简单例子来说明多元复合函数求导法则(又称为多元函数的链式法则)。假设可微函数z=f(u,v),且u=h(s,t),v=g(s,t),则z 是s、t 的复合函数。

(1.23)

(1.24)

依照链式法则可计算各参数梯度,如表1-1所示。

表1-1 反向传播计算权重和偏置

对深度神经网络的计算方式,能够总结出什么规律呢? 若以图的角度来审视权重参数的传递路径,可能会更直观。

以图1-8中神经节点相应的权重参数为例,如果将图视为一个有向图,从损失函数 L 出发,有

等四条路径。那么对产生贡献的可以计算为

(1.25)

(1.26)

(1.27)

在训练神经网络时,正向传播和后向传播相互依赖。一方面,在正向传播期间认为是已知模型参数,用来逐层计算,得出神经元预测结果。另一方面,反向传播期间模型参数的偏导数的计算取决于由正向传播给出的隐藏变量的当前值。更新的模型参数则是由优化算法根据最近迭代的反向传播给出的。

总的来说,在初始化模型参数后,交替使用正向传播和反向传播,利用反向传播给出的梯度更新模型参数,直到模型参数收敛。

4

卷积神经网络

传统方法中,读取图像的像素矩阵后,根据具体任务的需要设计相应的滤波器(Filter)。常用的滤波器是由具有专业背景的人设计出来的。同样是边缘检测的任务,由于滤波器的不同,其结果也具有显著差异。

现实生活中,图像或者视频应用的场景各种各样,为每一种场景设计相应的滤波器成本较高。如何根据任务来自适应求解相应的过滤器,显得十分必要。深度学习的设计理念是从大数据中学习,得到过滤器参数,以解决人工依赖问题。

4.1 图像数据的存储

当给出一幅图像时,首先需要思考图像是如何被计算机存储和理解的。图像由像素构成,每一像素由颜色构成。在计算机中,生成电子图像的最小单元为像素,整个图像是由规则排列的像素点阵构成。

图1-9 彩色图像示意图

在如图1-9所示的彩色图像中,每一个像素点由RGB颜色空间表示。换句话说,每一像素通过三个颜色通道表示:红色、绿色和蓝色。在一个8位图像中,每个颜色通道能取到的颜色值为28=256种,即0~255。越亮的区域,像素值越高,对应着较高的强度。相反,较暗的区域像素值较低,对应较低的强度。

目前智能手机拍摄的照片大都是 1000×1000像素以上的彩色照片,按照像素给出的数据规模可以达到1000×1000×3=3000000的量级。如果直接采用深度神经网络处理图像信息,会存在以下问题:①在全连接神经网络中,第一个隐藏层会接收百万级的输入参数,导致参数规模非常巨大,神经网络训练效果非常差,且容易产生过拟合现象。②直接使用深度神经网络,难以保证图像的局部不变性,即缩放、平移、旋转不变性。因此,设计适合图像数据的神经网络是十分必要的。

4.2 传统图像处理算子

对于图像信息的处理,人们首先想到的是借鉴动物大脑处理视觉信息的方法。Hubel和Wiesel等在20世纪50年代研究猫与猴子的视觉大脑皮层时,发现一些神经元能分别对某一小块视觉区域进行回应。

受生物意义上的图像识别的启发,人们在设计计算机识别图像的算法上,采用先通过“感受野”识别局部信息,然后合并成整个视觉图像的策略。为了模拟视神经细胞对图像的感知,图感知算法通常会采用某个算子f对图像进行处理。对于区块信息的处理,假设算子f一次性处理的区块面积为3×3的像素区域,计算模式如图1-10所示。

图1-10 按“感受野”分片处理图像数据

边缘检测(Edge Detection)是图像处理和计算机视觉的基本问题,其目的是标识数字图像中亮度变化明显的点,图像属性中的显著变化通常反映了属性的重要事件和变化。简单来说,边缘检测就是寻找边缘,即区域或对象之间的边界,也即像素变化最快的位置。在实际的边缘检测中,往往只用到一阶和二阶差分。二阶导数还可以说明灰度突变的类型。

在某些情况下,如灰度变化均匀的图像,只利用一阶导数可能找不到边界,此时二阶导数就能提供很有用的信息。二阶导数对噪声比较敏感,解决的方法是先对图像进行平滑滤波,消除部分噪声,再进行边缘检测。利用二阶导数信息的算法是基于过零检测的,因此得到的边缘点数比较少,有利于后续的处理和识别工作。拉普拉斯边缘检测算子是典型的二阶边缘检测算子,该算子采用二阶导数的差分格式。下面讲解一下该式的推导过程。

图1-11为拉普拉斯边缘检测算子的实际效果图。

图1-11 拉普拉斯边缘检测算子过滤效果图

4.3 卷积

在传统方法中,我们所提到的处理边缘的Sobel滤波器和拉普拉斯滤波器均为一种卷积核。通过卷积运算提取图上的特征,如图像像素变化的梯度特征等。同时,一般将卷积运算前后的图数据统称为特征映射(Feature Map),输入图数据称作输入特征图(InputFeature Map),输出图数据称作输出特征图(Output Feature Map)。

图像中的卷积运算又是如何定义的呢? 如图1-12所示为以3×3的两个矩阵计算的形式展示卷积的计算过程。

图1-12 卷积运算示意图

原始图片与特定的神经元做卷积运算,两个3×3的矩阵相乘后再相加,以图1-12为例,有

1×1+6×0+7×(-1)+20×2+5×0+8×(-2)+20×1+4×0+9×(-1)=29

值得注意的是,卷积运算不一定能得到正数,在后续特征图像生成时,会取绝对值或者采用激活函数(如ReLU)处理负值。图1-13更加形象化地展示了传统的图像处理中Sobel算子和拉普拉斯算子等进行卷积计算后的特点。经过Gx运算后,可以观察到在水平方向上有像素梯度的位置会很亮。

同样地,经过Gy运算后,可以观察到在垂直方向上有像素梯度的位置会很亮。拉普拉斯算子没有具体的分量算子,是在矩阵上做二阶导数来提取轮廓。从数学运算上看,卷积作为一种运算方式,用数学语言可以归纳为

从计算效果上看,经过上述几种卷积运算后,可以得到不同的处理结果,实现不同的功能。卷积参数深刻影响着卷积结果,将传统图像处理中的卷积核泛化为一般形式,即卷积核为待定系数,通过深度学习的方式来最终确定。

图1-13 二维Sobel卷积核与拉普拉斯卷积核运算和可视化

4.4 池化

对于分类任务而言,即使物体局部比较模糊,依然能够对图片进行分类,而这种局部模糊化的处理可以用于压缩数据和参数的量。保留主要的特征同时减少参数(或者说降维,效果类似于主成分分析)和计算量。经过局部模糊化后的图片仍然具有平移不变性和特征不变性。

平移不变性指经过平移、旋转、缩放后,卷积仍能检测到图片的特征。特征不变性,也就是我们在图像处理中经常提到的特征的尺度不变性,例如,一只猫的图片被缩小了数倍,我们还能认出这是一张猫的图片,说明这张图片中仍保留着猫最重要的特征,图像压缩时去掉的信息不会影响整图判断,留下的信息具有尺度不变性的特征,可以表达图像的特征。同时,压缩过的图片像素矩阵大大减小,可以提高运算速度。

那么如何进行这种局部模糊化处理呢? 我们采用一种称为池化的算法。池化函数在计算某一位置的输出时,会计算该位置相邻区域的输出的某种总体统计特征,作为该位置的输出。池化算子又分为最大池化(MaxPooling)和平均池化(Average Pooling),计算过程如图1-14所示。

图1-14 二维平均池化与最大池化

平均池化的输出为区域内像素的平均值,而最大池化的输出为区域内像素的最大值。在图像处理中,一般采用最大池化算子。池化算子与卷积算子存在几点差异: ①移动方式有所差异,池化算子每次移动的步幅与其本身窗格大小一致; ②池化过程没有需要学习的参数; ③不改变通道数(高维池化过程)。

一般来说,池化算子包括以下几方面的作用: ①逐渐降低数据体的空间尺寸; ②减少网络中参数的数量; ③减少耗费的计算资源; ④有效控制过拟合。

4.5 填充

填充(Padding)是指在输入高和宽的两侧填充元素。图1-15中,在原输入高和宽的两侧分别添加了值为0的元素,将输入高和宽从4调整为5,使得输出的高与宽由2调整为4。

当没有填充时,原来4×4的矩阵经过卷积后,变为2×2的矩阵,卷积运算对输入矩阵周边的运算次数少于中间的元素,调整后可使周边元素的计算与中间元素的计算次数相当,因此填充可以起到调节输出图像特征大小和输入图像边缘像素计算次数的作用。

图1-15 填充示意图

4.6 步幅

从计算过程上看,从左边的输入数据到右侧的输出数据,是通过以卷积核窗口大小为滑动间隔计算完成的。需要注意的是,更为泛化的卷积运算过程,滑动间隔也是可以变化的,我们将每次滑动的行数和列数定义为步幅(Stride),图1-16是步幅为1和2的卷积计算。

图1-16 步幅为1和2的卷积计算实例

填充和步幅都能改变输出特征图的大小,那么具体如何计算二者对于输出图的影响呢?具体而言,填充可以调大输出特征图的尺寸,而增大步幅则会减小输出图的尺寸。假设输入特征图矩阵的尺寸为,卷积核大小为,步幅为S,则计算输出的特征图尺寸

4.7 典型的卷积神经网络结构

卷积神经网络(Convolutional Neural Network,CNN)的网络结构经过长期发展,目前包含多种网络结构。卷积神经网络主要由三种模块构成: 卷积层、采样层和全连接层。这里介绍图神经网络的先驱工作LeNet-5,1988年由Yann LeCun提出,其中5表示五层结构的意思,用于实现手写字识别功能,其网络结构如图1-17所示,其符号说明如表1-2所示。

图1-17 LetNet-5示意图

表1-2 LetNet-5符号说明

LeNet5是早期非常经典的卷积神经网络,也是网络成功商业化的代表,但它的输入图像太小,加上数据不足,在早期并没有在除手写数字识别之外的其他计算机视觉任务上取得大的突破。

4.8 卷积神经网络与多层感知机的差别

多层感知机(MLP)其实是多个全连接层叠加组合而成的神经网络模型。与多层感知机相比,卷积神经网络把全连接层改成了卷积层和池化,也就是把传统的由一个个多层感知机组成的网络层变成由卷积和池化组成的神经网络层,如图1-18所示。

图1-18 多层感知机与卷积神经网络的比较

对比一下多层感知机的层和由卷积与池化层组合成的卷积神经网络层: 假设存在一个8×8像素的图像,也就是64像素,同时假设有一个9个单元的全连接层,如图1-19所示。

图1-19 卷积神经网络与多层感知机的数据处理模式对比

对于多层感知机模型,这一层总共需要64×9×2=1152个学习参数。因为每一个连接都对应一个权重W 和一个偏置b。对于同样有9个单元的卷积核则是有几个单元就有几个参数,即共有9个学习参数。因为对于不同的区域,共享同一个卷积核,因此就共用同一组参数。由于卷积核的参数共享,即使图片进行了一定的平移操作,图片的特征同样可以被识别出来,确保图片信息的“平移不变性”。

卷积神经网络相对于多层感知机具有以下三个特点。

(1) 局部连接。卷积计算过程中,卷积核心只与特征图矩阵中卷积核心大小的矩阵块进行计算,分片处理,让每个神经元只与输入数据的一个局部区域连接,该连接的空间大小叫作神经元的感受野,会大大减少网络的参数。而一般的深度神经网络,在处理图像这样的高维输入时,让每个神经元都与前一层中的所有神经元进行全连接,这对于像素较多的图是不现实的。

(2) 权值共享。在卷积计算中使用相同的卷积核,用来实现共享参数。每个卷积核与上一层局部连接,同时每个卷积核的所有局部连接都使用同样的参数,这样会大大减少网络的参数,且各个小区块做卷积运算时,并无相互依赖,故可以并行计算。

(3) 池化。它的作用是逐渐降低数据的空间尺寸,这样就能减少网络中参数的数量,使计算资源耗费变少,也能有效控制过拟合。

5

深度学习训练的最优化算法

深度学习模型训练的目的是寻找模型参数来最小化损失函数,属于典型的最优化问题(Optimization Problem,OP)。优化算法的选择是深度学习的重要环节,即使在相同模型结构和数据集中,不同的优化算法也可能导致不同的训练效果。

当神经网络模型结构较为简单且参数较少时,尚能采用最小二乘法求得参数。然而,模型参数维度往往较高,无法直接给出数学上的解析解。最小二乘法需要计算逆矩阵,但其逆矩阵不存在,则无法直接用最小二乘法。梯度下降为代表的迭代法则不受矩阵可逆的约束,仍然可以使用,因此在神经网络中通常采用这类算法。

假设损失函数与权重参数的关系可用图1-20所示的函数关系描述。下面我们利用梯度下降法来寻找使损失函数最小的参数。随机选取一个初始点和学习率来训练模型。计算损失函数点的微分,如果得到的微分值为负,则增加的值(向右移动),如果得到的微分值为正,则减小的值(向左移动)。移动的步长(即学习率)用表示,第一步训练结束后,参数更新为,接着进一步计算损失函数点的微分 ,参数更新为,如此不断循环,每次参数的更新都向使损失函数更小的方向移动,经过多轮迭代后,落在一个局部最小点处,损失函数在此处保持稳定不变(微分为0),便是通过梯度下降法求得的相对最优解,如图1-20所示。

图1-20 梯度降求解过程

高维函数的损失函数在某点的梯度,梯度下降过程类似于在等高线地图上从某一点沿着等高线法线的方向不断移动,直至找到最低点,如图1-21所示。

图1-21 梯度曲面

梯度下降算法自身也存在一些问题,如学习速率的选择,鞍点(Saddle Point)问题以及局域最优化的问题。学习速率设置得太小,收敛速度会非常慢,训练时间过长,学习率设置得过大,则会越过最低点,无法达到最低点。若以一阶导数是否为零来作为判定最小值的标准,则会出现鞍点和局域最小值的问题。

在深度学习中,一般假设损失函数为凸函数,而实际中的数据难以保证预测函数满足凸函数条件。而在多元连续函数中,导数为零的点只能称为驻点,是极值点的必要不充分条件,需要结合黑塞矩阵(Hessian Matrix)做进一步判断。鞍点则是在该点导数为零的点,而在该点的函数值在一个方向是函数的极大值点,在另一个方向是函数的极小值点。梯度下降法会沿着梯度下降的方向搜寻极小值,沿着梯度上升的方向搜寻极大值。

若损失函数为非凸,则梯度下降找到的不一定是全局最优解,可能只是局部最优解,需要改变不同初始值来改变优化过程中的搜索路径,以求得最优解。对于鞍点问题,如果模型曲线是凹凸不平的,从不同的初始点出发,可能会落至不同的局部最小点,导致模型性能不一致,更糟糕的情况是模型最终不是陷入某个局部最优点,而是来回振荡或者停留在鞍点。

如图1-22所示,鞍点处的梯度同样为0,但很明显这个位置并不是最优解,此外,鞍点通常被相同误差值的平面所包围,在高维的情形下,这个鞍点附近的平坦区域范围可能非常大,使得梯度下降法很难脱离区域,可能会长时间滞留在该点附近。

图1-22 鞍点示意图

梯度下降法有三种常见的变体: 批量梯度下降法(Batch Gradient Descent,BGD)、随机梯度下降法(Stochastic Gradient Descent,SGD)和小批量梯度下降法(Mini-Batch GradientDescent,MBGD)。

这三种变体的区别体现在计算梯度所用的数据量大小上,目的是在参数更新准确率和训练时间之间实现平衡。批量梯度下降法每次迭代都使用整个训练集的数据来计算损失函数对参数的梯度,能准确反应模型的移动方向,其缺点是使用全量数据会导致训练速度慢;随机梯度下降法每次迭代只使用一个训练样本,可大大加快训练速度,其缺点是单个样本求得的梯度携带大量噪声,每次迭代并不是都朝着整体最优的方向移动,所以随机梯度下降法虽然训练速度快,但模型准确率会降低;小批量梯度下降法是对随机梯度下降法的一种优化,每次迭代使用一小批样本,这样可以降低随机梯度的方差,使模型收敛更稳定。

为了抑制随机梯度下降法的振荡,若在梯度下降过程加入惯性,也就是在随机梯度下降法的基础上引入一阶动量,则可以在一定程度上抑制随机梯度下降法的振荡,此改进方法称为动量随机梯度下降法(SGD with Momentum,SGD-M)。基于一阶动量的梯度下降法,其参数的更新不仅依赖于当前梯度,还依赖于历史梯度。可以理解为小球从山上滚下来时,不会在鞍点停留,而是由于惯性继续向前冲过鞍点,甚至有可能冲出局部最小点继续前进的过程。基于动量的梯度下降法的迭代更新规则可表示为

(1.28)

(1.29)

其中,是t-1轮迭代的梯度,表示动量的累加,且初始值=0,为阻尼系数,为学习速率,为权重矩阵历经第 t 轮迭代后的值。

从式(1.28)、式(1.29)可以看出,动量随机梯度下降法中存在两个额超参数: (阻尼系数)和(学习速率)。

特别地,若=0,则动量随机梯度下降法退化为随机梯度下降法,若=1,则可直观地表达为的累计。

如图1-23所示,迭代之初,符号未变,故的符号与一致,能促进权重系数的学习; 随着迭代的进行,跨过0变换符号后,尚未来得及变换符号,又能避免偏离极值太远; 综合来看,动量随机梯度下降法相较于随机梯度下降法更能加速学习效率。

图1-23 考虑动量的梯度更新过程

梯度自适应优化算法(Adaptive Gradient Algorithm,AdaGrad)独立地适应所有模型参数的学习率,对于每一维的参数空间,采用的学习速率不同,其梯度更新方程如下:

(1.30)

(1.31)

(1.32)

其中,☉表示向量的元素积,为梯度累积变量,初始化为0,是全局学习速率,是防止除零操作设定的正常实数值,一般取10-6。梯度自适应优化算法会记录过去所有梯度的平方和,因此,随着迭代次数的增加,更新量会趋近于0,直至完全不更新。即初始阶段激励收敛,后期则逐渐惩罚收敛。

梯度自适应优化算法的学习率不断衰退,会使得很多任务尚未达到最优解,其学习率已经过量减小。为了改善这个问题,有人提出了RMSProp算法。RMSProp算法将这些梯度按元素平方做指数加权移动平均,其他部分则与梯度自适应优化算法保持一致,其梯度更新规则为

(1.33)

(1.34)

(1.35)

其中,0≤<1为超参数,自变量每个元素的学习速率在迭代过程中不再一直降低,改善了AdaGrad算法。

在实战中,更常被使用的是自适应动量随机优化算法(Adaptive Moment Estimation,Adam)。自适应动量随机优化算法可以理解为加了动量的RMSProp算法,同时使用动量和自适应学习率来加快模型收敛的速度。除了像RMSProp一样存储了过去梯度的平方的指数衰减平均值,也像动量一样保持了过去梯度的指数衰减平均值。对于动量的累计采用指数移动平均,具体如下:

以上是关于深度学习概述:从基础概念计算步骤到调优方法|赠书的主要内容,如果未能解决你的问题,请参考以下文章

赠书福利!《深度学习框架PyTorch:入门与实践》

深度神经网络全面概述:从基本概念到实际模型和硬件基础

赠书 | 人工智能识万物:卷积神经网络的前世今生

话题留言赠书Tensorflow + PyTorch 深度学习从算法到实战

云计算架构设计6大原则,你遵循了吗?| 赠书

深度学习基础概念理解