一些DNN上的优化技巧
1. Over fitting & Under fitting
Over fitting指用过多的参数来拟合训练集。其造成的结果称之为High variance,现象是在训练集的部分噪点(例如线性回归中离曲线特别远的点,逻辑斯蒂回归中跑到对面去的点)附近,训练结果会产生扭曲。Ng PPT上的定义: If we have two many features, the learned hypothesis may fit the training set very well($J(\theta)\approx0$), but fail to generalize to new examples(predict prices on new examples)
Under fitting指用过少的参数来拟合训练集。其造成的结果称之为High bias,可以理解为程序有偏见地认为数据是用参数较少的方程来拟合的。
How to addressing over fitting:
- Reduce number of features.
- Manually select which features to keep
- Use model selection algorithm
- cons: Throwing away info that might be useful
- Regularization:
- Keep all the features, but reduce magnitidue/values of parameters $\theta_j$
- pros: works well when we have a lot of features, each of which contribute a bit to predict y
2. L2 Regularization
Regularization的内在原理是,J的梯度下降会导致W偏小,导致每一层的z偏小,由于tanh和sigmoid之类的激活函数在0附近近似线性,整个网络会更趋向于线性而非非线性。直观的说是边界会更钝,不尖锐。
2.1 For linear regression
$$
J(\theta)=\frac{1}{2m}[\sum_i^m(h_\theta(x^{(i)}) - y^{(i)})^2+\lambda\sum_{j=1}^n\theta_j^2]
$$
注意一般不penalize $\theta_0$,$\lambda$是regularization parameter,设置是为了在minimize $J(\theta)$时,尽可能地减小参数的值以降低参数的影响。regularization parameter设置过大可能会导致under fitting的情况
在更新参数的时候采取如下公式
$$
\theta_j:=\theta_j(1-\alpha \frac{\lambda}{m})-\alpha \frac{1}{m}\sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)}
$$
观察这个公式的第一项也可以发现,$\lambda$设置过大可能会导致不可预期的结果
并且针对Normal Function同样可以使用Regularization,公式中这个长得像对角矩阵的矩阵的行数和列数是参数的个数(包括$\theta_0$)
$$
\theta=(X^T \cdot X + \lambda \cdot
\left[\begin{matrix}
0 & 0 & 0 & 0 \
0 & 1 & 0 & 0 \
0 & 0 & … & 0 \
0 & 0 & 0 & 1
\end{matrix}\right] \tag{4}
)^{-1} \cdot X^T \cdot Y
$$
2.2 For logistic regression
和linear regression一样,logistic regression的regularization也是在$J(\theta)$后加了一项
$$
J(\theta):=J(\theta)+\frac{\lambda}{2m}\sum_{j=1}^n\theta_j^2
$$
3. Dropout Regularization
按概率(默认0.5?)随机剔除网络中的部分a节点,使之在forward的时候值为0。防止Overfitting,不要让网络在判断时过分依赖某些节点(特征),形象的理解是,比如说,判断人脸不一定要两只眼。
4. 动量梯度下降
4.1 一阶低通滤波器(指数加权平均)
v0=t0
v1=a*v0+(1-a)t1
v2=a*v1+(1-a)t2
...
4.2 动量
使用指数加权平均的梯度。使用$v_{d_w}$而不是$d_w$
$$
v_{d_w}=\beta v_{d_w}+(1-\beta)d_w
$$
去除在非目标方向的抖动,类似低通滤波器去毛刺
5. Root Mean Square prop
类似动量,也是用指数加权平均,但是将梯度看作是标量而不是向量。会将大的梯度变小,进而去抖动(看起来好不合理啊)。下面用w和b做例子(假设如果我们将w和b作为坐标轴,梯度等高图会很狭长,这样就可以用如下RMSProp)
$$
s_{dw}=\beta * s_{dw}+(1-\beta)*d_w^2
$$
$$
s_{db}=\beta * s_{db}+(1-\beta)*d_b^2
$$
$$
w:=w-\alpha\frac{dw}{\sqrt{S_{dw}+10^{-3}}}
$$
$$
b:=b-\alpha\frac{db}{\sqrt{s_{db}+10^{-3}}}
$$
6. Adam optimizer
混合了动量和RMSprop。很多优化算法只能针对某些特定的模型,但是RMSprop、Adam和动量基本上泛用性程度很高
1 | vdw = 0 |
7. Hyper parameters
7.1 按重要度排序
- learning rate
- momentum beta(如果使用动量梯度);hidden units数;mini-batch size
- network layers,learning rate decay
7.2 随机采样
随机地采样超参数空间,来检查超参数组合的优劣,不要均匀选取点检查,因为不同超参数的重要性差异很大。同样的,如果发现一个超参数效果比较好,可以在其周围进行更高密度的采样(有没有什么自动化的手段?)
8. Batch Normalization
相当于对Logistic Regression和Linear Regression中的Feature normalization的推广,在每一层进行归一化。让梯度等高图不至于窄长,让梯度下降更高效。
normalize每一层的z(虽然有文献也说normalize a的)
$$
\mu^{(l)}=avg(z^{(l)})
$$
$$
\sigma^{(l)}=var(z^{(l)})
$$
其中$\epsilon$的存在是为了防止出现分母为0的情况
$$
z_{norm}^{(l)}=\frac{z^{(l)}-\mu^{(l)}}{\sqrt{\sigma^2+\epsilon}}
$$
有时候不一定要求均值为0方差为1,可以用下面公式得到一个全新的分布,$\gamma$和$\beta$是两个新增的参数,shape和z相同,可以学习得到。
$$
z_{norm_1}^{(l)}=\gamma*z_{norm}^{(l)}+\beta
$$
注意,在batch normalization中,由于有$\beta$存在,b显得没有意义,所以一般在使用batch normalization的时候,b设置为0,不参与学习。
8.1 Insight of Batch Normalization
- 梯度等高图
- 让深层的值对于浅层的值的变化变得更robust。让中间层的a的分布不会因为输入的分布不均匀而不均匀。相当于让中间层更稳定。
- 有轻微的regularization效果。为每一层添加噪声,让后网络不过分依赖于某一条路径(类似Dropout)
8.2 Implementation Details
往往batch normalization是和mini-batch一起使用的,在每个mini-batch训练的时候,还需要维护一个$\mu$和$\sigma$的指数加权平均。在测试的时候,使用这个指数加权平均值作为batch normalization的$\mu$和$\sigma$(实际上就是对分布作一个估计)
9. Learning Rate Decay
- 常用
$$
\alpha=\frac{\alpha_0}{1+DecayRate*iEpoch}
$$
- Exponential Decay
$$
\alpha=0.95^{iEpoch}*\alpha_0
$$
- 少见
$$
\alpha=\frac{k*\alpha_0}{\sqrt{iEpoch}}
$$
- Discrete StairCase
10. Gradient Exploding & Gradient Vanishing
相比于梯度消失,梯度爆炸更容易被发现,因为这会导致参数特别大,甚至会出NaN导致网络崩溃。
主要有三个原因:
- 网络太深
- 使用了不恰当的激活函数
- 初始化有问题
10.1 深层网络
链式法则求偏导的时候,深层网络会乘上很长一坨系数,这些系数如果
10.2 不恰当的激活函数
像sigmoid,求偏导可以发现,这个函数的导数不会超过0.25,往往都非常小,很容易产生梯度消失
10.3 初始化
初始化不要太大
10.4 如何解决
- Gradient Clipping.梯度修剪,检测回传的每一层的梯度,如果高于某一threshold,就缩放。
- ReLU,leakReLU等更好的激活函数
- BatchNorm
- 残差网络