AI入门笔记-改善深层神经网络:超参数调试、正则化以及优化
改善深层神经网络:超参数调试、正则化以及优化
备注:常用词
logistic回归=逻辑回归=线性拟合
cost=误差=成本
第一周 深度学习的实用层面
1.1 训练 / 开发 / 测试集
AI不同领域对于参数的使用会很不一样
|训练集|交叉验证集|测试集|
想法->代码->实验->…..
快速迭代是推动项目进展的关键
小数据量时: 70%/30% 60%/20%/20%
大数据(1m)时: 98%/1%/1%
- 如果不需要无偏误差评估,可不设置测试集.
- 测试集与训练集同分布可以加快训练.
- 验证集需要用来训练
1.2 偏差 / 方差
- 高偏差:拟合欠佳
- 高方差:过拟合
集合/误差 | 情况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 | d3=np.random.rand(a3.shape)<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 | DIGRAPH G{ |
1 | DIGRAPH G{ |
$$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_1
0.90.999
beta_2
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 | from scipy import misc |