深度学习中的优化问题(Optimization)

2023-05-16

文章目录

      • 1. 优化中的挑战
        • 1.1. 优化问题
        • 1.2. 挑战
        • 1.3. 解决方法
      • 2. 优化算法
        • 2.1. 优化算法的分类
          • 2.1.1. 批量大小的选择
          • 2.1.2. 学习率调整
          • 2.1.3. 梯度估计修正
        • 2.2. 自适应学习率算法
          • 2.2.1. AdaGrad
          • 2.2.2. RMSProp
          • 2.2.3. AdaDelta
          • 2.2.4. Adam
        • 2.3. 梯度估计修正
          • 2.3.1. 随机梯度下降(SGD)
          • 2.3.2. 小批量梯度下降(Mini-BGD)
          • 2.3.3. 动量(Momentum)
          • 2.3.4. Nesterov动量
        • 2.4. 算法比较
          • 2.4.1. MNIST数据集比较
          • 2.4.2. 算法选择
      • 3. 参数初始化
      • 4. 数据预处理
        • 4.1. 常用的归一化方法
        • 4.2. 逐层归一化
      • 5. 超参数优化



1. 优化中的挑战

1.1. 优化问题

优化问题:

  1. 神经网络的损失函数通常是一个非凸函数,找全局最优解通常比较困难
  2. 深度神经网络的参数通常非常多,训练数据集比较大,因此无法使用计算代价非常高的二阶优化方法
  3. 深度神经网络存在梯度消失或者梯度爆炸问题,导致基于梯度的普通优化方法经常失效。


1.2. 挑战

病态:

病态体现在随即梯度下降会卡在某些情况,此时即使很小的更新步长也会增加代价函数。其结果是尽管梯度很强,学习会变得非常缓慢,因为学习率必须收缩以弥补更强的曲率。

局部极小值:

当一个优化问题的数值解在局部最优解附近时,由于目标函数有关解的梯度接近0或者变成0,最终迭代求得的数值解可能只令目标函数局部最小化而非全局最小化。

深度神经网络的参数非常多,并且具有一定的冗余性,这使得单个参数对最终损失的影响都比较小,因此会导致损失函数在局部最小解附近通常是一个平坦区域,称为平坦最小值。在平坦最小值领域内所有点对应的损失函数都比较接近,表明我们在训练神经网络时,不需要精确找到一个局部最小值,只需要在一个局部最小值的领域内就足够了。当模型收敛到平坦局部最小值附近时,其鲁棒性通常会很好,即微小的参数变动不会剧烈影响模型的能力。

在大型神经网络中,大部分局部最小解都有相同的代价函数。局部最小解对应的训练损失很可能非常接近全局最小解对应的训练损失,因此在训乱神经网络时,通常能不能找到真正的全局最小点并不重要,这反而可能导致过拟合,而是需要在参数空间中找到一个代价很小的点。

在高维空间中,很难明确证明局部极小值是导致问题的原因,许多并非局部极小值的结构也具有很小的梯度。

鞍点:

梯度接近或者变成0的另一个可能性是在鞍点附近。由于深度学习模型参数通常是高维的,目标函数的鞍点通常比局部最小值更常见,也就是说在高维空间中大部分驻点都是鞍点。多类随机函数表现出以下性质:低维空间中,局部极小值很普遍;更高维空间中,局部极小值很罕见,而鞍点则很常见。

悬崖和梯度爆炸:

多层神经网络通常存在像悬崖一样的斜率比较大的区域。当参数接近斜率极大的悬崖结构时,梯度下降更新会很大程度的改变参数值,使得参数弹射的非常远,可能会使大量已经完成的优化工作成为无用功。通常我们用梯度截断来避免这种梯度爆炸的问题。

长期依赖:

当计算图变得极深时,由于变深的结构使模型丧失了学习到先前信息的能力,让优化变得极其困难。

深层计算图不仅存在于前馈神经网络,还存在于循环神经网络,循环神经网络要在很长时间序列里的各个时刻重复应用相同的操作结构来构建非常深的计算图,并且模型参数共享,这使得长期依赖问题更加凸显。这容易导致产生梯度爆炸或者梯度消失问题,梯度爆炸会使得学习不稳定,梯度消失使得我们难以知道参数朝哪个方向移动能够改进代价函数。

非精确梯度:

大多数优化算法的先决条件都是我们知道精确的梯度挥着Hessian矩阵,实际训练模型中,这些量都会有噪声或者偏的估计。当目标函数不可解时,通常其梯度也是难以处理的,在这种情况下我们只能近似梯度。这种问题通常出现在更高级模型中。

各个神经网络优化算法的设计都考虑到了梯度估计的缺陷。我们可以选择比真实损失函数更容易估计的代理损失函数来避免这个问题。


1.3. 解决方法

网络优化方面:

优化算法,参数初始化,数据预处理,超参数优化



2. 优化算法

2.1. 优化算法的分类

训练神经网络时常用的优化算法大体上分为两类:1. 调整学习率,使得优化更加稳定;2. 梯度估计修正,优化训练速度。还有一种是调整数据批量大小的选择。

2.1.1. 批量大小的选择

学习率影响

批量大小一般不影响随即梯度的期望,但是会影响随即梯度的方差。批量越大,随即梯度的方差越小,引入的噪声也越小,训练也越稳定,因此可以设置较大的学习率;批量较小时,需要设置较小的学习率,否则模型不收敛。学习率通常跟批量大小成正相关。

一个简单的方法是线性缩放规则:当批量大小增加m倍时,学习率也增加m倍。线性缩放规则往往在批量大小比较小时适用,当批量大小非常大时,线性缩放会使得训练不稳定。

泛化能力影响

批量大小和模型的泛化能力也有一定的关系。批量越大,越有可能收敛到尖锐最小值区域;批量越小,越有可能收敛到平坦最小值区域。


2.1.2. 学习率调整

常用的学习率调整方法分为:学习率衰减、学习率预热、周期性学习率调整、自适应学习率

学习率衰减

从经验上来看,一般学习开始大些要保证收敛速度,在收敛到最优解附近时小些避免来回震荡。这种情况可以通过学习率衰减来实现,也叫学习率退火。

一般学习率衰减方式设置为按迭代次数进行衰减。常见的衰减方法有以下几种:

  1. 分段衰减(阶梯衰减)。每经过T1,T2,Tn次迭代将学习率衰减为原来的β1,β2,βn倍。其中Ti和βi <1,为根据经验设置的超参数。
  2. 逆时衰减。 α t = α 0 1 1 + β × t \alpha _t=\alpha _0\frac{1}{1+\beta \times t} αt=α01+β×t1
  3. 指数衰减。 α t = α 0 β t \alpha _t=\alpha _0\beta ^t αt=α0βt
  4. 自然指数衰减。$\alpha _t=\alpha _0\exp \left( -\beta ×t \right) $
  5. 余弦衰减。$\alpha _t=\frac{1}{2}\alpha _0\left( 1+\cos \left( \frac{t\pi}{T} \right) \right) $,其中 T为迭代总次数。
  • 不同学习率衰减方法的比较
    在这里插入图片描述

学习率预热

在Mini-BGD算法中,批量大小设置比较大时,通常需要比较大的学习率。但是刚开始训练时,由于参数是随机初始化的,梯度往往也比较大,再加上较大的初始学习率,会使得训练不稳定。

为了提高稳定性,通常在最初的几轮迭代时,采用比较小的学习率,等到梯度下降到一定程度后再恢复到初始学习率,这种方法称为学习率预热。

一个常用的学习率预热方法是逐渐预热。假设预热的迭代次数为T‘,在预热过程中,每次更新的学习率为:

α t ’ = t T ‘ α 0   1 ≤ t ≤ T ’ \alpha _t^’=\frac{t}{T^‘}\alpha _0\ 1\le t\le T^’ αt=Ttα0 1tT

当预热过程结束后,再选择一种学习率衰减方法来逐渐降低学习率。


周期性学习率调整

为了使得梯度下降法能够逃离鞍点或者尖锐最小值,一种经验性方法是在训练过程中周期性的增大学习率。

周期性的增大学习率虽然可能短期内损害优化过程,使得网络收敛的稳定性变差,但从长期来看有助于找到更好的局部最优解。

常用的周期性调整学习率的方法有两种:循环学习率、带热重启的随机梯度下降。

  1. 循环学习率。让学习率在一个区间内周期性的增大和缩小。通常可以使用线性缩放来调整学习率,称为三角循环学习率。
  2. 带热重启的随机梯度下降。用热重启方式来替代学习率衰减的方法。学习率每隔一定周期后重新初始化为某个预先设定值,然后逐渐衰减。每次重启后模型参数不是从头开始优化,而是从重启前的参数基础上继续优化。
  • 周期性学习率调整
    在这里插入图片描述

2.1.3. 梯度估计修正

在梯度下降方法中,如果每次选取的样本数量比较小,损失会呈现振荡的方式下降。也就是说随机梯度下降方法中每次迭代的梯度估计和整个训练集上的最优梯度方向并不一致,具有一定的随机性。一种有效的解决方法是通过使用最近一段时间内的平均梯度来代替当前时刻的随机梯度来作为参数更新的方向,从而提高优化速度。

动量法

动量法是用之前累积的动量来代替真正的梯度,每次迭代的梯度可以看作加速度。

在第t次迭代时,计算负梯度方向的“加权移动平均”作为参数的更新方向,其中 ρ \rho ρ为动量因子,通常设为0.9,α为学习率:

在这里插入图片描述

这样每个参数的实际更新差值取决于最近一段时间内梯度的加权平均值。优点在于:

  1. 当某个参数在最近一段时间内梯度方向不一致时,其真实的参数更新幅度会变小;当在最近一段时间内梯度方向一致时,其真实的参数更新幅度变大,起到加速作用。
  2. 在迭代初期,梯度方向都比较一致,动量法起到加速作用更快到达最优点;迭代后期,梯度方向会不一致,在收敛值附近振荡,动量法起到减速作用,增加稳定性。


Nesterov加速梯度

Nesterov加速梯度对动量法进行了改进,主要是修正了梯度更新方向上向量的叠加:

在这里插入图片描述

  • 标准动量法和Nesterov动量法的比较:

在这里插入图片描述


梯度截断

梯度截断主要是应对梯度爆炸这种情况。把梯度的模限定在一个区间,当梯度的模小于或者大于这个区间时就进行截断。一般截断方式分为:

  1. 按值截断。在第t次迭代时,梯度为gt,给定一个区间[a,b],如果一个参数的梯度<a时,就将其设置为a;如果>b,就将其设定为b。
  2. 按模截断。将梯度的模截断到一个给定的超参数截断阈值b。

2.2. 自适应学习率算法

在标准的梯度下降法中,每个参数在每次迭代时都使用相同的学习率.由于每个参数的维度上收敛速度都不相同,因此根据不同参数的收敛情况分别设置
学习率,即为自适应学习率。

2.2.1. AdaGrad

AdaGrad算法借鉴L2正则化的思想,独立的自适应调整模型每个参数的学习率,取值每个参数所有梯度历史平方值的平方根,即根据平方梯度的整个历史收缩学习率。AdaGrad旨在应用与凸问题时快速收敛。

特点:

  1. 在AdaGrad算法中,如果某个参数的偏导数累积比较大,其学习率下降的比较快;相反如果其偏导数累积较小,其学习率下降的比较缓慢.但整体是随着迭代次数的增加,学习率逐渐缩小.
  2. 只需要设定一个全局学习速率ϵ。

缺点:

  1. 在经过一定次数的迭代依然没有找到最优点时,由于这时的学习率已经非常小,很难再继续找到最优点。
  2. 从训练开始时积累梯度平方会导致有效学习率过早和过量的减小,这会导致学习率变小以至于最终变得无限小。
  • AdaGrad算法:

在这里插入图片描述


2.2.2. RMSProp

RMSProp算法是对AdaGrad算法的改进,可以在有些情况下避免AdaGrad算法中学习率不断单调下降以至于过早衰竭的缺点。

特点:

  1. 对于每次迭代梯度的计算由累积方式变成了指数衰减移动平均,每个参数的学习率并不是呈衰减趋势,即可以变大也可以变小。
  2. RMSProp算法使用小批量随机梯度按参数平方的指数加权移动平均来调整学习率,引入了一个新的超参数 ρ \rho ρ,用来控制移动平均的长度范围。
  • RMSProp算法:

在这里插入图片描述

  • 使用Nesterov动量的RMSProp算法:

在这里插入图片描述


2.2.3. AdaDelta

AdaDelta算法也是AdaGrad算法的一个改进。AdaDelta算法没有学习率超参数,它通过使用有关自变量更新量(即参数更新差值$\varDelta \theta $)平方的指数加权移动平均的项来代替RMSProp算法中的学习率。

第t次迭代时,参数更新差值$\varDelta \theta 的平方的指数衰减权移动平均为,其中 的平方的指数衰减权移动平均为,其中 的平方的指数衰减权移动平均为,其中\beta_1 为衰减率,此时 为衰减率,此时 为衰减率,此时\varDelta \theta_t 还未知,因此只能计算到 还未知,因此只能计算到 还未知,因此只能计算到\varDelta X_t-1$:

Δ X t − 1 2 = β 1 Δ X t − 2 2 + ( 1 − β 1 ) Δ θ t − 1 ⊙ Δ θ t − 1 \varDelta X_{t-1}^{2}=\beta _1\varDelta X_{t-2}^{2}+\left( 1-\beta _1 \right) \varDelta \theta _{t-1}\odot \varDelta \theta _{t-1} ΔXt12=β1ΔXt22+(1β1)Δθt1Δθt1

AdaDelta算法的参数更新差值为:

Δ θ t = − Δ X t − 1 2 + ϵ G t + ϵ g t \varDelta \theta _t=-\frac{\sqrt{\varDelta X_{t-1}^{2}+\epsilon}}{\sqrt{G_t+\epsilon}}g_t Δθt=Gt+ϵ ΔXt12+ϵ gt

其中 G t G_t Gt的计算方式和RMSProp算法一样, Δ X t − 1 2 \varDelta X_{t-1}^{2} ΔXt12为参数更新差值 Δ θ \varDelta \theta Δθ的指数衰减权移动平均。

特点:

  1. AdaDelta算法的最大改动是将RMSProp算法中的初始化学习率α改为动态计算的 Δ X t − 1 2 \sqrt{\varDelta X_{t-1}^{2}} ΔXt12


2.2.4. Adam

Adam算法可以看作动量法和RMSProp算法的结合,不但使用动量作为参数更新方向,而且可以自适应调整学习率。还有一种改进的Adam算法是引进Nesterov加速梯度,称为Nadam算法。

  • Adam算法:

在这里插入图片描述

特点:

  1. Adam算法在RMSProp算法的基础上对小批量随机梯度也做了指数加权移动平均。
  2. Adam算法使用了偏差修正。

2.3. 梯度估计修正

2.3.1. 随机梯度下降(SGD)

按照数据生成分布抽取m个小批量样本(独立同分布的),通过计算它们的梯度均值,可以得到梯度的无偏差估计。以下算法展示了如何沿着这个梯度的估计下降。

  • 随机梯度下降的算法过程:

在这里插入图片描述

步长 = 梯度范数 x 学习率

SGD算法中的一个关键参数是学习率。在实践中,有必要随着时间推移逐渐降低学习率,即使用可变学习率。

实践中,一般会线性衰减学习率直到第t次迭代:
在这里插入图片描述

主要问题在于设置初始学习率。若初始学习率太大,学习曲线将会剧烈震荡,代价函数值通常会明显增加;若初始学习率太小,那么学习过程会很缓慢。

随机梯度下降优缺点:

优点:

  1. 由于每次迭代只使用了一个样本计算梯度,训练速度快,包含一定随机性,从期望来看,每次计算的梯度基本是正确的导数的。
  2. 当训练数据集的样本较多时,梯度下降每次迭代的计算开销较大,因此SGD更受青睐。

缺点:

  1. 更新频繁,带有随机性,会造成损失函数在收敛过程中严重震荡。
  2. 由于梯度越大更新不长越大,导致在峡谷类型的函数上收敛非常慢,会一直在比较陡的方向来回振荡。

在这里插入图片描述


2.3.2. 小批量梯度下降(Mini-BGD)

在训练深度神经网络时,训练数据的规模通常都比较大。如果每次训练都计算整个训练数据集的梯度,计算开支比较大,另外大规模训练数据集中数据 通常会比较冗余,没有必要计算整个训练集的梯度。

迭代规则:MBGD 每一次利用一小批样本,即 n 个样本进行计算梯度( n 一般取值在 50~256)。

更新规则如下:

在这里插入图片描述

批量梯度下降优缺点 :

优点:

  1. 可以降低参数更新时的方差,收敛更稳定,另一方面可以充分地利用深度学习库中高度优化的矩阵操作来进行更有效的梯度计算。

缺点:

  1. 不能保证很好的收敛性,learning rate 如果选择的太小,收敛速度会很慢,如果太大,损失函数就会在极小值处不停地震荡甚至偏离。(一种措施是使用可变学习率)


2.3.3. 动量(Momentum)

动量法旨在加速学习,特别是处理高曲率、小但一致的梯度,或者是带有噪声的梯度。动量算法累积了之前梯度指数级衰减的移动平均,并继续沿着该方向移动。动量法引入了变量v充当速度变量,它代表参数在参数空间移动的方向和速度。

超参数α->[0,1)决定了之前梯度的贡献衰减得速度快慢。更新规则如下:

在这里插入图片描述

  • 使用动量法的随即梯度下降

在这里插入图片描述

加入动量法之后,步长取决于梯度序列的大小和排列。当许多连续的梯度指向相同的方向时,步长最大。

动量法优缺点:

优点:

  1. 前后梯度一致的时候能够加速学习;前后梯度不一致的时候能够抑制震荡,越过局部极小值。(加速收敛,减小震荡。)
  2. 动量法使用了指数加权移动平均的思想。它将过去时间步的梯度做了加权平均,且权重按时间步指数衰减。
  3. 动量法使得相邻时间步的自变量更新在方向上更加一致。

缺点:

  1. 增加了一个超参数α。
  2. 由于动量算法考虑了之前的速度,所以它有可能冲过局部极小值,但是也有可能冲过全局最优值,在损失函数曲面情况较复杂的情况下,可能会多次冲过极小值又折返回来,使收敛不稳定,也会浪费时间。


2.3.4. Nesterov动量

受Nesterov加速梯度算法启发,提出的动量算法的一个变种。更新规则如下:

在这里插入图片描述

Nesterov动量法和标准动量法的区别在于梯度计算上,Nesterov动量中,梯度计算施加在当前速度之后,因此可以解释为往标准动量法中添加了一个校正因子。

  • 使用Nesterov动量法的随即梯度下降

在这里插入图片描述


2.4. 算法比较

2.4.1. MNIST数据集比较

在这里插入图片描述


2.4.2. 算法选择
  1. 对于稀疏数据,尽量使用学习率可自适应的优化方法,不用手动调节,而且最好采用默认值。
  2. SGD通常训练时间更长,但是在好的初始化和学习率调度方案的情况下(很多论文都用SGD),结果更可靠。
  3. 如果在意更快的收敛,并且需要训练较深较复杂的网络时,推荐使用学习率自适应的优化方法。
  4. Adadelta,RMSprop,Adam是比较相近的算法,在相似的情况下表现差不多 。Adam 就是在 RMSprop 的基础上加了 bias-correction 和 momentum,随着梯度变得稀疏,Adam 比 RMSprop 效果会好。整体来讲,Adam 是最好的选择。


3. 参数初始化

神经网络的参数学习是一个非凸优化问题,关系到网络的优化效率和泛化能力。深度学习模型的训练算法通常是迭代的,因此要求使用者指定一些开始迭代的初始点,大多数算法都很大程度地受到初始化选择的影响。

优化和正则化对于初始点的设定和需求是不一致的,有些初始点从优化的观点看或许是有利的,但是从泛化的观点看是不利的。例如对于权重的初始化,优化观点建议权重应该足够大以成功传播信息,但是正则化希望其小一点。诸如随机梯度下降这类对权重较小的增量更新趋于停止在更靠近初始化参数的区域的这类优化算法倾向于最终参数应接近于初始参数。

参数初始化的方式通常有三种:预训练初始化、随机初始化、固定值初始化。


随机初始化

常用的随机初始化方法有三种:基于固定方差的参数初始化、基于方差放缩的参数初始化、正交初始化。

随机初始化一个严重的问题是“对称权重问题” ,所以完全确知的唯一特性是初始参数需要在不同单元间“破坏对称性”。如果具有相同激活函数的两个隐藏单元连接到相同的输入,那么这些单元必须具有不同的初始参数。如果它们具有相同的初始参数,然后在应用损失函数和模型算法上时将会一直以相同的方式更新这两个单元。更大的初始化权重具有更强的破坏对称性的作用,有助于避免冗余的单元,但是如果初始权重太大,那么会在前向传播或者反向传播中产生爆炸的值,即梯度爆炸问题。

通常情况下,我们仅随机初始化权重,几乎总是初始化模型的权重为高斯分布或者均匀分布中随机抽取的值,即基于固定方差的参数初始化方法,高斯分布或者均匀分布的选择通常没有太大的差别。在基于固定方差的随机初始化方法中,比较关键的是如何设置方差 σ 2 \sigma ^2 σ2,比如均匀分布初始化如果分布区间参数范围设置的太大,会导致输入状态过大,对于sigmoid型激活函数来说,激活值变得饱和,梯度接近于0,从而会导致梯度消失问题。

由于采样的随机性,采样出来的权重矩阵依然可能存在梯度消失或者梯度爆炸问题,为了避免出现此类问题,我们希望误差项在反向传播中具有范数保持性。因此一种方法是将权重矩阵初始化为正交矩阵,这种方法称为正交初始化。根据正交矩阵的性质,这个线性网络在信息的前向传播或者反向传播过程和误差的方向传播过程中具有范数保持性,从而避免在训练开始时就出现梯度爆炸或梯度消失问题。

可惜通常情况下这些随机初始化权重的最佳准则往往不会带来最佳效果。有三种可能性:1. 我们使用了错误的方法,这个方法实际上并不利于保持整个网络信号的范数。2. 初始化时强加的性质可能在学习开始进行后不能保持。3. 这个方法可能成功提高了优化速度,但是意外的增大了泛化误差。


固定值初始化

对于一些特殊的参数,我们可以根据经验用一个特殊的固定值来进行初始化。比如偏置(Bias)通常用0来初始化,设置偏置为0通常在大多数权重初始化方案 中是可行的。但是也存在一些我们可能会设置偏置为非0的情况。


预训练初始化

预训练初始化通常会提升模型的泛化能力,一种解释是预训练任务起到一定的正则化作用。

除了以上的初始化模型参数为常数或者随机的方法外,还可以使用机器学习初始化模型参数。一个常用的策略是使用相同的输入数据集,用无监督模型训练出来的参数来初始化监督模型。由于无监督学习任务更容易获取大规模的训练数据集,因此被广泛采用。我们也可以在相关问题上使用监督训练,即使在一个不相关的任务上运行监督训练,有时也能得到一个比随机初始化具有更快收缩率的初始值。

这些预训练初始化策略有些能够得到更快的收敛率和更好的泛化误差,因为它们编码了模型初始参数的分布信息。其他策略效果不错的原因主要在于它们为参数设置了正确的数值范围,或者是设置不同的单元计算不同的函数。



4. 数据预处理

如果一个机器学习算法在缩放全部或者部分特征后不影响它的学习和预测,我们就称该算法具有尺度不变性。

从理论上来看,神经网络应该具有尺度不变性,可以通过调节参数来适应不同特征的尺度(取值范围),但是尺度不同的输入特征会增加训练难度,比如特征的尺度超过激活函数的取值尺度。因此通过数据预处理把每一个特征的尺度调节相似,比如[0,1]或者[-1,1]等等,我们就不太需要区别对待每一个参数,从而减少人工干预。

数据预处理的作用在于:当我们计算不同样本之间的欧式距离的时候,尺度大的特征会起到主导作用。因此对于尺度敏感的模型,必须先对样本进行预处理,将各个纬度的特征转换到相同的取值区间,并且消除不同特征之间的相关性,这样才能获得比较理想的效果。尺度不同除了参数初始化比较困难以外,还会造成在大多数位置上的梯度方向并不是最优的搜索方向,如果我们把数据归一化为相同尺度,这样大部分位置每一步的梯度方向近似于最优搜索方向,都基本指向最小值,训练效率会大大增加。

归一化方法泛指将数据特征转化为相同尺度的方法,比如把数据特征映射到[0,1]或者[-1,1]区间内,或者映射为服从均值为0,方差为1的标准正态分布,即将不同尺度的特征压缩到一个比较受限的区间内。


4.1. 常用的归一化方法

最大最小值归一化

通过缩放将每一个特征值的取值范围归一化到[0,1]或者[-1,1]之间。

标准化

也叫Z值归一化,将每一个维特征都调整为均值为0,方差为1。

白化

是一种重要的预处理方法,用来降低输入数据特征之间的冗余性,但是计算比较复杂。输入数据经过白化处理后,特征之间的相关性比较低,并且所有特征具有相同的方差。白化的一个主要实现方法是使用主成分分析(PCA)方法去掉各个成分之间的相关性。

  • 标准归一化和PCA白化对比:

在这里插入图片描述


4.2. 逐层归一化

逐层归一化是对神经网络中的隐藏层进行归一化,从而使得网络更加容易训练。逐层归一化不但可以提高优化效率,还可以作为一种隐形的正则化方法。

逐层归一化可以有效提高训练效率的原因:

  1. 更好的尺度不变性。从机器学习角度来看,如果一个神经层的输入分布发生了改变,那么其参数需要重新学习,称为内部协变量偏移。为了缓解这个问题,我们可以对每一个神经层的输入进行归一化操作,使其分布保持稳定。把每个神经层的输入分布都归一化为标准正态分布,可以使得每个神经层对其输入具有更好的尺度不变性,不论低层的参数如何分布,高层的输入保持相对稳定。尺度不变形可以使得我们更加高效的进行参数初始化以及超参数选择。
  2. 更平滑的优化地形。 逐层归一化可以使得大部分神经层的输入处于不饱和区域,从而让梯度变大,避免梯度消失问题;另一方面还可以使得神经网络的优化地形更加平滑,以及使梯度变得更加稳定,从而允许我们使用更大的学习率,并提高收敛速度。

常用的逐层归一化方法: 批量归一化、层归一化、权重归一化、局部归一化

批量归一化

批量归一化可以对神经网络中的任意的中间层进行归一化操作,其操作对象是一个中间层的单个神经元。因此要求小批量样本的数量不能太小,否则难以计算单个神经元的统计信息。另外批量归一化无法操作类似于循环神经网络这种神经元的净输入的分布是动态变化的神经网络。

逐层归一化需要在中间层进行操作,要求效率比较高,所以白化这种复杂度比较高的方法就不太适合,一般使用标准化将净输入 𝒛(𝑙) 的每一维都归一化到标准正态分布。

对于一个深度神经网络,令第𝑙 层的净输入为𝒛(𝑙),神经元的输出为 𝒂(𝑙),即𝒂(𝑙) = 𝑓(𝒛(𝑙)) = 𝑓(𝑾𝒂(𝑙−1) + 𝒃),其中 𝑓(⋅) 是激活函数,𝑾 和𝒃 是可学习的参数.
为了提高优化效率,就要使得净输入 𝒛(𝑙) 的分布一致,比如都归一化到标准正态分布.虽然归一化操作也可以应用在输入 𝒂(𝑙−1) 上,但归一化 𝒛(𝑙) 更加有利于优化.因此,在实践中归一化操作一般应用在仿射变换(Affine Transforma-tion)𝑾𝒂(𝑙−1) + 𝒃 之后、激活函数之前。

批量归一化操作可以看作一个特殊的神经层,加在每一层非线性激活函数之前,即𝒂(𝑙) = 𝑓(BN𝜸,𝜷(𝒛(𝑙))) = 𝑓 (BN𝜸,𝜷(𝑾𝒂(𝑙−1))) ,其中因为批量归一化本身具有平移变换,所以仿射变换 𝑾𝒂(𝑙−1) 不再需要偏置参数。

在模型训练的时候,批量归一化利用小批量上的均值和标准差,不断调整神经网络的中间输出,从而使得整个神经网络在各层的中间输出的数值更加稳定。批量归一化层和丢弃层一样,在训练模式和测试模式上的计算结果是不一样的。


层归一化

层归一化是和批量归一化非常类似的方法,不同的是曾归一化是对一个中间层的所有神经元进行归一化。

层归一化对于循环神经网络有很好的效果。在标准循环神经网络中,循环神经层的净输入一般会随着时间慢慢变大或者变小,从而导致梯度爆炸或者梯度消失。而层归一化的循环神经网络可以有效的缓解这种情况。


权重归一化

权重归一化是对神经网络的连接权重进行归一化,通过再参数化方法,将连接权重分解为长度和方向两种参数。

由于在神经网络中权重经常是共享的,权重数量往往比神经元数量要少,因此权重归一化的开销会比较小。


局部响应归一化

局部响应归一化通常用在基于卷积的图像处理上。局部响应归一化和层归一化都是对同层的神经元进行归一化.不同的是,局部响应归一化应用在激活函数之后,只是对邻近的神经元进行局部归一化,并且不减去均值.

部响应归一化和生物神经元中的侧抑制(lateral inhibition)现象比较类似。如果一个神经元的活性值非常大,那么和它邻近的神经元就近似地归一化为 0,从而起到抑制作用,增强模型的泛化能力.最大汇聚也具有侧抑制作用.但最大汇聚是对同一个特征映射中的邻近位置中的神经元进行抑制,而局部响应归一化是对同一个位置的邻近特征映射中的神经元进行抑制.



5. 超参数优化

常见的超参数有以下三类:

  1. 网络结构,包括神经元之间的连接关系、层数、每层的神经元数量、激活函数的类型等
  2. 优化参数,包括优化方法、学习率、小批量的样本数量
  3. 正则化系数

超参数优化主要存在两方面的困难:1. 超参数优化是一个组合优化问题,无法像一般参数那样通过梯度下降方法来优化,也没有一种通用有效的优化方法。2. 评估一组超参数配置的时间代价非常高,从而导致一些优化方法在超参数优化中难以应用。

自动超参数优化算法:网格搜索、随机搜索、贝叶斯优化、动态资源分配分配、神经架构搜索。


网格搜索

当有3个或者更少的超参数时,常见的超参数搜索方法是网格搜索。

网格搜索是一种通过尝试所有超参数的组合来寻址合适的一组超参数配置的方法,即暴力搜索方法。如果超参数是连续的,可以将超参数离散化选择几个经验值,对于连续的超参数,我们不能按照等间隔的方式进行离散化,需要根据超参数自身的特点进行离散化。网格搜索根据这些超参数的不同组合分别训练一个模型,然后测试这些模型在开发集上的性能,选取一组性能最好的配置。通常重复进行网格搜索时效果会更好。

网格搜索的一个明显缺点是:计算代价会随着超参数数量呈现指数级增长,即使是并行,我们也无法提供令人满意的搜索规模。


随机搜索

随机搜索不需要离散化超参数的值,这允许我们在一个更大的集合上进行搜索而不产生额外的计算代价。相比于网格搜索,随机搜索能够更快地见笑验证集误差。与网格搜索一样,随机搜索通常会重复不同的随机组合,以基于前一次运行的结果改进下一次搜索。

随机搜索比网格搜索更快更好的找到超参数的原因是:没有浪费的实验结果,不像网格搜索有时会对一个超参数的两个不同值给出相同的结果这种重复的计算。因此,如果这两个值的变化对应的验证集误差没有明显区别的话,网格搜索没有必要重复两个等价的实验,而随机搜索仍然对其他超参数进行两次独立的搜索。

网格搜索和随机搜索都没有利用不同的超参数组合之间的相关性,即如果模型的超参数组合比较类似,那么其模型性能也是比较接近的,因此这两种搜索方式一般都比较低效。大部分超参数优化算法都比随机搜索更复杂,并且具有一个共同的缺点:在它们能够从实验中提取任何信息之前,都需要运行完整的训练实验,这种方法是相当低效的,因为无法提前终止性能差的组合评估。


贝叶斯优化

大部分基于模型的超参数搜索算法,都是使用贝叶斯回归模型来估计每个超参数的验证集误差期望和该期望的不确定性。贝叶斯优化是一种自适应超参数优化方法,根据当前已经试验的超参数组合来预测下一个可能带来最大收益的组合。

一种常用的贝叶斯优化方法为时序模型优化。时序模型优化为了使得超参数优化的函数f(x)的后验分布p能接近其真实分布,就需要对样本空间进行足够多的采样。但是超参数优化中每一个样本的生成成本很高,需要用尽可能少的样本来使得p更接近于真是分布。

这也表明贝叶斯优化的一个缺点是:高斯过程建模需要计算协方差矩阵的逆,时间复杂度为o(N^3),因此不能很好的处理高维情况,计算代价太高。

  • 时序模型优化方法:

在这里插入图片描述


动态资源分配

在超参数优化中,每组超参数配置的评估代价比较高.如果我们可以在较早的阶段就估计出一组配置的效果会比较差,那么我们就可以中止这组配置的评
估,将更多的资源留给其他配置.这个问题可以归结为多臂赌博机问题的一个泛化问题:最优臂问题(Best-Arm Problem),即在给定有限的机会次数下,如何玩这些赌博机并找到收益最大的臂.和多臂赌博机问题类似,最优臂问题也是在利用和探索之间找到最佳的平衡.

由于目前神经网络的优化方法一般都采取随机梯度下降,因此我们可以通过一组超参数的学习曲线来预估这组超参数配置是否有希望得到比较好的结果.如果一组超参数配置的学习曲线不收敛或者收敛比较差,我们可以应用早期停止(Early-Stopping)策略来中止当前的训练.

动态资源分配的关键是将有限的资源分配给更有可能带来收益的超参数组合.一种有效方法是逐次减半(Successive Halving)方法。在逐次减半方法中,尝试的超参数配置数量 𝑁 十分关键.如果 𝑁 越大,得到最佳配置的机会也越大,但每组配置分到的资源就越少,这样早期的评估结果可能不准确.反之,如果 𝑁 越小,每组超参数配置的评估会越准确,但有可能无法得到最优的配置.因此,如何设置 𝑁 是平衡“利用-探索”的一个关键因素.


神经架构搜索

上面介绍的超参数优化方法都是在固定(或变化比较小)的超参数空间 𝒳中进行最优配置搜索,而最重要的神经网络架构一般还是需要由有经验的专家来进行设计.

神经架构搜索是一个新的比较有前景的研究方向,通过神经网络来自动实现网络架构的设计.一个神经网络的架构可以用一个变长的字符串来描述.利用元学习的思想,神经架构搜索利用一个控制器来生成另一个子网络的架构描述.控制器可以由一个循环神经网络来实现.控制器的训练可以通过强化学习来完成,其奖励信号为生成的子网络在开发集上的准确率.



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深度学习中的优化问题(Optimization) 的相关文章

  • 为什么Python的“sorted()”比“copy,then.sort()”慢

    这是我运行的代码 import timeit print timeit Timer a sorted x x 2 bla 4 boo 3 4 1 2 0 1 4 3 2 1 0 0 timeit number 1000 print time
  • php 日期函数和 Carbon 哪个更快?

    Carbon 是 DateTime 的简单 PHP API 扩展 我想知道我们可以通过 Composer 安装 Carbon 来使用日期时间函数 php 日期时间函数和 Carbon 哪个更快 我对您的评论做了一些测试 比较了 DateTi
  • 使用非负约束进行优化

    考虑以下功能 import numpy as np import scipy optimize as opt import math Periodic indexation def pl list i return list i len l
  • HTML5 - Canvas - 大图像优化

    我需要建立一个HTML5 canvas其中包含非常大的图像 可能高达 10 15MB 我的第一个想法是将图像分成几个块 这些块将在画布上水平移动时加载 对这个想法有什么想法吗 这是一件好事吗 也许我错过了一些已经实现的优化功能 你说得对 这
  • 平衡括号问题的优化解

    给定一个仅包含字符的字符串 and 判断输入字符串是否有效 输入字符串在以下情况下有效 左括号必须由相同类型的括号封闭 左括号必须按正确的顺序关闭 请注意 空字符串也被视为有效 示例1 Input Output true Example 2
  • Java 反射性能

    使用反射创建对象而不是调用类构造函数是否会导致任何显着的性能差异 是的 一点没错 通过反射查找类是 按幅度 更贵 Quoting Java关于反射的文档 http java sun com docs books tutorial refle
  • 为什么我应该使用内联代码? [复制]

    这个问题在这里已经有答案了 我是一名 C C 开发人员 这里有几个始终困扰我的问题 常规 代码和内联代码之间有很大区别吗 主要区别是什么 内联代码只是宏的一种 形式 吗 选择内联代码时必须进行什么样的权衡 Thanks 表现 正如之前的答案
  • 优化正则表达式以过滤数千个 HTML 选择选项

    背景 我开发了一个基于 jQuery 的穿梭小部件 https stackoverflow com a 13557000 59087对于 HTMLselect元素 因为我找不到一个经过最低限度编码并提供正则表达式过滤器来补偿的元素变音符号
  • 将 javascript 合并到一个文件中

    最近阅读了雅虎的网络优化技巧并使用 YSlow 我在我的一个网站上实现了他们的一些想法http www gwynfryncottages com http www gwynfryncottages com你可以在这里看到该文件http ww
  • 使用 numpy 加速 for 循环

    下一个 for 循环如何使用 numpy 获得加速 我想这里可以使用一些奇特的索引技巧 但我不知道是哪一个 这里可以使用 einsum 吗 a 0 for i in range len b a numpy mean C d e f b i
  • 快速查找具有最大总不同元素的列表列表的子集

    给定元组列表的列表 我想找到列表的子集 该子集最大化不同整数值的数量 而不重复任何整数 该列表看起来像这样 x 1 2 3 8 9 10 15 16 2 3 10 11 9 10 11 17 18 19 20 21 22 4 5 11 12
  • 计算径向轮廓的最有效方法

    我需要优化图像处理应用程序的这一部分 它基本上是按距中心点的距离划分的像素的总和 def radial profile data center y x np indices data shape first determine radii
  • 如何优化这个查询(涉及4毫米表)

    我正在使用如下所示的遗留数据库架构 product table表有字段 uid 整数 主键 name varchar 50 category表有字段 uid 整数 主键 name varchar 50 好吧 现在product table与
  • 编译器什么时候内联函数?

    在 C 中 函数仅在显式声明时才内联inline 或在头文件中定义 或者编译器是否允许内联函数 因为他们认为合适 The inline关键字实际上只是告诉链接器 或告诉编译器告诉链接器 同一函数的多个相同定义不是错误 如果您想在标头中定义函
  • iPhone - dequeueReusableCellWithIdentifier 用法

    我正在开发一个 iPhone 应用程序 它有一个相当大的 UITableView 其中的数据来自网络 所以我正在尝试优化它的创建和使用 我发现dequeueReusableCellWithIdentifier非常有用 但是在看到很多使用它的
  • 有没有办法让这个哈希查找更快?

    我需要 非常 快速处理有限范围的字符串 计算它们的值 输入文件的形式为 January 7 March 22 September 87 March 36 等等 因为线宽相同 所以我可以简单地读取一行fread相当快 而且我已经开发了一个完美
  • 快速平方根优化?

    如果你检查这个非常好的页面 http www codeproject com Articles 69941 Best Square Root Method Algorithm Function Precisi http www codepr
  • 完全禁用 NVCC 优化

    我正在尝试测量 GPU 上的峰值单精度触发器 为此我正在修改 PTX 文件以在寄存器上执行连续的 MAD 指令 不幸的是 编译器正在删除所有代码 因为它实际上没有做任何有用的事情 因为我没有执行任何数据的加载 存储 是否有编译器标志或编译指
  • GCC:分段错误和调试程序仅在优化时崩溃

    这是线程的后续内容 C 分段错误 也许 GDB 在骗我 https stackoverflow com questions 22828609 c segmentation fault and maybe gdb is lying to me
  • Java Integer CompareTo() - 为什么使用比较与减法?

    我发现java lang Integer实施compareTo方法如下 public int compareTo Integer anotherInteger int thisVal this value int anotherVal an

随机推荐

  • 在 React 中实现记忆以提高性能小技巧

    React 如何渲染 UI 在详细了解 React 中的 memoization 之前 xff0c 让我们先看看 React 如何使用虚拟 DOM 呈现 UI 常规 DOM 基本上包含一组表示为树的节点 DOM 中的每个节点都是 UI 元素
  • 《Linux内核设计与实现》读书总结

    Linux内核设计与实现 进程管理 进程 xff1a 处于执行器的程序 xff0c 包含代码段 xff0c 打开的文件 xff0c 信号 xff0c 内核内部数据 xff0c 内存地址空间 xff0c 多个线程 xff0c 存放全局变量的数
  • python无报错但是主函数没有执行

    python无报错但是主函数没有执行 是不是遇到过python没有报错 xff0c 但是主函数没有执行 xff0c 完全没有结果的情况 遇到这种情况很有可能就是你没有添加if name 61 61 main 这个东西 xff0c 或者格式不
  • 2018.2.2PHPstrom破解版

    作者 xff1a 聽 雨 来源 xff1a CSDN 原文 xff1a https blog csdn net qq 39439751 article details 82758330 版权声明 xff1a 本文为博主原创文章 xff0c
  • python3中 print不加括号报错!

    python 3和python 2的print是有区别 xff0c python3需要加括号 xff0c 但python2不需要 span class token operator gt gt span span class token o
  • leetcode 772 基本计算器3 双栈解析表达式 单调栈

    此题是比较难的一个题 xff0c 不能简单的用递归来做 假设我们已经能把数字分离出来 xff0c 并且解决了其他无关细节 此时我们要考虑 xff0c 如何处理括号和运算优先级 此题最强的一点是 xff0c 当你看到一个符号时 xff0c 你
  • 自然场景OCR检测(YOLOv3+CRNN)

    自然场景OCR检测 YOLOv3 43 CRNN xff08 中文 43 英文模型 xff09 前言 最近对于自然场景下的OCR比较有兴趣 xff0c 所以总结了一些目前OCR现状 xff0c 并且找了一个自然场景OCR的项目练练手 本人新
  • Tx2刷机及安装Jetpack4.5教程

    描述 xff1a 由于项目需要在工控机上运行目标检测程序 xff0c 所需配置需要包括Cuda OpenCV等软件配置 目前Nvidia已经将cuda opencv等相关用于图像处理 深度学习 计算机视觉所需的软件及文件集成到Jetpack
  • ROS gazebo 模型加载报错

    我的ros装的是ros kinetic desktop full版本 xff0c 所以不用另装gazebo 但是用命令 roscore rosrun gazebo ros gazebo 启动后 xff0c 出现如下错误 xff1a Erro
  • excel对比两边数据去重

    需求 筛选重复数据 xff0c A列是1000条数据 xff0c C列是100条数据 xff0c 删除重复的数据 xff0c 只剩900条 首先 xff0c A列数据要分列 xff0c 因为数据格式不一样 xff0c 会导致后面的问题 xf
  • GVIM的配置/使用

    关于GVIM的配置 使用 以我个人喜好配置 配置文件在用户目录下的 vimrc里 配置完后 xff0c 保存并bash一下即可 一 配置 xff1a 根据自己的喜好配置了一点点 colorscheme darkblue span class
  • 小白科研笔记:简析PointRCNN的基于Bin的误差机制

    1 前言 PointRCNN是一篇做3D目标检测的CVPR2019的文章 目前位居KITTI目标检测榜首的是PV RCNN 这个算法的前身就是PointRCNN 它们的作者都是同一个人 考虑到PV RCNN算法有些复杂 xff0c 于是我想
  • ROS基础:获取全局与局部launch Parameter

    在launch 参数配置中 xff0c 分为有全局参数和局部参数 私有参数 xff0c 两者参数的获取是不同的 xff0c 参数示例如下 xff1a lt launch gt lt 全局参数 gt lt param name 61 34 p
  • Redis分布式锁系列

    1 压力测试出的内存泄漏及解决 xff08 可跳过 xff09 使用jmeter对查询产品分类列表接口进行压力测试 xff0c 出现了堆外内存溢出异常 我们设置的虚拟机堆内存100m xff0c 并不是堆外内存100m 产生堆外内存溢出 x
  • java核心技术卷1基础知识整理

    java核心技术卷1基础知识整理 1 java概述2 java程序设计3 对象与类4 继承5 接口 lambda 表达式与内部类6 并发 1 java概述 1 Java 剔除了 C 43 43 中许多很少使用 难以理解 易混淆的特性 xff
  • 【论文笔记】—目标姿态估计—EPro-PnP—2022-CVPR

    论文介绍 该论文被评为 CVPR 2022 最佳学生论文 将PnP位姿优化问题转变为预测位姿概率密度的问题 对于一个基于PnP的物体位姿估计网络 xff0c 可以通过反向传播位姿的概率密度从而学习物体的2D 3D关联 xff0c 实现稳定的
  • STM32 HAL库串口回调函数配置失效(HAL_UART_RxCpltCallback)

    小编实际操作中 xff0c 用HAL UART RxCpltCallback函数配置接收串口数据 xff0c 在测试过程中用手碰了单片机引脚之后无法再接收到数据 xff0c 终于找到了解决办法 xff0c 就是自己使能接收中断和自己定义中断
  • PADS2.4版本,软件打开无法操作问题记录

    小编将pads2 4软件打开后 xff0c 放大和缩小不能使用 xff0c 查找相关资料后汇总方法 xff0c 如果有侵权请联系 xff0c 谢谢 xff0c 解决方法如下 xff1a 方法1 xff1a 设置微软键盘兼容性 xff08 小
  • 学习记录《Simulink 快速入门 —— 官方Help文档》

    Simulink 快速入门 官方Help文档 1 Simulink 模块图2 创建简单模型2 1 打开新模型2 2 打开 Simulink库浏览器2 2 1将模块添加到模型2 2 2 连接模块2 2 3 添加信号查看器2 2 4 运行仿真2
  • 深度学习中的优化问题(Optimization)

    文章目录 1 优化中的挑战1 1 优化问题1 2 挑战1 3 解决方法 2 优化算法2 1 优化算法的分类2 1 1 批量大小的选择2 1 2 学习率调整2 1 3 梯度估计修正 2 2 自适应学习率算法2 2 1 AdaGrad2 2 2