第八章 深度学习中的优化
官网
python实现代码
2020-2-15 深度学习笔记8 - 深度学习中的优化1(与纯优化区别-基于梯度下降,神经网络优化-下降到足够小即可)
2020-2-16 深度学习笔记8 - 深度学习中的优化2(基本算法-梯度下降/动量,参数初始化策略)
2020-2-17 深度学习笔记8 - 深度学习中的优化3(自适应学习率算法-AdaGrad / RMSProp / Adam,二阶近似方法-牛顿法 / 共轭梯度 / BFGS)
元算法将不同的分类器组合起来,具体使用有多种形式,可以是不同算法的集成,也可以是不同算法在不同设置下的集成,还可以是数据集不同部分分配给不同分类器之后的集成。
例如:bagging, boosting, AdaBoost
许多优化技术并非真正的算法,而是一般化的模板,可以特定地产生算法,或是并入到很多不同的算法中。
1.批标准化(Batch Normalization)–自适应的重参数化的方法
normalizaiton让每个特征都有均值为0,方差为1的分布
批标准化 (Ioffe and Szegedy, 2015) 是优化深度神经网络中最激动人心的最新创新之一。实际上它并不是一个优化算法,而是一个自适应的重参数化的方法,试图解决训练非常深的模型的困难。
非常深的模型会涉及多个函数或层组合。在其他层不改变的假设下,梯度用于如何更新每一个参数。在实践中,我们同时更新所有层。当我们进行更新时,可能会发生一些意想不到的结果,这是因为许多组合在一起的函数同时改变时,计算更新的假设是其他函数保持不变。
【补充-为什么要标准化】
(以下摘自https://zhuanlan.zhihu.com/p/34879333)
随着训练的进行,网络中的参数也随着梯度下降在不停更新。
上述这一现象叫做Internal Covariate Shift【内部协变量偏移】。Internal Covariate Shift一个较规范的定义为:在深层网络训练的过程中,由于网络中参数变化而引起内部结点数据分布发生变化的这一过程。
Internal Covariate Shift会带来什么问题呢?
(1)上层网络需要不停调整来适应输入数据分布的变化,导致网络学习速度的降低
梯度下降的过程会让每一层的参数发生变化,进而使得每一层的线性与非线性计算结果分布产生变化。后层网络就要不停地去适应这种分布变化,这个时候就会使得整个网络的学习速率过慢。
(2)网络的训练过程容易陷入梯度饱和区,减缓网络收敛速度
当我们在神经网络中采用饱和激活函数(saturated activation function)时,例如sigmoid,tanh激活函数,很容易使得模型训练陷入梯度饱和区(saturated regime)。
我们如何减缓Internal Covariate Shift?
要缓解ICS的问题,就要明白它产生的原因。
ICS产生的原因是由于参数更新带来的网络中每一层输入值分布的改变,并且随着网络层数的加深而变得更加严重,因此我们可以通过 固定每一层网络输入值的分布来对减缓ICS问题 。
(1)白化(Whitening)
白化
(Whitening)是机器学习里面常用的一种规范化数据分布的方法,主要是PCA白化与ZCA白化。白化是对输入数据分布进行变换,进而达到以下两个目的:
通过白化操作,我们可以减缓ICS的问题,进而固定了每一层网络输入分布,加速网络训练过程的收敛(LeCun et al.,1998b;Wiesler&Ney,2011)。
(2)Batch Normalization提出
既然白化可以解决这个问题,为什么我们还要提出别的解决办法?
当然是现有的方法具有一定的缺陷,白化主要有以下两个问题:
为解决上面两个问题,我们的思路很简单,
于是就有了简化+改进版的白化——Batch Normalization。
既然白化计算过程比较复杂,那我们就简化一点,比如我们可以尝试单独对每个特征进行normalizaiton就可以了,让每个特征都有均值为0,方差为1的分布就OK。
另一个问题,既然白化操作减弱了网络中每一层输入数据表达能力,那我就再加个线性变换操作,让这些数据再能够尽可能恢复本身的表达能力就好了。
图中可以看到共有8列,代表当前训练样本的batch中共有8个样本,每一行代表当前层神经元的一个节点,可以看到当前层共有4个神经元结点,即维度为4。我们可以看到,每行的数据分布都不同。
对于第一个神经元,我们求得 μ 1 = 1.65 \mu_{1}=1.65 μ1=1.65, σ 1 2 = 0.44 \sigma_{1}^{2}=0.44 σ12=0.44,对第一行数据进行normalize得到新的值[-0.98,-0.23,-0.68,-1.13,0.08,0.68,2.19,0.08],同理我们可以计算出其他输入维度归一化后的值。
计算过程如下:
(1+1.5+1.2+0.9+1.7+2.1+3.1+1.7)/8=1.65,均值mean
((1-1.65)2+(1.5-1.65)2+…+(1.7-1.65)2)/8=3.52/8=0.44,方差
0.44 \sqrt {0.44} 0.44=0.66,标准差standard deviation(均方差)
归一化方法有2种,这里采用的是0均值标准化
min-max标准化(Min-Max Normalization)(线性函数归一化)
把数变为【0,1】之间的小数。转换函数:(X-Min)/(Max-Min)
其中:max为样本数据的最大值,min为样本数据的最小值,Mean表示数据的均值。
缺陷:当有新数据加入时,可导致max和min的变化,需要重新定义。
0均值标准化(Z-score standardization)
归一化后如下图:
通过上面的变换,我们解决了第一个问题,即用更加简化的方式来对数据进行规范化,使得各层的输入每个特征的分布均值为0,方差为1。
Normalization操作我们虽然缓解了ICS问题,让每层网络的输入数据分布都变得稳定,但却导致了数据表达能力的缺失。也就是我们通过变换操作改变了原有数据的信息表达(representation ability of the network),使得底层网络学习到的参数信息丢失。
因此,BN又引入了两个可学习(learnable)的参数 γ \gamma γ和 β \beta β。这两个参数的引入是为了恢复数据本身的表达能力,对规范化后的数据进行线性变换,即 Z ~ j = γ j Z ^ j + β j \tilde{Z}_{j}=\gamma_{j} \hat{Z}_{j}+\beta_{j} Z~j=γjZ^j+βj,通过上面的步骤,我们就在一定程度上保证了输入数据的表达能力。
以上就是整个Batch Normalization在模型训练中的算法和思路。
2.坐标下降(Coordinate descent)
坐标下降法属于一种非梯度优化的方法,它在每步迭代中沿一个坐标的方向进行线性搜索(线性搜索是不需要求导数的),通过循环使用不同的坐标方法来达到目标函数的局部极小值。
在某些情况下,将一个优化问题分解成几个部分,可以更快地解决原问题。
如果我们相对于某个单一变量 x i x_i xi最小化f (x),然后相对于另一个变量 x j x_j xj,反复循环所有的变量,我们会保证到达局部极小值。这种做法被称为坐标下降
(coordinate descent),因为我们一次优化一个坐标。更一般地, 块坐标下降(block coordinate descent)是指对于某个子集的变量同时最小化。术语 “坐标下降’’ 通常既指块坐标下降,也指严格的单个坐标下降。
当优化问题中的不同变量能够清楚地分成相对独立的组,或是当优化一组变量明显比优化所有变量效率更高时,坐标下降最有意义。
例如,考虑代价函数
J ( H , W ) = ∑ i , j ∣ H i , j ∣ + ∑ i , j ( X − W ⊤ H ) i , j 2 J(H,W)=\sum_{i,j}|H_{i,j}|+\sum_{i,j}(X−W^⊤H)^2_{i,j} J(H,W)=i,j∑∣Hi,j∣+i,j∑(X−W⊤H)i,j2
我们可以将训练算法的输入分成两个集合:参数W和H。最小化关于这两者之一的任意一组变量的目标函数都是凸问题。因此,块坐标下降允许我们使用高效的凸优化算法,交替固定H优化W和固定W优化H。
3.Polyak平均
Polyak平均 (Polyak and Juditsky, 1992) 会平均优化算法在参数空间访问轨迹中的几个点。
如果t次迭代梯度下降访问了点 θ ( 1 ) , … , θ ( t ) \boldsymbol{\theta}^{(1)}, \ldots, \boldsymbol{\theta}^{(t)} θ(1),…,θ(t),那么Polyak平均算法的输出是 θ ^ ( t ) = 1 t ∑ i θ ( i ) \hat{\boldsymbol{\theta}}^{(t)}=\frac{1}{t} \sum_{i} \boldsymbol{\theta}^{(i)} θ^(t)=t1∑iθ(i),在某些问题中,如梯度下降应用于凸问题时,这种方法具有较强的收敛保证。
当应用于神经网络时,其验证更多是启发式的,但在实践中表现良好。基本想法是,优化算法可能会来回穿过山谷好几次而没经过山谷底部附近的点。尽管两边所有位置的均值应比较接近谷底。
当应用Polyak平均于非凸问题时,通常会使用指数衰减计算平均值:
θ ^ ( t ) = α θ ^ ( t − 1 ) + ( 1 − α ) θ ( t ) \hatθ^{(t)}=α\hatθ^{(t−1)}+(1−α)θ^{(t)} θ^(t)=αθ^(t−1)+(1−α)θ(t)
4.监督预训练-得到比较好的局部最优解
有时,如果模型太复杂难以优化,或是如果任务非常困难,直接训练模型来解决特定任务的挑战可能太大。有时训练一个较简单的模型来求解问题,然后使模型更复杂会更有效。训练模型来求解一个简化的问题,然后转移到最后的问题,有时也会更有效些。这些在直接训练目标模型求解目标问题之前,训练简单模型求解简化问题的方法统称为预训练
(pretraining)。
贪心算法
(greedy algorithm)将问题分解成许多部分,然后独立地在每个部分求解最优值。令人遗憾的是,结合各个最佳的部分不能保证得到一个最佳的完整解。贪心算法也可以紧接一个精调(fine-tuning)阶段,联合优化算法搜索全问题的最优解。使用贪心解初始化联合优化算法,可以极大地加速算法,并提高寻找到的解的质量。
在贪心监督预训练的原始版本 (Bengio et al., 2007c) 中,每个阶段包括一个仅涉及最终神经网络的子集层的监督学习训练任务。
贪心监督预训练的一个例子如上图所示,其中每个附加的隐藏层作为浅层监督多层感知机的一部分预训练,以先前训练的隐藏层输出作为输入。最初由Bengio et al. (2007d) 提出的假说是,其有助于更好地指导深层结构的中间层的学习。一般情况下,预训练对于优化和泛化都是有帮助的。
【补充】
为什么预训练?
深度网络存在以下缺点:
解决方法:逐层贪婪训练。
无监督预训练(unsupervised pre-training)即训练网络的第一个隐藏层,再训练第二个,最后用这些训练好的网络参数值作为整个网络参数的初始值。
无监督学习—>参数初始值;监督学习—>fine-tuning,即训练有标注样本。
经过预训练最终能得到比较好的局部最优解。
常用预训练方法:stacked RBM、stacked sparse-autoencoder、stacked denoise-autoencoder
5.设计有助于优化的模型
改进优化的最好方法并不总是改进优化算法。相反,深度模型中优化的许多改进来自于设计易于优化的模型。
在实践中,选择一族容易优化的模型比使用一个强大的优化算法更重要。神经网络学习在过去 30 年的大多数进步主要来自于改变模型族,而非改变优化过程。1980 年代用于训练神经网络的带动量的随机梯度下降,仍然是现代神经网络应用中的前沿算法。
具体来说,现代神经网络的设计选择体现在层之间的线性变换,几乎处处可导的激活函数,和大部分定义域都有明显的梯度。特别地,创新的模型,如 LSTM,整流线性单元和 maxout 单元都比先前的模型(如基于 sigmoid 单元的深度网络)使用更多的线性函数。这些模型都具有简化优化的性质。线性函数在一个方向上一致增加,所以即使模型的输出远离正确值,也可以简单清晰地计算梯度,使其输出方向朝降低损失函数的方向移动。
现代神经网络的设计方案旨在使其局部梯度信息合理地对应着移向一个遥远的解。
其他的模型设计策略有助于使优化更简单。例如,层之间的线性路径或是跳跃连接减少了从较低层参数到输出最短路径的长度,因而缓解了梯度消失的问题(Srivastava et al., 2015)。
6.延拓法和课程学习
延拓法
(continuation method)是一族通过挑选初始点使优化更容易的方法,以确保局部优化花费大部分时间在表现良好的空间。
延拓法背后想法是构造一系列具有相同参数的目标函数。为最小化代价函数J(θ),我们构建新的代价函数 { J ( 0 ) , … , J ( n ) } \left\{J^{(0)}, \ldots, J^{(n)}\right\} {J(0),…,J(n)}。这些代价函数的难度逐步提高,其中 J ( 0 ) J^{(0)} J(0)是最容易最小化的, J ( n ) J^{(n)} J(n)是最难的,真正的代价函数驱动整个过程。当我们说 J ( i ) 比 J ( i + 1 ) J^{(i)}比J^{(i+1)} J(i)比J(i+1)更容易时,是指在更多的θ空间上表现良好。随机初始化更可能落入局部下降可以成功最小化代价函数的区域,因为其良好区域更大。这系列代价函数设计为前一个解是下一个的良好初始点。因此,我们首先解决一个简单的问题,然后改进解以解决逐步变难的问题,直到我们求得真正问题的解。
尽管延拓法最初用来解决局部最小值的问题,而局部最小值已不再认为是神经网络优化中的主要问题了。幸运的是,延拓法仍然有所帮助。延拓法引入的简化目标函数能够消除平坦区域,减少梯度估计的方差,提高 Hessian 矩阵的条件数,使局部更新更容易计算,或是改进局部更新方向与朝向全局解方向之间的对应关系。
Bengio et al. (2009) 指出被称为课程学习
(curriculum learning)或者塑造
(shaping)的方法可以被解释为延拓法
。课程学习被证实为与人类教学方式一致:教师刚开始会展示更容易、更典型的示例,然后帮助学习者在不太显然的情况下提炼决策面。