0%

优化算法与计算性能

优化与深度学习

一般会预定义一个损失函数,再使用优化算法试图将其最小化,这样的损失函数通常被称为优化问题的目标函数,通常只考虑最小化目标函数。由于优化算法的目标函数通常是一个基于训练集的损失函数,故优化目的在于降低训练误差,而深度学习目的在于降低泛化误差,因此需要注意过拟合问题。

很多优化问题并不存在解析解,因此需要通过优化算法有限次迭代模型参数来尽可能降低损失函数值。

局部最小值

当一个优化问题的数值解在局部最优解附近时,由于目标函数有关解的梯度接近或变成0,因此最终迭代可能只令目标函数局部最小化而非全局最小化。

鞍点

在二维空间函数中,f(x,y) = x^2 - y^2,鞍点位置是x = 0处。且在图的鞍点位置,目标函数在x轴方向上是局部最小值,但在y轴方向上是局部最大值。

假设函数的输入为k维向量,输出为标量,则其海森矩阵有k个特征值;可通过该函数在对应点,其海森矩阵的特征值的正负,来判断该点为:(特征值全为负)局部最大值、(特征值全为正)局部最小值,还是(特征值有正有负)鞍点。

而通过随机矩阵理论可知:对一个大的高斯随机矩阵来说,任一特征值为正或负的概率均为0.5,故局部最小、最大值的可能性均为(0.5)^k,目标函数的鞍点比局部最值更常见。

梯度下降与随机梯度下降

一维梯度下降:通过用X - nf*(x)来代替x的方法,利用该式子不断迭代x,直到达到停止条件(一般为f’(x) ^2已经足够小,或者迭代次数已到达某个值)。其中正数n通常叫做学习率,为超参数,需人工设定。学习率过小:x更新缓慢,需要更多次迭代;学习率过大:可能会导致taylor展开的不等式不一定成立,迭代x不一定减小f(x)的值。

多维梯度下降:方向导数给出了x沿所有可能方向的变化率,为了最小化f,希望能找到f能被下降最快的方向,故利用梯度下降算法不断降低f的值。

随机梯度下降:n为训练数据样本数,x为模型的参数向量。则如果使用梯度下降时,会使用各个样本的平均作为,每次自变量迭代的计算开销为O(n),随n线性增长,因此若样本数大时,每次迭代的计算开销高。而随机梯度下降减少了计算开销,在每次迭代中随机均匀采样样本索引来计算梯度,从而减少每次迭代的开销。

小批量随机梯度下降

在每次迭代,梯度下降用整个训练集来计算梯度,而小批量梯度随机下降,利用随机均匀采样一个由样本索引组成的小批量B。

且由于随机采样得到梯度的方差在迭代过程中无法减小,因此实际中,小批量随机梯度下降的学习率需要在迭代过程中自我衰减。

在Gluon中可用创建Trainer实例来调用调优算法。

动量法

梯度下降又称最陡下降:自变量在当前位置下降最快的方向,在每次迭代中梯度下降根据自变量当前位置沿着梯度来更新自变量,然而,若自变量的迭代方向仅仅取决于自变量当前位置,可能会带来问题。

在二维或者多维的变量中,梯度下降往往难以同时兼顾学习率与确保f(x)下降;需要确保学习率较小,从而避免自变量在竖直方向越过函数最优解,但会因此导致向最优解移动缓慢。

动量法:设时间步t的自变量为Xt,学习率为Nt,动量法对每次迭代的步骤做出以下修改:Vt <- yV(t-1);Xt <- X(t-1) - Vt。y为动量超参数,范围在[0,1)

指数加权移动平均:

由指数加权平均理解动量法:

相对于小批量随机梯度下降,动量法需要对每一个自变量维护一个同它一样形状的速度变量,且在超参数中多了动量超参数。

在Gluon中,需要在Trainer实例中通过momentum来指定动量超参数,即可使用动量法。

AdaGrad算法

动量法依赖指数加权移动平均,使得自变量的更新方向更加一致,从而降低自变量在梯度较大的维度发散的可能。

而AdaGrad算法根据自变量在每个维度的梯度大小,来调整各个维度的学习率,从而避免统一的学习率难以适应所有维度的问题。

AdaGrad算法会使用一个小批量随机梯度Gt按元素平方的累加变量St:

Gluon中使用名称为”adagrad”的Trainer实例来调用该算法训练模型。

RMSProp算法

AdaGrad算法在迭代后期由于学习率过小,可能比较难找一个有用的解:因此用RMSProp算法改良后。

不同于AdaGrad算法里状态变量St是截至时间步t所有小批量随机梯度Gt按元素平方和。RMSProp算法将这些梯度按元素平方做指数加权移动平均,即

Gluon中使用名称为”rmsprop”的Trainer实例来调用该算法训练模型,且超参数由gammal指定。

还有AdaDelta算法、Adam算法

深度学习计算性能

命令式和符号式混合编程

之前一般使用Sequential类来串联多个层,先为了使用混合式编程,使用HybridSequential类来替换Sequential类。

异步运算

MXNet使用异步运算来提升性能,通过前端线程与后端线程的交互进行异步运算:前端线程无需等待当前指令从后端线程返回结果就继续执行后面的指令。

但同样异步运算会占据额外的内存:由于深度学习模型往往比较大,且内存资源通常有限,因此在训练模型时通常使用同步函数,而不用异步运算。

自动并行计算

MXNet后端会自动构建计算图,依据该图,系统会自动知道所有计算的依赖关系。

包括CPU与GPU的并行计算、多GPU计算、数据并行。

-------------本文结束感谢您的阅读-------------
坚持原创技术分享,您的支持将鼓励我继续创作!