zoukankan      html  css  js  c++  java
  • 李宏毅2021春机器学习课程笔记——Tips for training:Batch and Momentum

    本文作为自己学习李宏毅老师2021春机器学习课程所做笔记,记录自己身为入门阶段小白的学习理解,如果错漏、建议,还请各位博友不吝指教,感谢!!

    Batch(批次)

    首先回顾一下,在深度学习中,往往将训练数据集随机划分为N个batch,每完成一个batch的计算,便更新一次参数( heta),一轮(epoch)完成对所有N个batch的计算。在每一个epoch完成之后,对训练数据集进行shuffle,然后进行下一epoch的训练。
    在这里插入图片描述
    那到底选用多大的Batch size可以获得理想的训练效果呢?李宏毅老师从以下几个方面做了对比:

    训练时间

    以MNIST:digit classification为例:在这里插入图片描述
    如上图所示,完成一个batch的时间,相比较来说:

    • batch size越小,完成一个batch的时间越短;
    • batch size越大,完成一个batch的时间越长。

    如上图所示,完成一个epoch的时间,相比较来说:

    • batch越小,虽然完成一个batch的时间短了,但是一个epoch中需要完成的update的次数变多,所以完成一次epoch的时间也就变长了。
    • batch越大,完成一次epoch的时间越短。

    训练数据集上的效果

    在这里插入图片描述
    如上图所示,小的batch在训练数据集上的训练效果更好一些,而大的batch则出现了Optimization Fails问题。对这种情况的解释如下所示:
    在这里插入图片描述
    PS:Full Batch是指Batch Size = 训练数据集大小
    当我们选用比较小的batch时,每次更新都是用的不同batch计算的结果,不同的batch得到的Loss是略有差异的。当在L1陷入critical point时,利用另一个batch的计算结果来更新则会更容易逃离critical point。

    测试数据集上的效果

    如下图所示:
    在这里插入图片描述
    引自:
    On Large-Batch Training for Deep Learning: Generalization Gap and Sharp Minima(https://arxiv.org/abs/1609.04836)

    从上图中可以看出,小的batch size要比大的batch size得到的模型的泛化能力要更好一些。对于这种情况的一种解释是小的batch size最终会落到平坦最小值(Flat Minima),而大的batch size最终更容易落到尖锐最小值(Sharp Minima)处。

    综合来看
    在这里插入图片描述

    平坦最小值

    深度神经网络的参数非常多,并且有一定的冗余性,这使得每单个参数对最终损失的影响都比较小,因此会导致损失函数在局部最小解附近通常是一个平坦的区域,称为平坦最小值(Flat Minima),如下图所示。
    在这里插入图片描述
    在平坦最小值的邻域内,所有点对应的训练损失都比较接近,表明我们在训练神经网络时,不需要精确的找到一个局部最小解,只要在一个局部最小解的邻域内就足够了。平坦最小值通常被认为和模型泛化能力有一定的关系。一般而言,当一个模型收敛到一个平坦的局部最小值时,其鲁棒性会更好,即微小的参数变动不会剧烈影响模型能力;而当一个模型收敛到一个尖锐的局部最小值时,其鲁棒性也会比较差。具备良好泛化能力的模型通常应该是鲁棒的,因此理想的局部最小值应该是平坦的。可以参考下图做理解:
    在这里插入图片描述
    如上图,尖锐最小解附近,Testing Loss轻微的晃动,都会对模型能力造成巨大的影响(红色虚线)。

    Momentum(动量法)

    在一般的梯度下降算法(Vanilla Gradient Descent)中,我们是根据计算的梯度的负方向来更新参数( heta),如下图所示:
    在这里插入图片描述
    而在动量法中,则是用之前积累动量代替真正的梯度来更新参数( heta)。而动量的计算方法不仅取决于梯度,同样取决于之前的动量,其计算方法是:当前的动量 = 前一步的动量 - 当前的梯度。如下图所示:
    在这里插入图片描述
    根据上图,我们将前边的动量值代入后续动量的公式中,计算出所有动量的值:

    [egin{aligned} & m^0=0 \ & m^1 = -eta g^0 \ & m^2 = -lambda eta g^0 - eta g^1 end{aligned} ]

    由此可见动量(m^i)是之前所有梯度(g^0,g^1,ldots,g^{i-1})的加权和,进而可以如下表示:

    [m^t = lambda m^{t-1}-eta g^t=-eta sum^{t}_{ au=1} lambda^{t- au}g_ au ]

    [Delta heta_t = lambda heta_{t-1} - eta g_t = -eta sum^{t}_{ au=1} lambda^{t- au}g_ au ]

    其中(lambda)为动量因子,通常设为0.9,(eta)为学习率。

    这样,每个参数的实际更新差值取决于最近一段时间内梯度的加权平均值。当某个参数在最近一段时间内的梯度方向不一致时,其真实的参数更新幅度便小;相反,当在近一段时间内的梯度方向都一致时,其真实的参数更新幅度变大,起到加速作用。一般而言,在迭代初期,梯度方向都比较一致,动量法会起到加速作用,可以更快的到达最优点。在迭代后期,梯度方向会不一致,在收敛值附近震荡,动量法会起到减速作用,增加稳定性。从某种角度来说,当前梯度叠加上部分的上次梯度,一定程度上可以近似看作二阶梯度。


    参考资料:

    《统计学习方法(第2版)》 李航
    《神经网络与深度学习》 邱锡鹏

  • 相关阅读:
    图片局部放大插件jquery.jQZoom.js
    FastCGI for iis6不能限制程序池的CPU
    技术普及帖:你刚才在淘宝上买了一件东西
    转载 ListView动态加载数据模板
    转载 Drawable、Bitmap、byte[]之间的转换
    转载 一个ImageView 点击时是一张图片,放开时换另一张图片
    转载 java抽象类与接口的区别
    转载 Android AsyncTask
    转载 Android实现ListView异步加载图片
    转载 Android权限大全
  • 原文地址:https://www.cnblogs.com/sykline/p/14630900.html
Copyright © 2011-2022 走看看