提交 b475d79c 编写于 作者: A Aston Zhang

opt boldsym

上级 987bdb2b
# Adadelta --- 从0开始
我们在[Adagrad](adagrad-scratch.md)里提到,由于学习率分母上的变量$\mathbf{s}$一直在累加按元素平方的梯度,每个元素的学习率在迭代过程中一直在降低或不变。所以在有些问题下,当学习率在迭代早期降得较快时且当前解依然不理想时,Adagrad在迭代后期可能较难找到一个有用的解。我们在[RMSProp](rmsprop-scratch.md)介绍了应对这一问题的一种方法:对梯度按元素平方使用指数加权移动平均而不是累加。
我们在[Adagrad](adagrad-scratch.md)里提到,由于学习率分母上的变量$\boldsymbol{s}$一直在累加按元素平方的梯度,每个元素的学习率在迭代过程中一直在降低或不变。所以在有些问题下,当学习率在迭代早期降得较快时且当前解依然不理想时,Adagrad在迭代后期可能较难找到一个有用的解。我们在[RMSProp](rmsprop-scratch.md)介绍了应对这一问题的一种方法:对梯度按元素平方使用指数加权移动平均而不是累加。
事实上,Adadelta也是一种应对这个问题的方法。有意思的是,它没有学习率参数。
## Adadelta算法
Adadelta算法也像RMSProp一样,使用了一个梯度按元素平方的指数加权移动平均变量$\mathbf{s}$,并将其中每个元素初始化为0。在每次迭代中,首先计算[小批量梯度](gd-sgd-scratch.md) $\mathbf{g}$,然后对该梯度按元素平方后做指数加权移动平均并计算$\mathbf{s}$:
Adadelta算法也像RMSProp一样,使用了一个梯度按元素平方的指数加权移动平均变量$\boldsymbol{s}$,并将其中每个元素初始化为0。在每次迭代中,首先计算[小批量梯度](gd-sgd-scratch.md) $\boldsymbol{g}$,然后对该梯度按元素平方后做指数加权移动平均并计算$\boldsymbol{s}$:
$$\mathbf{s} := \rho \mathbf{s} + (1 - \rho) \mathbf{g} \odot \mathbf{g} $$
$$\boldsymbol{s} := \rho \boldsymbol{s} + (1 - \rho) \boldsymbol{g} \odot \boldsymbol{g} $$
然后我们计算当前需要更新的参数的变化量:
$$ \mathbf{g}^\prime = \frac{\sqrt{\Delta\mathbf{x} + \epsilon}}{\sqrt{\mathbf{s} + \epsilon}} \odot \mathbf{g} $$
$$ \boldsymbol{g}^\prime = \frac{\sqrt{\Delta\boldsymbol{x} + \epsilon}}{\sqrt{\boldsymbol{s} + \epsilon}} \odot \boldsymbol{g} $$
其中$\epsilon$是为了维持数值稳定性而添加的常数,例如$10^{-5}$。和Adagrad一样,模型参数中每个元素都分别拥有自己的学习率。其中$\Delta\mathbf{x}$初始化为零张量,并做如下$\mathbf{g}^\prime$按元素平方的指数加权移动平均:
其中$\epsilon$是为了维持数值稳定性而添加的常数,例如$10^{-5}$。和Adagrad一样,模型参数中每个元素都分别拥有自己的学习率。其中$\Delta\boldsymbol{x}$初始化为零张量,并做如下$\boldsymbol{g}^\prime$按元素平方的指数加权移动平均:
$$\Delta\mathbf{x} := \rho \Delta\mathbf{x} + (1 - \rho) \mathbf{g}^\prime \odot \mathbf{g}^\prime $$
$$\Delta\boldsymbol{x} := \rho \Delta\boldsymbol{x} + (1 - \rho) \boldsymbol{g}^\prime \odot \boldsymbol{g}^\prime $$
同样地,最后的参数迭代步骤与小批量随机梯度下降类似。只是这里梯度前的学习率已经被调整过了:
$$\mathbf{x} := \mathbf{x} - \mathbf{g}^\prime $$
$$\boldsymbol{x} := \boldsymbol{x} - \boldsymbol{g}^\prime $$
## Adadelta的实现
......
......@@ -18,28 +18,28 @@ Adagrad就是一个在迭代过程中不断自我调整学习率,并让模型
## Adagrad算法
由于小批量随机梯度下降包含了梯度下降和随机梯度下降这两种特殊形式,我们在之后的优化章节里提到的梯度都指的是小批量随机梯度。由于我们会经常用到按元素操作,这里稍作介绍。假设$\mathbf{x} = [4, 9]^\top$,以下是一些按元素操作的例子:
由于小批量随机梯度下降包含了梯度下降和随机梯度下降这两种特殊形式,我们在之后的优化章节里提到的梯度都指的是小批量随机梯度。由于我们会经常用到按元素操作,这里稍作介绍。假设$\boldsymbol{x} = [4, 9]^\top$,以下是一些按元素操作的例子:
* 按元素相加: $\mathbf{x} + 1 = [5, 10]^\top$
* 按元素相乘: $\mathbf{x} \odot \mathbf{x} = [16, 81]^\top$
* 按元素相除: $72 / \mathbf{x} = [18, 8]^\top$
* 按元素开方: $\sqrt{\mathbf{x}} = [2, 3]^\top$
* 按元素相加: $\boldsymbol{x} + 1 = [5, 10]^\top$
* 按元素相乘: $\boldsymbol{x} \odot \boldsymbol{x} = [16, 81]^\top$
* 按元素相除: $72 / \boldsymbol{x} = [18, 8]^\top$
* 按元素开方: $\sqrt{\boldsymbol{x}} = [2, 3]^\top$
Adagrad的算法会使用一个梯度按元素平方的累加变量$\mathbf{s}$,并将其中每个元素初始化为0。在每次迭代中,首先计算[小批量梯度](gd-sgd-scratch.md) $\mathbf{g}$,然后将该梯度按元素平方后累加到变量$\mathbf{s}$:
Adagrad的算法会使用一个梯度按元素平方的累加变量$\boldsymbol{s}$,并将其中每个元素初始化为0。在每次迭代中,首先计算[小批量梯度](gd-sgd-scratch.md) $\boldsymbol{g}$,然后将该梯度按元素平方后累加到变量$\boldsymbol{s}$:
$$\mathbf{s} := \mathbf{s} + \mathbf{g} \odot \mathbf{g} $$
$$\boldsymbol{s} := \boldsymbol{s} + \boldsymbol{g} \odot \boldsymbol{g} $$
然后我们将模型参数中每个元素的学习率通过按元素操作重新调整一下:
$$\mathbf{g}^\prime := \frac{\eta}{\sqrt{\mathbf{s} + \epsilon}} \odot \mathbf{g} $$
$$\boldsymbol{g}^\prime := \frac{\eta}{\sqrt{\boldsymbol{s} + \epsilon}} \odot \boldsymbol{g} $$
其中$\eta$是初始学习率,$\epsilon$是为了维持数值稳定性而添加的常数,例如$10^{-7}$。请注意其中按元素开方、除法和乘法的操作。这些按元素操作使得模型参数中每个元素都分别拥有自己的学习率。
需要强调的是,由于梯度按元素平方的累加变量$\mathbf{s}$出现在分母,Adagrad的核心思想是:如果模型损失函数有关一个参数元素的偏导数一直都较大,那么就让它的学习率下降快一点;反之,如果模型损失函数有关一个参数元素的偏导数一直都较小,那么就让它的学习率下降慢一点。然而,由于$\mathbf{s}$一直在累加按元素平方的梯度,每个元素的学习率在迭代过程中一直在降低或不变。所以在有些问题下,当学习率在迭代早期降得较快时且当前解依然不理想时,Adagrad在迭代后期可能较难找到一个有用的解。
需要强调的是,由于梯度按元素平方的累加变量$\boldsymbol{s}$出现在分母,Adagrad的核心思想是:如果模型损失函数有关一个参数元素的偏导数一直都较大,那么就让它的学习率下降快一点;反之,如果模型损失函数有关一个参数元素的偏导数一直都较小,那么就让它的学习率下降慢一点。然而,由于$\boldsymbol{s}$一直在累加按元素平方的梯度,每个元素的学习率在迭代过程中一直在降低或不变。所以在有些问题下,当学习率在迭代早期降得较快时且当前解依然不理想时,Adagrad在迭代后期可能较难找到一个有用的解。
最后的参数迭代步骤与小批量随机梯度下降类似。只是这里梯度前的学习率已经被调整过了:
$$\mathbf{x} := \mathbf{x} - \mathbf{g}^\prime $$
$$\boldsymbol{x} := \boldsymbol{x} - \boldsymbol{g}^\prime $$
......
......@@ -6,39 +6,39 @@ Adam是一个组合了[动量法](momentum-scratch.md)和[RMSProp](rmsprop-scrat
## Adam算法
Adam算法会使用一个动量变量$\mathbf{v}$和一个RMSProp中梯度按元素平方的指数加权移动平均变量$\mathbf{s}$,并将它们中每个元素初始化为0。在每次迭代中,首先计算[小批量梯度](gd-sgd-scratch.md) $\mathbf{g}$,并递增迭代次数
Adam算法会使用一个动量变量$\boldsymbol{v}$和一个RMSProp中梯度按元素平方的指数加权移动平均变量$\boldsymbol{s}$,并将它们中每个元素初始化为0。在每次迭代中,首先计算[小批量梯度](gd-sgd-scratch.md) $\boldsymbol{g}$,并递增迭代次数
$$t := t + 1$$
然后对梯度做指数加权移动平均并计算动量变量$\mathbf{v}$:
然后对梯度做指数加权移动平均并计算动量变量$\boldsymbol{v}$:
$$\mathbf{v} := \beta_1 \mathbf{v} + (1 - \beta_1) \mathbf{g} $$
$$\boldsymbol{v} := \beta_1 \boldsymbol{v} + (1 - \beta_1) \boldsymbol{g} $$
该梯度按元素平方后做指数加权移动平均并计算$\mathbf{s}$:
该梯度按元素平方后做指数加权移动平均并计算$\boldsymbol{s}$:
$$\mathbf{s} := \beta_2 \mathbf{s} + (1 - \beta_2) \mathbf{g} \odot \mathbf{g} $$
$$\boldsymbol{s} := \beta_2 \boldsymbol{s} + (1 - \beta_2) \boldsymbol{g} \odot \boldsymbol{g} $$
在Adam算法里,为了减轻$\mathbf{v}$和$\mathbf{s}$被初始化为0在迭代初期对计算指数加权移动平均的影响,我们做下面的偏差修正:
在Adam算法里,为了减轻$\boldsymbol{v}$和$\boldsymbol{s}$被初始化为0在迭代初期对计算指数加权移动平均的影响,我们做下面的偏差修正:
$$\hat{\mathbf{v}} := \frac{\mathbf{v}}{1 - \beta_1^t} $$
$$\hat{\boldsymbol{v}} := \frac{\boldsymbol{v}}{1 - \beta_1^t} $$
$$\hat{\mathbf{s}} := \frac{\mathbf{s}}{1 - \beta_2^t} $$
$$\hat{\boldsymbol{s}} := \frac{\boldsymbol{s}}{1 - \beta_2^t} $$
可以看到,当$0 \leq \beta_1, \beta_2 < 1$时(算法作者建议分别设为0.9和0.999),当迭代后期$t$较大时,偏差修正几乎就不再有影响。我们使用以上偏差修正后的动量变量和RMSProp中梯度按元素平方的指数加权移动平均变量,将模型参数中每个元素的学习率通过按元素操作重新调整一下:
$$\mathbf{g}^\prime := \frac{\eta \hat{\mathbf{v}}}{\sqrt{\hat{\mathbf{s}} + \epsilon}} $$
$$\boldsymbol{g}^\prime := \frac{\eta \hat{\boldsymbol{v}}}{\sqrt{\hat{\boldsymbol{s}} + \epsilon}} $$
其中$\eta$是初始学习率,$\epsilon$是为了维持数值稳定性而添加的常数,例如$10^{-8}$。和Adagrad一样,模型参数中每个元素都分别拥有自己的学习率。
同样地,最后的参数迭代步骤与小批量随机梯度下降类似。只是这里梯度前的学习率已经被调整过了:
$$\mathbf{x} := \mathbf{x} - \mathbf{g}^\prime $$
$$\boldsymbol{x} := \boldsymbol{x} - \boldsymbol{g}^\prime $$
## Adam的实现
......
......@@ -7,11 +7,11 @@
## 梯度下降的问题
考虑一个输入为二维向量$\mathbf{x} = [x_1, x_2]^\top$,输出为标量的目标函数$f: \mathbb{R}^2 \rightarrow \mathbb{R}$。下面为该函数的等高线示意图(每条等高线表示相同函数值的点:越靠近中间函数值越小)。
考虑一个输入为二维向量$\boldsymbol{x} = [x_1, x_2]^\top$,输出为标量的目标函数$f: \mathbb{R}^2 \rightarrow \mathbb{R}$。下面为该函数的等高线示意图(每条等高线表示相同函数值的点:越靠近中间函数值越小)。
![](../img/gd-move.png)
上图中,红色三角形代表参数$\mathbf{x}$的初始值。带箭头的线段表示每次迭代时参数的更新。由于目标函数在竖直方向($x_2$轴方向)上比在水平方向($x_1$轴方向)弯曲得更厉害,梯度下降迭代参数时会使参数在竖直方向比在水平方向移动更猛烈。因此,我们需要一个较小的学习率从而避免参数在竖直方向上overshoot。这就造成了上图中参数向最优解移动速度的缓慢。
上图中,红色三角形代表参数$\boldsymbol{x}$的初始值。带箭头的线段表示每次迭代时参数的更新。由于目标函数在竖直方向($x_2$轴方向)上比在水平方向($x_1$轴方向)弯曲得更厉害,梯度下降迭代参数时会使参数在竖直方向比在水平方向移动更猛烈。因此,我们需要一个较小的学习率从而避免参数在竖直方向上overshoot。这就造成了上图中参数向最优解移动速度的缓慢。
## 动量法
......@@ -19,30 +19,30 @@
动量法的提出是为了应对梯度下降的上述问题。广义上,以小批量随机梯度下降为例(当批量大小等于训练集大小时,该算法即为梯度下降;批量大小为1即为随机梯度下降),我们对[梯度下降和随机梯度下降](./gd-sgd-scratch.md)的章节中的小批量随机梯度算法做如下修改:
\begin{align*}
\mathbf{v} &:= \gamma \mathbf{v} + \eta \nabla f_\mathcal{B}(\mathbf{x}),\\
\mathbf{x} &:= \mathbf{x} - \mathbf{v},
\boldsymbol{v} &:= \gamma \boldsymbol{v} + \eta \nabla f_\mathcal{B}(\boldsymbol{x}),\\
\boldsymbol{x} &:= \boldsymbol{x} - \boldsymbol{v},
\end{align*}
其中$\mathbf{v}$是当前速度,$\gamma$是动量参数。其余符号如学习率$\eta$、有关小批量$\mathcal{B}$的随机梯度$\nabla f_\mathcal{B}(\mathbf{x})$都已在[梯度下降和随机梯度下降](./gd-sgd-scratch.md)的章节中定义,此处不再赘述。
其中$\boldsymbol{v}$是当前速度,$\gamma$是动量参数。其余符号如学习率$\eta$、有关小批量$\mathcal{B}$的随机梯度$\nabla f_\mathcal{B}(\boldsymbol{x})$都已在[梯度下降和随机梯度下降](./gd-sgd-scratch.md)的章节中定义,此处不再赘述。
当前速度$\mathbf{v}$的更新可以理解为对$[\eta / (1 - \gamma)] \nabla f_\mathcal{B}(\mathbf{x})$做指数加权移动平均。因此,动量法的每次迭代中,参数在各个方向上移动幅度不仅取决当前梯度,还取决过去各个梯度在各个方向上是否一致。当过去的所有梯度都在同一方向,例如都是水平向右,那么参数在水平向右的移动幅度最大。如果过去的梯度中在竖直方向上时上时下,那么参数在竖直方向的移动幅度将变小。这样,我们就可以使用较大的学习率,从而如下图收敛更快。
当前速度$\boldsymbol{v}$的更新可以理解为对$[\eta / (1 - \gamma)] \nabla f_\mathcal{B}(\boldsymbol{x})$做指数加权移动平均。因此,动量法的每次迭代中,参数在各个方向上移动幅度不仅取决当前梯度,还取决过去各个梯度在各个方向上是否一致。当过去的所有梯度都在同一方向,例如都是水平向右,那么参数在水平向右的移动幅度最大。如果过去的梯度中在竖直方向上时上时下,那么参数在竖直方向的移动幅度将变小。这样,我们就可以使用较大的学习率,从而如下图收敛更快。
![](../img/momentum-move.png)
## 动量参数
为了有助于理解动量参数$\gamma$,让我们考虑一个简单的问题:每次迭代的小批量随机梯度$\nabla f_\mathcal{B}(\mathbf{x})$都等于$\mathbf{g}$。由于所有小批量随机梯度都在同一方向,动量法在该方向使参数移动加速:
为了有助于理解动量参数$\gamma$,让我们考虑一个简单的问题:每次迭代的小批量随机梯度$\nabla f_\mathcal{B}(\boldsymbol{x})$都等于$\boldsymbol{g}$。由于所有小批量随机梯度都在同一方向,动量法在该方向使参数移动加速:
\begin{align*}
\mathbf{v}_1 &:= \eta\mathbf{g},\\
\mathbf{v}_2 &:= \gamma \mathbf{v}_1 + \eta\mathbf{g} = \eta\mathbf{g} (\gamma + 1),\\
\mathbf{v}_3 &:= \gamma \mathbf{v}_2 + \eta\mathbf{g} = \eta\mathbf{g} (\gamma^2 + \gamma + 1),\\
\boldsymbol{v}_1 &:= \eta\boldsymbol{g},\\
\boldsymbol{v}_2 &:= \gamma \boldsymbol{v}_1 + \eta\boldsymbol{g} = \eta\boldsymbol{g} (\gamma + 1),\\
\boldsymbol{v}_3 &:= \gamma \boldsymbol{v}_2 + \eta\boldsymbol{g} = \eta\boldsymbol{g} (\gamma^2 + \gamma + 1),\\
&\ldots\\
\mathbf{v}_{\inf} &:= \frac{\eta\mathbf{g}}{1 - \gamma}.
\boldsymbol{v}_{\inf} &:= \frac{\eta\boldsymbol{g}}{1 - \gamma}.
\end{align*}
例如,当$\gamma = 0.99$, 最终的速度将是学习率乘以相应小批量随机梯度$\eta\mathbf{g}$的100倍大。
例如,当$\gamma = 0.99$, 最终的速度将是学习率乘以相应小批量随机梯度$\eta\boldsymbol{g}$的100倍大。
## 算法实现和实验
......
# RMSProp --- 从0开始
我们在[Adagrad](adagrad-scratch.md)里提到,由于学习率分母上的变量$\mathbf{s}$一直在累加按元素平方的梯度,每个元素的学习率在迭代过程中一直在降低或不变。所以在有些问题下,当学习率在迭代早期降得较快时且当前解依然不理想时,Adagrad在迭代后期可能较难找到一个有用的解。
我们在[Adagrad](adagrad-scratch.md)里提到,由于学习率分母上的变量$\boldsymbol{s}$一直在累加按元素平方的梯度,每个元素的学习率在迭代过程中一直在降低或不变。所以在有些问题下,当学习率在迭代早期降得较快时且当前解依然不理想时,Adagrad在迭代后期可能较难找到一个有用的解。
为了应对这一问题,RMSProp算法对Adagrad做了一点小小的修改。我们先给出RMSProp算法。
## RMSProp算法
RMSProp算法会使用一个梯度按元素平方的指数加权移动平均变量$\mathbf{s}$,并将其中每个元素初始化为0。在每次迭代中,首先计算[小批量梯度](gd-sgd-scratch.md) $\mathbf{g}$,然后对该梯度按元素平方后做指数加权移动平均并计算$\mathbf{s}$:
RMSProp算法会使用一个梯度按元素平方的指数加权移动平均变量$\boldsymbol{s}$,并将其中每个元素初始化为0。在每次迭代中,首先计算[小批量梯度](gd-sgd-scratch.md) $\boldsymbol{g}$,然后对该梯度按元素平方后做指数加权移动平均并计算$\boldsymbol{s}$:
$$\mathbf{s} := \gamma \mathbf{s} + (1 - \gamma) \mathbf{g} \odot \mathbf{g} $$
$$\boldsymbol{s} := \gamma \boldsymbol{s} + (1 - \gamma) \boldsymbol{g} \odot \boldsymbol{g} $$
然后我们将模型参数中每个元素的学习率通过按元素操作重新调整一下:
$$\mathbf{g}^\prime := \frac{\eta}{\sqrt{\mathbf{s} + \epsilon}} \odot \mathbf{g} $$
$$\boldsymbol{g}^\prime := \frac{\eta}{\sqrt{\boldsymbol{s} + \epsilon}} \odot \boldsymbol{g} $$
其中$\eta$是初始学习率,$\epsilon$是为了维持数值稳定性而添加的常数,例如$10^{-8}$。和Adagrad一样,模型参数中每个元素都分别拥有自己的学习率。
同样地,最后的参数迭代步骤与小批量随机梯度下降类似。只是这里梯度前的学习率已经被调整过了:
$$\mathbf{x} := \mathbf{x} - \mathbf{g}^\prime $$
$$\boldsymbol{x} := \boldsymbol{x} - \boldsymbol{g}^\prime $$
需要强调的是,RMSProp只在Adagrad的基础上修改了变量$\mathbf{s}$的更新方法:把累加改成了指数加权移动平均。因此,每个元素的学习率在迭代过程中既可能降低又可能升高。
需要强调的是,RMSProp只在Adagrad的基础上修改了变量$\boldsymbol{s}$的更新方法:把累加改成了指数加权移动平均。因此,每个元素的学习率在迭代过程中既可能降低又可能升高。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册