美文网首页工作生活
《改善深层神经网络:超参数调试、正则化以及优化》笔记(2)

《改善深层神经网络:超参数调试、正则化以及优化》笔记(2)

作者: wipping的技术小栈 | 来源:发表于2019-07-07 14:56 被阅读0次

    一、前言

    这一课主要讲述mini-batch的使用方法及其作用,其实会涉及到几种不同的梯度下降方式以及学习率的衰减问题。内容不多,如果笔者所言有错之初,还请各位读者海涵指正

    二、mini-batch

    2.1、介绍

    原本的batch梯度下降是同时处理整个训练集,如果数据集很大,数百万个的情况下就不使用了。而mini-batch是对整个batch训练数据的样本进行训练,每次处理单个min_batch,我们将数据集分成
    X^{\{1\} } X^{\{2\} } ... X^{\{i\} }

    X^{\{i\}}指的是第 i 个mini-batch,每个mini-batch都含有 m 个样本。同样,标签数据集也需要进行相应处理

    处理步骤同batch梯度下降类似,只是我们不再使用整个数据集进行迭代,每一次迭代都是一个mini-batch。假设数据集分为 t 个mini-batch,那么经过 t 次迭代将整个数据集迭代完成后我们称为一代,就是指遍历一次训练集

    如下图所示,左图是指常规的batch下降,而右图使用了mini-batch,可以看到每次迭代并不都是下降的,与batch梯度下降图都不一样,会产生噪声。但总体趋势应该是下降的


    batch与minibatch

    2.2、batch大小

    我们使用 m 表示 batch 的大小

    m =1 时为随机梯度下降,随机抽取一个样本代表整个数据集进行训练,随机梯度下降不会收敛,最终会在最优点振荡,这种情况相当于不使用向量化计算,效率过于低下,如下图紫色线

    m = all时,就是最速梯度下降,相当于我们之前使用的梯度下降法,这种情况在数据量非常大的时候单次迭代时间过长,如下图蓝色线

    图中蓝色的线是 最速梯度下降,它的优化效果最好,如果将图中的一个蓝色箭头看成是一个迭代,那么每次迭代是时间会过长

    青色的线表示mini-batch,每一个曲折代表一个迭代,虽然优化过程不如蓝色顺利,但胜在每一次迭代不需要很长的时间,且梯度可以收敛

    同理紫色的情况不理想,虽然每次迭代都非常快,但优化效果并不是我们想要的
    所以mini-batch是去蓝色和紫色线的中间情况


    不同m的下降梯度.png

    确定 m 大小的指导原则:

    • 训练集比较小,使用batch最速梯度下降,比如样本不大于2000个
    • 训练集比较大,使用mini-batch,m=64~512,一般取2^n次方

    三、指数加权平均数

    3.1、算法

    指数加权平均数 可以让每个数据集与周围的 n 个数值进行平均,下面几个例子,加入我们用\theta表示当前的温度,用v_i表示当天温度的指数加权平均数,那么有如下式子
    \begin {aligned} &v_0 = x \\ &v_1 = 0.9v_0 + 0.1\theta_1 \\ &v_2 = 0.9v_1 + 0.1\theta_2 \\ &v_3 = 0.9v_2+ 0.1\theta_3 \\ &... \\ &v_t = 0.9 v_{t-1} + 0.1\theta_t \\ \end{aligned}

    其中 x 是初始值,v_t = \beta v_{t-1} + (1-\beta)\theta_t就是指数加权平均数,在例子中表示的意义是过去1 / (1-β) 天的平均温度

    3.2、理解指数加权平均数

    我们可以对v_t的公式进行展开,得到一个关于每日温度\theta_t的表达式

    以 100 天的温度来举例,我们有下面的式子
    \begin{aligned} & v_{100} = 0.9v_{99} + 0.1v_{100} \\ & v_{99} = 0.9v_{98} + 0.1v_{99} \\ & v_{98} = 0.9v_{97} + 0.1v_{98} \\ &... \end{aligned}
    我们将v_{100}展开得到下面的式子
    v_{100} = 0.9(0.1\theta_{99} + 0.9v_{98}) + 0.1\theta_{100}
    以此类推,最终展开得到
    v_{100} = 0.1\theta_{100} + 0.1 \times 0.9\theta_{99} +0.1 \times (0.9)^2\theta_{98}+0.1 \times (0.9)^3\theta_{97}+0.1 \times (0.9)^4 \theta_{96}+\cdots
    可见,对一个项式总是递减的,且第 100 天的温度由前面的温度数据组成,不同天温度的占比也不同,会越来越少,如果我们将每个项式当做一个指数函数,且常数部分小于 1 ,那么可以得到下图

    指数函数
    那么我们一般加到哪一项就停止下来呢?
    我们有如下的指导原则:
    当某一天的指数部分为\frac{1}{e},那么加到该天即可。以上面例子来说,我们设有变量,那么在例子中,我们一般有

    在例子中,我们可以知道指数部分为,且,那么我们就可以只加到前面的第10天即可。
    更一般的,我们可以把指数加权平均数写成如下的格式

    指数加权平均数并不是计算平均数最好的,但使用的内存是比较少的。如果使用平均数计算,我们需要保存过去的数据,但是使用指数加权平均数,我们可以使用当前的数据进行迭代即可

    3.2、指数加权平均数偏差修正

    指数加权平均数的偏差修正,可以让平均数运算更加准确
    v_0 = 0 \\ v_1 = 0.9v_0 + 0.1θ_1 = 0.1θ_1 \\
    因为初始化v_0为 0 ,所以前期的数据数据都偏小,需要经过几轮迭代后数据才会开始正常

    所以我们对指数加权平均数进行偏差修正:
    v_t = (β(v_t-1) + (1-β)θ_t) / (1-β^t)
    也就是在原来的基础上除以(1-β^t),随着t的增加 (1-β^t)会越大,变得越接近1,所以此时(1-β^t)的作用会越来越弱,而在前期(1-β^t)可以放大我们的数据,使得v_t更加接近原始数据。

    四、momentum动量梯度下降法

    momentum动量梯度下降法是计算梯度的指数加权平均数,并利用该梯度更新权重,如下图

    计算方式

    如图,假设我们的训练集让损失函数的下降梯度比较曲折,这样我们就无法加大学习率来加快我们的学习速度,因为会引起更大的振荡。此时我们可以使用加权指数平均值将每次的梯度与前面的梯度做一个平均,将梯度的纵向平均掉,那么此时纵向梯度接近 0 ,而横向梯度变化不大

    梯度下降

    五、RMSprop(root mean square prop)

    回顾前面的例子,我们降低纵向梯度的同时,横向梯度也会被进行平均,那么横向梯度也会收到一些影响,如果你想减缓纵向方向的学习,同时加快,至少不是减缓横轴方向的学习,那么RMSprop可以帮助我们实现。

    公式如下:
    S_{dW} = \beta S_{dW} + (1-\beta)(dW)^2 \\ S_{db} = \beta S_{db} + (1-\beta)(db)^2
    其中dW可由mini-batch等方法计算出,公式的意义在于能够保留微分平方的加权平均数

    那么RMSprop更新参数的公式如下:
    W = W - \alpha\frac{dW}{\sqrt{S_{dW}}} \\ b = b - \alpha\frac{db}{\sqrt{S_{db}}} \\
    原理:
    直观地理解,以上面的图为例子,在某个方向的摆动程度比较大,那么该方向梯度也会比较大,在这里是纵轴b值。摆动程度大的方向要减去一个比较小的值来减缓摆动,比如
    b = b - \alpha \frac{db}{\sqrt{S_{db}}}
    那么我们希望\sqrt{S_{db}}大一些,这样b的变化就小一些,摆动程度也会小一些,怎样可以是\sqrt{S_{db}}大呢,我们刚刚说过摆动程度大的方向,其梯度也会比较大,那么我们可以将\sqrt{S_{db}}和梯度db关联起来,创建一个两者正相关的函数

    得到S_{db} = \beta S_{db} + (1-\beta)(db)^2,这样我们就能够让\sqrt{S_{db}}随着db增大而增大,缩小而缩小,这样就能得到一个正相关的函数,从而满足我们的要求。当然以上的笔者的个人理解,未必正确,如果有错,请海涵指正

    六、Adam优化算法(Adaptive Moment Estimation)

    Adam优化算法基本上就是将MomentumRMSprop结合在一起
    步骤:
    \begin{aligned} & V_{dW} = \beta_1 * V_{dW} + (1 - \beta_1)dW \\ & V_{db} = \beta_1 * V_{db} + (1 - \beta_1)db \\ & S_{dW} = \beta_2 * S_{dW} + ( 1 - \beta_2) * (d_W)^ 2 \\ & S_{db} = \beta_2 * S_{db} + ( 1 - \beta_2) * (d_b)^2 \\ & V_{dW}^{corrected} = \frac{V_{dW}}{(1 - \beta^t_1)} , V_{db}^{corrected} = \frac{V_{db}}{(1 - \beta^t_1)} \\ & S_{dW}^{corrected} = \frac{S_{dW}}{(1 - \beta^t_2)} , S_{db}^{corrected} = \frac{S_{db}}{(1 - \beta^t_2)} \\ & W = W - \alpha *( \frac{V_{dW}^{corrected}}{ \sqrt{S_{dW}^{corrected} } + \varepsilon } ) \\ & b = b - \alpha *( \frac{V_{db}^{corrected}}{ \sqrt{S_{db}^{corrected} } + \varepsilon } ) \\ \end{aligned}
    需要初始化:
    V_{dW}=0,S_{dW}=0,v_{db}=0,S_{db}=0
    关于Adam算法的超参我们一般使用默认数值,如下
    学习率(自定),\beta_1 = 0.9 (又称第一矩) , \beta_2 = 0.999 (又称第二矩), \varepsilon = 10^-8
    损失函数梯度最小值一般是鞍点,Adam算法可以让我们加快速度,走出平稳段,使优化值不在暗点上

    七、学习率衰减

    学习率衰减,随着训练迭代而衰减
    训练时数据集可能带有噪声,固定学习率会在收敛值附近放大噪声,从而在收敛值附近大幅度摆动,从而无法真正收敛。
    学习率指导公式:
    \alpha = \frac{1}{1 + decay\_rate * epoch\_num} * \alpha
    decay_rate:衰减率,属于超参
    epoch_num:训练轮数
    其他形式:
    \alpha = 0.95^{epoch_num} * \alpha \\ \alpha = \frac{k}{\sqrt{epoch_num}} * \alpha \\

    相关文章

      网友评论

        本文标题:《改善深层神经网络:超参数调试、正则化以及优化》笔记(2)

        本文链接:https://www.haomeiwen.com/subject/epbocctx.html