【CS231n笔记】06 Training Neural Networks, Part 2

来源:互联网 发布:淘宝买卖交易平台 编辑:程序博客网 时间:2024/05/16 14:25

1.参数更新
2.学习率更新
3.模型整合(model ensembles)
4. Dropout
5. 梯度检查
6.卷积神经网络简史及应用

1.参数更新
训练一个神经网络的主要流程如下:
这里写图片描述
a.简单梯度下降(SGD)
这里写图片描述
Q:假设损失函数在垂直方向上陡峭而在水平方向上平缓,那么使用SGD来进行损失函数最小化时的收敛轨迹是怎样的?
这里写图片描述
A:在比较平缓的方向上行进缓慢,而在陡峭方向上则会不停震荡,如下图所示:
这里写图片描述

b.动量(Momentum)
这里写图片描述
物理解释:更新如同一个球在损失函数曲线上滑动,动量更新系数相当于加上摩擦力,而学习率和梯度的乘积可以视作“加速度”。
动量更新系数一般取0.5、0.9、0.99,有时也会随时间进行退火处理,例如从0.5->0.99
这里写图片描述
梯度在平缓维度上方向一致,“加速度”一直为正,经过累加会增大在平缓维度上的收敛速度;
梯度在陡峭维度上频繁变换方向,“加速度”的符号也经常变化,会逐渐减小在陡峭维度上的收敛速度。
利用momentum进行优化的时候可能会越过最优点,但是总体的收敛速度比SGD要快得多,而且可以减轻震荡。

c.Nesterov accelerated gradient (NAG)
NAG是对momentum的改进。
由于动量的加入,最优化时可能会越过最优点,虽然随后仍然可以收敛至最优点,但总是有些不尽人意。就如同一个球在山坡上滚下,一味沿着梯度向下冲并不理想,如果这个球更加“智能”,可以提前预知下一步的位置,进而可以在到达谷底之前降低速度,以便更快的稳定在谷底,即最优点。
这里写图片描述
由上图可以看出,NAG相对于momentum的唯一不同就是在计算梯度时加入一项—前一刻的加速度,这就相当于一个预知,根据之前的加速度预测当前位置,在预测的位置求取梯度,计算当前的加速度,最后对参数进行更新。当即将收敛到最优点时,预测的位置就会越过最优点,此时计算的梯度和之前的梯度符号相反,加速度随即减小,所以参数更新减缓,越过最优点的情况得到改善,因此NAG比momentum的收敛速度要更快一点。
出于计算的方便,一般对上述公式做变形如下:
这里写图片描述

d.AdaGrad update
前面的两种算法可以增大SGD的收敛速度,但是我们希望不同参数上可以自适应的调节更新速度,即自适应调节各自的学习率,在不常出现的参数上更新幅度大一些,在频繁出现的参数上更新幅度小一些。所以AdaGrad更新算法非常适合处理稀疏数据。
具体实现如下:
这里写图片描述
红色框中即在SGD基础上添加的处理项。在求取梯度时添加了一个元素级的缩放因子,它基于所属维度上的历史梯度的平方和。
这里写图片描述
Q:以上图所示损失函数为例,AdaGrad的更新趋势是怎样的?
A:垂直方向上的梯度很大,cache会快速增大,因此垂直方向上的学习率会快速减小,所以垂直方向上的更新步长会越来越小;而水平方向上梯度很小,相对于垂直方向上学习率会大得多,所以水平方向上的更新更快。这就实现了不同梯度上的补偿。
Q2:经过长时间之后更新步幅会发生什么变化?
A2:由于catch的增量是平方,所以会一直增大,最终会造成更新步长趋于零,完全停止学习。但是在训练神经网络中我们希望不断更新从而优化网络。

e.RMSProp update
RMSProp更新算法是对AdaGrad更新算法的改进,主要就是解决更新步长趋于零导致停止学习的问题。
主要改进如下:
这里写图片描述
添加一个衰减系数,将cache变成一个泄露的变量,cache的值只与前面一段时期的梯度有关而不是历史梯度的平方和,这样既保持了在不同梯度上的补偿效果,又不会造成学习停止的问题。
衰减系数一般设置为0.9。

f.Adam update
“强强联合”Momentum+RMSProp
这里写图片描述
与RMSProp的区别在于用前一段时期梯度的动量替换当前梯度,这样可以稳定梯度方向,并且自适应更新幅度,所以效果拔群。
超参数beta1一般设置为0.9,beta2一般设置为0.995。
但上面并非完整形式,完整的计算过程如下:
这里写图片描述
加入偏置矫正(bias correction),用来对m,v初始化为零进行补偿,只在最初很短的时期起作用。
0.9^50≈0.005,0.995^1000≈0.0067

另外还有二阶优化算法如牛顿法(Newton)、拟牛顿法BFGS、L-BFGS(Limited memory BFGS)等。优点是不需要设置超参数如学习率,缺点是需要计算Hessian矩阵,不适用于深度神经网络。其中L-BFGS不需要存储Hessian矩阵和逆矩阵,但是容易受到随机性和样本噪声的干扰,不适合用于规模较大样本集。

实际应用:
— Adam在多数情况下都是一个不错的选择
— 如果可以在整个样本上进行更新,并且去除所有噪声源,那么可以考虑使用L-BFGS。

2.学习率更新
不论何种更新算法(SGD、SGD+Momentum、AdaGrad、RMSProp、Adam),均有学习率这一最重要的超参数。
Q:什么样的学习率是最优的呢?
这里写图片描述
A:以上均不是最优情况。应该在学习过程中不断调节学习率,起始阶段使用较大的学习率加速收敛过程,然后逐渐衰减以收敛到到最优值。
常用的学习率衰减策略有步进衰减、指数衰减、1/t衰减等。
这里写图片描述

3.模型整合(model ensembles)
在测试阶段,可以使用模型整合的策略,具体如下:
1)独立训练多个模型;
2)在测试阶段将所有模型的结果进行平均作为最终的结果。
一般来说,模型整合可以提高2%的性能效果。
但是,训练大量的模型本就繁琐,在测试阶段也很耗时。

实用技巧:
— 可以不需要独立训练多个模型,保存单个模型不同阶段的checkpoint,将这些checkpoint作为独立模型进行整合。
— 跟踪运行期平均(running average)参数向量,并应用于测试集。
这里写图片描述
这就相当于对之前一段时间的参数进行加权,所得到的效果一般总会比单独使用一个时间点的参数要好。可以解释如下,设想对一个碗状函数进行优化,在最低点周围不停移动,如果对这些点做平均,一般会更接近最低点,即最优点位置。

  1. Dropout
    Dropout是一种正则化方法。
    在前向传播时随机将一部分神经元的值置为零。
    这里写图片描述
    以一个三层神经网络为例,下面是在前向传播时使用dropout的示例代码:
    这里写图片描述
    在每一层的后面随机生成一个概率为p的失活掩码,这里的p是神经元的存活几率,因此每个神经元会有(1-p)的概率被舍弃。

Q:为什么说dropout是一个好主意?
A:使用dropout可以在每次训练时抽取一个神经元数量少(1-p)的子网络, 模型变小,其表达能力相应变小,因此发生过拟合的情况就会减少,即dropout可减少发生过拟合的概率。

Dropout可以有如下解释:
1)强迫网络对输入学习冗余的表示
这里写图片描述
以上图学习对猫的表示为例,由于dropout会随机另一部分神经元失活,所以网络无法依赖某个或少量神经元来完全表示概念,那样在相关神经元失活时便不能进行准确预测。所以网络会学习更多表示,以保证在部分神经元失活时仍然可以做出准确的预测。
2)模型整合
Dropout可以理解为将大规模网络结构不同但参数共享的模型进行整合,以提升模型性能。
每个二值掩码都会产生一个不同结构的网络,由于随机性,每个网络几乎只会被训练一次,但是所有网络是共享参数的。

那么在测试阶段应该如何处理使用了dropout的网络呢?
在测试阶段只需要运行一次前向传播,所有神经元都处于激活状态,即在测试阶段不使用dropout,可以近似理解为对所有“子模型”进行整合。
Q:假设在测试阶段神经元的输出为x,那么在训练阶段该神经元的期望输出是多少?(假设p=0.5)
A:具体计算如下:
这里写图片描述
由上面的计算可以看出,p=0.5时,测试阶段的所有输入经过前向传播后的激活值是训练时的两倍,所以要通过对测试阶段的激活值进行缩放来进行补偿。所以测试阶段的实现代码如下:
这里写图片描述
在测试阶段,对所有神经元的激活值进行缩放,使得测试阶段的输出=训练阶段的期望输出。
但是上述操作在实际中并不常用,一般常用“反向失活”(inverted dropout)
这里写图片描述
这样在测试阶段就不需要做额外的处理。

  1. 梯度检查
    具体见http://cs231n.github.io/neural-networks-3/Gradient Check 章节
    主要是利用数值梯度来验证解析梯度的正确性。

6.卷积神经网络简史及应用
生物视觉机制

分层结构(hierarchical organization)
这里写图片描述

神经认知机(Neurocognitron)

LeNet、AlexNet

应用:
分类(Classification)
检索(Retrieval)
检测(Detection)
语义分割(Segmentation)
自动驾驶(self-driving cars)
人脸识别
姿态识别
图像描述(Image captioning)
… …

0 0
原创粉丝点击