1 梯度下降法

以线性回归为例:


\[h_0 = \sum_{j=0}^{n}\theta_j * x_j\]


损失函数为:


\[J(\theta) = \frac{1}{2m}\sum_{i=1}^{m}(y^{(i)}-h_{\theta}(x^{(i)}))*x_{j}^{i}\]


1.1 批量梯度下降法(原始的梯度下降法)


\[\theta_j = \theta_j-\alpha*\frac{\partial J(\theta)}{\partial \theta_{j}}\]


对于所有数据点,上述损失函数的偏导数为:


\[\frac{\partial J(\theta)}{\partial \theta_j} = -\frac{1}{m}\sum_{i=1}^{m}(y^{(i)}-h_{\theta}(x^{(i)}))*x_{j}^i\]


缺点:每一次参数更新都用到了所有的训练数据,如果训练数据非常多,则很耗时。

每次更新的伪代码:

repeat:

  \(\theta_{j}^{'} = \theta_{j} + \alpha * \frac{1}{m}\sum_{i=1}^{m}(y^{(i)}-h_{\theta}(x^{(i)}))*x_{j}^i\)  (j=0,1,2,..n)

1.2 随机梯度下降法(SGD)

利用每个样本的损失函数对\(\theta\)求偏导得到对应的梯度来更新\(theta\)


\[\theta_{j}^{'} = \theta_{j} + (y^{(i)} - \alpha * h_{\theta}(x^{(i)})*x_{j}^{i}\]


更新过程如下:

  1. random shuffle dataset
  2. repeat:
        for i = 1...m
            \(\theta_{j}^{'} = \theta_{j} + \ alpha * (y^{(i)} - h_{\theta}(x^{(i)})*x_{j}^{i}\)  (j=0,1,...n)  这里的j代表的是\(\theta的每一个分量\)
    缺点:SGD伴随的一个问题是噪音多,是的SGD并不是每一次迭代都是朝着整体最优方向。

1.3 小批量梯度下降法

假设每次更新参数的样本数为10个,更新的伪代码为:

repeat:

    for i = 1,11,21,31,...

        \(\theta_{j}^{'} = \theta_{j} + \alpha * \frac{1}{10} * \sum_{k=i}^{i+9}(y^{(k)}-h_{\theta}(x^{(k)}))*x_{j}^k\)  (j=0,1,...n)

2 动量优化

2.1 Momentum


\[m_{t+1} = u*m_{t}+\alpha * \frac{\partial J(\theta)}{\partial \theta}\]


\[\theta_{t+1} = \theta_{t}-m_{t+1}\]


u表示动量因子,通常取值为0.9或近似值,在梯度方向改变时,momentum可以加速更新,从而加速收敛。即,momentum能够加速SGD收敛,抑制振荡

2.2 NAG

momentum保留了上一时刻的梯度,对其没有任何改变,NAG是momentum的改进,在梯度更新时做一个矫正,具体的做法是在当前梯度上添加上一时刻的动量\(u*m_{t}\),梯度改变为\(\frac{\partial J(\theta - u*m_{t})}{\partial \theta}\)


\[m_{t+1} = u*m_{t} + \alpha * \frac{\partial J(\theta - u*m_{t})}{\partial \theta} \]


\[\theta_{t+1} = \theta_{t}-m_{t+1}\]


3 自适应学习率优化算法

3.1 Adagrad


\[g_{t} = \frac{\partial J(\theta)}{\partial \theta}\]


\[r_{t} = r_{t-1} + g_{t}^2 \]


\[\Delta \theta = \frac{\alpha}{\sqrt {r_{t}+\epsilon}}*g_{t}\]


\[\theta_{t} = \theta_{t-1}-\Delta \theta\]


对于每一个\(\theta_{j}\)在计算的过程中\(g_{t,j}\)不同,即每个变量在更新的时候学习率是不同的。

训练前期,梯度较小,使得Regularizer(上式中的r_t)项很大,放大梯度。[激励阶段]

训练后期,梯度较大,使得Regularizer项很小,缩小梯度。[惩罚阶段]

缺点:

仍需要手工设置一个全局学习率\(\alpha\),如果设置过大,会使regularizer过于敏感,对梯度调节太大,中后期,分母梯度累加的平方和越来越大,使更新量趋于零,使训练提前结束,无法学习。

3.2 RMSProp

修改了AdaGrad的梯度平方和累加为指数加权的移动平均


\[g_{t} = \frac{\partial J(\theta)}{\partial \theta}\]


\[r_{t} = \rho *r_{t-1} + (1-\rho)*g_{t}^2\]


\[\Delta \theta = \frac{\alpha}{\sqrt {r_{t}+\epsilon}}*g_{t}\]


\[\theta_{t} = \theta_{t-1}-\Delta \theta\]


自变量每个元素的学习率在迭代过程中就不再一直降低(或不变)。

3.3 Adadelta

AdaDelta算法也像RMSProp算法一样,使用了指数加权移动平均变量。在时间步0,它的所有元素被初始化为0。与RMSProp算法不同的是,AdaDelta算法还维护一个额外的状态变量 Δxt ,其元素同样在时间步0时被初始化为0。我们使用 Δxt−1 来计算自变量的变化量:


\[g_{t} = \frac{\partial J(\theta)}{\partial \theta}\]


\[r_{t} = \rho *r_{t-1} + (1-\rho)*g_{t}^2\]


\[g_{t'} = \frac{\sqrt{\Delta X_{t-1}+\epsilon}}{\sqrt{r_t+\epsilon}}*g_{t}\]


\[\theta_{t} = \theta_{t-1}-g_{t'}\]


\[\Delta x_{t} = \rho *\Delta x_{t-1} + (1-\rho)*g_{t}^2\]


3.4 Adam

Adam算法在RMSProp算法的基础上对小批量随机梯度也做了指数加权移动平均。

Adam算法使用了偏差修正。也有人说Adam算法是RMSProp法和动量法的结合


\[g_{t} = \frac{\partial J(\theta)}{\partial \theta}\]


\[m_{t} = \beta_{1} *m_{t-1} + (1-\beta_{1})*g_{t}\]


\[v_{t} = \beta_{2} *v_{t-1} + (1-\beta_{2})*g_{t}^2\]


\[\widehat{m_{t}} = \frac{m_{t}}{1-\beta_{1}^t}\]


\[\widehat{v_{t}} = \frac{v_{t}}{1-\beta_{2}^t}\]


\[\theta_{t} = \theta_{t-1}-\frac{\alpha}{\sqrt{\widehat{v_{t}}}+\epsilon}*\widehat{m_{t}}\]