美文网首页
优化算法

优化算法

作者: 此间不留白 | 来源:发表于2019-10-22 21:13 被阅读0次

    前言

    机器学习的应用是一个高度依赖经验的过程,为了达到最优的计算结果,往往需要多次迭代,利用各种优化算法能够大大加快这个迭代过程,节省大大量的时间和资源。本篇文章将介绍有关机器学习和深度学习的一些优化算法

    Mini-batch 梯度下降算法

    Mini-batch 梯度下降算法的介绍

    对于m个训练样本,可以通过向量化的实现方法,降低训练所花费的时间。如果训练样本很大,假设m = 5000000,那么即使采用使用向量化的实现方法,也会花费大量的时间。对于大规模的数据,可以采用mini-batch的训练方法。这种方法是通过将大规模样本划分为小样本,再进行训练。例如,可以将500 0000个训练样本按照每1000个一组划分,这些被划分为小样本的训练集称之为训练子集,即也就是mini-batch

    对此,每一个训练子集,都可以用\{X^{ \{1\}},X^{\{2\}}…X^{ \{t\}} \}表示,t表示训练子集mini-batch的数量。在整个训练过程中,将会通过向量化同时实现每个训练子集的样本,再通过t次循环完成整个样本的训练。

    使用常规梯度下降算法,遍历一次样本,只能实现一次梯度下降,但是使用mini-batch,完成所有样本训练,就可以实现t次梯度下降。通常情况下,可以通过设置外层循环,实现样本的多次训练,直至算法收敛至最优结果。

    Mini-batch梯度下降算法的理解

    使用batch梯度下降算法时,损失函数的损失值会随着迭代次数的增加逐渐下降。而在mini-batch梯度下降算法中,损失函数的在整体样本上还是呈现下降趋势,但是在每次迭代中会出现更多的噪声,出现噪声的原因是因为某些样本是比较容易计算的mini-batch,而另一些样本的mini-batch更难计算。如下图所示:


    mini-batch的大小对算法的执行结果有着重要的影响,对此,有如下分析:

    • mini-batch=1,这是一种极端情况,这种情况下的梯度下降算法称之为随机梯度下降算法,每次迭代只训练一个样本,尽管这种方法会产生很多的噪声,但是还是能够通过多次迭代,损失函数值最终还是会靠近最小值。随机梯度下降算法永远不会达到最小值,而是会一直
      在最小值附近波动。

    • mini-batch = m,这是另一种极端情况,也就是相当于执行batch梯度下降算法,相对噪声更低,幅度也更大。

    • 1<mini-batch<m,实际上,这种情况下mini-batch的选择一般在(64,512)之间,考虑到计算机的内存,一般都会将其设置为2n次方。

    指数加权平均

    指数加权平均的介绍

    某一地区,一年中的温度数据散点图如下所示,需要计算温度的趋势,也就是局部平均值或者移动平均值,可以如下公式所示:

    \theta_i表示当日的温度,移动平均值用v_i表示,则有:

    v_0 = 0
    v_1 = 0.9v_0 + 0.1 \theta_1
    v_2 = 0.9v_1+ 0.1 \theta_2

    v_i = 0.9v_{i-1} + 0.1 \theta_i

    即也就是,每一天都根据当日的温度和前一天的加权平均值获得一个新的加权平均值。绘出v_i的值,如下所示:

    根据以上推导,可以获得一个更加通用的公式:
    v_t = \beta v_{t-1} + (1-\beta) \theta_t \tag{1}

    在计算时,可视v_t \approx \frac{1}{1-\beta}天的每日温度。

    假设\beta = 0.98,这是计算所得为\frac{1}{1-0.98} = 50天的平均温度。绘制图形效果如下图绿线所示,50天的温度平均值导致曲线更加平滑并且会向右移动。

    假设设置\beta = 0.5,那么会计算出两天的温度平均值,平均的天数太少,会出现更多的噪声,可能会出现异常值,但是这个曲线会更快速的适应温度的变化。如下图黄线所示

    通过设置参数\beta可以得到不同的效果。

    对指数加权平均的理解

    如公式(1)所示,指数加权平均实际上就是一个递归的过程,写出这个递归的详细计算可以如下所示:

    v_t = (1-\beta) \theta_t + \beta(v_t -1) \\ = (1-\beta) \theta_t + \beta (1-\beta)\theta_{t-1} + \beta ^2(v_{t-2}) \\ = (1-\beta) \theta_t + \beta (1-\beta)\theta_{t-1} +\beta^2(1-\beta)\theta_{t-2} +\beta^3v_{t-3} + ……

    可以将第t日的指数衰减值\beta^{t}(1-\beta)作为一个参数,可以得到一个随天数变化的指数衰减函数,第t日的温度可以看成当日温度加上第t日温度乘以当日对应的指数衰减值构成。

    一般情况下,需要利用指数衰减函数将温度衰减至原来的\frac{1}{e},所以参数\beta的取值决定着应该取多少天的平均值,即也就是令\beta^t = \frac{1}{e},则有以下推导:
    根据数学极限知识,有\lim_{\epsilon->0} (1-\epsilon)^{\frac{1}{\epsilon}} = \frac{1}{e}
    所以,令\beta = 1-\epsilont = \frac{1}{\epsilon}
    平均的天数就是 \frac{1}{1-\beta}

    指数加权平均的偏差修正

    计算第一天的温度时,通常会设置v_0 = 0,这样做有可能导致第一天和第二天的温度的估计值太小,为了解决这一问题,提出了偏差修正的解决方案。

    具体做法如下所示:

    不用v_t,而是用\frac{v_t}{1-\beta^{t}},值得注意的是,随着t的增加,\beta^t将会变得很小,偏差修正几乎会失去作用。

    动量梯度下降法

    动量梯度下降法(Gradient descend with Momentum)是一种比标准梯度下降法运行速度更快的算法,其基本思想就是利用指数加权平均来更新梯度。

    假设要优化损失函数,如下图所示,红点代表最小值,蓝点表示起点,使用标准的梯度下降法,其计算过程在纵轴上是一个衰减震荡的过程,我们希望,在梯度下降的计算过程中,尽可能的在纵轴上消除这些震荡,在横轴上更新速度尽可能快。

    参数的更新可以采用指数加权平均加快训练速度,具体实现如下所示:
    v_{dw} = \beta v_{dw} + (1-\beta)dW \tag{2}
    v_{db} = \beta v_{db} +(1- \beta)db \tag{3}
    W = W -\alpha v_{dw} \tag{4}
    b = b -\alpha v_{db} \tag{5}

    动量梯度下降法需要调整两个参数,一个是学习率\alpha,另一个是j加权平均参数\beta,一般情况下取\beta = 0.9,具有较强的鲁棒性。

    动量梯度下降法与标准梯度下降法相比,每次的梯度更新不再是一个独立的过程,当梯度更新的方向与上次梯度更新的方向相同时,会产生一个正向加速,当梯度更新的方向与上次梯度的更新量相反时,会产生一个反向减速的效果,而不是立刻改变方向。所以,动量梯度下降法,既消除了震荡,又加快了更新速度。

    RMSprop

    在如上所述的梯度下降过程中,希望尽可能的减小纵轴上的震荡,加快横轴的更新速度,假设以参数b代表纵轴,参数W代表横轴,则RMSprop算法的梯度更新将会如下所示:

    S_{dw} = \beta S_{dw} + (1-\beta){d^2W} \tag{6}
    S_{db} = \beta S_{db} + (1-\beta){d^2b} \tag{7}
    W := W- \alpha \frac{dW}{\sqrt{S_{dw}}} \tag{8}
    b := b- \alpha \frac{db}{\sqrt{S_{db}}} \tag{9}

    分析以上算法,如果S_{dW}较小,通过公式(8)的计算,参数W将会变大,而S_{db}如果较小,通过公式(9)的计算,参数b将会变小。RMSprop算法,可以允许采用一个更大学习率\alpha来加快参数的更新速度。

    在实际的算法应用中,为了避免参数更新中的分母为0,通常会将参数的更新公式中的分母项变成\frac{dW}{\sqrt{S_{dW}}+\epsilon}\frac{db}{\sqrt{S_{db}}+\epsilon},通常取\epsilon = 10^{-8}

    Adam优化算法

    Adam优化算法就是将动量梯度下降法和RMSprop结合在一起的算法。该算法的具体实现步骤如下所示:

    • 初始化,令S_{db} = 0,S_{dw} = 0,v_{dw} = 0,v_{db} = 0

    • 在第t次迭代时,计算微分,即用当前的mini-batch计算微分dW,db,再用动量指数加权平均,如下公式所示:
      v_{dw} = \beta_1 v_{dw} + (1-\beta_1)v_{dw} \tag{10}
      v_{db} = \beta_1 v_{db} + (1-\beta_1) v_{db} \tag{11}

    • 用RMSprop算法进行更新,如下公式所示:
      S_{dw} = \beta_2 S_{dw} + (1-\beta_2){d^2W} \tag{12}
      S_{db} = \beta_2 S_{db} + (1-\beta_2){d^2b} \tag{13}

    • 计算偏差修正,如下公式所示;
      v^{corrected}_{dW} = \frac{v_{dW}}{1-\beta_1^t} \tag{14}
      v^{corrected}_{db} = \frac{v_{db}}{1-\beta_1^t} \tag{15}

    S^{corrected}_{dW} = \frac{S_{dW}}{1-\beta_2^t} \tag{16}
    S^{corrected}_{db} = \frac{S_{db}}{1-\beta_2^t} \tag{17}

    • 最后,进行参数更新,如下公式所示:
      W := W- \alpha\frac{v^{corrected}_{dW}}{\sqrt{S^{corrected}_{dW}}+\epsilon} \tag{18}
      b := b- \alpha\frac{v^{corrected}_{db}}{\sqrt{S^{corrected}_{db}}+\epsilon} \tag{19}

    一般情况下,参数\beta_1 = 0.9,而取参数\beta_2 = 0.99

    学习率衰减

    学习率一直保持不变的情况下,随着梯度下降过程的进行,损失函数并不会达到最小值,而是一直在最小值附近震荡。为此,算法刚开始运行时,可以将学习率设置较大,以加快运行速度,算法逐渐收敛时,可以将学习率逐渐减小,以获得损失函数的最小值,具体而言,学习率的衰减可以用以下公式表示:
    \alpha = \frac{1}{1+decayrate* epoch_{num}} *\alpha_0 \tag{20}

    decayrate表示学习率的衰减比例
    epoch_{num} 表示迭代次数
    \alpha_0表示初始学习率

    除了如公式(20)表示的学习率衰减方式外,还有其他的衰减方式。如下所示:

    • 指数衰减, \alpha = 0.95^{epoch_{num}}*\alpha_0
    • \alpha = \frac{k}{\sqrt{epoch_{num}}} 或者\alpha = \frac{k}{t},其中t代表mini-bitch数量。
    • 离散衰减,随着算法运行的时间,每次将其减少为原来的一半。

    局部最优问题

    所谓局部最优问题就是,人们担心深度学习的优化算法被困在局部最优点,而不能达到全局最优点,如下图所示:

    实际上,高维的神经网络中,梯度为0的点并不是局部最优点,而是鞍点,如下图所示,在鞍点上,如果梯度为0,那么在一些方向上它可能是凸函数,而另一些点上则是凹函数。假设一个20000的空间,如果要想达到局部最优,需要所有的方向全是凹函数,其概率为\frac{1}{20000},所以,高维空间中,遇到最多的是鞍点。

    局部最优并不是深度学习的问题,而梯度为0的平稳段会耗费大量的时间,即也就是需要花费多次梯度,才能走出平稳段,如动量梯度下降法,RMSprop梯度下降方法和Adam优化算法neng

    相关文章

      网友评论

          本文标题:优化算法

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