优化方法:
以下的$x$带到神经网络中就是bp中的$w$
1.梯度下降法
SGD(随机梯度下降):
在每个给定的n个训练集中,选择第i个数据集的$\triangledown f_i(x) $来更新$x$(也就是样本中随机均匀采样一个样本来求梯度),因为
$$ E_i\triangledown f_i(x)=\frac{1}{n}\sum^n_{i=1}\triangledown f_i(x)=\triangledown f(x) $$
BGD小批量随机梯度下降:
SGD的进化,在每轮迭代中随机均匀采样多个样本来组成一个小批量,然后使用这个小批量来计算梯度。
Nesterov动量法:
利用小批量随机梯度下降选出$g_t$,动量超参数$\gamma$满足$0\le\gamma<1$,且当$\gamma = 0$时,动量法等价于小批量随机梯度下降
$$ \begin{gathered} v_0=0 \\ v_t=\gamma v_{t-1}+\eta_tg_t \\ x_t=x_{t-1}-v_t \end{gathered} $$
$\gamma$是为了指数加权平均,上式中$v_t$可以改写成
$$ v_t=\gamma v_{t-1}+(1-\gamma)(\frac{\eta_t}{1-\gamma}g_t) $$
$v_{t-1}$可以不断扩展,然后可以认为t-?时刻以后的高项次可以舍弃;
其中$\gamma$可由Epoch确定:
$$ Epoch=\frac{1}{1-\gamma} $$
这里的Epoch可以作为上面的$t$时刻来看,可看出,距t时刻越久之前对$v_t$的影响就越小,在这之后的epoch则对梯度基本没有影响了,$\gamma$越大,有影响的epoch就越多
(一般pyroch中的SGD都是指这个)
梯度下降法缺点:因为各维度的学习率一致,会导致自变量在梯度值较小的维度上迭代过慢
2.自适应梯度下降:
牛顿法:
设$x+ϵ$为向到达最小极值点的位置,使$f(x_{t-1}+\epsilon)$在$f(x_{t-1})$处泰勒展开有
$$ f(x_{t-1}+\epsilon)=f(x_{t-1})+ϵ^T\triangledown f(x_{t-1})+\frac12\epsilon^T\triangledown^2f(x_{t-1})\epsilon+O(||\epsilon||^3) $$
对上式求最小值,
于是对$ \epsilon $求导并且取$f'(x_{t-1}+\epsilon)=0$,忽略不重要的高阶项可得
$$ 0=\triangledown f(x_{t-1})+\epsilon \triangledown^2f(x_{t-1}) $$
设dxd的矩阵Hessian为$ H=\triangledown^2f(x)$
$$ \epsilon=-H^{-1}\triangledown f(x_{t-1}) $$
将$x=x_{t-1} $带入后,算出$H^{-1}$和$\triangledown f(x_{t-1})$的值后,更新$x_t$的值
$$ x_t=x_{t-1}+\epsilon $$
因此只要给出$\triangledown f(x_{t-1})$和$H$,就可以不断迭代算法寻找合适的$ \epsilon$.
但是缺点是如果二阶导数是负数,则会导致$H$为负数,一般解决的方法是对Hessian矩阵求绝对值。
还有不是正定不可逆的情况,以及每次迭代都要计算dxd的H矩阵等的问题
AdaGrad:
利用BGD或者SGD算出的$g_t $:
$$ \begin{gathered} s_t=s_{t-1}+g_t\odot g_t \\ x_t=x_{t-1}-\frac{\eta}{\sqrt{s_t+\epsilon}} \odot g_t \end{gathered} $$
$\odot $是点乘,$ \epsilon$是超参,可以使得不同维度的参数有自己的学习率,偏值越大下降越快。
缺点是后期下降率会过慢
RMSprop:
解决AdaGrad后期下降过慢的问题
动量法中的指数加权移动平均和AdaGrad结合
$$ \begin{gathered} s_t=\gamma s_{t-1}+(1-\gamma) g_t\odot g_t \\ x_t=x_{t-1}-\frac{\eta}{\sqrt{s_t+\epsilon}} \odot g_t \end{gathered} $$
AdaDelta:
也是AdaGrad的一种改进,但是他不用学习率$\eta$
$$ \begin{gathered} s_t=\rho s_{t-1}+(1-\rho) g_t\odot g_t \\ g'_t=\sqrt{\frac{\triangle x_{t-1}+\epsilon}{s_t+\epsilon}}\odot g_t \\ x_t=x_{t-1}-g'_t \end{gathered} $$
其中,$\triangle x$初始为0,后续的也使用指数加权来维护:
$$ \triangle x_t=\rho\triangle x_{t-1}+(1-\rho)g'_t\odot g'_t $$
可见该算法的学习率实际使用了$\sqrt{\triangle x_{t-1}}$来取代学习率
Adam:
是RMSprop+动量法的结合
首先是动量法里的$v_t$,这里$0 \leq \beta_1<1$调节范围一般是0.9,0.99...
$$ v_t=\beta_1 v_{t-1}+(1-\beta_1)g_t $$
然后是RMSprop中的$ s_t$
$$ s_t=\beta_2 s_{t-1}+ (1-\beta_2)g_t\odot g_t \\ $$
可见都加上了加权指数
然后由于设$v_t$和$s_t$初始为0,当t较小时,有可能会使得这两个数值特别小,于是使用偏差修正使得:
$$ \begin{gathered} \hat{v}_t=\frac{v_t}{1-\beta^t_1} \\ \hat{s}_t=\frac{s_t}{1-\beta^t_2} \end{gathered} $$
接下来使用学习率计算偏差:
$$ g'_t=\frac{\eta\hat{v}_t}{\sqrt{\hat{s}_t}+\epsilon} $$
$\epsilon$一般取10e-3—10e-15,$\eta$是学习率,这样每个维度的元素就有了自己的学习率
$$ x_t=x_{t-1}-g'_t $$