AI入门笔记-改善深层神经网络:超参数调试、正则化以及优化

改善深层神经网络:超参数调试、正则化以及优化

备注:常用词

logistic回归=逻辑回归=线性拟合

cost=误差=成本

第一周 深度学习的实用层面

1.1 训练 / 开发 / 测试集

AI不同领域对于参数的使用会很不一样

|训练集|交叉验证集|测试集|

想法->代码->实验->…..

快速迭代是推动项目进展的关键

小数据量时:  70%/30%  60%/20%/20%

大数据(1m)时:  98%/1%/1%

  • 如果不需要无偏误差评估,可不设置测试集.
  • 测试集与训练集同分布可以加快训练.
  • 验证集需要用来训练

1.2 偏差 / 方差

bias_var

  • 高偏差:拟合欠佳
  • 高方差:过拟合
集合/误差 情况1 情况2 情况3 情况4
训练 1% 15% 15% 0.5%
验证 15% 16% 30% 1%
情况 过拟合训练集/高方差 欠拟合/高偏差 高偏差&高方差 低方差&低偏差
这里需要假设人类误差为0,但结果接近最优误差(贝叶斯误差)也被认为是合理的

1.3 机器学习基础

高偏差->评估训练集/训练数据性能->甚至无法拟合训练集

  • 选择新网络(更多层/单元,一般有用)
  • 增加训练时间(可能有用,但无害)
  • 优化算法
  • 切换NN架构
    循环直到接近高偏差问题(基本要求)

偏差可接受->高方差?
验证集性能

  • 增加数据量
  • 正则化减少过拟合
  • NN架构

评估偏差

直到完成

在现在的大数据时代,只有数据够多,持续训练.正则合适,可以在不影响偏差的情况下减小方差

正则化可以在除了几乎没有负面影响的情况下训练更大的网络,而加大网络的代价只是训练时间.

1.4 正则化

  • λ是超参数
    $$J(w,b)=\frac{1}{m}\sum_{i=1}^m L(y,y’)+\frac{\lambda}{2m}||w||_2^2 $$

    通常不对b进行正则化

$$ L1 正则化 ||w||2^2=\sum{i=1}^m w_j^2=w^Tw $$
$$ L2 正则化 \frac{\lambda}{2m}\sum_{i=1}^m |w|=\frac{\lambda}{2m}||w||_1$$

1.5 为什么正则化可以减少过拟合?

$$wave \ length(cm^{-1})$$
$$J(w,b)=\frac{1}{m}\sum_{i=1}^m L(y,y’)+\frac{\lambda}{2m}||w||_F^2 $$
增加cost函数项,降低w项占权重.
对于tanh,当λ充分大,网络会接近于线性,从而获得简化效果,从高方差倾向于高偏差,中间值会得到刚好合适.

1.6 Dropout 正则化

前向传播时放弃部分节点,后向传播不会影响本轮放弃的节点.

1
2
3
d3=np.random.rand(a3.shape)<keepprob
a3=np.multiply(a3,d3) #a3*=d3
a3/=keepprob

不应该在测试使用,意义不大.

1.7 理解 Dropout

对于容易发送过拟合的层,应该设置低留存率,代价是超参数多(运行慢).

或者部分层使用,另一部分不使用Dropout,这样超参数就少了.

计算机视觉邻域因参数过多,常使用Dropout.

1.8 其他正则化方法

数据集扩增:图像水平翻转,旋转,裁剪,变形等等.
早停训练:

测试集误差先减小后变大,早停止是在测试集即将变大时停止训练.

优化成本函数/不过拟合是2个任务,早停止不能分离这2任务.

1.9 正则化输入

减去均值
$$ \mu=\frac{1}{m}\sum_{i=1}^{m}X^i $$
$$X=X-\mu$$
除去方差
$$ c^2=\frac{1}{m}\sum_{i=1}^{m}X^i**2 $$
$$X/=c^2$$

因为,对于未正则输入,如下的成本函数难以计算优化方向.
$$J(w,b)=\frac{1}{m}\sum_{i=1}^{m}L(\hat{y}^{(i)},y^{(i)})$$

1.10 梯度消失与梯度爆炸

1.11 神经网络的权重初始化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
DIGRAPH G{
rankdir=LR;
subgraph cluster0 {
node[style=filled, color=white]; //定义子图中的节点的样式
style=filled; //定义子图的样式
color=red; //定义子图的填充色
drying; //定义节点, 及节点之间的关系
label="47℃ "; //定义子图的标签
}

met[shape="record",label="Sieved to a particle size of less than 175 mm"]

met2[shape="record"label="70 g calcium sulfate dihydrate"]
met3[shape="record"label="210 g magnesium sulfate"]
met4[shape="record"label="280 g glycerin"]
met5[shape="record"label="7000 mL water"]
test1[shape="record"label="Phosphogypsum suspension(2% by mass)"]
addHCl[shape="record"label="Add dilute HCl dropwise to adjust the slurry solution to pH=4"]
doit[shape="record"label="Add it to the stainless steel reactor , invert at 120℃"]
Phosphogypsum[shape="record"]
Pickling[shape="record"]
Phosphogypsum[shape="record"]
Grind[shape="record"]

Phosphogypsum->Pickling->drying->Grind->met
met->test1
met2->test1
met3->test1
met4->test1
met5->test1
test1->addHCl->doit
}
##shape=polygon,sides=5,l
1
2
3
4
5
6
7
8
9
10
11
12
13
DIGRAPH G{
X1->a_gZ
X2->a_gZ
X3->a_gZ
X4->a_gZ
a_gZ->Y_hat
X1[label=<X<SUB>1</SUB>>]
X2[label=<X<SUB>2</SUB>>]
X3[label=<X<SUB>3</SUB>>]
X4[label=<X<SUB>4</SUB>>]
a_gZ[label="a=g(z)"]
}
##shape=polygon,sides=5,l

$$Z=w_1x_1+w_2x_2+…+w_nx_n+b$$
n越大-》希望wi越小

$$W_i=\frac{1}{n}$$

对于ReLU,使用下式会更好
$$W_i=\frac{2}{n}$$
$$g(L)=ReLU(z)$$

代码上
$$W_i=np.random.randn(shape)*np.sqrt(\frac{1}{n})$$

以上方法缓解梯度消失/爆炸问题

变体:
tanh:Xavier 初始化
$$\sqrt{\frac{1}{n^{l-1}}}$$
Noname
$$\sqrt{\frac{1}{n^{l-1}+n^{l}}}$$

1.12 梯度的数值逼近

Call python code sample

对于积分f(x)=x^3
$$g(\theta)\approx\frac{f(\theta+c)-f(\theta-c)}{2\theta}$$
$$\sigma(0.01)=g(0.01)-f’=\frac{1.01^3-0.99^3}{0.02}-3\theta^2=3.0001-3=0.0001$$
近似误差为0.0001,即O(θ)
而单侧积分
$$\sigma(0.01)=g(0.01)-f’=\frac{1.01^3-1}{0.01}-3\theta^2=3.0301-3=0.03$$
误差为0.0301
双侧积分虽然消耗性能,但精确得多,值得尝试

1.13 梯度检验

将W1,b1,,,…,Wl,bl整合成巨大的向量θ
将dW1,db1,,,…,dWl,dbl整合成巨大的向量θ
根据近似原理,使用之前的公式
$$d\theta_{approx} [i]=\frac{J(\theta_1,\theta_2,\theta_3,…)-J(\theta_1,\theta_2,\theta_3,…))}{2\theta} \approx \theta [i]= \frac{\partial J}{\partial \theta_i}$$
使用向量是否满足,即
$$d\theta_{approx} [i]\approx ? \frac{\partial J}{\partial \theta_i}$$
使用欧几里得距离(向量差的平方和再开方)判断相近

$$检查
\frac{||d\theta_{approx} -d\theta||2}{||d\theta{approx} ||_2+||d\theta||_2}
\left{
\begin{aligned}
&>10^{-7} & & 正确 \
&\approx 10^{-5}-10^{-7} & & 检查是否存在巨大分量 \
&< 10^{-5} & & 检查所有数据
\end{aligned}
\right.
$$

1.14 关于梯度检验代码实现

  • 不在训练中使用-仅限调试
  • 可以用来定位(猜测)bug
  • 使用正则化
  • 与dropout不兼容
  • (偶然)随机初始化,部分训练后再次初始化

第二周 优化算法

2.9 学习率衰减

$$ \alpha = \frac{1}{1+decay*epoch_num}$$

第三周 超参数调试、Batch 正则化和程序框架

3.1 调试处理

超参数重要性

  • 学习率
  • 隐藏单元
  • mini批次大小
  • belta~0.9
  • 层数
  • 学习率衰减

beta_10.9

beta_2
0.999

epsilon~10^-8

3.2 为超参数选择合适的范围

常用对数坐标进行随机参数选择以确定最优值的大概范围

3.3 超参数训练的实践:Pandas VS Caviar

3.4 正则化网络的激活函数

3.5 将 Batch Norm 拟合进神经网络

3.6 Batch Norm 为什么奏效?

3.7 测试时的 Batch Norm

3.8 Softmax 回归

3.9 训练一个 Softmax 分类器

3.10 深度学习框架

3.11 TensorFlow

写img到hdf5

1
2
3
4
from scipy import misc
X = misc.imresize(misc.imread('xx.jpg' % i), image_size)
h = h5py.File&#40;'pic.h5'&#41;
h.create_dataset("picture",data=X)