CS231n 学习笔记(十二)

时间:2019/4/3
内容:更好的优化

课时16:更好的优化

(加油!理论学好就能开始学习框架了)
之前学过的内容有:

  • 各种激活函数 CS231n 学习笔记(十二)_第1张图片

  • 权重初始化(较好的选择:Xavier、MSRA,这样学习深度网络时,每一层的激活值会有很好的分布;网络越来越深时,权重的初始化会变得至关重要,因为随着网络的变深,你会不断乘以那些权重矩阵) CS231n 学习笔记(十二)_第2张图片

  • 数据预处理(zero-centered、normalized会使得数据分布均值为0,方差为1) CS231n 学习笔记(十二)_第3张图片
    CS231n 学习笔记(十二)_第4张图片
    在左边的图中如果直线转动,那么分类很容易就发生改变,也就是说,损失函数对我们权重中的线性分类器中参数值的小扰动非常敏感,造成学习困难。

  • 由于我们了解了归一化的重要性,因此引入了batch normalization
    即在神经网络中加入额外一层,以使得中间的激活值均值为0,方差为1.在batch normalization中正向传递时,我们用小批量的统计数据计算平均值和标准差,并用这个估计值对数据进行归一化。之后还介绍了缩放函数和平移函数来增加层的可表达性
    CS231n 学习笔记(十二)_第5张图片

  • 跟踪学习过程
    CS231n 学习笔记(十二)_第6张图片
    可加入正则化防止过拟合

  • 超参数搜索
    随机搜索比网格搜索效果更优,因为当你的模型性能对某一个超参数比对其他超参数更敏感的时候,随机搜索可以对超参数空间覆盖的更好。最右侧是粗细粒交叉搜索,当做超参数哟优化时,一开始可能会处理很大的搜索范围,几次迭代之后就可以缩小范围,圈定合适的超参数所在的区域,然后再对这个小范围重复这个过程注意一开始的搜索范围要足够大)
    通常要先确定学习率,然后是正则化、模型大小等参数CS231n 学习笔记(十二)_第7张图片

之后几讲会涉及到的内容:
CS231n 学习笔记(十二)_第8张图片

我们先看优化
训练神经网络的核心策略是一个优化问题。我们写下损失函数,定义网络权重的每一个值,损失函数告诉我们这些权重值在解决我们问题时表现是好是坏
CS231n 学习笔记(十二)_第9张图片
假设右图是当前权重下损失函数的等高线图,我们只优化两个值W1,W2,目标是找到红色最深的区域(对应了损失最小的权重值)。我们已使用的最简单的优化算法是随机梯度下降:我们首先评估一些小批数据中损失的梯度,然后,向梯度为负的方向更新参数向量,因为它给出了损失函数下降最快的方向。

在现实应用中存在的问题:

1.SGD在多维上可能会出问题

CS231n 学习笔记(十二)_第10张图片
CS231n 学习笔记(十二)_第11张图片

2.另一个问题是局部极小值或鞍点
CS231n 学习笔记(十二)_第12张图片
CS231n 学习笔记(十二)_第13张图片
3.在一维问题上,局部极小值看起来是个大问题,鞍点看起来不用担心。但在高纬中,情况相反,鞍点意味着某些方向上的损失会增加,某些方向会减小,然而在局部极小值点上,在所有方向中,向任何一个方向前进损失都会变大

在SGD中,损失是通过计算不同实例的损失来定义的,每次计算损失会耗费很大的计算量。事实上我们通常通过小批的实例对损失和梯度进行估计
CS231n 学习笔记(十二)_第14张图片

下面我们需要引入新的方法来解决以上这些问题
想法:在随机梯度下降过程中加入动量项。保持一个不随时间变化的速度,并且我们将梯度估计添加到这个速度上,然后再这个速度方向上步进,而不是在梯度方向上步进
CS231n 学习笔记(十二)_第15张图片
CS231n 学习笔记(十二)_第16张图片
可以理解成,一个球滚下山,他会在下降的时候速度变快,在通过局部极小值点的时候,虽然梯度为0,但这个点仍有速度,这样就可以越过这个局部极小值点,然后继续下降(在鞍点附近也是类似的解释)

这种使用动量的方法可以抵消之前前进过程中的zigzag,并减小朝敏感方向步进的数量。

右图的蓝线是加了动量的SGD
CS231n 学习笔记(十二)_第17张图片

  • 上图左侧图中,红色的点是我们当前的位置,在当前位置有一些红色的向量表示梯度,或者我们对当前位置梯度的估计方向,绿色向量是速度向量的方向,当我们做动量更新时,实际上我们是在根据这两者的平均权重进行步进,这有助于克服梯度估计中的一些噪声。有时你会看到动量的轻微变化,称为Nesterov加速梯度或Nesterov动量

  • 普通SGD动量中,我们估算当前位置的梯度,然后取速度和梯度的混合

  • Nesterov动量中(拥有校正因子),从红点开始,在取得的速度的方向上步进,之后评估这个位置的梯度,随后回到初始位置将这两者混合起来(这种操作正把信息一点点混合在一起),如果速度的方向实际上有一点错误,那它可以让你在目标函数的等高轮廓图更大一点的部分中加入梯度信息。

  • 这里提到了一点点凸优化,回去查

我们根据之前的速度前进一步,然后计算此处的梯度,现在当我们前进下一步的时候,我们实际上是在速度的方向上步进,从多点合并信息

速度基本上都会初始化到0,它并不是一个超参数
CS231n 学习笔记(十二)_第18张图片
上图通过换元来简化计算loss和grad的过程

另一种优化算法是AdaGrad
CS231n 学习笔记(十二)_第19张图片

  • 核心思想:在优化过程中,需要保持一个在训练过程中的每一步的梯度的平方和的持续估计,与速度项不同的是,我们现在有了一个梯度平方项,在训练时,我们会一直累加当前梯度的平方到这个梯度平方项,当我们在更新我们的参数向量时,我们会除以这个梯度平方项

  • 举个例子,如果我们有两个坐标轴,沿其中一个A轴我们有很高的梯度,而另一个B轴方向有很小的梯度,那么在A轴随着我们累加小梯度的平方,我们会在最后更新参数向量时除以一个很小的数字,从而加速了在小梯度维度上的学习速度;在B轴上由于梯度变得特别大,我们会除以一个非常大的数,所以我们会降低这个维度方向上的训练进度

  • 当时间越来越大的时候,在训练过程中使用AdaGrad会发生什么?步长会越来越小,因为我们一直在随时间更新梯度平方的估计值,所以这个估计值在训练过程中一直随时间单调递增,这会导致我们的步长随时间越来越小。在学习目标是一个凸函数的情况下,有理论证明这个特征效果很好,因为当你接近极值点时,你会逐渐慢下来最后达到收敛,但在非凸函数情况下,事情会变的复杂,因为当到达一个局部的极值点时,使用这种方式会让你在这里被困住,式的训练过程无法进行下去

  • 没太明白这里关于凸函数的解释,回去查查

CS231n 学习笔记(十二)_第20张图片

  • 对AdaGrad有个变体叫RMSProp(梯度的平方被衰减了),它考虑到了以上的问题。这种算法下,我们仍计算梯度的平方,但并不仅仅简单的在训练中累加梯度平方,而是会让平方梯度按照一定比率下降(与动量优化法比较像,只不过这里我们是给梯度的平方加动量而非给梯度加动量)。在计算完梯度后,我们取出当前梯度的平方将其乘以一个衰减率(0.9或0.99),然后用1减去衰减率乘以梯度平方,再加上之前的结果。随着训练的进行,在被除了梯度平方后,和AdaGrad一样,步长会有一个良好的性质,在一个(梯度下降很缓慢的)维度上训练会加快,而在另一个维度上训练减慢

  • 在做神经网络训练时,倾向于不使用AdaGrad

  • 这一部分听得有点迷惑,之后做作业的时候再详细查询

小总结

  • 在动量中,我们有关于速度的概念,我们通过梯度的叠加得到速度 ,然后顺着速度的方向走
  • 在AdaGrad,RMSProp中,先求梯度平方的估计值,然后除以梯度平方的实际值

把以上两种方法结合起来引出Adam算法
使用Adam我们更新第一动量和第二动量的估计值。

这里Adam算法先开个头,今天来不及更完了,明天继续更这一讲剩下内容和正则化~

(这一讲内容真的好多鸭,发出疲惫的声音)

你可能感兴趣的:(斯坦福,CS231n,学习笔记)