改善深层神经网络超参数调试、正则化以及优化
Improving Deep Neural Networks Hyperparameter tuning, Regularization and Optimization 本章设计超参数调优如何构建数据以及如何确保优化算法的快速运行。
神经网路机器学习的问题然后是随机神经网路
在配置训练验证和测试数据集的过程中做出正确决策。
数据的分配通常是验证集、测试集和训练集。 一般的话要保证验证集和测试集来此同一地方也就是适用范围较小
偏差和方差
偏差较高 称为 欠拟合 方差过大 成为 过拟合 差不多 称为 适度拟合 理解偏差跟方差的关键在于 训练集误差和验证集误差
通过训练集和验证集的误差来判断偏差和方差。 可以在机器学习的过程中通过这些基本方法来优化算法。
- 先判断偏差高不高如果偏差较高尝试评估训练集或者训练数据的性能。如果的确很高那就要尝试拟合一个新网络。或者增加隐藏网络的层数反正就是不断尝试迭代直到拟合。
- 高偏差对于增加训练集是没有用的所以如果不够拟合要判断是高偏差还是高方差的原因。
正则化
解决高方差最常见的方法可能是 ①正则化。 ②增加更多的训练数据
正则化: 讲解链接
文章目录 正则化Regularization 稀疏模型与特征选择的关系 L1和L2正则化的直观理解 正则化和特征选择的关系 为什么梯度下降的等值线与正则化函数第一次交点是最优解 L2正则化和过拟合的关系 正则化参数的选择 L1正则化参数 L2正则化参数 Reference
还有一个正则化方法叫做 dropout随机失活 好像每次迭代之后神经网络都会变得比以前更小
也就是随机选取随机删除 那么如何实施呢采用反向随机失活inverted dropout keep-prob表示保留某个单元的概率
- 最开始设定网络层数和保留概率
- 然后将部分的矩阵d【】设置成0
- 然后通过a3d3*a3将a的对应的位置改变成0
- 最后再让a3除以keep-prob来保证期望值相同。
测试阶段一般不使用dropout
dropout不同于L2正则化的地方在于他可能被应用于不同的输入范围
每层keep-prob的值都可能不同K
dropout一个缺点就是它的代价函数不能被明确定义了
损失函数
损失函数和代价函数代表的一个意思。
回归问题所对应的损失函数为L2损失函数和L1损失函数 通过最小化L2或L1损失对其参数进行估计。 一个是偏差一个是方差。
其他方法
- 图片的水平翻转裁剪图片通过这些方法扩增数据。进而正则化数据集减少过拟合比较廉价
- early Stopping 可以绘制验证集误差验证集的代价函数通常先下降再上升。 自我理解用来减少过拟合
缺点就是过拟合和J的优化没法同时解决。
配置优化提高训练速度
通过将数据均化零值如果输入特征在不同的范围内那么归一化特征值就比较重要了。比如x是1–1000y是0-1那么可能就需要 xy 的归一化 3d展示。迭代的学习率的问题一个需要特别小导致次数特别多一个则均匀无所谓的。
梯度消失或者梯度爆炸
指的就是导数 如何选择随机初始化权重从而避免这个问题 RELU的初始权重 tanh和其他方法的初始权重选额 运行两次单边公差因为它的结果更准。 也就是实际运行的导数。 结论双边误差公式的结果更准确。 ** backprop反向传播 其实就是求导**
实施梯度检验的技巧和注意事项
- 首先不要在训练中使用梯度检验它只用于调试
- 第二点如果算法的梯度桧验失败要检查所有项也就是说如果dOapprox[i]与O的值相差很大,查看具体的i看看是哪个元素导致的
- 在实施梯度检测时请注意正则化代价函数一定要包含正则项。
- 第四点梯度检验不能与dropout同时使用
mini-batch梯度下降法
提前把训练集分成小的部分这些部分叫做mini-batch
小括号表示第几个中括号表示神经网络的第几层大括号表示第几个mini-batch
batch梯度下降算法就是一次处理所有的数据集
选择你的mini-batch的大小
- 如果训练集较小直接使用batch算法《2000
- 一般的mini-batch大小为64—512一般采用2的次方
深度学习中优化方法
可以看:深度学习中优化方法
指数加权平均
移动平均值也就是每一个数是上一个数的代数最新的数 eg0.9v10.1v2
也就是可以通过β来计算出这是几天的平均值如果β是0.9那么1/1-0.910那这个数就是十天的平均值。 通过调整β可以得到不同的值一个恰当的β往往是重要的。 这是优化算法的关键一环
vtβvt−1(1−β)vt{v_t} \beta {v_{t - 1}} \left( {1 - \beta } \right){{\rm{v}}_t} vtβvt−1(1−β)vt
从内存和效率上来讲这是一个性价比比较高的办法
偏差修正
可以让平均数运行的更加准确。 如果不用的话得到的是紫色的曲线就是一开始的起点基本跟第一个点基本是重合的甚至前几个点也是一样的。
有一个办法可以处理这个问题也就是不用v_t而是用v_t除以(1-B^t)
vt1−βt\frac{{v_t}}{{1 - {\beta _t}}} 1−βtvt 主要用来处理前期数据的。
动量momentum
运行速度几乎总是快于标准的梯度下降的 想法计算梯度的指数加权平均值并利用该梯度更新你的权重。
梯度下降算法基本是这样的这样的形状导致了你无法使用较大的学习率来优化参数如果使用较大的学习率那么波动更大。 同时你希望的是纵轴方式波动比较小但是横轴方向波动比较大
人们在使用momentum的时候不会受到修正偏差的影响所以 vt1−βt\frac{{v_t}}{{1 - {\beta _t}}} 1−βtvt 就几乎用不到了。 公式
可以看:深度学习中优化方法
RMSprop
文章有详细的介绍我这里只说我的补充想法
我们希望S dW会相对较小所以我们要除以一个较小的数而希望S db又较大所阅这里我们要除以较大的数字这样就河以减缓纵轴上的变化通过图片可以知道垂直方向的要比水平方向的大得多所以斜率在b方向特别大所以这些微分中db较大dw较小结果就是纵轴的更新被一个较大的数相除就能消除摆动而水平方向的更新被一个较小的数相除。
所以你可以使用更大的学习率而不用担心上下浮动过大
Adam
将Momentum和RMSprop结合在一起 一个更新了1一个更新了2. 还要计算修正偏差。 β_1用于计算这个微分β_2用来计算平方数的指数力加权平均数叫做第二矩。
学习率衰减
如果使用固定的学习率就会是这样最后 不会收敛因为min-batch中有噪音。 看这个
学习率衰减(Learning rate decay)
还有一个局部最优的问题这也是当前需要考虑的问题。
week2的第十题不太懂
超参数调试设置 超参数中
- 1、学习率更为重要
- 2、 momentum β 、mini-batch大小、隐藏单元数量
- 3、选择层数学习率衰退
- -4、 β1、β2、ε一般都是默认值不用怎么动的。
采取的策略随机取值和精确搜索 考虑使用由粗糙到精细的搜索过程随机取值可以提升你的搜索效率随机取值也是选取合适的指标来的。 如果是这样那么随机均匀取值是合理的但是如果是这样
如果采用随机均匀取值的话那么0.001—1之间90%的数字都会落在0.1-0.9之间那么显然是不太合理的。使用的不是线性轴分别取值0.0010.010.11然后对数均匀取值 用对数标展搜索超参数的方武会更合理
如何组建超参数搜索过程 鱼子酱模式的训练和熊猫方式的训练
batch归一化
在深度学习兴起后最重要的一个思想是一个算法-Batch归一化由Sergey Ioffe和Christian Szegedy两位研究者创造。Batch归一化会使参数搜索问题变得很容易使神经网络对超参数的旋转更加稳定超参数的范围会更庞大工作效果也很好。 在逻辑回归中我们学过归一化输入会让算法运行的更好。 那么我们可不可以归一化每一层的a来使得下一次的参数训练的更好呢简单来说Batch归一化做的就是这个事情。严格的说归一化的不是a而是z。 归一化的过程如下 前三个公式让z的每一个分量都含有平均值0和方差1但我们不想让隐藏单元总是含有平均值0和方差1也许隐藏单元有了不同的分布会有意义所以有了第四个公式。 注意 γ\gammaγ 和β是模型的学习参数他们的作用是允许我们可以随意设置z~\tilde zz~的平均值事实上如果γσ2ε\gamma \sqrt {{\sigma ^2} \varepsilon}γσ2ε
β−μ\beta - \muβ−μz~(i)z(i){\tilde z^{(i)}} {z^{(i)}}z~(i)z(i)。通过对γ\gammaγ 和β合理设定可以使你构造含其他平均值和方差的隐藏单元值。于是我们将会使用z~(i){\tilde z^{(i)}}z~(i)来替代z(i){z^{(i)}}z(i)方便神经网络中的后续计算。
怎么将bantch归一化加到神经网络中呢
Batch归—化是发生在计算z和a之间的 bantch归一化在深度学习中通常是一行代码
关于如何用Batch图一化来应用梯度下降法 假设你在使用min-batch算法
详细的算法步骤
batch归一化
batch归一化2
那么batch归一化为什么会有效呢 首先从之前的输入特征归一化可以看到它可以将不同参数的范围变换到相似的范围可以加速学习。但是batch归一化不仅仅是对输入值而且还对隐藏单元进行归一化。 第二个原因是它可以使权重比你的网络更滞后或更深层。比如第10层的权重比第一层的权重更能经受的住变化。这是什么意思呢下面给出一个生动形象的例子。 对于下面这个猫脸识别的神经网路可能是深层也可能是浅层。假设你已经在所有黑猫的图像上训练了数据集如果现在你要把此网路应用于有色猫这种情况下正面的例子不仅是黑色猫还有有色猫。那么你的cosfa可能适用的不会很好cosfa是啥意思是classify吗。如果在黑猫图像中你的训练集是一种情况加上有色猫以后如果你试图把黑猫和有色猫统一与一个数据集那么你就不应该期待左边训练很好的模块同样在右边也运行的很好。 所以使你的数据分布改变的想法有个有点怪的名字-covariate shift。如果你已经学习了x->y的映射如果x的分布改变了那么你可能需要重新训练你的学习算法。covariate shift的问题怎么应用于神经网络呢 让我们从第三层来看看神经网络的学习过程。假如此网络已经学习了参数w3b3从第三隐藏层的角度来看它从前层中取一些值然后做些什么希望使输出值\hat\hat接近于真实值y。
协变量偏移(Covariate Shift)
Batchl图一化将你的数据以mini-batch的形式逐一处理但在测试时你可能需要对每一个样本逐一处理
sofatmax回归
能能让你在试图识别某一分类时做出预测或者说是多种分类中的一个不只是识别两个分类
softmax讲解
softmax需要输入个向量最后输出一个向量
深度学习的框架
TensorFlow框架