深度学习笔记一(实践相关)

目录

训练、验证、测试集(Train/Dev/Test sets)

验证集和测试集

没有测试集

偏差和方差(Bias/Variance)

   高偏差——欠拟合

高方差——过度拟合

 适度拟合

   ​编辑                                             训练集误差和验证集误差(Train set error and Dev set error)

最优误差

分析

优化模型(机器学习基础)

处理偏差

处理方差

需要注意

正则化

L1,L2正则化

逻辑回归的损失函数增加L1正则化:

L2正则化时最常见的正则化类型

如何使用L2范数实现梯度下降呢?

为什么正则化有利于防止过拟合现象?

dropout正则化

 实施dropout——反向随机失活(inverted dropout)

理解dropout

其他正则化方法

数据扩增

early stopping(早终止法)

优化代价函数J

归一化输入

零均值化

归一化方差


训练、验证、测试集(Train/Dev/Test sets)

        通常,我们将总数据的60%作为训练集、20%作为验证集、20%作为测试集,当然,在总数据集非常大时,我们可以使验证集和测试集的数据远小于总数据集的20%,甚至10%,即可以不用按照固定的比例进行分配,但是必须保证验证集和测试集的功能实现。

验证集和测试集

        训练集执行完算法后,通过验证集或者简单交叉验证集选择最好的模型,经过充分验证,最终确定模型,再利用测试集对模型进行评估。

        验证集的目的就是验证不同算法,检验哪种算法更有效。

        测试集会根据最终选择的分类器正确评估分类器的性能。

(建议测试集和训练集来自于同一分布,不然可能会出现严重的过拟合现象。)

没有测试集

        测试集的目的是对所选定的神经网络做出无偏估计,不需要无偏估计,可以不用设置测试集。

        当没有测试集只有验证集时,那么就在训练集上尝试不同的模型,再验证集评估,然后迭代并选出合适的模型。相当于验证集上已经涵盖测试集数据,不再提供无偏估计。

        没有独立的测试集时,人们可能会将验证集成为测试集,只是将测试集当成简单交叉验证集使用,并不是真正的测试集,只是把验证集的数据过度拟合到了测试集中。

小结

        搭建训练验证集能够加速神经网络的集成,更有效地衡量算法的偏差和方差,从而帮助我们选择更合适的优化算法。

偏差和方差(Bias/Variance)

高偏差——欠拟合

                                                              

         将数据简单拟合一条直线,得到一个逻辑回归拟合,显然并不能很好地拟合这些数据,这就是高偏差,欠拟合的现象。

高方差——过度拟合

         将数据拟合成一个非常复杂的分类器,比如深度学习网络或者含有多个隐藏层的神经网络,虽然非常适合该数据集,但它并不是一种很好的拟合方式,分类器方差较高,数据过度拟合。

 适度拟合

        介于上述两种拟合方式之间,复杂程度适中的分类器能够将数据拟合得更加合理,成为”适度拟合“。

                                                训练集误差和验证集误差(Train set error and Dev set error)

        理解方差和偏差的两个关键数据是训练集误差和测试集误差。

        假设训练集误差是1%,验证集误差是11%,显然,训练集设置得非常好,但是验证集的结果相对较差,这可能是因为没有充分利用交叉验证集的作用,过度拟合了训练集,是高方差现象。

        假设训练集误差是15%,验证集误差是16%,算法并没有在训练集中得到很好的训练,训练数据的拟合度不高,我们称之为欠拟合,偏差太高,显然在这个例子中的方差是合适的。

        假设训练集误差是15%,验证集误差达到30%,这是最糟糕的情况,方差和偏差都很高。

        假设训练集误差0.5%,验证集误差1%,这显然是非常好的情况。

最优误差

        最优误差也被称作贝叶斯误差,如果数据的最优误差(贝叶斯误差)达到了15%,某个分类器的训练集误差是15%,测试集误差是16%,那么这个错误率是非常合理的,偏差和方差都很低。

        图片非常模糊的情况下,即使是人眼也无法准确无误地识别,这种情况下最优误差就会很高。

        重点是通过查看训练集误差,我们可以判断数据拟合情况,判断是否有偏差问题,查看错误率有多高,当完成训练集训练,通过验证验证集,我们可以知道方差是否过高,即从训练集到验证集的过程,我们可以判断方差是否过高。

分析

        偏差高是因为它几乎是一条直线,没有拟合数据,二次曲线能够很好地拟合数据,但是过度拟合会导致偏差很高。

优化模型(机器学习基础)

处理偏差

        初始模型训练完成后,首先我们需要知道偏差是不是太高。

        如果偏差较高,需要试着评估训练集或者训练数据的性能;如果偏差的确很高,甚至都不能正确地拟合训练数据,那么需要重新选择一个网络(含有更多的隐藏层或者隐藏单元),或者花费很长时间来训练网络,或者尝试更先进的优化算法

        采用更大的网络通常会有所帮助,延长训练时间不一定有帮助,但是也没什么坏处。如果网络足够大,通常能够很好地拟合训练集。

处理方差

        当偏差降低到可接受的范围后,就可以开始检查方差,评估方差需要查看验证集的性能,如果方差过高,最好的方式就是采用更多数据,如果无法获取更多数据,可以通过正则化来减少过拟合,找到一个低偏差、低方差的神经网络框架就成功了。

需要注意

        第一,高偏差和高方差是两种不同的情况,处理的方式也有区别,所以我们必须明白是偏差的问题还是方差的问题,还是两者都有问题。可以通过训练验证集来判断是方差的问题还是偏差的问题。

        第二,通常,构建一个更大的网络能够不影响方差的同时减少偏差,采用更多的数据能够不影响偏差的同时减少方差。即,训练网络,选择网络或者准备更多的数据。

正则化

        正则化是一种减少方差的方法,进行正则化时,可能会出现方差和偏差权衡的问题,偏差可能略有增加,但是如果网络非常大,偏差通常不会增幅太大。当发生了过度拟合,通常第一想到的就是正则化。简单来说,正则化就是对代价函数增加限制条件,限制其较高次的参数大小不能过大。正是因为高次项参数导致了过拟合的发生,如果我们能够将高此项的系数接近0,那么就能很好地拟合了。

参考:

(1条消息) 【深度学习】正则化(超详解)_ZSYL的博客-CSDN博客_深度学习正则化https://blog.csdn.net/qq_46092061/article/details/119680604

L1,L2正则化

        在逻辑回归中加入正则化,需要加上正则化参数λ,即给代价函数增加惩罚项,防止其权重过大。

逻辑回归的损失函数增加L1正则化:

 L1范数:

(1条消息) 一篇文章完全搞懂正则化(Regularization)_见见大魔王的博客-CSDN博客_正则化https://blog.csdn.net/weixin_41960890/article/details/104891561?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-3.topblog&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-3.topblog         L1正则化对于所有权重予以同样的惩罚,也就是说,不管模型参数的大小,对它们都施加同等力度的惩罚(取绝对值的作用),因此,较小的权重在被惩罚后,就会变成0。因此,在经过L1正则化后,大量模型参数的值变为0或趋近于0,当然也有一部分参数的值相对就会变得很高。由于大量模型参数变为0,这些参数就不会出现在最终的模型中,因此达到了稀疏化的作用,这也说明了L1正则化自带特征选择的功能,这一点十分有用。

L2正则化时最常见的正则化类型

逻辑回归的损失函数中增加L2正则化:

L2的范数可以理解为(所有W参数的平方和)

参考 (1条消息) 一篇文章完全搞懂正则化(Regularization)_见见大魔王的博客-CSDN博客_正则化https://blog.csdn.net/weixin_41960890/article/details/104891561?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-3.topblog&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-3.topblog 二次正则项的优点就是处处可导,方便计算!

        L2正则化对于绝对值较大的权重予以很重的惩罚,对于绝对值很小的权重予以非常非常小的惩罚,当权重绝对值趋近于0时,基本不惩罚。这个性质与L2的平方项有关系,即越大的数,其平方越大,越小的数,比如小于1的数,其平方反而越小。

如何使用L2范数实现梯度下降呢?

        使用反向传播计算dw的值,反向传播会给出J对W的偏导数,我们要做的就是在原来dw的基础上加上\frac{\lambda }{m} w^{^{[l]}},然后用这个新的dw来计算更新项w^{^{[l]}}

dw = \frac{\partial J}{\partial w} +\frac{\lambda }{m}w ^{[l]}                (1)

w := w - \alpha dw                (2)

        将(1)带入(2)可以得到(3)

W = W - \alpha (\frac{\partial J}{\partial w}+\frac{\lambda }{m}W)                (3)

整理得        W = W(1-\frac{\alpha \lambda }{m}) - \alpha *\frac{\partial J}{\partial w }                (4)

每次进行更新的时候都会让  W(1 - \frac{\alpha \lambda }{m}) ,而这个系数一直小于1,所以常称L2范数为权重衰减。

为什么正则化有利于防止过拟合现象?

        将正则化系数设置得足够大时,权重矩阵W就会被设置为接近0的值,即许多隐藏单元的权重设为0,那么就会基本消除了这些隐藏单元的许多影响(实际上依然存在只是影响变小),将神经网络简化为一个很小的神经网络,但是深度很大,使其不断从过拟合状态接近高偏差状态。这个过程中正则参数λ会有一个中间值,使数据的拟合程度达到一个适度的状态。

        采用tanh作为激活函数时,z非常小时,激活函数就处于正切函数的线性状态,当z扩展到更大或者更小值时,激活函数开始变为非线性。

        当λ很大时,w^{[l]}很小,由于Z = W^{[l]}a^{[l-1]}+b,所以Z受到影响后也会很小,所以利用tanh激活函数后,基本呈现线性。我们知道,如果每一层激活函数都呈现线性的话,那么整个神经网络基本上就是一个线性网络(即使它非常深),不会发生过度拟合(就是从过度拟合往欠拟合上拉)。所以它不适合非常复杂的决策以及过度拟合数据集的非线性决策边界。

dropout正则化

        dropout正则化(随机失活)是一种非常实用的正则化方法,主要作用就是处理过度拟合,它会遍历网络的每一层,并设置消除该层神经网络节点的概率(比如随机消除该层40%的节点),对于消除的节点会删除从该节点进出的连线,最后得到一个节点更少,规模更小的网络,再进行训练。

 实施dropout——反向随机失活(inverted dropout)

        用一个三层网络来说明如何实施dropout,定义一个向量d表示三层的dropout向量

d3 = np.random.rand(a3.shape[0],a3.shape[1])

        根据该随机矩阵d3中的元素是否小于某个0.x来生成一个只含有0,1的随机矩阵,比如,根据元素是否小于0.8,那么就会删去20%的节点数。 保留小于0.8的1位置的节点。(keep-prob=0.8)

得到只含有0,1的d3矩阵后,用d3*a3,即a3 = np.multiply(a3,d3),这样就可以将d3中0元素与a3中的相对元素归零。(如果keep-prob设置为1,那么就不存在dropout,因为它会保留所有节点)

        在测试阶段,我们不期望输出结果是随机的,所以测试阶段不会使用dropout函数。

理解dropout

        dropout会让神经元随机失活,这使得每一次迭代都在一个更小的神经网络中计算,而使用更小的神经网络就好像具有了正则化的效果。

        不能依赖任何一个特征,因为该单元的输入随时有可能被清除,所以不会给任何一个输入过多的权重,为每个输入都加一点权重,通过这种方式进行传播,dropout将会产生收缩权重的平方范数的效果,和L2正则化有点类似,实施dropout的结果是会压缩权重,完成一些预防过拟合的外层正则化。

        不同层的keep-prob值可以不同,越接近输出层的keep-prob值越大,因为越是接近输出层,它的过拟合程度相对越轻。通常我们只对隐藏层应用dropout,而不对输入层用。 

        dropout主要用在计算机视觉领域。

        缺点:代价函数J不再被明确定义,每次迭代都会随机移除一些点,检查梯度下降的性能是很难复查的,因为优化的代价函数J没有明确定义,某种程度上很难计算。通常可以关闭dropout,即令keep-prob的值设置为1,运行代码,确保J单调递减。

其他正则化方法

数据扩增

        拟合猫咪图片分类器时,可以将原始图片数据经过翻转,旋转或者裁剪等操作作为新的数据来扩充原始数据。

        字符识别时,可以将原始图片上的数字经过随意旋转或者扭曲数字作为新的数据添加到训练集进行处理。

        数据扩增可作为正则化方法使用,实际功能上也与正则化相似。

early stopping(早终止法)

        运行梯度下降时,我们可以绘制训练误差或者绘制代价函数J的优化过程,呈现单调下降的趋势。而验证集误差的表现通常会先呈现下降趋势,然后从某个节点开始上升,early stopping要做的就是在中间点停止迭代,得到一个w值中等大小的弗罗贝尼乌斯范数,与L2相比,选择w范数较小的神经网络,(但愿过度拟合情况不严重)

        优点是只进行一次梯度下降,可以找出w的较小值,中间值和较大值,无需尝试L2正则化超参数λ的很多值。

优化代价函数J

         优化代价函数可以采用梯度下降、Momentum、RMSprop和Adam等等,优化代价函数之后,为了防止过拟合,需要正则化、扩充数据等等。

        在优化代价函数J时,只需要注意w和b,而J的值越小越好,之后再去处理过拟合。

early stopping的主要缺点是,不能独立地处理这两个问题,停止梯度下降之后,就不会继续优化代价函数J,那么代价函数可能会不够小,同时又不希望会出现过拟合。

        L2正则化的训练时间很长,需要尝试许多不同的λ值。

归一化输入

        归一化输入是一种加速神经网络训练的方法,有两个步骤,一个是零均值,一个是归一化方差。我们希望训练集和测试集都通过相同的μ和\delta ^{2}训练数据,所以μ和\delta ^{2}是通过训练集数据得到的。 

x = \frac{x-\mu }{\delta }

零均值化

        \mu = \frac{1}{m} \sum_{i=1}^{m} x^{(i)}        这是一个向量,更新x就是将x中的每个元素减去均值μ        x = x-μ

即移动训练集,直到它完成均值化。

归一化方差

        给\delta赋值,即        \delta ^{2} = \frac{1}{m} \sum_{i=1}^{m} (x^{(i)})^{2}        \delta ^{2}是一个向量,每个特征都有方差,x = \frac{x}{\delta }

   代价函数:J(w,b) = \frac{1}{m}\sum_{i=1}^{m} L(\widehat{y}^{(i)},y^{(i)})

表现:

        使用归一化之后,代价函数的表现就会更对称一些,使用梯度下降法进行迭代的次数就会减少,能够更快速地找到最小值。表现如下图所示,

         如果特征x_{1}的范围在0~1之间,而x_{2}的范围在-1~1之间,它们是相似范围,所以表现得很好,但是无果其中一个0~1,而另一个0~1000,那么这对优化算法将非常不利,此时,进行归一化就非常重要了。

 

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值