神经网络优化2
梯度下降
梯度下降法
批梯度下降法(Batch Gradient Descent,BGD)是最常用的梯度下降形式,前面的Logistic回归及深层神经网络的构建中所用到的梯度下降都是这种形式。其在更新参数时使用所有的样本来进行更新,具体过程为:
示例图:

优点:最小化所有训练样本的损失函数,得到全局最优解;易于并行实现。
缺点:当样本数目很多时,训练过程会很慢。
随机梯度下降
随机梯度下降法(Stochastic Gradient Descent,SGD)与批梯度下降原理类似,区别在于每次通过一个样本来迭代更新。其具体过程为:
示例图:

优点:训练速度快。
缺点:最小化每条样本的损失函数,最终的结果往往是在全局最优解附近,不是全局最优;不易于并行实现。
小批量梯度下降
小批量梯度下降法(Mini-Batch Gradient Descent,MBGD)是批量梯度下降法和随机梯度下降法的折衷,对用m个训练样本,,每次采用t(1 < t < m)个样本进行迭代更新。具体过程为:
其中:
之后:
示例图:

样本数t的值根据实际的样本数量来调整,为了和计算机的信息存储方式相适应,可将t的值设置为2的幂次。将所有的训练样本完整过一遍称为一个epoch。
64 到 512 的 mini-batch 比较常见。
梯度下降优化
指数加权平均
指数加权平均(Exponentially Weight Average)是一种常用的序列数据处理方式,其计算公式为:
其中为
下的实际值,
为
下加权平均后的值,
为权重值。
给定一个时间序列,例如伦敦一年每天的气温值:

如果要计算趋势的话,也就是温度的局部平均值,或者说移动平均值,先使:

上面的计算更一般的形式是:

实际上时,图中所示的划线并不是绿色的线,而是下图紫色的线条:

当进行指数加权平均计算时,第一个值被初始化为0,这样将在前期的运算用产生一定的偏差。为了矫正偏差,需要在每一次迭代后用以下式子进行偏差修正:
举个具体例子:
当时:
也就是的加权平均数,并去除偏差。
随着增加,
接近于 0,所以当
很大的时候,偏差修正几乎没有作用,因此当
较大的时候,紫线基本和绿线重合了。不过在开始学习阶段,你才开始预测热身练习,偏差修正可以帮助你更好预测温度,偏差修正可以帮助你使结果从紫线变成绿线。
在机器学习中,在计算指数加权平均数的大部分时候,大家不在乎执行偏差修正,因为大部分人宁愿熬过初始时期,拿到具有偏差的估测,然后继续计算下去。如果你关心初始时期的偏差,在刚开始计算指数加权移动平均数的时候,偏差修正能帮助你在早期获取更好的估测。
Momentum梯度下降
动量梯度下降(Gradient Descent with Momentum)是计算梯度的指数加权平均数,并利用该值来更新参数值。
动量梯度下降法运行速度几乎总是快于标准的梯度下降算法。
具体过程为:
其中的动量衰减参数一般取0.9。

进行一般的梯度下降将会得到图中的蓝色曲线,而使用Momentum梯度下降时,通过累加减少了抵达最小值路径上的摆动,加快了收敛,得到图中红色的曲线。
当前后梯度方向一致时,Momentum梯度下降能够加速学习;前后梯度方向不一致时,Momentum梯度下降能够抑制震荡。
RMSProp算法
RMSProp(Root Mean Square Prop,均方根支)算法在对梯度进行指数加权平均的基础上,引入平方和平方根。具体过程为:
其中的,用以提高数值稳定度,防止分母太小。
当或
较大时,
、
会较大,造成
、
也会较大,最终使
、
较小,减小了抵达最小值路径上的摆动。

使用RMSprop 的影响就是你的更新最后会变成这样(绿色线),纵轴方向上摆动较小,而横轴方向继续推进。
还有个影响就是,你可以用一个更大学习率a,然后加快学习,而无须在纵轴上垂直方向偏离。
Adam优化算法
Adam(Adaptive Moment Estimation,自适应矩估计)优化算法适用于很多不同的深度学习网络结构,它本质上是将Momentum梯度下降和RMSProp算法结合起来。具体过程为:
其中的学习率需要进行调参,超参数
被称为第一阶矩,一般取0.9,
被称为第二阶矩,一般取0.999,
一般取
。
学习率衰减
随着时间推移,慢慢减少学习率的大小。在初期
较大时,迈出的步长较大,能以较快的速度进行梯度下降,而后期逐步减小
的值,减小步长,有助于算法的收敛,更容易接近最优解。
常用到的几种学习率衰减方法有:
其中的decay_rate为衰减率,epoch_num为将所有的训练样本完整过一遍的次数。
批标准化
批标准化(Batch Normalization,BN)和之前的数据集标准化类似,是将分散的数据进行统一的一种做法。具有统一规格的数据,能让机器更容易学习到数据中的规律。
对于含有m个节点的某一层神经网络,对z进行操作的步骤为:
其中的、
并不是超参数,而是两个需要学习的参数,神经网络自己去学着使用和修改这两个扩展参数。这样神经网络就能自己慢慢琢磨出前面的标准化操作到底有没有起到优化的作用。如果没有起到作用,就使用
和
来抵消一些之前进行过的标准化的操作。例如当
,就抵消掉了之前的正则化操作。
Batch 归一化的作用是它适用的归一化过程,不只是输入层,甚至同样适用于神经网络中的深度隐藏层。应用 Batch 归一化了一些隐藏单元值中的平均值和方差,不过训练输入和这些隐藏单元值的一个区别是,你也许不想隐藏单元值必须是平均值 0 和方差 1。、
参数控制使得均值和方差可以是 0 和 1,也可以是其它值。

可以认为每个圆圈代表着两步计算,先计算z,再计算a。
如果没有Batch Norm,那么计算步骤就是根据输入,
,
计算出
,再利用激活函数计算出
,以此类推计算出
,
。
Batch归一化的做法是先将值进行Batch归一化,简称BN,此过程由参数
,
控制的,这一操作的结果为
,然后将其输入激活函数中得到
,即:
依次类推:
Batch 归一化是发生在计算z和a之间的,除了参数,
又加入了新的参数
和
。
接下来可以使用任意一种优化算法,例如梯度下降算法:
当然也可以使用 Adam 或 RMSprop 或 Momentum来进行参数更新。
实践中, Batch 归一化通常和训练集的 mini-batch 一起使用。
Batch Norm的作用
在猫识别的问题上,假设训练集中只包含黑猫的识别,其训练集以及正负样本分布如下图所示:

现在要将训练的结果使用在带颜色的猫识别问题中,其样本和正负分布可能如下图所示:

此时在识别黑猫中训练很好的模块可能并不会在在识别带颜色猫的问题上表现的依旧很好。这种数据分布改变的问题称为 “Covariate shift”,具体可以理解为:
已经学习到了x到y的映射,但是如果x的分布改变了,那么可能需要重新训练学习算法。
“Covariate shift”问题在神经网络中的体现,如下的神经网络:

我们从第三层开始看起,遮挡住前两层:

从第三隐藏层的角度来看,它得到一些值,称为

可以看到这个网络还有参数
Batch 归一化做的,是它减少了这些隐藏值分布变化的数量。当神经网络在之前层中更新参数,z的值可能发生变化, Batch 归一化可以确保无论其怎样变化z的均值和方差保持不变,这就使得后面的数据及数据分布更加稳定,减少了前面层与后面层的耦合,使得每一层不过多依赖前面的网络层,最终加快整个神经网络的训练。
Batch 归一化还有一个作用,它有轻微的正则化效果, Batch 归一化中非直观的一件事是在 mini-batch 计算中,由均值和方差缩放的,因为在 mini-batch 上计算的均值和方差,而不是在整个数据集上,均值和方差有一些小的噪声。缩放过程从
在训练时
我们选择
第一个mini-batch
第二个mini-batch
第三个mini-batch
这样在计算每个batch的
最终测试时,使用
进而计算:
Softmax 回归
Softmax回归模型是Logistic回归模型在多分类问题上的推广,在多分类问题中,输出y的值不再是一个数,而是一个多维列向量,有多少种分类是就有多少维数。激活函数使用的是softmax函数:
损失函数也变为: