2.1 优化神经网络(上)

1 机器学习的基本步骤

  • 训练完一个模型之后首先检查是否模型有高偏差,如果有高偏差的问题,那么应该选择一个更复杂的网络,比如增加隐层和神经元个数,或者花更多时间训练模型,或者尝试更先进的优化算法,或者选择新型的神经网络架构。
  • 接着检查是否存在高方差问题,如果存在,则可以通过使用更多训练数据解决,或者使用正则化项,或者选择更好的神经网络架构
    神经元个数越多,权重值就越多,模型越容易出现过拟合,若神经网络某一层神经元个数很过,则该层出现过拟合的可能性较大

2 dropout 正则化(随机失活正则化)

2.1 原理

都遍历神经网络的每一层,并设置消除神将网络中节点的概率。对每一个训练样本输入神经网络进行训练时,我们判断当前神经网络有哪些节点被删除了,哪些还保留着,若该节点被消除,则删除掉从该节点进出的连线。所以对每一个训练样本,我们都是用一个精简后的神经网络去训练它。即每次使用不同的训练样本迭代都会有不同的单元被删除

2.2 使用方法

我们常用的是inverted dropout(反向随机失活)

  1. 假设神经网络有3层,设置第三层的节点保留概率为keep-prob=0.8
  2. 令d3 = (np.random.rand(a3.shape[0], a.shape[1]) < keep-prob),d向量是用来觉得每一个隐层哪些神经元被删除的
  3. a3 = np.multiply(a3, d3)
  4. a3 = a3 / keep-prob
  5. 在测试阶段却不使用dropout,因为我们不希望我们的测试输出是随机的
    我们可以对神经网络的不同层设置不同的keep-porb值,若该层神经元个数多,则过拟合可能性大,我们应该使用较小的keep-porb值,具体设置多少,可以通过交叉验证集确定。
    我们甚至可以在输入层使用dropout来随机删除部分特征(实际应用少)
    dropout正则化在cv领域应用较多,因为数据量太大

2.3 缺点

代价函数J不再被明确定义,因为J不再随着迭代次数增加而依次降低,所以debug时我们一般先把dropout关闭(将keep-porb值设置为1)迭代几次,若J逐渐降低,说明网络结构没错,可以进一步计算

3 其他的一些解决过拟合的方法

3.1 Data augmentation(数据增加)

如果我们想通过扩大训练集来解决过拟合的话,我们可以简单地将训练集图片进行变换,获得新的训练输出样本,这样可以在低成本的情况下增大训练数据集
在这里插入图片描述

3.2 Early stopping

同时绘制训练集上和交叉验证集上的误差随着迭代次数增加的变化曲线,在紫色点处停止训练,神经网络在此时已经表现的很好了:
在这里插入图片描述

4 加快训练速度的方法

4.1 Early stopping

Early stopping就可以起到类似L2正则化的效果,但是他不用搜索很大的λ参数空间,仅使用一次梯度下降迭代就可以得到和L2近似的效果,因为我们一般初始化w和b的值都很小,随着迭代次数增加会变得越来越大,而Early stopping可以在w还比较小的时候停止迭代,这与L2正则化功能类似。

4.2 归一化输入

  1. 对输入数据集,减去其特征的均值μ(使该数据集的每个特征均值为0)
    在这里插入图片描述

  2. 归一化方差
    在这里插入图片描述
    则归一化后的结果为:
    在这里插入图片描述
    **我们还应该使用刚刚的μ和σ去归一化测试集,因为我们希望训练集和测试集都是通过相同的μ和σ定义的相同的数据转换 **
    可以加速训练的原因:如果你使用非归一化的输入特征,那么代价函数将会像下图左侧图那样,这是一个非常细长狭窄的代价函数。如果x1的取值范围从1到1000,x2的范围是从0到1,结果是参数w1和w2的范围或比率将会非常不同。如果你能画出该函数的部分轮廓,它会是这样一个狭长的函数。然而,如果你归一化特征,代价函数平均起来更对称。如果你在左图这样的代价函数上运行梯度下降法,你必须使用一个非常小的学习率,因为如果初始位置位于下图红色箭头的位置,梯度下降法可能需要多次迭代过程,直到找到最小值。但如果函数是一个更圆的球形轮廓,那么不论从哪个位置开始,梯度下降法都能够更直接地找到最小值,你可以在梯度下降法中使用较大步长,而不需要像在左图那样反复执行。当然,实际上w是一个高维向量,因此用二维绘制w并不能正确地传达直观理解,但总的直观理解是当特征都在相似范围内时,代价函数会更圆一点,而且更容易优化。
    在这里插入图片描述

5 梯度消失和梯度爆炸及其解决

5.1 梯度消失和梯度爆炸

梯度消失和梯度爆炸是训练深层网络经常遇到的问题,即导数的坡度会变得非常大或者非常小。假设我们的网络很深,为了方便起见,我们这里假设激活函数是线性的g(z)=z,则我们最后得到的输出y也是x1,x2的线性组合,呈指数关系
在这里插入图片描述
如果w的权重都是1.5,则y将会比输入的x大好多好多倍:
在这里插入图片描述
反之,如果w的权重小于1,那么y将会比输入的x小很多

5.2 解决方法

解决方法是谨慎选择权重矩阵的初始化的值:如果某一层的神经元数量越多,为了防止下一层神经元激活函数取到太大的输入值,我们一般希望权重小一些,即我们在w初始化时乘以下面这一项:其中分子可以是1,也可以是2
在这里插入图片描述
也可以乘以这个:
在这里插入图片描述

6 梯度检验

在编写梯度下降算法的代码时,为了防止出错,我们一般使用梯度检验操作来检验我们算法的正确性,方法如下:
在这里插入图片描述
注意,这种梯度检测虽然可以很近似的表示梯度,但是时间复杂度很高,远大于反向传播时间复杂度,所以梯度下降只用作检验方法。
注意:
如果使用了正则化项,则在梯度检测中近似表示dθ时也要加上正则化项
在梯度检测中不要使用dropout,这样会导致代价函数J很难计算。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值