1. 优化算法
- 优化的目标在于降低训练损失,只关注最小化目标函数上的表现,优化算法通常只考虑最小化目标函数(损失函数)。
1.1. 局部最优
当一个优化问题的数值解在局部最优解附近时,由于目标函数有关解的梯度接近或变成零,最终迭代求得的数值解可能只能令目标函数局部最小化而非全局最小化。
1.2. 鞍点与海森矩阵(Hessian Matric)
-
鞍点(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\)。
-
-
条件:
- 当函数的海森矩阵在梯度为零的位置上的特征值全部为正时,该函数得到局部最小值。
- 当函数的海森矩阵在梯度为零的位置上的特征值全部为负时,该函数得到局部最大值。
- 当函数的海森矩阵在梯度为零的位置上的特征值有正有负时,该函数得到鞍点。
1.3. 梯度消失
造成损失函数难以优化的原因是激活函数存在使得函数计算梯度时遇到梯度消失问题。在梯度函数上出现的以指数级递增或递减的情况分别称为梯度爆炸和梯度消失。
解决办法通常有:
- Mini梯度下降法
- 梯度下降算法的优化
- 初始化参数策略
- 学习率衰减
2. 批梯度下降算法(Batch Gradient Descent)
- 定义:批梯度下降算法,即同时处理整个数据集。
- 当数据集很大时,处理速度会比较慢。
2.1. Mini-Batch Gradient Descent
-
定义:Mini-Batch梯度下降算法(小批量梯度下降算法)将数据集分批次处理,每次同时处理固定大小的数据集。
当Mini-Batch的大小为1时,就变为随机梯度下降算法(stochastic gradient descent)
2.2. Batch大小选择
- 如果训练样本数量比较小,如\(m\leq2000\)时,选择Batch梯度下降法;
- 如果训练样本数量比较小,选择Mini-Batch梯度下降法。Batch大小一般为2的幂次方,典型的大小为\(2^6,2^7,2^8,2^9\)。
3. 优化算法
- 动量更新法
- 逐参数适应学习率法
- 二阶法
3.1. 动量梯度下降(Gradient Descent with Momentum)
- 目的:解决因鞍点问题带来的梯度更新停止问题。
- 解决办法:
- 在随机梯度下降(SGD)中加入指数加权平均数来更新参数的梯度。
-
指数加权平均
指数加权平均(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)
动量梯度下降是计算梯度的指数加权平均数,并利用该值来更新参数值。动量梯度下降法的整个过程为:
- \(S_{dW^{[l]}}=\beta S_{dW^{[l]}}+(1-\beta )dW^{[l]}\)
- \(S_{db^{[l]}}=\beta S_{db^{[l]}}+(1-\beta)db^{[l]}\)
- \(W^{[l]}:=W^{[l]}-\alpha S_{dW^{[l]}}\)
- \(b{[l]}:=b{[l]}-\alpha S_{db{[l]}}\)
其中\(\beta\)通常设置为0.9
效果:当前后梯度方向一致时,动量梯度下降能够加速学习;而前后梯度方向不一致时,动量梯度下降能够抑制震荡。
3.2. 逐参数适应学习率方法
-
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}\)。这里开方、除法和乘法的运算都是按元素运算的。这些按元素运算使得目标函数自变量中每个元素都分别拥有自己的学习率。
- 理解:
- 小批量随机梯度按元素平方的累加变量\(s_t\)出现在学习率的分母项中。
- 如果目标函数有关自变量中某个参数的偏导数一直都较大,那么该参数的学习率将下降较快(梯度计算大,学习率小,过程优化慢);
- 反之,如果目标函数有关自变量中某个参数的偏导数一直都较小,那么该参数的学习率将下降较慢(梯度计算小,学习率大,优化速率加快)。
- 然而由于\(s_t\)一直在累加按元素平方的梯度,自变量中每个元素的学习率在迭代过程中一直在降低(或不变)。所以,当学习率在迭代早期降的较快且当前解依然不佳时,AdaGrad算法在迭代后期由于学习率过小,可能较难找到一个有用的解。
- 理解:
-
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}\)
原论文中作者建议的参数设置的值:
- 学习率\(\alpha\):需要尝试一系列的值,来寻找比较合适的
- \(\beta_1\):常用的缺省值为0.9
- \(\beta_2\):Adam算法的作者建议为0.999
- \(\epsilon\):Adam算法的作者建议的默认值为\(10^{-8}\)
注:\(\beta_1\)、\(\beta_2\)、\(\epsilon\) 通常不需要调试
4. 学习率退火
如果设置一个固定的学习率 \(\alpha\)
- 在最小值附近,由于不同的batch中存在一定的噪声,因此不会精确收敛,而是始终在最小值周围一个比较大的范围内波动。
- 如果随着时间慢慢减少学习率 \(\alpha\) 的大小,在初期 \(\alpha\) 较大时,下降的步长较大,能以较快的速度进行梯度下降;而后期逐步减小 \(\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为将所有的训练样本完整过一遍的次数。
对于大型的数据模型,需要使用这些方法去自动进行学习率衰减。而一些小型网络可以直接手动进行调整。
5. 参数初始化策略与归一化输入
5.1. 参数初始化
由于在 \(z=w_1x_1+w_2x_2+...+w_nx_n+b\) 公式中,当输入的数量 \(n\) 较大时,如果每个 \(w_i\) 的值都小一些,这样它们的和得到的 \(z\) 也会非常大,导致在激活函数(例如sigmoid函数)两边的梯度可能会非常小,梯度下降优化就会非常困难。所以都会初始化比较小的值。
对网络输入的特征进行标准化,能够缓解梯度消失或者梯度爆炸的情况。
5.2. 归一化输入
-
标准化公式:\(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了。虽然没有解决梯度消失和爆炸的问题,但其在一定程度上确实减缓了梯度消失和梯度爆炸的速度。