深度学习之几种模型的优化技术

数据增强(Data Augmentation)

人工智能,或者说计算机视觉的一个最终目标在于构建一个真正可适用于真实世界复杂环境的系统。而就目前所应用的机器学习系统而言,大部分采用了有监督的学习方法,也必然导致了需要广泛收集图像样本,并进行对应的图像标注的工作。而人力时有穷尽,高质量的样本集图片又是构建一个优秀的机器学习系统的关键因素。使用适当的数据增强方法可以将数据集的数量增大十倍以上,从而极大化利用小样本集中的每个样本,使之也可以训练得到一个较好的机器学习模型。数据增强方法也可以提高模型的鲁棒性,防止其易在训练中出现过拟合的现象。

常用的数据增强方法主要来自数字图像处理中的几何变换,但不改变图像中的像素值,而是改变了其空间位置,借此希望卷积神经网络学习到图像中更多的不变性特征,也有利于提高其泛化性能。

以下将对各种方法做简单的列举与说明。

平移(Shift)变换:对原始图片在图像平面内以某种方式(预先定义或者随机方式确定平移的步长、范围及其方向)进行平移。

翻转(Flip)变换:沿竖直或者水平方向对原始图片进行翻转。

随机裁剪(Random Crop):随机定义感兴趣区域以裁剪图像,相当于增加随机扰动。

噪声扰动(Noise):对图像随机添加高斯噪声或者椒盐噪声等。

对比度变换(Contrast):改变图像对比度,相当于在HSV空间中,保持色调分量H不变,而改变亮度分量V和饱和度S,用于模拟现实环境的光照变化。

缩放变换(Zoom):以设定的比例缩小或者放大图像。

尺度变换(Scale):与缩放变换有点类似,不过尺度变换的对象是图像内容而非图像本身(可以参考SIFT特征提取方法),构建图像金字塔以得到不同大小、模糊程度的图像。

权重初始化(weight initialization)

传统神经网络之所以一直没办法加深网络的深度,一个很重要的原因在于使用随机梯度下降法训练时,随着训练迭代过程的深入会出现梯度弥散的现象,也就导致了神经网络无法有效地从样本中进行学习。而造成梯度弥散的一部分原因应该归结于传统神经网络使用了权重随机初始化。

而现代深度神经网络抛弃了随机初始化的方法,转而使用高斯初始化、 Xavier算法等来解决这一问题。

所谓的高斯初始化方法是指随机选取一个固定均值(如0等)和固定方差(如0.01等)的高斯分布中的值作为网络各个神经元的权重参数的初值,从而保证权重参数训练开始时符合高斯分布,以期获得更好的结果。这是一种常用的权重初始化方法。

Xavier算法是Glorot于2010年提出的权值初始化方法。相比与随机初始化或者高斯初始化方法中的随机选取,Xavier算法为每一个深度神经网络的初始权值进行了个性定制,因为他是根据输入输出神经元的个数来进行权重的初始化。该算法假设对于一个网络有n个线性神经元,其初始权值为W,网络输出为Y,即:

Y=W_1 X_1+W_2 X_2+⋯+ W_n X_n (1-1)

计算每个神经元输出的方差如下:

Var(W_i X_i )=E[X_i ]^2 Var(W_i )+E[W_i ]^2 Var(X_i ) + Var(W_i )Var(X_i ) (1-2)

假设所有输入权重的均值为0,上述公式可以简化如下:

Var(W_i X_i )= Var(W_i )Var(X_i ) (1-3)

同时假设Xi和Wi都是独立同分布的,可得输出Y的方差:

Var(Y)=Var(W_1 X_1+W_2 X_2+⋯+ W_n X_n )=nVar(W_i )Var(X_i ) (1-4)

故如果我们要求输出分布要与输入的分布一样,则nVar(Wi)的值应为1。

尽管算法中使用了诸多假设,可是在实际应用过程中取得了良好的效果。直观上来讲,对原始的Xavier算法来说,假设输入的均值为0对于传统的神经网络是合理的。因为其初始化层之后是非线性激活层(tanh,sigmoid等)中的激活函数在0值附近的梯度值最大。而对于现代深度神经网络而言,由于其线性整流单元(ReLU)对于输入的响应有一半为0,故He等提出以下公式作为替代。

Var(W_i )=2/n_in (1-8)

随机梯度下降法(Stochastic Gradient descent)

梯度下降法(Gradient descent)是当前最为受欢迎的优化算法之一,也是最常用的深度神经网络优化方法。它通过沿着当前函数点所对应的梯度的反方向进行迭代搜索,从而找到目标函数的极值点。许多学者对其提出了改进算法。

标准梯度下降法可以表征为:

θ(t+1)=θ_t- η∇θ E(L(θ_t) (1-9)

其中η为每次迭代的学习率,L(θ)为目标函数。E[L(θ)]整个数据集的数学期望。

标准梯度下降法要求在每次迭代的时候都要计算整个数据集的梯度方向。它可以保证凸目标函数可以收敛到全局最小点,而对于非凸目标函数至少可以收敛到局部极值点。近几十年来,样本数据的增长速度远远大于处理器的计算能力的增长。从这个角度上来说,统计机器学习方法的局限在于计算能力而不在于样本量的大小。对于小样本学习中标准梯度下降法是适用的,但是应用于大数据集时是极其缓慢的,整个数据集无法一次性装载进内存中的情况越来越普遍。因此标准梯度下降法无法胜任于现代大规模数据的优化任务,此时随机梯度下降法 (stochastic gradient descent, SGD)的应用效果要远远好于标准梯度下降法。

相比于计算整个数据集的梯度方向,随机梯度下降法(SGD)以从训练集中随机选取的单个样本来估计目标梯度,以迭代更新参数θ。

θ(t+1)=θ_t- η_t ∇θ L(θ_t;x^((t) ),y^((t) )) (1-10)

在实际应用过程中,每次的参数更新并不是根据单个样本计算的,而是由所定义的最小批量样本(mini-batch)来计算的。这可以降低单个样本参数更新的剧烈波动并使收敛过程更加稳定。由于采用批量样本并不能完全代表数据集的梯度方向,其参数更新的波动也是无可避免的。但是这种波动一定程度上使其能够跳转到潜在的更好的局部极小点,并且最终到达全局最小点。尽管理论上,随机梯度下降法(SGD)可以渐进收敛,但是在实际应用过程中仍有许多挑战。

首先,收敛的速度取决于学习率η,一个合适的学习率并不是那么容易确定的。如果学习率太小会导致收敛过程极其缓慢,而过大的学习率η将会阻碍模型收敛并导致目标函数在最小值附近波动甚至发散。其次,对于神经网络这种高度非线性任务而言,其目标函数通常都有大量的次优局部极小点,为保证收敛到全局最小点需要避免训练过程陷入局部极小点中。

对于学习率或者学习策略的选择,可以参考以下方法:

- 选取一个足够小的,在第一次迭代中可以收敛的常数值(或选取两个取其均值),如果收敛速度有所下降,取η/2作为新的学习率;

- 在每次迭代之后引入评估机制,当两次迭代间的变化小于某个设定阈值时减小学习率。

为了避免训练陷入局部极小点,Qian等提出了基于动量(momentum)的梯度下降学习算法,通过增加历史参数更新的权重项,加速当前参数更新的过程并减少振荡。

ν(t+1)=〖γν〗_t- η_t ∇θ L(θ_t;x^((t) ),y^((t) )) (1-11)

θ(t+1)=θ_t+ν(t+1) (1-12)

其中ν_(t+1)是当前的更新向量,γ即为动量,通常设为0.9或者其他常数。

2013年,Sutskever等对传统动量算法改进动量更新过程使得训练更加稳定。而Recht等提出并行SGD以适应现代海量数据集的训练任务。

批规范化(Batch normalization)

当训练一个深度神经网络时,由于各层参数不断变化,所以各层输入的概率分布也在不断的变化,也导致了非线性激活函数(如sigmoid等)正负两边都会饱和,使得训练迭代的过程变得极其缓慢甚至无法进行。这时候,通常需要采用较小的学习率以及精细进行权重初始化。loffe等将这种现象称为“内部协方差偏移”(internal covariate shift),并提出了批规范化(Batch normalization,BN)解决此类问题。

该论文中提出在每次随机梯度下降迭代时,在最小批量样本(mini-batch)内做规范化操作,使得输出结果各个维度的均值为0,方差为1,有效地避免了非线性激活函数的饱和问题(以sigmoid为例,观察sigmoid函数即可知,该函数输入集中在0附近时,其输出梯度较大);同时也让梯度变化受参数及其初值的影响减小。

假设对当前隐含层执行规范化,其输入有d个,分别为 x=〖[x_1,x_1,…,x_d]〗^T,则其第k维输出如下:

x ̂k = (x_k-μβ)/√(δ_β^2+ϵ) (1-13)

其中,μβ和δβ^2分别为最小批量样本的均值和方差。

为了加强其表示能力,原作中引入了一对可学习参数 γ,β,使得:

y_k=〖BN〗_(γ,β) (x_k )= γx ̂_k+β (1-14)

总体而言,批规范化(Batch normalization)作用可以归纳如下:

(1) 可以使用更高的学习率,加快了训练速度;

(2) 可以移除或使用较低的dropout(下一小节将作介绍)。dropout是常用的防止过拟合的方法,较低的dropout也可以提高训练速度。

(3) 减少图像预处理的使用。由于现在训练迭代次数降低,所以可以对样本数据少做一些图像扭曲,让神经网络多从真实的数据中学习。

当然,对于上述问题的解决办法并不是唯一的,Razvan等提出的自然梯度(Natural Gradient)也是对解决这一问题的一种思路。

Dropout

众所周知,过拟合问题一直是机器学习的算法的致力于解决的问题。对于大型神经网络来说,其参数规模相比于浅层学习算法有了跃进式的增加,所以相对来说也更加容易发生过拟合的现象。而为了解决过拟合问题,一般会采用集成方法,即同时训练多个模型进行组合,然而这种方法费时费力也不能保证取得预期效果。

2012年,Hinton等提出Dropout用于解决神经网络训练易过拟合的问题。通过在其训练过程中,按照事先规定的概率暂时屏蔽掉其中的某些神经元。由于这种屏蔽是暂时而是随机的,对于随机梯度下降来说,相当于每一次批量样本的训练均是在训练一个新的网络。极端情况下,对于一个n节点的网络,相当于同时在训练2^n个不同网络模型, 但此时需要优化的参数数量确实不变的,这也一定程度上符合传统的集成方法的思想而同时解决了其费时的问题。

其数学表达如下:

y= εx (1-15)

其中,ε以一定的概率p等于0,使得该神经元节点x暂时被屏蔽。

版权声明:本文为CSDN博主「csuzhaoqinghui」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/csuzhaoqinghui/article/details/72770546

推荐阅读