网络优化 深度学习中的优化算法 在这里建立了基于梯度的优化算法的基本分析框架,并讨论了它如何应用在深度学习中。 Gradient descent 1. Formalizing the Taylor Expansion Descent lemma for gradient descent Stochastic gradient descent Accelerated Gradient Descent Local Runtime Analysis of GD Pre-conditioners 梯度下降(GD) 假设我们现在想要找出一个多元连续函数 ![[公式]](https://www.zhihu.com/equation?tex=f%28%5Comega%29) 的最小值 !
网络优化
在这里建立了基于梯度的优化算法的基本分析框架,并讨论了它如何应用在深度学习中。
假设我们现在想要找出一个多元连续函数 的最小值
梯度下降算法是这样的: ,其中
称为步长或学习率。
设计出GD算法的一个核心思想就是找出局部最陡的梯度下降方向
我们来考虑该点的泰勒展开式:
假设我们去掉高阶项,只在 的一个邻域内优化一阶近似式,即
,它的最优解是
,其中
泰勒展开的形式化
我们下面来陈述一个引理,它刻画了GD算法下函数值的下降。我们先假设函数 的二阶梯度是有界的,即
,我们称满足这个条件的函数为L-光滑函数。
这使我们能够在下面这个意义上使用泰勒展开精确的近似函数:
GD的下降引理
下面我们将说明,在下降梯度和足够小的学习率下,函数值总是减小,除非迭代处的梯度为零。
证明:

Motivation:损失函数的梯度的计算代价可能很大。
在深度学习里,目标函数通常是训练数据集中有关各个样本的损失函数的平均。设 是有关索引为i的训练数据样本的损失函数,n是训练数据样本数,
是模型的参数向量,那么目标函数定义为
目标函数在 处的梯度计算为
如果使用梯度下降,每次自变量迭代的计算开销为 ,它随着n线性增长。因此,当训练数据样本数很大时,梯度下降每次迭代的计算开销很高。
随机梯度下降(stochastic gradient descent,SGD)减少了每次迭代的计算开销。在随机梯度下降的每次迭代中,我们随机均匀采样的一个样本索引 ,并计算梯度
来迭代
:
这里 同样是学习率。可以看到,每次迭代的计算开销从梯度下降的
降到了常数
。值得强调的是,随机梯度
是对梯度
的无偏估计:
这意味着,平均来说,随机梯度是对梯度的一个良好的估计。
让我们考虑一个输入和输出分别为二维向量 和标量的目标函数
。

可以看到,同一位置上,目标函数在竖直方向( 轴方向)比在水平方向(
轴方向)的斜率的绝对值更大。因此,给定学习率,梯度下降迭代自变量时会使自变量在竖直方向比在水平方向移动幅度更大。那么,我们需要一个较小的学习率从而避免自变量在竖直方向上越过目标函数最优解。然而,这会造成自变量在水平方向上朝最优解移动变慢。
学习率调得稍大一点,此时自变量在竖直方向不断越过最优解并逐渐发散。

动量法的提出是为了解决梯度下降的上述问题。设时间步t的自变量为 ,学习率为
。 在时间步0,动量法创建速度变量
,并将其元素初始化成0。在时间步t>0,动量法对每次迭代的步骤做如下修改:
其中,动量超参数 满足
。当
时,动量法等价于小批量随机梯度下降。
指数加权移动平均:为了从数学上理解动量法,让我们先解释一下指数加权移动平均(exponentially weighted moving average)。给定超参数 ,当前时间步t的变量
是上一时间步t-1的变量
和当前时间步另一变量
的线性组合:
我们可以对 展开:
令 ,那么
。因为
所以当 时,
,如
。如果把
当作一个比较小的数,我们可以在近似中忽略所有含
和比
更高阶的系数的项。例如,当
时,
因此,在实际中,我们常常将 看作是对最近
个时间步的
值的加权平均。例如,当
时,
可以被看作对最近20个时间步的
值的加权平均;当
时,
可以看作是对最近10个时间步的
值的加权平均。而且,离当前时间步t越近的
值获得的权重越大(越接近1)。
现在,我们对动量法的速度变量做变形:
由指数加权移动平均的形式可得,速度变量 实际上对序列
做了指数加权移动平均。换句话说,相比于小批量随机梯度下降,动量法在每个时间步的自变量更新量近似于将前者对应的最近
个时间步的更新量做了指数加权移动平均后再除以
。所以,在动量法中,自变量在各个方向上的移动幅度不仅取决于当前梯度,还取决于过去的各个梯度在各个方向上是否一致。
当迭代接近局部极小值时,梯度下降行为更为明显,因为该函数可以用二次函数进行局部逼近。因此这里为了简单起见,我们假设我们正在优化一个凸二次函数,并了解函数的曲率如何影响算法的收敛性。
我们用梯度下降方法来优化 ,其中
,
是半正定矩阵。
注:w.l.o.g,我们可以假设A是对角矩阵(对角化是线性代数中的一个基本idea)。假设A的SVD分解: ,其中
是个对角矩阵。我们可以简单的验证得到
,其中
。换句话说,在由U定义的一个不同的坐标系中,我们处理的是一个以对角矩阵
为系数的二次型。注意这里的对角化技术仅用于分析。
因此我们假设 ,其中
,这样该函数就可以化简为
,这样梯度下降更新可以写成:
从上面的二次型例子中,我们可以看到如果我们在不同的坐标系中使用不同的学习率,这将是得到优化。换句话说,如果我们对每个坐标引入一个学习率 ,那么我们可以实现更快的收敛。
在A不是对角阵这样的更一般的情况下,我们事先不知道坐标系,算法对应于
在更一般的情况下,f不是二次函数,这与牛顿算法相对应
计算Hessian矩阵可能是非常困难的,因为它scale quadratically in d(在实践中可能超过100万)。因此,使用hessian函数及其逆函数的近似值。