优化器
1.神经网络的梯度
1.1梯度
下面是如何求解导数
$$
\frac{df(x)}{dx}=\lim\limits_{x\rightarrow\infty}\frac{f(x+h)-f(x)}{h}
$$
举个例子速度的导数是加速反应了速度变换的快慢,所以在神经网络中导数往往决定方向下降的快慢。
下面是一个偏导数
$$
f(x_0,x_1)=x_0^2+x_1^2
$$
可以将神经网络中的神经元理解为这些自变量,而梯度则是对这些自变量求导,我们将他称之为偏导数(求哪个自变量就是对他比较偏心),这些偏导数称之为模型的梯度。
1.2梯度法
根据高中学习的知识可以知道,函数的极值出现在导数为0的部分,也就是梯度为0的部分。函数可能有多个极值点由此可见梯度下降可能会出现的一个就是局部最优解。

梯度法的过程就是土话来说,我先确认一个方向向前跑几步,然后再求梯度之后再跑几步,其中这个具体跑几步就要由我们的学习率来决定了。
给出梯度下降的公式:
$$
x_0=x_0-\eta\dfrac{\partial f}{\partial x_0}
$$
$$
x_1=x_1-\eta\dfrac{\partial f}{\partial x_1}
$$
其中$\eta$就是神经网络中的学习率
2神经网络动量
2.1一阶动量和二阶动量
通过高中物理知识可以知道动量的概念是物体在它运动方向上保持运动的趋势,是该物体质量和速度的乘积。土话来举个例子,孙策开大下船的时候船会往我们指定方向运动这就是动量。
一阶动量为过去各个时刻梯度的线性组合,而二阶动量自然是过去各个时刻梯度的平方的线性组合,虽然一阶动量确认梯度下降的路程,二阶动量确认梯度下降的速度。。
动量法的一般形式,先确定梯度:
$$
g_t=\nabla loss=\dfrac{\partial loss}{\partial \omega_t}
$$
这就和我上述讲的损失函数差不多对损失函数的每个权重求偏导的出来的就是权重。
这俩是一阶动量和二阶动量的表达式
$$
m_{t}=\phi\left(g_{1}, g_{2}, \cdots, g_{t}\right) ; V_{t}=\psi\left(g_{1}, g_{2}, \cdots, g_{t}\right)
$$
当前时刻下降的梯度
$$
\eta_t=\alpha·\dfrac{m_t}{\sqrt{V_t}}
$$
根据下降的梯度进行更新
$$
\omega_{t+1}= \omega_t-\eta_t
$$
2.2 一阶矩和二阶矩
假设梯度$g$是个随机变量,他的一阶矩就是他的期望,二阶矩就是方差(根据概率统计的定义得到的,高阶矩的目的就是为了验证概率$p(x)$是否随着x的增大而变小)
2.3 动量法
首先动量法的表达式如下:
$$
\eta_{t}=\gamma \eta_{t-1}+\alpha g_{t}
$$
$$
w_{t+1}=w_{t}-\eta_{t}
$$
如何将他转到之前定义下降的梯度$\eta_t=\alpha·\dfrac{m_t}{\sqrt{V_t}}$,我们做一下转换:
为了防止大家看不懂在写一个$t=1$时刻$\eta_0$的状态
$$
\eta_1=\alpha g_1
$$
$$
\begin{array}{l}
\eta_{t}=\gamma \eta_{t-1}+\alpha g_{t} \
=\gamma^2 \eta_{t-2}+\gamma \alpha g_{t-1}+\alpha g_{t} \
=\gamma^3 \eta_{t-3}+\gamma^{2} \alpha g_{t-2}+\gamma \alpha g_{t-1}+\alpha g_{t} \
=\cdots \
=\gamma^{t-1} \alpha g_{1}+\gamma^{t-2} \alpha g_{2}+\cdots+\gamma^{0}\alpha g_{t}
\end{array}
$$
大家通常也跑过优化器的代码应该知道$\gamma$通常取小于1的值所以$\gamma$离当前时刻越远占的权重就越小,这个叫做指数加权移动平均。虽然,动量法的一阶动量不是取过去所有时间步梯度的平均,但同样能用来控制模型更新的方向,动量法以来指数加权平均使得自变量的更新方向更加一致。而动量法的二阶梯度取为1,所以常说动量法只利用了一阶梯度的信息。
2.4 SGD
SGD中他的一阶动量和二阶动量定义如下
$$
m_{t}=g_{t};V_{t}=I^2
$$
因此他的当前时刻下降的梯度为
$$
\eta_t=\alpha·g_{t}
$$
SGD最大的缺点是下降速度慢,而且可能会在凹凸的两边持续震荡,停留在一个局部最优点。
2.5 SGD with Momentum
为了抑制SGD的震荡,SGDM认为梯度下降过程可以加入惯性。下坡的时候,如果发现是陡坡,那就利用惯性跑的快一些。SGDM全称是SGD with momentum,在SGD基础上引入了一阶动量:
$$
m_t=\beta_1m_{t-1}+(1-\beta)·g_t
$$
我们将这个式子换一个形式先将他展开:
$$
m_t=\beta_1m_{t-1}+g_t-\beta_1·g_t
$$
之后我们合并一下同类项:
$$
m_t=g_t+\beta_1*(m_{t-1}-g_t)
$$
这个式子有没有类似与卡尔曼滤波中的后验估计的求解。
卡尔曼是用测量值-先验值,这里是用先验值-测量值。
相当于他这个求的是$\dfrac{1}{1-\beta_1}$个时刻的平均值,但是此时这个$\beta_1$是个超参数是个定值一般取$0.9$
这个解决了SGD中收敛缓慢的问题但是还有一个局部最优的问题没有解决。
2.6 SGD with Nesterov Acceleration
先给出他的改进点主要在第一步:
$$
g_{t}=\nabla f\left(w_{t}-\alpha \cdot m_{t-1} / \sqrt{V_{t-1}}\right)
$$
根据上面的表达式我们可以知道$\alpha \cdot m_{t-1} / \sqrt{V_{t-1}}$代表的是当前时刻的梯度因此先下降一步,相当于走出去看看,不行就回去。
2.7 AdaGrad
这里给出二阶动量的表达式:
$$
V_t= {\textstyle \sum_{t}^{T=1}} g_T^2
$$
表示所有梯度值的平方,因此我们此时的学习率变成了$\alpha/\sqrt{V_t}$,当梯度整体下降的慢也就是速度较小的时候,相当于学习率会大一点加快下降的速度。
在这之前我提到过高阶矩的目的,这里大家可以去详细了解一下高阶矩,他有个好记的特性就是对极大值特别的敏感,随着梯度越大下降的速度应该更快。
这里因为$\sqrt{V_t}$是个单调递增的函数,所以学习率可能下降的很快导致有一些特征没有学到这就是他的缺点。
2.8AdaDelta / RMSProp
这个方法和SGD with Momentum有点相似不过他这里是为了防止学习率太低的情况,
$$
V_t=\beta_2*V_{t-1}+(1-\beta_2)·g_t^2
$$
2.9Adam
阿蛋优化器集合了一阶动量以及二阶动量的特点:
$$
m_t=\beta_1*m_{t-1}+(1-\beta)·g_t
$$
$$
V_t=\beta_2*V_{t-1}+(1-\beta_2)·g_t^2
$$