优化方法
1. Gradient Descent
1.1 Batch Gradient Descent
在每一轮的训练过程中,Batch Gradient Descent算法用整个训练集的数据计算cost fuction的梯度,并用该梯度对模型参数进行更新,其中$\theta$是训练参数,$\eta$是学习率,$J(\theta)$是损失函数:
$ \theta=\theta-\eta\frac{\partial^2J(\theta)}{\partial^2\theta} $
优点:
cost fuction若为凸函数,能够保证收敛到全局最优值;若为非凸函数,能够收敛到局部最优值。
缺点:
由于每轮迭代都需要在整个数据集上计算一次,所以批量梯度下降可能非常慢。
训练集较大时,需要较大内存。
批量梯度下降不允许在线更新模型,例如新增实例。
1.2 Stochastic Gradient Descent
和批梯度下降算法相反,Stochastic gradient descent 算法每读入一个数据,便立刻计算cost fuction的梯度来更新参数:
$ \theta=\theta-\eta\frac{\partial^2J(\theta;x^{(i)},y^{(i)})}{\partial^2\theta} $
优点:
算法收敛速度快(在Batch Gradient Descent算法中, 每轮会计算很多相似样本的梯度, 这部分是冗余的)。
可以在线更新训练数据。
有几率跳出一个比较差的局部最优而收敛到一个更好的局部最优甚至是全局最优,因为有时候方向会走错,从而跳出局部最优。
缺点:
容易收敛到局部最优。
1.3 Mini-batch Gradient Descent
mini-batch Gradient Descent的方法是在上述两个方法中取折衷, 每次从所有训练数据中取一个子集(mini-batch) 用于计算梯度:
$ \theta=\theta-\eta\frac{\partial^2J(\theta;x^{(i:i+n)},y^{(i:i+n)})}{\partial^2\theta} $
Mini-batch Gradient Descent在每轮迭代中仅仅计算一个mini-batch的梯度,不仅计算效率高,而且收敛较为稳定。
2. Momentum
Momentum算法借用了物理中的动量概念,它模拟的是物体运动时的惯性,即更新的时候在一定程度上保留之前更新的方向,同时利用当前batch的梯度微调最终的更新方向。这样一来,可以在一定程度上增加稳定性,从而学习地更快,并且还有一定摆脱局部最优的能力:
$ \upsilon_{t}=\theta \upsilon_{t-1}-\eta\frac{\partial^2J(\theta)}{\partial^2\theta} $
$ \theta=\theta -\upsilon_{t} $
3. Adagrad
上述方法中,对于每一个参数$ \theta_{i}$的训练都使用了相同的学习率$ \eta$ 。Adagrad算法能够在训练中自动的对learning rate进行调整,对于出现频率较低参数采用较大的 $ \eta$ 更新;相反,对于出现频率较高的参数采用较小的 $ \eta$ 更新。因此,Adagrad非常适合处理稀疏数据。
我们设$ g_{t,i}$ 为第t轮第i个参数的梯度,即$g_{t,i}=\frac{\partial^2J(\theta)}{\partial^2\theta_{i}}$因此,SGD中参数更新的过程可写为:
$ \theta_{t+1,i}=\theta_{t,i} -\eta\cdot g_{t,i}$
Adagrad在每轮训练中对每个参数 的学习率进行更新,参数更新公式如下:
$ \theta_{t+1,i}=\theta_{t,i} -\frac{\eta}{\sqrt{G_{t,ii}+\epsilon}} g_{t,i}$
其中$G_{t}\in R^{ d\times d}$为对角矩阵,每个对角线位置i,i为对应参数$\theta_{i}$ ,从第1轮到第t轮梯度的平方和。ϵ是平滑项,用于避免分母为0,一般取值1e−8。Adagrad的缺点是在训练的中后期,分母上梯度平方的累加将会越来越大,从而梯度趋近于0,使得训练提前结束。
4.Adam
Adam(Adaptive Moment Estimation)是另一种自适应学习率的方法。它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。Adam的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳。公式如下:
$m_{t}=\beta_{1}m_{t-1}+(1-\beta_{1})g_{t}$
$ \upsilon_{t}=\theta_{2} \upsilon_{t-1}+(1-\beta_{2})g^{2}_{t} $
$\hat{m_{t}}=\frac{m_{t}}{1-\beta_{1}^{t}}$
$\hat{\upsilon}=\frac{\upsilon}{1-\upsilon_{2}^{t}}$
$ \theta_{t+1}=\theta_{t} -\frac{\eta}{\sqrt{\hat{\upsilon_{t}}+\epsilon}} \hat{m_{t}}$
其中$g_{t}$是参数的导数,$g^{2}_{t} $是导数的平方,$m_{t}$,$ \upsilon_{t}$ 分别是对梯度的一阶矩估计和二阶矩估计,可以看作对期望$ E[g_{t}]$, $E[g_{t}^{2}]$的近似, (越往后参数的更行,会除以它之前累积的梯度的平方根,这样就可以使得更新幅度变小),$\hat{m_{t}}$ , $\hat{\upsilon_{t}}$ 是对$m_{t}$,$ \upsilon_{t}$ 的校正,这样可以近似为对期望的无偏估计。 Adam算法的提出者建议$\beta_{1}$ 的默认值为0.9, $\beta_{2}$的默认值为.999。