2020-2-18 深度学习笔记8 - 深度学习中的优化4(优化策略和元算法-- 批标准化 / 坐标下降 / Polyak平均 / 监督预训练 /设计有助于优化的模 / 延拓法和课程学习)

第八章 深度学习中的优化

官网
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白化。白化是对输入数据分布进行变换,进而达到以下两个目的:

  • 使得输入特征分布具有相同的均值与方差。其中PCA白化保证了所有特征分布均值为0,方差为1;而ZCA白化则保证了所有特征分布均值为0,方差相同。
  • 去除特征之间的相关性。

通过白化操作,我们可以减缓ICS的问题,进而固定了每一层网络输入分布,加速网络训练过程的收敛(LeCun et al.,1998b;Wiesler&Ney,2011)。

(2)Batch Normalization提出
既然白化可以解决这个问题,为什么我们还要提出别的解决办法?
当然是现有的方法具有一定的缺陷,白化主要有以下两个问题

  • 白化过程计算成本太高,并且在每一轮训练中的每一层我们都需要做如此高成本计算的白化操作。
  • 白化过程由于改变了网络每一层的分布,因而改变了网络层中本身数据的表达能力。底层网络学习到的参数信息会被白化操作丢失掉。

为解决上面两个问题,我们的思路很简单,

  • 一方面,我们提出的normalization方法要简化计算过程;
  • 另一方面又需要经过规范化处理后让数据尽可能保留原始的表达能力。

于是就有了简化+改进版的白化——Batch Normalization。

既然白化计算过程比较复杂,那我们就简化一点,比如我们可以尝试单独对每个特征进行normalizaiton就可以了,让每个特征都有均值为0,方差为1的分布就OK。

另一个问题,既然白化操作减弱了网络中每一层输入数据表达能力,那我就再加个线性变换操作,让这些数据再能够尽可能恢复本身的表达能力就好了。
在这里插入图片描述
图中可以看到共有8列,代表当前训练样本的batch中共有8个样本,每一行代表当前层神经元的一个节点,可以看到当前层共有4个神经元结点,即维度为4。我们可以看到,每行的数据分布都不同。

对于第一个神经元,我们求得 μ 1 = 1.65 \mu_{1}=1.65 , σ 1 2 = 0.44 \sigma_{1}^{2}=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.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)

    • 这种方法给与原始数据的均值(mean)和标准差(standard deviation)进行数据的标准化。经过处理的数据符合标准正态分布,即均值为0,标准差为1。
    • 转换函数:(X-Mean)/(Standard deviation)
    • 这种方法,新的数据由于对方差进行了归一化,这时候每个维度的量纲其实已经等价了,每个维度都服从均值为0、方差1的正态分布。在计算距离的时候,每个维度都是去量纲化的,避免了不同量纲的选取对距离计算产生的巨大影响。
      • 无量纲化,也称为数据的规范化,是指不同指标之间由于存在量纲不同致其不具可比性,故首先需将指标进行无量纲化,消除量纲影响后再进行接下来的分析。
      • 常见的无量纲化处理方法主要有极值化、标准化、均值化和标准差化方法,而最常使用的是标准化方法。
      • 标准化方法处理后的各指标均值都为0,标准差都为1,它只反映了各指标之间的相互影响,在无量纲化的同时也抹杀了各指标之间变异程度上的差异,因此,标准化方法并不适用于多指标的综合 评价中。
    • 所以,涉及到计算点与点之间的距离,如利用距离度量来计算相似度、PCA、LDA,聚类分析等,并且数据量大(近似正态分布),可考虑该方法。

归一化后如下图:
在这里插入图片描述
通过上面的变换,我们解决了第一个问题,即用更加简化的方式来对数据进行规范化,使得各层的输入每个特征的分布均值为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} ,通过上面的步骤,我们就在一定程度上保证了输入数据的表达能力。

以上就是整个Batch Normalization在模型训练中的算法和思路。

2.坐标下降(Coordinate descent)

坐标下降法属于一种非梯度优化的方法,它在每步迭代中沿一个坐标的方向进行线性搜索(线性搜索是不需要求导数的),通过循环使用不同的坐标方法来达到目标函数的局部极小值。

在某些情况下,将一个优化问题分解成几个部分,可以更快地解决原问题。
如果我们相对于某个单一变量 x i x_i 最小化f (x),然后相对于另一个变量 x j x_j ,反复循环所有的变量,我们会保证到达局部极小值。这种做法被称为坐标下降(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}
我们可以将训练算法的输入分成两个集合:参数W和H。最小化关于这两者之一的任意一组变量的目标函数都是凸问题。因此,块坐标下降允许我们使用高效的凸优化算法,交替固定H优化W和固定W优化H。

3.Polyak平均

Polyak平均 (Polyak and Juditsky, 1992) 会平均优化算法在参数空间访问轨迹中的几个点。

如果t次迭代梯度下降访问了点 θ ( 1 ) , , θ ( t ) \boldsymbol{\theta}^{(1)}, \ldots, \boldsymbol{\theta}^{(t)} ,那么Polyak平均算法的输出是 θ ^ ( t ) = 1 t i θ ( i ) \hat{\boldsymbol{\theta}}^{(t)}=\frac{1}{t} \sum_{i} \boldsymbol{\theta}^{(i)} ,在某些问题中,如梯度下降应用于凸问题时,这种方法具有较强的收敛保证。

当应用于神经网络时,其验证更多是启发式的,但在实践中表现良好。基本想法是,优化算法可能会来回穿过山谷好几次而没经过山谷底部附近的点。尽管两边所有位置的均值应比较接近谷底。

当应用Polyak平均于非凸问题时,通常会使用指数衰减计算平均值:
θ ^ ( t ) = α θ ^ ( t 1 ) + ( 1 α ) θ ( t ) \hatθ^{(t)}=α\hatθ^{(t−1)}+(1−α)θ^{(t)}

4.监督预训练-得到比较好的局部最优解

有时,如果模型太复杂难以优化,或是如果任务非常困难,直接训练模型来解决特定任务的挑战可能太大。有时训练一个较简单的模型来求解问题,然后使模型更复杂会更有效。训练模型来求解一个简化的问题,然后转移到最后的问题,有时也会更有效些。这些在直接训练目标模型求解目标问题之前,训练简单模型求解简化问题的方法统称为预训练(pretraining)。

贪心算法(greedy algorithm)将问题分解成许多部分,然后独立地在每个部分求解最优值。令人遗憾的是,结合各个最佳的部分不能保证得到一个最佳的完整解。贪心算法也可以紧接一个精调(fine-tuning)阶段,联合优化算法搜索全问题的最优解。使用贪心解初始化联合优化算法,可以极大地加速算法,并提高寻找到的解的质量。

在贪心监督预训练的原始版本 (Bengio et al., 2007c) 中,每个阶段包括一个仅涉及最终神经网络的子集层的监督学习训练任务。
在这里插入图片描述
贪心监督预训练的一个例子如上图所示,其中每个附加的隐藏层作为浅层监督多层感知机的一部分预训练,以先前训练的隐藏层输出作为输入。最初由Bengio et al. (2007d) 提出的假说是,其有助于更好地指导深层结构的中间层的学习。一般情况下,预训练对于优化和泛化都是有帮助的。

【补充】
为什么预训练?
深度网络存在以下缺点:

  • 网络越深,需要的训练样本数越多。(深层网络意味着特征比较多,机器学习里面临多特征:1.多样本 2.规则化 3.特征选择)
  • 多层神经网络参数优化是个高阶非凸优化问题,常收敛较差的局部解
  • 梯度扩散问题。BP算法计算出的梯度随着深度向前而显著下降,导致前面网络参数贡献很小,更新速度慢。

解决方法:逐层贪婪训练。
无监督预训练(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^{(0)} 是最容易最小化的, J ( n ) J^{(n)} 是最难的,真正的代价函数驱动整个过程。当我们说 J ( i ) J ( i + 1 ) J^{(i)}比J^{(i+1)} 更容易时,是指在更多的θ空间上表现良好。随机初始化更可能落入局部下降可以成功最小化代价函数的区域,因为其良好区域更大。这系列代价函数设计为前一个解是下一个的良好初始点。因此,我们首先解决一个简单的问题,然后改进解以解决逐步变难的问题,直到我们求得真正问题的解。

尽管延拓法最初用来解决局部最小值的问题,而局部最小值已不再认为是神经网络优化中的主要问题了。幸运的是,延拓法仍然有所帮助。延拓法引入的简化目标函数能够消除平坦区域,减少梯度估计的方差,提高 Hessian 矩阵的条件数,使局部更新更容易计算,或是改进局部更新方向与朝向全局解方向之间的对应关系。

Bengio et al. (2009) 指出被称为课程学习(curriculum learning)或者塑造(shaping)的方法可以被解释为延拓法。课程学习被证实为与人类教学方式一致:教师刚开始会展示更容易、更典型的示例,然后帮助学习者在不太显然的情况下提炼决策面。

发布了151 篇原创文章 · 获赞 10 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_42555985/article/details/104369064
今日推荐