深度学习中的优化问题(Optimization)
1. 深度学习、机器学习、神经网络、CNN。2. 模型构建中的优化问题。3. 基于花书、邱锡鹏书、李沐书、其他资料等。
1. 优化中的挑战
1.1. 优化问题
优化问题:
- 神经网络的损失函数通常是一个非凸函数,找全局最优解通常比较困难
- 深度神经网络的参数通常非常多,训练数据集比较大,因此无法使用计算代价非常高的二阶优化方法
- 深度神经网络存在梯度消失或者梯度爆炸问题,导致基于梯度的普通优化方法经常失效。
1.2. 挑战
病态:
病态体现在随即梯度下降会卡在某些情况,此时即使很小的更新步长也会增加代价函数。其结果是尽管梯度很强,学习会变得非常缓慢,因为学习率必须收缩以弥补更强的曲率。
局部极小值:
当一个优化问题的数值解在局部最优解附近时,由于目标函数有关解的梯度接近0或者变成0,最终迭代求得的数值解可能只令目标函数局部最小化而非全局最小化。
深度神经网络的参数非常多,并且具有一定的冗余性,这使得单个参数对最终损失的影响都比较小,因此会导致损失函数在局部最小解附近通常是一个平坦区域,称为平坦最小值。在平坦最小值领域内所有点对应的损失函数都比较接近,表明我们在训练神经网络时,不需要精确找到一个局部最小值,只需要在一个局部最小值的领域内就足够了。当模型收敛到平坦局部最小值附近时,其鲁棒性通常会很好,即微小的参数变动不会剧烈影响模型的能力。
在大型神经网络中,大部分局部最小解都有相同的代价函数。局部最小解对应的训练损失很可能非常接近全局最小解对应的训练损失,因此在训乱神经网络时,通常能不能找到真正的全局最小点并不重要,这反而可能导致过拟合,而是需要在参数空间中找到一个代价很小的点。
在高维空间中,很难明确证明局部极小值是导致问题的原因,许多并非局部极小值的结构也具有很小的梯度。
鞍点:
梯度接近或者变成0的另一个可能性是在鞍点附近。由于深度学习模型参数通常是高维的,目标函数的鞍点通常比局部最小值更常见,也就是说在高维空间中大部分驻点都是鞍点。多类随机函数表现出以下性质:低维空间中,局部极小值很普遍;更高维空间中,局部极小值很罕见,而鞍点则很常见。
悬崖和梯度爆炸:
多层神经网络通常存在像悬崖一样的斜率比较大的区域。当参数接近斜率极大的悬崖结构时,梯度下降更新会很大程度的改变参数值,使得参数弹射的非常远,可能会使大量已经完成的优化工作成为无用功。通常我们用梯度截断来避免这种梯度爆炸的问题。
长期依赖:
当计算图变得极深时,由于变深的结构使模型丧失了学习到先前信息的能力,让优化变得极其困难。
深层计算图不仅存在于前馈神经网络,还存在于循环神经网络,循环神经网络要在很长时间序列里的各个时刻重复应用相同的操作结构来构建非常深的计算图,并且模型参数共享,这使得长期依赖问题更加凸显。这容易导致产生梯度爆炸或者梯度消失问题,梯度爆炸会使得学习不稳定,梯度消失使得我们难以知道参数朝哪个方向移动能够改进代价函数。
非精确梯度:
大多数优化算法的先决条件都是我们知道精确的梯度挥着Hessian矩阵,实际训练模型中,这些量都会有噪声或者偏的估计。当目标函数不可解时,通常其梯度也是难以处理的,在这种情况下我们只能近似梯度。这种问题通常出现在更高级模型中。
各个神经网络优化算法的设计都考虑到了梯度估计的缺陷。我们可以选择比真实损失函数更容易估计的代理损失函数来避免这个问题。
1.3. 解决方法
网络优化方面:
优化算法,参数初始化,数据预处理,超参数优化
2. 优化算法
2.1. 优化算法的分类
训练神经网络时常用的优化算法大体上分为两类:1. 调整学习率,使得优化更加稳定;2. 梯度估计修正,优化训练速度。还有一种是调整数据批量大小的选择。
2.1.1. 批量大小的选择
学习率影响
批量大小一般不影响随即梯度的期望,但是会影响随即梯度的方差。批量越大,随即梯度的方差越小,引入的噪声也越小,训练也越稳定,因此可以设置较大的学习率;批量较小时,需要设置较小的学习率,否则模型不收敛。学习率通常跟批量大小成正相关。
一个简单的方法是线性缩放规则:当批量大小增加m倍时,学习率也增加m倍。线性缩放规则往往在批量大小比较小时适用,当批量大小非常大时,线性缩放会使得训练不稳定。
泛化能力影响
批量大小和模型的泛化能力也有一定的关系。批量越大,越有可能收敛到尖锐最小值区域;批量越小,越有可能收敛到平坦最小值区域。
2.1.2. 学习率调整
常用的学习率调整方法分为:学习率衰减、学习率预热、周期性学习率调整、自适应学习率
学习率衰减
从经验上来看,一般学习开始大些要保证收敛速度,在收敛到最优解附近时小些避免来回震荡。这种情况可以通过学习率衰减来实现,也叫学习率退火。
一般学习率衰减方式设置为按迭代次数进行衰减。常见的衰减方法有以下几种:
- 分段衰减(阶梯衰减)。每经过T1,T2,Tn次迭代将学习率衰减为原来的β1,β2,βn倍。其中Ti和βi <1,为根据经验设置的超参数。
- 逆时衰减。 α t = α 0 1 1 + β × t \alpha _t=\alpha _0\frac{1}{1+\beta \times t} αt=α01+β×t1
- 指数衰减。 α t = α 0 β t \alpha _t=\alpha _0\beta ^t αt=α0βt
- 自然指数衰减。$\alpha _t=\alpha _0\exp \left( -\beta ×t \right) $
- 余弦衰减。$\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’=T‘tα0 1≤t≤T’
当预热过程结束后,再选择一种学习率衰减方法来逐渐降低学习率。
周期性学习率调整
为了使得梯度下降法能够逃离鞍点或者尖锐最小值,一种经验性方法是在训练过程中周期性的增大学习率。
周期性的增大学习率虽然可能短期内损害优化过程,使得网络收敛的稳定性变差,但从长期来看有助于找到更好的局部最优解。
常用的周期性调整学习率的方法有两种:循环学习率、带热重启的随机梯度下降。
- 循环学习率。让学习率在一个区间内周期性的增大和缩小。通常可以使用线性缩放来调整学习率,称为三角循环学习率。
- 带热重启的随机梯度下降。用热重启方式来替代学习率衰减的方法。学习率每隔一定周期后重新初始化为某个预先设定值,然后逐渐衰减。每次重启后模型参数不是从头开始优化,而是从重启前的参数基础上继续优化。
- 周期性学习率调整
2.1.3. 梯度估计修正
在梯度下降方法中,如果每次选取的样本数量比较小,损失会呈现振荡的方式下降。也就是说随机梯度下降方法中每次迭代的梯度估计和整个训练集上的最优梯度方向并不一致,具有一定的随机性。一种有效的解决方法是通过使用最近一段时间内的平均梯度来代替当前时刻的随机梯度来作为参数更新的方向,从而提高优化速度。
动量法
动量法是用之前累积的动量来代替真正的梯度,每次迭代的梯度可以看作加速度。
在第t次迭代时,计算负梯度方向的“加权移动平均”作为参数的更新方向,其中 ρ \rho ρ为动量因子,通常设为0.9,α为学习率:
这样每个参数的实际更新差值取决于最近一段时间内梯度的加权平均值。优点在于:
- 当某个参数在最近一段时间内梯度方向不一致时,其真实的参数更新幅度会变小;当在最近一段时间内梯度方向一致时,其真实的参数更新幅度变大,起到加速作用。
- 在迭代初期,梯度方向都比较一致,动量法起到加速作用更快到达最优点;迭代后期,梯度方向会不一致,在收敛值附近振荡,动量法起到减速作用,增加稳定性。
Nesterov加速梯度
Nesterov加速梯度对动量法进行了改进,主要是修正了梯度更新方向上向量的叠加:
- 标准动量法和Nesterov动量法的比较:
梯度截断
梯度截断主要是应对梯度爆炸这种情况。把梯度的模限定在一个区间,当梯度的模小于或者大于这个区间时就进行截断。一般截断方式分为:
- 按值截断。在第t次迭代时,梯度为gt,给定一个区间[a,b],如果一个参数的梯度<a时,就将其设置为a;如果>b,就将其设定为b。
- 按模截断。将梯度的模截断到一个给定的超参数截断阈值b。
2.2. 自适应学习率算法
在标准的梯度下降法中,每个参数在每次迭代时都使用相同的学习率.由于每个参数的维度上收敛速度都不相同,因此根据不同参数的收敛情况分别设置
学习率,即为自适应学习率。
2.2.1. AdaGrad
AdaGrad算法借鉴L2正则化的思想,独立的自适应调整模型每个参数的学习率,取值每个参数所有梯度历史平方值的平方根,即根据平方梯度的整个历史收缩学习率。AdaGrad旨在应用与凸问题时快速收敛。
特点:
- 在AdaGrad算法中,如果某个参数的偏导数累积比较大,其学习率下降的比较快;相反如果其偏导数累积较小,其学习率下降的比较缓慢.但整体是随着迭代次数的增加,学习率逐渐缩小.
- 只需要设定一个全局学习速率ϵ。
缺点:
- 在经过一定次数的迭代依然没有找到最优点时,由于这时的学习率已经非常小,很难再继续找到最优点。
- 从训练开始时积累梯度平方会导致有效学习率过早和过量的减小,这会导致学习率变小以至于最终变得无限小。
- AdaGrad算法:
2.2.2. RMSProp
RMSProp算法是对AdaGrad算法的改进,可以在有些情况下避免AdaGrad算法中学习率不断单调下降以至于过早衰竭的缺点。
特点:
- 对于每次迭代梯度的计算由累积方式变成了指数衰减移动平均,每个参数的学习率并不是呈衰减趋势,即可以变大也可以变小。
- 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} ΔXt−12=β1ΔXt−22+(1−β1)Δθt−1⊙Δθt−1
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+ϵΔXt−12+ϵgt
其中 G t G_t Gt的计算方式和RMSProp算法一样, Δ X t − 1 2 \varDelta X_{t-1}^{2} ΔXt−12为参数更新差值 Δ θ \varDelta \theta Δθ的指数衰减权移动平均。
特点:
- AdaDelta算法的最大改动是将RMSProp算法中的初始化学习率α改为动态计算的 Δ X t − 1 2 \sqrt{\varDelta X_{t-1}^{2}} ΔXt−12。
2.2.4. Adam
Adam算法可以看作动量法和RMSProp算法的结合,不但使用动量作为参数更新方向,而且可以自适应调整学习率。还有一种改进的Adam算法是引进Nesterov加速梯度,称为Nadam算法。
- Adam算法:
特点:
- Adam算法在RMSProp算法的基础上对小批量随机梯度也做了指数加权移动平均。
- Adam算法使用了偏差修正。
2.3. 梯度估计修正
2.3.1. 随机梯度下降(SGD)
按照数据生成分布抽取m个小批量样本(独立同分布的),通过计算它们的梯度均值,可以得到梯度的无偏差估计。以下算法展示了如何沿着这个梯度的估计下降。
- 随机梯度下降的算法过程:
步长 = 梯度范数 x 学习率
SGD算法中的一个关键参数是学习率。在实践中,有必要随着时间推移逐渐降低学习率,即使用可变学习率。
实践中,一般会线性衰减学习率直到第t次迭代:
主要问题在于设置初始学习率。若初始学习率太大,学习曲线将会剧烈震荡,代价函数值通常会明显增加;若初始学习率太小,那么学习过程会很缓慢。
随机梯度下降优缺点:
优点:
- 由于每次迭代只使用了一个样本计算梯度,训练速度快,包含一定随机性,从期望来看,每次计算的梯度基本是正确的导数的。
- 当训练数据集的样本较多时,梯度下降每次迭代的计算开销较大,因此SGD更受青睐。
缺点:
- 更新频繁,带有随机性,会造成损失函数在收敛过程中严重震荡。
- 由于梯度越大更新不长越大,导致在峡谷类型的函数上收敛非常慢,会一直在比较陡的方向来回振荡。
2.3.2. 小批量梯度下降(Mini-BGD)
在训练深度神经网络时,训练数据的规模通常都比较大。如果每次训练都计算整个训练数据集的梯度,计算开支比较大,另外大规模训练数据集中数据 通常会比较冗余,没有必要计算整个训练集的梯度。
迭代规则:MBGD 每一次利用一小批样本,即 n 个样本进行计算梯度( n 一般取值在 50~256)。
更新规则如下:
批量梯度下降优缺点 :
优点:
- 可以降低参数更新时的方差,收敛更稳定,另一方面可以充分地利用深度学习库中高度优化的矩阵操作来进行更有效的梯度计算。
缺点:
- 不能保证很好的收敛性,learning rate 如果选择的太小,收敛速度会很慢,如果太大,损失函数就会在极小值处不停地震荡甚至偏离。(一种措施是使用可变学习率)
2.3.3. 动量(Momentum)
动量法旨在加速学习,特别是处理高曲率、小但一致的梯度,或者是带有噪声的梯度。动量算法累积了之前梯度指数级衰减的移动平均,并继续沿着该方向移动。动量法引入了变量v充当速度变量,它代表参数在参数空间移动的方向和速度。
超参数α->[0,1)决定了之前梯度的贡献衰减得速度快慢。更新规则如下:
- 使用动量法的随即梯度下降
加入动量法之后,步长取决于梯度序列的大小和排列。当许多连续的梯度指向相同的方向时,步长最大。
动量法优缺点:
优点:
- 前后梯度一致的时候能够加速学习;前后梯度不一致的时候能够抑制震荡,越过局部极小值。(加速收敛,减小震荡。)
- 动量法使用了指数加权移动平均的思想。它将过去时间步的梯度做了加权平均,且权重按时间步指数衰减。
- 动量法使得相邻时间步的自变量更新在方向上更加一致。
缺点:
- 增加了一个超参数α。
- 由于动量算法考虑了之前的速度,所以它有可能冲过局部极小值,但是也有可能冲过全局最优值,在损失函数曲面情况较复杂的情况下,可能会多次冲过极小值又折返回来,使收敛不稳定,也会浪费时间。
2.3.4. Nesterov动量
受Nesterov加速梯度算法启发,提出的动量算法的一个变种。更新规则如下:
Nesterov动量法和标准动量法的区别在于梯度计算上,Nesterov动量中,梯度计算施加在当前速度之后,因此可以解释为往标准动量法中添加了一个校正因子。
- 使用Nesterov动量法的随即梯度下降
2.4. 算法比较
2.4.1. MNIST数据集比较
2.4.2. 算法选择
- 对于稀疏数据,尽量使用学习率可自适应的优化方法,不用手动调节,而且最好采用默认值。
- SGD通常训练时间更长,但是在好的初始化和学习率调度方案的情况下(很多论文都用SGD),结果更可靠。
- 如果在意更快的收敛,并且需要训练较深较复杂的网络时,推荐使用学习率自适应的优化方法。
- 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) + 𝒃),其中 𝑓(⋅) 是激活函数,𝑾 和𝒃 是可学习的参数.
为了提高优化效率,就要使得净输入 𝒛(𝑙) 的分布一致,比如都归一化到标准正态分布.虽然归一化操作也可以应用在输入 𝒂(𝑙−1) 上,但归一化 𝒛(𝑙) 更加有利于优化.因此,在实践中归一化操作一般应用在仿射变换(Affine Transforma-tion)𝑾𝒂(𝑙−1) + 𝒃 之后、激活函数之前。
批量归一化操作可以看作一个特殊的神经层,加在每一层非线性激活函数之前,即𝒂(𝑙) = 𝑓(BN𝜸,𝜷(𝒛(𝑙))) = 𝑓 (BN𝜸,𝜷(𝑾𝒂(𝑙−1))) ,其中因为批量归一化本身具有平移变换,所以仿射变换 𝑾𝒂(𝑙−1) 不再需要偏置参数。
在模型训练的时候,批量归一化利用小批量上的均值和标准差,不断调整神经网络的中间输出,从而使得整个神经网络在各层的中间输出的数值更加稳定。批量归一化层和丢弃层一样,在训练模式和测试模式上的计算结果是不一样的。
层归一化
层归一化是和批量归一化非常类似的方法,不同的是曾归一化是对一个中间层的所有神经元进行归一化。
层归一化对于循环神经网络有很好的效果。在标准循环神经网络中,循环神经层的净输入一般会随着时间慢慢变大或者变小,从而导致梯度爆炸或者梯度消失。而层归一化的循环神经网络可以有效的缓解这种情况。
权重归一化
权重归一化是对神经网络的连接权重进行归一化,通过再参数化方法,将连接权重分解为长度和方向两种参数。
由于在神经网络中权重经常是共享的,权重数量往往比神经元数量要少,因此权重归一化的开销会比较小。
局部响应归一化
局部响应归一化通常用在基于卷积的图像处理上。局部响应归一化和层归一化都是对同层的神经元进行归一化.不同的是,局部响应归一化应用在激活函数之后,只是对邻近的神经元进行局部归一化,并且不减去均值.
部响应归一化和生物神经元中的侧抑制(lateral inhibition)现象比较类似。如果一个神经元的活性值非常大,那么和它邻近的神经元就近似地归一化为 0,从而起到抑制作用,增强模型的泛化能力.最大汇聚也具有侧抑制作用.但最大汇聚是对同一个特征映射中的邻近位置中的神经元进行抑制,而局部响应归一化是对同一个位置的邻近特征映射中的神经元进行抑制.
5. 超参数优化
常见的超参数有以下三类:
- 网络结构,包括神经元之间的连接关系、层数、每层的神经元数量、激活函数的类型等
- 优化参数,包括优化方法、学习率、小批量的样本数量
- 正则化系数
超参数优化主要存在两方面的困难:1. 超参数优化是一个组合优化问题,无法像一般参数那样通过梯度下降方法来优化,也没有一种通用有效的优化方法。2. 评估一组超参数配置的时间代价非常高,从而导致一些优化方法在超参数优化中难以应用。
自动超参数优化算法:网格搜索、随机搜索、贝叶斯优化、动态资源分配分配、神经架构搜索。
网格搜索
当有3个或者更少的超参数时,常见的超参数搜索方法是网格搜索。
网格搜索是一种通过尝试所有超参数的组合来寻址合适的一组超参数配置的方法,即暴力搜索方法。如果超参数是连续的,可以将超参数离散化选择几个经验值,对于连续的超参数,我们不能按照等间隔的方式进行离散化,需要根据超参数自身的特点进行离散化。网格搜索根据这些超参数的不同组合分别训练一个模型,然后测试这些模型在开发集上的性能,选取一组性能最好的配置。通常重复进行网格搜索时效果会更好。
网格搜索的一个明显缺点是:计算代价会随着超参数数量呈现指数级增长,即使是并行,我们也无法提供令人满意的搜索规模。
随机搜索
随机搜索不需要离散化超参数的值,这允许我们在一个更大的集合上进行搜索而不产生额外的计算代价。相比于网格搜索,随机搜索能够更快地见笑验证集误差。与网格搜索一样,随机搜索通常会重复不同的随机组合,以基于前一次运行的结果改进下一次搜索。
随机搜索比网格搜索更快更好的找到超参数的原因是:没有浪费的实验结果,不像网格搜索有时会对一个超参数的两个不同值给出相同的结果这种重复的计算。因此,如果这两个值的变化对应的验证集误差没有明显区别的话,网格搜索没有必要重复两个等价的实验,而随机搜索仍然对其他超参数进行两次独立的搜索。
网格搜索和随机搜索都没有利用不同的超参数组合之间的相关性,即如果模型的超参数组合比较类似,那么其模型性能也是比较接近的,因此这两种搜索方式一般都比较低效。大部分超参数优化算法都比随机搜索更复杂,并且具有一个共同的缺点:在它们能够从实验中提取任何信息之前,都需要运行完整的训练实验,这种方法是相当低效的,因为无法提前终止性能差的组合评估。
贝叶斯优化
大部分基于模型的超参数搜索算法,都是使用贝叶斯回归模型来估计每个超参数的验证集误差期望和该期望的不确定性。贝叶斯优化是一种自适应超参数优化方法,根据当前已经试验的超参数组合来预测下一个可能带来最大收益的组合。
一种常用的贝叶斯优化方法为时序模型优化。时序模型优化为了使得超参数优化的函数f(x)的后验分布p能接近其真实分布,就需要对样本空间进行足够多的采样。但是超参数优化中每一个样本的生成成本很高,需要用尽可能少的样本来使得p更接近于真是分布。
这也表明贝叶斯优化的一个缺点是:高斯过程建模需要计算协方差矩阵的逆,时间复杂度为o(N^3),因此不能很好的处理高维情况,计算代价太高。
- 时序模型优化方法:
动态资源分配
在超参数优化中,每组超参数配置的评估代价比较高.如果我们可以在较早的阶段就估计出一组配置的效果会比较差,那么我们就可以中止这组配置的评
估,将更多的资源留给其他配置.这个问题可以归结为多臂赌博机问题的一个泛化问题:最优臂问题(Best-Arm Problem),即在给定有限的机会次数下,如何玩这些赌博机并找到收益最大的臂.和多臂赌博机问题类似,最优臂问题也是在利用和探索之间找到最佳的平衡.
由于目前神经网络的优化方法一般都采取随机梯度下降,因此我们可以通过一组超参数的学习曲线来预估这组超参数配置是否有希望得到比较好的结果.如果一组超参数配置的学习曲线不收敛或者收敛比较差,我们可以应用早期停止(Early-Stopping)策略来中止当前的训练.
动态资源分配的关键是将有限的资源分配给更有可能带来收益的超参数组合.一种有效方法是逐次减半(Successive Halving)方法。在逐次减半方法中,尝试的超参数配置数量 𝑁 十分关键.如果 𝑁 越大,得到最佳配置的机会也越大,但每组配置分到的资源就越少,这样早期的评估结果可能不准确.反之,如果 𝑁 越小,每组超参数配置的评估会越准确,但有可能无法得到最优的配置.因此,如何设置 𝑁 是平衡“利用-探索”的一个关键因素.
神经架构搜索
上面介绍的超参数优化方法都是在固定(或变化比较小)的超参数空间 𝒳中进行最优配置搜索,而最重要的神经网络架构一般还是需要由有经验的专家来进行设计.
神经架构搜索是一个新的比较有前景的研究方向,通过神经网络来自动实现网络架构的设计.一个神经网络的架构可以用一个变长的字符串来描述.利用元学习的思想,神经架构搜索利用一个控制器来生成另一个子网络的架构描述.控制器可以由一个循环神经网络来实现.控制器的训练可以通过强化学习来完成,其奖励信号为生成的子网络在开发集上的准确率.
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)