当一个优化问题的数值解在局部最优解附近时,由于目标函数有关解的梯度接近或变成零,最终迭代求得的数值解可能只能令目标函数局部最小化而非全局最小化。
鞍点(saddle)是函数上的导数为零,但不是轴上局部极值的点。通常梯度为零的点是鞍点,而非局部最小值。减少损失的难度也来自误差曲面中的鞍点,而不是局部最低点。
海森矩阵:一个多元函数的二阶偏导构成的方阵
例子:
\[f(x,y,z)=x^2+y^2+z^2+2x+4y-6z \]求此函数的极值:
首先对于某个变量的一阶导数为0,意味着在这个变量方向上是极小或者极大值:
\[\frac{\partial f}{\partial x}=2x+2=0, \frac{\partial f}{\partial y}=2y+4=0, \frac{\partial f}{\partial z}=2z-6=0 \]则该函数的驻点是(-1, -2, -3),表示在三个变量方向上梯度都是为0的,但是不知道该点是极大值点或极小值点或鞍点。
求二阶偏导数:
\[\frac{\partial^2 f}{\partial x^2}=2, \frac{\partial^2 f}{\partial y^2}=2, \frac{\partial^2 f}{\partial z^2}=2 \]则表示成海森矩阵:
\[A=\begin{pmatrix} 2 & 0 & 0 \\ 0 & 2 & 0 \\ 0 & 0 & 2 \end{pmatrix} \]\(A\)矩阵所有值为正(正定矩阵),故(-1, -2, 3)是极小值点,极小值为\(f(-1,-2,3)=-14\)。
条件:
造成损失函数难以优化的原因是激活函数存在使得函数计算梯度时遇到梯度消失问题。在梯度函数上出现的以指数级递增或递减的情况分别称为梯度爆炸和梯度消失。
解决办法通常有:
定义:Mini-Batch梯度下降算法(小批量梯度下降算法)将数据集分批次处理,每次同时处理固定大小的数据集。
当Mini-Batch的大小为1时,就变为随机梯度下降算法(stochastic gradient descent)
指数加权平均
指数加权平均(Exponential Weight Average)是一种常用的序列数据处理方式,通常用在序列场景如金融序列分析、温度变化序列分析。
指数加权公式:
\[S_t=\left\{ \begin{matrix} Y_1, & t=1 \\ \beta S_{t-1}+(1-\beta)Y_t, & t>1 \end{matrix} \right. \]\(Y_t\)为\(t\)下的实际值,\(S_t\)为\(t\)下加权平均后的值,\(\beta\)为权重值。
\(\beta\) 越大相当于求取平均利用的样本数量越多,曲线就会越平滑且越滞后。这些系数被称为偏差修正(Bias Correction)。
动量梯度下降(Gradient Descent with Momentum)
动量梯度下降是计算梯度的指数加权平均数,并利用该值来更新参数值。动量梯度下降法的整个过程为:
其中\(\beta\)通常设置为0.9
效果:当前后梯度方向一致时,动量梯度下降能够加速学习;而前后梯度方向不一致时,动量梯度下降能够抑制震荡。
Adagrad
Adagrad算法会使用一个小批量随机梯度\(g_t\)按元素平方的累加变量\(s_t\)。在时间步0,Adagrad将\(s_0\)中每个元素初始化为0。在时间步\(t\),首先将小批量随机梯度\(g_t\)按元素平方后累加到变量\(s_t\)。
\[s_t←s_{t-1}+g_t\odot g_t \]其中\(\odot\)是按元素相乘。接着将目标函数自变量中的每个元素的学习率按元素运算重新调整一下:
\[w_t\leftarrow w_{t-1}-\frac{\alpha}{\sqrt{s_t+\epsilon }}\odot g_t \]其中\(\alpha\)是学习率,$\varepsilon $是为了维持数值稳定性而添加的常数,如\(10^{-6}\)。这里开方、除法和乘法的运算都是按元素运算的。这些按元素运算使得目标函数自变量中每个元素都分别拥有自己的学习率。
RMSProp算法
RMSProp算法为了解决AdaGrad算法在迭代后期由于学习率过小,可能难找到一个有用的解的问题,作了修改。
不同于AdaGrad算法里状态变量\(s_t\)是截至时间步\(t\)所有小批量随机梯度\(g_t\)按元素平方和,RMSProp(Root Mean Square Prop)算法将这些梯度按元素平方做指数加权移动平均:
\(s_{dw}=\beta s_{dw}+(1-\beta)(dw)^2\)
\(s_{db}=\beta s_{db}+(1-\beta)(db)^2\)
\(w:=w-\frac{\alpha}{\sqrt{s_{dw}+\epsilon }}dw\)
\(b:=b-\frac{\alpha}{\sqrt{s_{db}+\epsilon }}db\)
其中 \(\varepsilon\) 一样是为了维持数值稳定性而添加的常数。
最终自变量每个元素的学习率在迭代过程中就不再一直降低。RMSProp有助于减少抵达最小值路径上的摆动,并允许使用一个更大的学习率 \(\alpha\) ,从而加快算法学习速度。
Adam算法
Adam优化算法(Adaptive Moment Estimation,自适应矩估计)将Momentum和RMSProp算法结合在一起。Adam算法在RMSProp算法基础上对小批量随机梯度也做了指数加权移动平均。
假设用每一个mini-batch计算\(dW\)、\(db\),第 \(t\) 次迭代时:
\[\left.\begin{matrix} v_{dW}=\beta_1v_{dW}(1-\beta_1)dW\\ v_{db}=\beta_1v_{db}(1-\beta_1)db \end{matrix}\right\} 动量计算的梯度 \]\[v_{dW^{[l]}}^{corrected}=\frac{v_{dW^{[l]}}}{1-(\beta_1)^t} (修正参数) \]\[\left.\begin{matrix} s_{dW}=\beta_2 s_{dW}(1-\beta_2)(dW)^2\\ s_{db}=\beta_2 s_{db}(1-\beta_2)(db)^2\\ s_{dW^{[l]}}^{corrected}=\frac{s_{dW^{[l]}}}{1-(\beta_2)^t} \end{matrix}\right\} RMSProp计算方式(平方指数加权移动平均) \]其中 \(l\) 为某一层,\(t\) 为移动平均第次的值
Adam算法的参数更新:
\(W:=W-\alpha \frac{v_{dW}^{corrected}}{s_{dW}^{corrected}+\epsilon}\)
\(b:=b-\alpha \frac{v_{db}^{corrected}}{s_{db}^{corrected}+\epsilon}\)
原论文中作者建议的参数设置的值:
注:\(\beta_1\)、\(\beta_2\)、\(\epsilon\) 通常不需要调试
如果设置一个固定的学习率 \(\alpha\)
最常用的学习率退火算法:
随步数衰减(不常用)
指数衰减
\(\alpha = 0.95^{epoch\_num}*\alpha_0\)
\(\frac{1}{t}\)衰减
\(\alpha =\frac{1}{1+decay\_rate*epoch\_num}*\alpha _0\)
其中,decay_rate为衰减率(超参数),epoch_num为将所有的训练样本完整过一遍的次数。
对于大型的数据模型,需要使用这些方法去自动进行学习率衰减。而一些小型网络可以直接手动进行调整。
由于在 \(z=w_1x_1+w_2x_2+...+w_nx_n+b\) 公式中,当输入的数量 \(n\) 较大时,如果每个 \(w_i\) 的值都小一些,这样它们的和得到的 \(z\) 也会非常大,导致在激活函数(例如sigmoid函数)两边的梯度可能会非常小,梯度下降优化就会非常困难。所以都会初始化比较小的值。
对网络输入的特征进行标准化,能够缓解梯度消失或者梯度爆炸的情况。
标准化公式:\(x=\frac{x-\mu }{\sigma }\)
这个公式与特征工程中的处理是一样的,\(\mu\) 为平均值,\(\sigma\) 为标准差。标准化的目的是所有特征的平均值为0,标准差为1。
可以看到,标准化后对于梯度下降无论从哪个位置开始迭代,都能以相对较少的迭代次数找到全局最优解,从而可以加速网络的学习。
理解这个原理,其实还是最初这样的公式:\(z=w_1x_1+w_2x_2+...+w_nx_n+b\)
如果激活函数的输入 \(X\) 近似设置成均值为0,标准差为1,神经元输出 \(z\) 的方差就正则化到1了。虽然没有解决梯度消失和爆炸的问题,但其在一定程度上确实减缓了梯度消失和梯度爆炸的速度。