深度学习笔记 10 神经网络的优化

目录

1. 为什么优化?

2. 使用正则化技巧提高模型的泛化能力

3. 梯度下降(解决局部最小值问题)

3.1 梯度下降的原理

3.2 梯度下降过程

3.3 批量大小选择

3.3  随机梯度下降 SGD

3.4 批量随机梯度下降 Batch-SGD

3.5 小批量随机梯度下降 Mini-Batch-SGD

4. 动量法 (解决鞍点问题)

4.1 Momentum-动量法

4.2 Nesterov 加速梯度(NAG)

 4.3  Adagrad-自适应梯度

4.4  RMSprop

4.5  Adadelta

4.6 Adam-自适应矩估计

4.7 优化算法可视化

5. 参数初始化

6. 归一化

6.1 为什么要归一化?

6.2 常用归一化方式

6.3  局部响应归一化(Local Response Normalization,LRN)

6.4 批归一化(Batch Normalization,BN)

7. 神经网络最优化方法总结比较


1. 为什么优化?

神经网络模型到机器学习时依然存在一些难点问题.主要分为两大类:优化问题、泛化问题。网络优化是指寻找一个神经网络模型来使得经验(或结构)风险最小化的过程;优化算法解决局部最小值、鞍点问题,尽可能提高模型泛化误差。

优化遇到的挑战:局部最优;梯度消失

局部最优定义:对于目标函数f(x),如果f(x)在x 上的值比在x邻近的其他点的值更小,那么f(x)可能是一 个局部最小值(local minimum)。 如果f(x)在x上的值是目标函数在整个定义域上的最小值,那么f(x)是全局最小值(global minimum)。

鞍点:在高维空间中,非凸优化的难点并不在于如何逃离局部最优点,而是如何逃离鞍点鞍点的特征是一阶梯度为 0,但是在一些维度上是最高点,在另一些维度上是最低点。

2. 使用正则化技巧提高模型的泛化能力

深度学习笔记 4 过拟合+欠拟合+解决方案_李同学_道阻且行的博客-CSDN博客过拟合、欠拟合及其解决方案,正则化方法https://blog.csdn.net/qq_41134483/article/details/127329139

3. 梯度下降(解决局部最小值问题)

3.1 梯度下降的原理

损失函数里一般有两种参数,一种是控制输入信号量的权重(Weight, 简称 w ),另一种是调整函数与真实值距离的偏差(Bias,简称 b )。我们所要做的工作,就是通过梯度下降方法,不断地调整权重 w 和偏差b,使得损失函数的值变得越来越小。

3.2 梯度下降过程

def train(X, y, W, B, alpha, max_iters):
    '‘’
    选取所有的数据作为训练样本来执行梯度下降
    X : 训练数据集
    y : 训练数据集所对应的目标值
    W : 权重向量
    B : 偏差变量
    alpha : 学习速率
    max_iters : 梯度下降过程最大的迭代次数
   '''
   dW = 0 # 初始化权重向量的梯度累加器
   dB = 0 # 初始化偏差向量的梯度累加器
   m = X.shape[0] # 训练数据的数量
   
   # 开始梯度下降的迭代
   for i in range(max_iters): 
       dW = 0 # 重新设置权重向量的梯度累加器
       dB = 0 # 重新设置偏差向量的梯度累加器
       
       # 对所有的训练数据进行遍历
       for j in range(m):
           # 1. 遍历所有的训练数据
           # 2. 计算每个训练数据的权重向量梯度w_grad和偏差向量梯度b_grad
           # 3. 把w_grad和b_grad的值分别累加到dW和dB两个累加器里
       
       W = W - alpha * (dW / m) # 更新权重的值
       B = B - alpha * (dB / m) # 更新偏差的值

    return W, B # 返回更新后的权重和偏差。

3.3 批量大小选择

批量大小(Batch Size)对网络优化的影响也非常大,一般而言,批量大小不影响随机梯度的期望,但是会影响随机梯度的方差。批量大小越大,随机梯度的方差越小,引入的噪声也越小,训练也越稳定,因此可以设置较大的学习率.而批量大小较小时,需要设置较小的学习率,否则模型会不收敛.学习率通常要随着批量大小的增大而相应地增大。

 从图a可以看出,批量大小越大,下降效果越明显,并且下降曲线越平滑。但从图b可以看出,如果按整个数据集上的回合(Epoch)数来看,则是批量样本数越小,下降效果越明显。适当小的批量会导致更快的收敛。

根据批量大小,梯度下降法可以分为:批量梯度下降、随机梯度下降以及小批量梯度下降三种形式

3.3  随机梯度下降 SGD

从样本中随机抽出一组,训练后按梯度更新一次,然后再抽取一组,再更新一次,在样本量极其大的情况下,可能不用训练完所有的样本就可以获得一个损失值在可接受范围之内的模型了。(重点:每次迭代使用一组样本。)随机是指每次迭代过程中,样本都要被随机打乱,打乱是有效减小样本之间造成的参数更新抵消问题。

批梯度下降法(stochastic gradient descent)是指使用每一条数据来计算梯度值更新参数

1)η表示学习率,通常是一个较小的值,例如0.001,其决定我们将以多大的步长更新参数;

2)▽θJ(θ;xi;yi)表示损失函数在每一条数据上对参数θ计算一阶导数。因为是更新参数θ,所以计算θ的一阶导,一阶导方向是参数变化最快的方向。

优点:

由于不是在全部训练数据上的损失函数,而是在每轮迭代中,随机优化某一条训练数据上的损失函数,这样每一轮参数的更新速度大大加快。

缺点:

(1)准确度下降。由于即使在目标函数为强凸函数的情况下,SGD仍旧无法做到线性收敛。

(2)可能会收敛到局部最优,由于单个样本并不能代表全体样本的趋势。

(3)不易于并行实现

3.4 批量随机梯度下降 Batch-SGD

批随机梯度下降,它是指每次参数更新使用所有样本,即把所有样本都代入计算一遍,然后取它们的参数更新均值,来对参数进行一次性更新。

批梯度下降法(batch gradient descent)是指在整个训练数据集上求解损失函数关于参数θ的梯度

η表示学习率,▽θJ(θ)表示损失函数在整个数据集上对参数θ计算一阶导数(取平均值)。

优缺点:对所有样本执行一次梯度下降,每一次迭代时间较长,训练过程很慢。相对来说噪声会低,而且总体的成本函数总是朝着最小化的方向去。

3.5 小批量随机梯度下降 Mini-Batch-SGD

小批量随机梯度下降,它是指每次参数更新使用一小批样本,这批样本的数量通常可以采取trial-and-error的方法来确定,这种方法被证明可以有效加快训练速度。

mini-batch梯度下降法的思想很简单,将样本总体分成多个mini-batch。例如100万的数据,分成10000份,每份包含100个数据的mini-batch-1到mini-batch-10000,每次梯度下降使用其中一个mini-batch进行训练,除此之外和梯度下降法没有任何区别。

优点:

可以以更小的方差来更新参数,参数收敛的过程波动更小;获得比批梯度下降法更快的运行速度。

4. 动量法 (解决鞍点问题)

4.1 Momentum-动量法

动量法是一种帮助SGD在相关方向上加速并抑制摇摆的方法,利于处理非平稳梯度,动量法是将上一次更新量的一个分量γ增加到当前的更新量中

目的:解决因鞍点问题而带来的梯度停止更新问题
解决办法:在SGD中,加入指数加权平均数来更新参数的梯度

 y 方向梯度大 x 方向梯度小所以它们会在 y 方向上不断摇摆而沿 x 方向缓慢移动,但是我们知道在 y 方向的震荡是无用的只有 x 方向的才在不断接近最优点。

Momentum 是模拟物理里动量的概念,积累之前的动量来替代真正的梯度,模拟的是物体运动时的惯性,即更新的时候在一定程度上保留之前更新的方向,同时利用当前batch的梯度微调最终的更新方向。

由于目标函数在 y 方向上摇摆,所以前后两次计算的梯度在 y 方向上相反,所以相加后相互抵消,而x方向上梯度方向不变,所以x方向的梯度是累加的,其效果就是损失函数在 y 方向上的震荡减小了,而更加迅速地从 x 方向接近最优点。 

4.2 Nesterov 加速梯度(NAG)

Nesterov动量是动量方法的变种,区别在于:计算mini-batch的梯度时,采用更新后的参数

动量法首先计算当前的梯度值,然后在更新的累积梯度方向上前进一大步,Nesterov加速梯度下降法NAG首先在先前累积梯度方向上前进一大步,计算梯度值,然后做一个修正。

 4.3  Adagrad-自适应梯度

 Adagrad是一种适应参数的梯度下降优化算法,其自适应性可以个性化到特征级别。在标准的梯度下降法中,每个参数在每次迭代时都使用相同的学习率.由于 每个参数的维度上收敛速度都不相同,因此根据不同参数的收敛情况分别设置 学习率,因此Adagrad适合于稀疏数据的深度神经网络模型

AdaGrad算法(Adaptive Gradient Algorithm)是借鉴 L2 正则化的思想,每次迭代时自适应地调整每个参数的学习率。由于Adagrad在t 时刻对每一个参数\theta _{i}使用了不同的学习率,我们首先介绍Adagrad对每一个参数的更新,然后对其向量化。

令 g_{t, i}为在 t 时刻目标函数关于参数\theta _{i}的梯度,

 在t 时刻,对每个参数\theta _{i}的更新过程变为\theta _{t+1,i}

对于上述的更新规则,在t 时刻,基于对\theta _{i}计算过的历史梯度,Adagrad修正了对每一个参数\theta _{i}的学习率: 

 G_{t} \in \mathbb{R}^{d \times d}是一个对角矩阵,对角线上的元素i,i是直到t 时刻为止,所有关于\theta _i​的梯度的平方和,\epsilon是平滑项,用于防止除数为0 。由于G_{t}的对角线上包含了关于所有参数\theta的历史梯度的平方和,现在,我们可以通过G_{t}​和g_{t}之间的元素向量乘法⊙向量化上述的操作。

Adagrad算法优点:是无需手动调整学习率。在大多数的应用场景中,通常采用常数0.01 。

Adagrad算法缺点:它在分母中累加梯度的平方:由于没增加一个正项,在整个训练过程中,累加的和会持续增长。这会导致学习率变小以至于最终变得无限小,在学习率无限小时,Adagrad算法将无法取得额外的信息。

4.4  RMSprop

RMSprop算法是Geoff Hinton提出的一种自适应学习率的方法,可以在有些情况下避免 AdaGrad 算法中学习率不断单调下降以至 于过早衰减的缺点。参数更新公式如下:

RMSProp 算法和 AdaGrad 算法的区别在于 𝐺𝑡 的计算由累积方式变成了指数衰减移动平均,Hinton建议将\gamma设置为0.9,对于学习率η ,一个好的固定值为0.001。在迭代过程中,每个参数的学习率并不是呈衰减趋势,既可以变小也可以变大。

4.5  Adadelta

AdaDelta 算法也是 AdaGrad 算法的一个改进,以处理Adagrad学习速率单调递减的问题。和 RMSprop 算法类似,AdaDelta 算法通过梯度平方的指数衰减移动平均来调整学习率。此 外,AdaDelta算法还引入了每次参数更新差值Δ𝜃的平方的指数衰减权移动平均。

AdaDelta不再累加参数所有的历史梯度平方和,转而设定一个窗口 w,只求前 w 个历史梯度平方的平均数,并且也不直接存储这些项,仅仅是近似计算对应的平均值。

ρ 参数类似于 Momentum 的动量项,一般取为 0.9。

先前得到的Adagrad参数更新向量变为:

简单将对角矩阵G_{t}替换成历史梯度的均值E[g^2]_t,Adadelta 的更新项为 

由于分母仅仅是梯度的均方根(root mean squared,RMS)误差,我们可以简写为:

在这里插入图片描述

作者指出上述更新公式中的每个部分(与SGD,动量法或者Adagrad)并不一致,即更新规则中必须与参数具有相同的假设单位。为了实现这个要求,作者首次定义了另一个指数衰减均值,这次不是梯度平方,而是参数的平方的更新: 

在这里插入图片描述

参数更新的均方根误差为: 

在这里插入图片描述

由于RMS[\Delta \theta]_{t}​是未知的,我们利用参数的均方根误差来近似更新。利用RMS[\Delta \theta]_{t-1}替换先前的更新规则中的学习率\eta,最终得到Adadelta的更新规则: 

在这里插入图片描述

4.6 Adam-自适应矩估计

Adam算法(Adaptive Moment Estimation Algorithm)可以看作动量法和 RMSprop 算法的结合,不但使用动量作为参数更新方向,而 且可以自适应调整学习率,利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。

Adam 算法一方面计算梯度平方 g^2_t 的指数加权平均(和 RMSprop 算法类 似),另一方面计算梯度g_t的指数加权平均(和动量法类似)。

 其中𝛽1 和𝛽2 分别为两个移动平均的衰减率,通常取值为𝛽1 = 0.9, 𝛽2 = 0.99.我 们可以把 𝑀𝑡 和 𝐺𝑡 分别看作梯度的均值(一阶矩)和未减去均值的方差(二阶矩)。

假设𝑀0 = 0, 𝐺0 = 0,那么在迭代初期𝑀𝑡 和𝐺𝑡 的值会比真实的均值和方差 要小.特别是当𝛽1 和𝛽2 都接近于1时,偏差会很大.因此,需要对偏差进行修正。

 Adam算法的参数更新差值为

 其中学习率𝛼通常设为0.001,并且也可以进行衰减,比如\alpha _t= \frac{\alpha _0}{\sqrt{t}}

4.7 优化算法可视化

5. 参数初始化

6. 归一化

标准化与归一化
归一化:\frac{Xi-Xin}{Xmax-Xmin}
标准化:\frac{Xi-u}{\sigma }
归一化就是要把需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内。首先归一化是为了后面数据处理的方便,其次是保证程序运行时收敛加快。归一化的具体作用是归纳统一样本的统计分布性。归一化在0 - 1之间是统计的概率分布,归一化在某个区间上是统计的坐标分布。
标准化和归一化本质上都是不改变数据顺序的情况下对数据的线性变化,而它们最大的不同是归一化Normalization)会将原始数据规定在一人范围区间中,而标准化(Standardization)则是将数据调整为标准差为1,均值为0对分布.
另外归一化只与数据的最大值和最小值有关,缩放比例为\sigma =Xma - Xmin,而标准化的缩放比例等于标准差\alpha =\sigma,平移量等于均值\beta =\mu,当除了极大值极小值的数据改变时他的缩放比例和平移量也会改变。

6.1 为什么要归一化?
 

引入归一化,是由于不同的特征之间,其量纲或者量纲单位往往不同,变化区间也处于不同的数量级,若不进行归一化,可能导致某些指标被忽略,影响到数据分析的结果。例如影响房价的两个特征,面积和房间数量,面积有80,90,100等,房间数有1,2,3等,这两个指标度量方式根本不在一个数量级上。
为了消除特征之间的量纲影响,需要进行归一化处理,以解决特征指标之间的可比性,原始数据,经归一化处理后,各个指标处于同一种数量级,可以直接对比评价。


6.2 常用归一化方式
 

1.线性归一化

x{}'=\frac{x-min(x)}{max(x)-min(x)}

适用范围: 比较适用在数值比较集中的情况
缺点: 如果max:和min不稳定,很容易使得归一化结果不稳定,使得后续使用效果也不稳定
2.标准差标准化

x{}'=\frac{x-\mu }{\sigma }
含义: 经过处理的数据符合标准正态分布,即均值为0,标准差为1其中u为所有样本数据的均值,o为所有样本数据的标准差
3.非线性归一化
适用范围: 经常用在数据分化比较大的场景,有些数值很大,有些很小。通过一些数学函数,将原始值进行映射。该方法包括log、指数,正切等。

6.3  局部响应归一化(Local Response Normalization,LRN)

这是一个争议比较大的方法,LRN技术主要是深度学习训练时的一种提高准确度的技术方法,其中afe、tensorfiow等里面是很常见的方法,其跟激活函数是有区别的,LRN一般是在激活、池化后进行的一种处理方法。LRN归一化技术首次在Ale Net模型中提出这个概念,通过实验确实证明它可以提高模型的泛化能力,但是提升的很少,以至于后面不再使用,甚至有人觉得它是一个"伪命题”,因而它饱受争议,在此不做过多介绍。


6.4 批归一化(Batch Normalization,BN)

在之前的神经网络训练中,只是对输入层数据进行归一化处理,却没有在中间层进行归一化处理。要知道,虽然我们对输入数据进行了归化处理,但是输入数据经过O(IV X +这样的矩阵乘法以及非线性运算之后,其数据分布很可能被改变,而随着深度网络的多层运算之后,数据分布的变化将越来越大。如果我们能在网络的中间也进行归一化处理,是否对网络的训练起到改进作用呢?答案是肯定的。
这种在神经网络中间层也进行归一化处理,使训练效果更好的方法,就是批归一化Batch Normalization(BN)。
那么使用Batch Normalization到底有哪些优点呢?
1.减少了人为选择参数。在某些情况下可以取消Dropout和L2正则项参数,或者采取更小的 工2正则项约束参数:

2.减少了对学习率的要求。现在我们可以使用初始很大的学习率或者选择了较小的学习率,算法也能够快速训练收敛

3.可以不再使用局部响应归一化,BN本身就是归一化网络(局部响应归一化在AleNet网络中存在);
4.破坏原来的数据分布,一定程度上缓解过拟合(防止每批训练中某一个样本经常被挑选到,文献说这个可以提高1%的精度):

5.减少梯度消失,加快收敛速度,提高训练精度

7. 神经网络最优化方法总结比较

(3条消息) 神经网络最优化方法总结比较_Muzi_Water的博客-CSDN博客https://blog.csdn.net/Muzi_Water/article/details/81453491

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值