# 奥利给干就完了!
第一周:深度学习的实用层面
训练、开发、测试集
应用深度学习是一个典型的迭代过程,因为不可能一开始就确定最优的超参数,需要多次循环往复,才能设计优秀的神经网络,因此循环该过程的效率是决定项目进展速度的一个关键因素,而创建高质量的训练数据集,验证集和测试集也有助于提高循环效率。如果不需要无偏估计,也可以不设置测试集。
数据规模较小时,开发和测试集占总数据的30%~40%;数据量较大时验证集和测试集占数据总量的比例会趋于变得更小。
建议确保验证集和测试集的数据来自同一分布。
偏差、方差
假设已有一个识别猫的分类器。已知人眼识别的错误率接近0%
训练集错误率:15% 测试集错误率:16% 拟合结果的偏差较大
训练集错误率:5% 测试集错误率:20% 拟合结果方差较大
训练集错误率:20% 测试集错误率:40% 拟合结果偏差和方差都较大
训练集错误率:0.1% 测试集错误率:1% 拟合结果的误差和方差合理
机器学习基本步骤
L2正则化
解决高方差通常采用增加数据量(如果可行)、正则化的方法。
假设采用tanh作为**函数,当λ很大而w接近0的时候,z的范围非常接近0,而对于tanh,接近0的部分约等于线性函数,因此将神经网络的各个层向线性靠近,使得多层的神经网络计算结果更简单(参考前面课程中介绍的,为什么要使用非线性**函数),减轻过拟合的情况。
Dropout(随机失活)正则化
对于神经网络的每个隐层,对每个节点设定其失活的概率,被设置为失活的节点其**后的值设置为0,不参与神经网络的计算。在测试时不使用dropout方法。
假设有一L=3的神经网络,d3是一个布尔类型的矩阵,d3.shape=(第3层节点数, 样本数)
在Python的运算中,将d3中的True解析为1,False解析为0,其中每个元素为True或False的概率由输入 keep-prob决定。
a3 =np.multiply(a3,d3),让d3中 0 元素与a3中相对元素归零。
a3 /= keep-prob,以保证a3的期望值不变。
可以为不同层设置不同的keep-prob值,将易发生过拟合的层keep-prob值设置得更低;也可以将某些不会发生过拟合的层的keep-prob值设置为1,即不使用dropout阻塞节点。
使用dropout的一个缺点是,代价函数J无法明确定义,不便观察训练效果。
其它正则化方法
①数据扩增:将原输入的图片进行对称、裁剪、旋转处理,以较小的代价得到更大的数据集。
②提前终止训练:当神经网络在迭代到某时刻时,其表现已满足要求,提前终止。
early stopping 的主要缺点就是不能独立地处理这两个问题,因为提早停止梯度下降,也就是停止了优化代价函数J,因为终止后不再尝试降低代价函数J,所以代价函数J的值可能不够小,同时又希望不出现过拟合,没有采取不同的方式来解决这两个问题,而是用一种方法同时解决两个问题,这样做的结果是要考虑的东西变得更复杂。
正则化输入
神经网络的权重初始化
为了避免深层神经网络中,梯度爆炸和梯度消失的现象,需要对各层节点的权值进行合理初始化。
梯度检验
注意:
①不要在训练中使用梯度检验,它只用于调试。
②如果????????approx[????]与????????[????]的值相差很大,查找不同的????值,找出是哪个导致????????approx[????]与????????[????]的值相差这么多。如果你发现,相对某些层或某层的????或????????的值相差很大,但是dw[????]的各项非常接近,(????的各项与????和????的各项都是一一对应的)这时可能在计算参数????的导数????????的过程中存在 bug。反过来也是一样。
③在实施梯度检验时,如果使用正则化,注意包括正则项。
④梯度检验不能与 dropout 同时使用。