0%

DNN优化

一些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:

  1. Reduce number of features.
    • Manually select which features to keep
    • Use model selection algorithm
    • cons: Throwing away info that might be useful
  2. 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
vdw = 0
sdw = 0
vdb = 0
sdb = 0
for t in niter:
dw, db = mini_batch()
vdw = beta1 * vdw + (1 - beta1) * dw # beta1一般默认0.9
vdb = beta1 * vdb + (1 - beta1) * db # beta2一般默认0.999
sdw = beta2 * sdw + (1 - beta2) * dw ** 2
sdb = beta2 * sdb + (1 - beta2) * db ** 2
Vdw = vdw / (1 - beta1 ** t)
Vdb = vdb / (1 - beta1 ** t)
Sdw = sdw / (1 - beta2 ** t)
Sdb = sdb / (1 - beta2 ** t)
w -= alpha * Vdw / (Sdw + epsilon) # epsilon一般默认10^-8
b -= alpha * Vdb / (Sdb + epsilon)

7. Hyper parameters

7.1 按重要度排序

  1. learning rate
  2. momentum beta(如果使用动量梯度);hidden units数;mini-batch size
  3. 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

  1. 梯度等高图
  2. 让深层的值对于浅层的值的变化变得更robust。让中间层的a的分布不会因为输入的分布不均匀而不均匀。相当于让中间层更稳定。
  3. 有轻微的regularization效果。为每一层添加噪声,让后网络不过分依赖于某一条路径(类似Dropout)

8.2 Implementation Details

往往batch normalization是和mini-batch一起使用的,在每个mini-batch训练的时候,还需要维护一个$\mu$和$\sigma$的指数加权平均。在测试的时候,使用这个指数加权平均值作为batch normalization的$\mu$和$\sigma$(实际上就是对分布作一个估计)

9. Learning Rate Decay

  1. 常用

$$
\alpha=\frac{\alpha_0}{1+DecayRate*iEpoch}
$$

  1. Exponential Decay

$$
\alpha=0.95^{iEpoch}*\alpha_0
$$

  1. 少见

$$
\alpha=\frac{k*\alpha_0}{\sqrt{iEpoch}}
$$

  1. Discrete StairCase

10. Gradient Exploding & Gradient Vanishing

相比于梯度消失,梯度爆炸更容易被发现,因为这会导致参数特别大,甚至会出NaN导致网络崩溃。

主要有三个原因:

  1. 网络太深
  2. 使用了不恰当的激活函数
  3. 初始化有问题

10.1 深层网络

链式法则求偏导的时候,深层网络会乘上很长一坨系数,这些系数如果

10.2 不恰当的激活函数

像sigmoid,求偏导可以发现,这个函数的导数不会超过0.25,往往都非常小,很容易产生梯度消失

10.3 初始化

初始化不要太大

10.4 如何解决

  1. Gradient Clipping.梯度修剪,检测回传的每一层的梯度,如果高于某一threshold,就缩放。
  2. ReLU,leakReLU等更好的激活函数
  3. BatchNorm
  4. 残差网络