改善深层神经网络:超参数调试、正则化以及优化
Improving Deep Neural Networks Hyperparameter tuning, Regularization and Optimization
本章设计超参数调优,如何构建数据,以及如何确保优化算法的快速运行。
神经网路机器学习的问题,然后是随机神经网路
在配置训练,验证和测试数据集的过程中做出正确决策。
数据的分配通常是验证集、测试集和训练集。
一般的话,要保证验证集和测试集来此同一地方,(也就是适用范围较小)
偏差和方差
偏差较高 称为 欠拟合
方差过大 成为 过拟合
差不多 称为 适度拟合
理解偏差跟方差的关键在于 训练集误差和验证集误差
通过训练集和验证集的误差来判断偏差和方差。
可以在机器学习的过程中,通过这些基本方法,来优化算法。
- 先判断偏差高不高,如果偏差较高,尝试评估训练集或者训练数据的性能。如果的确很高,那就要尝试拟合一个新网络。或者增加隐藏网络的层数,反正就是不断尝试迭代,直到拟合。
- 高偏差对于增加训练集是没有用的,所以如果不够拟合,要判断是高偏差还是高方差的原因。
正则化
解决高方差,最常见的方法可能是
①正则化。
②增加更多的训练数据
正则化: 讲解链接
文章目录
正则化(Regularization)
稀疏模型与特征选择的关系
L1和L2正则化的直观理解
正则化和特征选择的关系
为什么梯度下降的等值线与正则化函数第一次交点是最优解?
L2正则化和过拟合的关系
正则化参数的选择
L1正则化参数
L2正则化参数
Reference
还有一个正则化方法叫做 dropout(随机失活)
好像每次迭代之后神经网络都会变得比以前更小
也就是随机选取,随机删除
那么如何实施呢?采用反向随机失活(inverted dropout)
keep-prob表示保留某个单元的概率
- 最开始设定网络层数和保留概率,
- 然后将部分的矩阵d【】设置成0,
- 然后通过a3=d3*a3将a的对应的位置改变成0,
- 最后再让a3除以keep-prob来保证期望值相同。
测试阶段一般不使用dropout+
dropout不同于L2正则化的地方在于,他可能被应用于不同的输入范围
每层keep-prob的值都可能不同K
dropout一个缺点就是它的代价函数不能被明确定义了
损失函数
损失函数和代价函数代表的一个意思。
回归问题所对应的损失函数为L2损失函数和L1损失函数
通过最小化L2或L1损失对其参数进行估计。
一个是偏差,一个是方差。
其他方法
- 图片的水平翻转,裁剪图片,通过这些方法扩增数据。进而正则化数据集,减少过拟合比较廉价
- early Stopping
可以绘制验证集误差,验证集的代价函数,通常先下降,再上升。
(自我理解:用来减少过拟合)
缺点就是过拟合和J的优化没法同时解决。
配置优化提高训练速度
通过将数据均化零值,如果输入特征在不同的范围内,那么归一化特征值就比较重要了。比如x是1–1000,y是0-1那么可能就需要,
x,y 的归一化
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的次方
深度学习中优化方法
可以看:深度学习中优化方法
指数加权平均
移动平均值,也就是每一个数是上一个数的代数+最新的数
eg:0.9v1+0.1v2
也就是可以通过β来计算出这是几天的平均值,如果β是0.9,那么1/(1-0.9)=10,那这个数就是十天的平均值。
通过调整β可以得到不同的值,一个恰当的β往往是重要的。
这是优化算法的关键一环
v t = β v t − 1 + ( 1 − β ) v t {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)
v
t
1
−
β
t
\frac{{v_t}}{{1 - {\beta _t}}}
1−βtvt
主要用来处理前期数据的。
动量(momentum)
运行速度几乎总是快于标准的梯度下降的
想法:计算梯度的指数加权平均值,并利用该梯度更新你的权重。
梯度下降算法基本是这样的,这样的形状导致了你无法使用较大的学习率来优化参数,如果使用较大的学习率,那么波动更大。
同时你希望的是,纵轴方式波动比较小,但是横轴方向波动比较大,
人们在使用momentum的时候,不会受到修正偏差的影响,所以
v
t
1
−
β
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.001,0.01,0.1,1,然后对数均匀取值,
用对数标展搜索超参数的方武会更合理
如何组建超参数搜索过程
鱼子酱模式的训练和熊猫方式的训练
batch归一化
在深度学习兴起后,最重要的一个思想是一个算法-Batch归一化,由Sergey Ioffe和Christian Szegedy两位研究者创造。Batch归一化会使参数搜索问题变得很容易,使神经网络对超参数的旋转更加稳定,超参数的范围会更庞大,工作效果也很好。
在逻辑回归中,我们学过归一化输入会让算法运行的更好。
那么我们可不可以归一化每一层的a来使得下一次的参数训练的更好呢?简单来说,Batch归一化做的就是这个事情。严格的说,归一化的不是a而是z。
归一化的过程如下:
前三个公式让z的每一个分量都含有平均值0和方差1,但我们不想让隐藏单元总是含有平均值0和方差1,也许隐藏单元有了不同的分布会有意义,所以有了第四个公式。 注意,
γ
\gamma
γ 和β是模型的学习参数,他们的作用是允许我们可以随意设置
z
~
\tilde z
z~的平均值,事实上,如果
γ
=
σ
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的问题怎么应用于神经网络呢?
让我们从第三层来看看神经网络的学习过程。假如此网络已经学习了参数w3,b3,从第三隐藏层的角度来看,它从前层中取一些值,然后做些什么希望使输出值\hat\hat接近于真实值y。
协变量偏移(Covariate Shift)
Batchl图一化将你的数据以mini-batch的形式逐一处理,但在测试时你可能需要对每一个样本逐一处理,
sofatmax回归
能能让你在试图识别某一分类时做出预测,或者说是多种分类中的一个不只是识别两个分类,
softmax讲解
softmax需要输入个向量最后输出一个向量
深度学习的框架:
TensorFlow框架