[cs231n] assignment2 总结

assignment2相比assignment1,多个维度上的难度都有了一个质的提升。

  1. 参数更新的策略

在这里介绍了几个不同的参数更新的策略,从最基础的SGD(随机梯度下降)到Momentum(动量法)到RMSProp再经过几个版本后最终到达目前使用广泛的adam算法,可以说在算法的迭代上的速度是越来越高效。

SGD的的参数更新策略:x += -learning_rate * dx 其中learning_rate是一个超参数,表示的是更新的幅度。这个参数在NN中是一个非常crucial的参数,太大会导致loss可能会异常,而太小则可能导致训练时间过长。

momentum(动量)这个方法还挺直观的,就是我们的神经网络在更新梯度的时候,一般都不是变化很大的,类似物体的惯性一样,都会保持其趋势。通过这样的方法,使得在梯度更新不变的维度上,速度更快。t时刻的主要下降主要是由t-1时刻决定的。

在sgd中,我们更新w为w-=config\[''learning_rate"] * dw;然后在sgd_momentum中,除了学习速率外,还有个参数:动量momentum,是一个介于0到1的数值表明了动量的数值,如果此值为0则代表是sgd。在此方法中,梯度的更新策略为:v = mu * v - learning_rate*dw,w += v,可以看到这个v是在之前的基础上的一个动量的变化。(其实很好理解了)

然后是AdaGrad,其主要的算法流程图如下:

《[cs231n] assignment2 总结》

和普通的sgd的区别在于,不是采用一个固定的参数learning_rate这个学习率去控制梯度的更新,而是引入了一个变量:累计平方梯度,然后学习率为全局学习率/sqrt(累计平方梯度),使得每次的学习率都不同。它起到的作用是在参数空间更为平缓的方向,取得更大的进步(平缓的地方的历史梯度平方和较小,对应学习率下降的幅度较小),从而加快训练速度。下图是一个比较直观的解释

在引入了累计平方梯度之后,可以看到绿色线是一个新的更新的路线,由于b方向上的梯度要大于w方向上的梯度,使得在经过除法之后,它的学习率较小,从而在该方向的更新较为平缓;与之相对的是在w方向的更新速度将较快,通过这样使得加快训练速度。


再之后,研究人员提出了RMSProp的算法,该算啊是在AdaProp算法上的一种改进。其算法流程图如下:

《[cs231n] assignment2 总结》

我们可以看到RMSProp与AdaProp算法的主要不同点在于累计平方梯度的计算方式略有不同。它引入了一个衰减系数来控制获取多少历史信息,即:r <- pr + (1-p) g * g

再之后就是广泛应用实践的adam算法。它不是直接用dx来计算,而是通过smooth操作。即:

最后贴一下RMSProp和adam的代码吧


assignment2的主要部分就是一个CNN网络的实现。然后


一些技巧:

  1. 面对大量出现的除法。通过加上一个较小的epilison来避免除0的问题,epilison一般在1e-4~1e-8范围内。

Ref

卷积神经网络中的优化算法比较

一文弄懂RMSProp优化算法

点赞
  1. godweiyang说道:

    奕哥搞什么方向呀

    1. ohazyi说道:

      打酱油

发表评论

电子邮件地址不会被公开。 必填项已用*标注