吴恩达改善深层神经网络参数:超参数调试、正则化以及优化——深度学习的实用层面

训练/开发/测试集

在配置训练、验证和测试数据集的过程中做到正确决策会在很大程度上帮助大家创建高效的神经网络。
训练神经网络时,我们要做很多决策:
1.网络层数
2.每层隐藏单元数
3.学习速率
4.各层**函数
我们不可能从一开始就准确测出这些信息和其他超参数。
神经网络是一个高度迭代的过程,通常在项目启动时,首先会有一个初步想法,然后编码并尝试运行这些代码,通过运行和测试得到该神经网络的结果,然后根据输出重新完善自己的想法,改变策略或者为“得到更好的神经网络”不断更新自己的方案。
吴恩达改善深层神经网络参数:超参数调试、正则化以及优化——深度学习的实用层面
创建高质量的训练数据集、验证集、测试集也有助于提高循环效率。
其中:训练集是用来训练数据得到网络模型,验证集是选择最好的模型,测试集是对模型进行评估。
1.在数据集不大的情况下:
训练:测试 = 7:3
训练:验证:测试=6:2:2
在大数据情况下,测试集和验证集的比例要降低
训练:验证:测试=8:1:1
训练:验证:测试=9:0.5:0.5
2.确保验证集和测试集的数据集是同一分布
3.没有测试集也可以

偏差/方差

吴恩达改善深层神经网络参数:超参数调试、正则化以及优化——深度学习的实用层面

第一幅图为高偏差(欠拟合)
第三幅图为高方差(过拟合)

在只有两个特征的二维数据集中,我们可以绘制数据。将偏差和方差可视化;在多维空间数据中,绘制数据和可视化分割边界无法实现,我们可以通过下面几个指标来研究偏差和方差:
(1)训练集误差
(2)验证集误差

在猫分类问题中:
吴恩达改善深层神经网络参数:超参数调试、正则化以及优化——深度学习的实用层面
假设人眼辨别的错误率接近0%
吴恩达改善深层神经网络参数:超参数调试、正则化以及优化——深度学习的实用层面

根据训练集误差可以判断数据拟合情况,可以判断是否有偏差问题,然后查看错误率多高
根据测试集误差可以片段是否有方差问题

以上分析前提:假设基本误差很小,训练集和验证集数据来自同一分布

机器学习基础

吴恩达改善深层神经网络参数:超参数调试、正则化以及优化——深度学习的实用层面

正则化

解决高方差问题:1.获得更多的数据2.正则化
有时候我们并不容易获取更多的数据
将正则化应用于Logistic回归中:
Logistic回归:
吴恩达改善深层神经网络参数:超参数调试、正则化以及优化——深度学习的实用层面
加入正则化:
吴恩达改善深层神经网络参数:超参数调试、正则化以及优化——深度学习的实用层面
L2正则化:
吴恩达改善深层神经网络参数:超参数调试、正则化以及优化——深度学习的实用层面
为什么正则化项没有b?
w是一个高维参数矢量,已经可以表达出高方差问题,w中可能包含很多参数,我们不可能拟合所有的参数;b只是一个数字,所以w几乎涵盖所有参数,而b没有,加入b没有太大影响。
L1正则化:
吴恩达改善深层神经网络参数:超参数调试、正则化以及优化——深度学习的实用层面
使用L1正则化,会使w变稀疏,一般使用L2正则化
在NN中:
吴恩达改善深层神经网络参数:超参数调试、正则化以及优化——深度学习的实用层面

吴恩达改善深层神经网络参数:超参数调试、正则化以及优化——深度学习的实用层面
在NN中,加入正则化

dW ^[l] = A^[l-1]*dZ^[l] + lambd/m*W^[l]
W^[l] : = W ^[l] - alpha*dW^[l]
W^[l] := W^[l] - alpha*( A^[l-1]*dZ^[l] + lambd/m*W^[l])
		  = W^[l] - alpha*lambd/m*W^[l]-alpha* A^[l-1]*dZ^[l] 
		  = (1-alpha*lambd/m)*W^[l]-alpha* A^[l-1]*dZ^[l] 

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

吴恩达改善深层神经网络参数:超参数调试、正则化以及优化——深度学习的实用层面

lambd非常大时,W^[l]约等于0,将多隐藏单元的权重设为0.基本消除了这些隐藏单元的许多影响,将DNN简化为一个很小的NN(小到如图一个逻辑回归单元,深度却很大),会使NN从高方差变为高偏差,在这一过程中,会有一个lambd使模型拟合的正好。

吴恩达改善深层神经网络参数:超参数调试、正则化以及优化——深度学习的实用层面
吴恩达改善深层神经网络参数:超参数调试、正则化以及优化——深度学习的实用层面

lambd很大时,w变小,则z也随w变小,所以tanh保持线性,整个网络呈现线性变化 

dropout

若这个网络存在过拟合
吴恩达改善深层神经网络参数:超参数调试、正则化以及优化——深度学习的实用层面
dropout做的是:遍历网络的每一层,并设置消除神经网络中节点的概率,得到一个节点更少、规模更小的网络。
吴恩达改善深层神经网络参数:超参数调试、正则化以及优化——深度学习的实用层面
反向随机**:
L = 3 ,keep_prob = 0.8(表示保留某个隐藏单元的概率)

#python
d3 = np.random.rand(a3.shape[0],a3.shape[1])<keep_prob
a3 = d3 *a3
a3/=keep_prob

不同样本,消除不同隐藏单元
在测试时,不使用dropout

理解dropout

类似L2正则化

1.若担心某些层容易过拟合,可以把某些层的keep_prob设置的比其它层低
缺点:更多超参数
2.有些层使用,有些层不使用

使用dropout的缺点:损失函数不再明确被定义

1.关闭dropout,运行代码,确定损失函数单调递减
2.打开dropout

其他正则化方法

增大数据集:随意翻转、剪裁、扭曲(轻微形变)
early stopping:提前停止训练
NN在拐点时已经表现的很好了,在此停止,得到验证集误差。
当还未在NN上运行迭代过程时,W几乎等于0,(随机初始化,初值很小),在迭代和训练过程中,W会变得越来越大,early stopping所做的就是在中间一点停止迭代,得到一个W值中等大小的费罗贝尼乌斯范数,与L2正则化相似,选择参数W范数较小的NN
缺点:不能同时处理两个过程(1,。优化cost2.防止过拟合)
优点:只运行一次坡度下降

归一化输入

1.零均值化
吴恩达改善深层神经网络参数:超参数调试、正则化以及优化——深度学习的实用层面
2.归一化方差
吴恩达改善深层神经网络参数:超参数调试、正则化以及优化——深度学习的实用层面
在训练集和测试集上使用相同的μ和σ确保所有特征在相似范围内
归一化输入帮助学习算法运行的更快。

梯度消失、梯度下降

如图为一个深度神经网络:
吴恩达改善深层神经网络参数:超参数调试、正则化以及优化——深度学习的实用层面
该网络使用言行**函数:
吴恩达改善深层神经网络参数:超参数调试、正则化以及优化——深度学习的实用层面
则:
吴恩达改善深层神经网络参数:超参数调试、正则化以及优化——深度学习的实用层面
吴恩达改善深层神经网络参数:超参数调试、正则化以及优化——深度学习的实用层面
设:
吴恩达改善深层神经网络参数:超参数调试、正则化以及优化——深度学习的实用层面
吴恩达改善深层神经网络参数:超参数调试、正则化以及优化——深度学习的实用层面
设:
吴恩达改善深层神经网络参数:超参数调试、正则化以及优化——深度学习的实用层面
吴恩达改善深层神经网络参数:超参数调试、正则化以及优化——深度学习的实用层面
**函数指数递增或指数递减
也适用于与层数L有关的导数或梯度函数

NN权重初始化

一个神经单元权重初始化:
吴恩达改善深层神经网络参数:超参数调试、正则化以及优化——深度学习的实用层面
b初始化为0
吴恩达改善深层神经网络参数:超参数调试、正则化以及优化——深度学习的实用层面
为了防止z过大或过小
需要:n越大,wi越小
当**函数为relu时:
吴恩达改善深层神经网络参数:超参数调试、正则化以及优化——深度学习的实用层面

w^[l] = np.random.randn(shape)+np.sqrt(2/n^[l-1]

当**函数为tanh时:
吴恩达改善深层神经网络参数:超参数调试、正则化以及优化——深度学习的实用层面

吴恩达改善深层神经网络参数:超参数调试、正则化以及优化——深度学习的实用层面

梯度的数值逼近

吴恩达改善深层神经网络参数:超参数调试、正则化以及优化——深度学习的实用层面
吴恩达改善深层神经网络参数:超参数调试、正则化以及优化——深度学习的实用层面
吴恩达改善深层神经网络参数:超参数调试、正则化以及优化——深度学习的实用层面
误差:0.0001
单边:3.0301 误差:0.03
双边误差公式更准确

梯度检验

1.将W^[1],b^[1],W^[2],b^[2],...,W^[l],b^[l]转化成向量矩阵theta
2.将dW^[1],db^[1],dW^[2],db^[2],...,dW^[l],db^[l]转化成向量矩阵dtheta

对于每一个i:
吴恩达改善深层神经网络参数:超参数调试、正则化以及优化——深度学习的实用层面
吴恩达改善深层神经网络参数:超参数调试、正则化以及优化——深度学习的实用层面
1.计算
吴恩达改善深层神经网络参数:超参数调试、正则化以及优化——深度学习的实用层面
设:
吴恩达改善深层神经网络参数:超参数调试、正则化以及优化——深度学习的实用层面
若上式约等于ε,则梯度下降无误

关于梯度检验实现技巧

1.不要在训练中使用梯度检验,他只用于调试
2.如果算法的梯度检验失败,则检查所有项
3.在实施梯度检验时,如果使用正则化,要记得zhengze项
4.梯度检验不能与dropout同时使用
5.在随机初始化过程中,运行梯度检验,训练网络,w,b会有一段时间远离0,如果随机初始化比较小,反复训练网路,再重新运行梯度检验。