week2_1

版权申明:本文为原创文章,转载请注明原文出处

原文链接:http://example.com/post/1a7d5752.html

week2_1

训练 _ 开发 _ 测试集

超级参数的选择通过最开始选择然后不断迭代选择最优

训练数据分为三部分:训练集,验证集(dev_set),测试集

对于小型数据,70train 30test or 60train 20dev_set 20test

大数据:验证集和测试集的占比减少验证集是为了检验那种算法更有效,所以验证集要足够大,但是比如我们有100万条数据,如果20dev_test就是20万条数据,太多了,可能取一万条数据就能进行评估了,然后找出最好的算法,测试集的主要目的是正确评估分类器的性能,所以比如拥有100万条数据,只需要10000条测试集就够了

比如一个用户通过上传图片验证该图片是不是猫,网上猫的图片就是训练集,用户上传的图片是验证集和测试集,但是网上的照片可能比用户上传的更高清,更好分析,要保证验证集和测试集来自同一分布,因为要用验证机来评估不同的模型/算法 测试集是对最后的神经网络做出无偏评估,不是必需的

如果只有验证机没有测试集:在训练集上训练,尝试不同的模型框架,在验证集上评估这些模型,并选择适合的模型

偏差_方差

过度拟合:“过于紧密或精确地对应于特定数据集的分析结果,因此可能无法拟合其他数据或可靠地预测未来的观察结果”

避免过度拟合和欠拟合->适度拟合

训练集误差 验证集误差,如果训练集误差很小,验证集较大,则称存在高方差;如果误差都比较大,称为欠拟合,高偏差;如果训练集误差比较大,训练集更大,则称存在高偏差和高方差

最优误差也称为贝叶斯误差,训练集误差的大小是通过和最优误差进行比较后判断的,比如若用户上传的图片本身就很模糊,即使人眼也很难一眼识别,这种的基本误差就大,

欠拟合会出现高偏差 局部过度拟合出现高方差和高偏差,因为他几乎是一条线性分类器并未拟合数据

机器学习基础

高偏差:选择更优算法或神经网络

高方差:扩充数据集、正则化、或者其他模型结构来解决高方差

最终目的:低偏差,低方差

正则化:训练一个更大的网络几乎没有任何负面影响,而训练一个大型神经网络的主要代价也只是计算时间

正则化

正则化:针对过度拟合

L2正则化(最常见):正则化其实是限制了W数据本身,使得最后分类的曲线不要太奇形怪状,就能抑制过拟合

如果λ太大,也可能会“过度平滑”,从而导致模型高偏差

image-20230707110026468

L1正则化:W会比较稀疏,也就是说W向量中有很多0

image-20230707110251006

L1正则化W更稀疏原因:

  • L1和L2正则常被用来解决过拟合问题。而L1正则也常被用来进行特征选择,主要原因在于L1正则化会使得较多的参数为0,从而产生稀疏解,将0对应的特征遗弃,进而用来选择特征。

    但为什么L1正则会产生稀疏解呢?这里利用公式进行解释。

    假设只有一个参数为 w,损失函数为L(w),分别加上L1正则项和L2正则项后有:

    假设L(w)在0处的倒数为 d0 ,即

    img

    则可以推导使用L1正则和L2正则时的导数

    引入L2正则项,在 0 处的导数

    img

    引入L1正则项,在0处的导数

    img

    可见,引入L2正则时,代价函数在 0 处的导数仍是 d0 ,无变化。而引入L1正则后,代价函数在0处的导数有一个突变。从 d0 + λ 到 d0 − λ ,若 d0 + λ 和 d0 − λ 异号,则在 0 处会是一个极小值点。因此,优化时,很可能优化到该极小值点上,即 w = 0 处。

    这里只解释了有一个参数的情况,如果有更多的参数,也是类似的。因此,用L1正则更容易产生稀疏解。

这里的入是正则化参数

对于多层神经网络:相当于在原来的W=W-α * dW的基础上再减 λ/m * W,

image-20230707113908610

为什么正则化有利于预防过拟合呢

如果入足够大,W就越接近于0,当正则化参数足够大,W会变小,Z会变小

如果不用正则化,则成本函数根据次数迭代可能就不是单调递减的

Dropout正则化

dropout会遍历网络的每一层,并设置消除神经网络中结点的概率

比如每一层的每个节点得以保留和消除的概率都是0.5,然后删除一些节点并删除相应的连线,对于每一个训练样本,都将采取一个精简后的神经网络来训练它

image-20230707133559373

最常用的Dropout正则化方法:inverted dropout(反向随机失活)(以三层神经网络为例):

  • 首先定义变量d,d3表示一个三层的dropout变量 d3=np.random.randn(a3.shape[0],a3.shape[1])<keep-prob(keepprob表示一个具体的数字,eg:0.8,表示保留某个隐藏单元的概率,它的作用是生成随机矩阵)
  • d3中的对应值为1的概率是0.8,为0的概率是0.2 keep_prob被广播了,和前面的随机矩阵的每个元素比较,比它小的是0,比它的大的是1,所以d3就是个一堆0和1的矩阵 就有a3=np.multiply(a3,d3),作用是过滤掉a3中d3对应位置为0的元素,然后向外扩展a3,a3/=keepprob(解释:假设第三隐层有50个单元,a3就是一个50 * m的矩阵,假设keep-prob=0.8,则最后被删除或者归零的元素有10个,z[4]=W[4] * a[3]+b[4],为了使a[3]的改变最小程度的影响到z[4],所以将a3/=keep-prob,使a[3]的期望不变)
  • 同时不难发现对于不同的样本,归零的神经单元也不同,如果使用相同训练集多次传递数据,每次训练的梯度也不同

在测试阶段不使用Dropout,因为在测试阶段进行测试时我们不希望输出结果是随机的,因为在训练的时候已经考虑了期望的问题,即使测试集不用dropout也没有问题

dropout

仿佛采用一个更小的神经网络和使用dropout正则化效果是一样的

对于使用dropout正则化的神经网络,如果上一层使用了dropout正则化,则下一层的单元不能依靠任何特征,因为任何特征都有可能被删除,我们不愿意把所有赌注放在一个节点上,不想下一层的输出依靠于上一层的每个特征,因此该单元将通过这种方式积极的传播开,通过传播所有权重,dropout将产生收缩权重的平方范数的效果,L2对不同权重的衰减是不同的取决于倍增的激活函数的大小,dropout和L2正则化的功能是类似的

  • dropout和L2正则化的功能是类似的,因为它们都可以防止神经网络过拟合,提高泛化能力。过拟合的原因是模型太复杂,参数太多,训练数据太少或有噪声,导致模型对训练数据过度拟合,而不能适应新的数据
  • dropout的方法是在训练过程中随机地“删除”一部分隐藏层节点,使得每次训练的网络结构不同,相当于训练了很多个子网络,最后再将它们组合起来。这样可以减少隐藏层节点之间的相互依赖,增加网络的多样性和鲁棒性。
  • L2正则化的方法是在代价函数中加入一个正则项,对所有参数w的平方求和,乘以一个正则化系数λ。这样可以使得参数w的值更小,从而降低模型的复杂度和方差。L2正则化也可以理解为对模型参数进行了一个高斯先验假设,使得参数更加平滑和稳定。dropout和L2正则化都有利于减少模型的自由度,防止模型过度拟合训练数据,提高模型在测试数据上的表现。它们也可以结合使用,根据实验结果选择合适的参数。

首先选择keep-prob,不同层的keep-prob可以不一样,对于一些担心过度拟合的层,keep-prob可以低一点

实施dropout在计算机视觉领域很成功,因为计算机视觉的输入量非常大

dropout的一大缺点是代价函数J不再被明确定义,因为每次迭代都会随机移除一些节点 正则化对策出现的原因就是我们无法准确给出某一问题模型的具体网络尺寸,只能通过尝试简化模型,通常先通过将所有的dropout设置为1,再绘制J的图形,再恢复dropout,这时候就没办法绘制J的图形

其他正则化方法

  1. 直接增加训练集的数目代价太大了,可以选择通过将训练集的图片进行翻转,标签不变,也可以随机裁剪图片

  2. early stopping

    不仅绘制训练集的J函数图像,也绘制验证集的J的图像,验证集的代价函数通常先下降,然后在某个点回升,就相当于,在验证集的代价函数达到极小值的时候,停止迭代,因为在迭代过程中W会不断增大,通过这种方式可以避免W的过度增大

    可以看成之前的曲线,W刚开始时很小,对应的J很大,到了中间某个值的时候最优,J最小,W再大,J就会变大,前面的课有一个凸函数曲线

    缺点:提前结束可以防止过度拟合,也就是高方差的问题,但是有可能会出现偏差,因为J并不小,对J的优化可能不够

归一化输入

归一化输入可以加快训练方法

归一化输入有两个步骤:

第一步是零均值化:

image-20230707214829466

第二步是归一化方差:

比如上图中X1的方差比X2大:

image-20230707215217361

如果选好了参数进行训练集归一化,那么测试集要用相同的参数

就不再计算如果使用非归一化,代价函数不直观:

image-20230707231953543

标准化:

image-20230707232321944

如果不归一化学习率很小,因为W可变范围不大

因此如果输入特征的范围值差别太大,比如有些是0-1,有些是1-1000,就需要归一化,如果相近就不需要归一化

梯度消失和梯度爆炸

导数和梯度有可能非常小或者非常大,这加大了训练的难度

W>1时,成本函数指数增长 W<0时成本函数指数降低

image-20230707233203258

抛出两个梯度下降中的两个存在性问题 在多层隐藏层的情况下 W>1 可能会造成梯度爆炸,W<1 可能会造成梯度消失的情况

神经网络的权重初始化

假设一层神经网络 a=g(z) z=W * X + b=w1 * x1 + w2 * x2 + w3 * x3 + ……,如果n越大,也就是X的特征值越多,就希望wi的值小,不然得出的z就会很大,最合理的方式是wi的方差为1/n

我们从一个正态分布(均值为零,单位标准差)中抽取随机值,然后乘以一个小数字,比如0.01。结果将是一个标准差接近0.01的权重集。如果是ReLU函数,令方差是2/n,因为ReLu在z<0段导数和值都为0,注意,这里的np.sqrt是开方的意思 W要乘以1/n的原因

image-20230708134430767

梯度的数值逼近

使用双边误差的方法更接近导数

image-20230708134824440

使用双边误差来判断导数是否正确实现了函数f的偏导,可以用这个方法来检验反向传播函数是否正确进行

梯度检验

梯度检验(Grad check)可以检验反向传播的过程是否有误

第一步:将所有参数转换成一个巨大的向量数据

image-20230708140048097

就是之前求梯度是通过推出的公式,这里求梯度是通过邻近两个割点求近似值,如果这两个梯度值差不多的话,那么就说明我们之前做的是对的

检查你在反向传播阶段做求偏导运算时有没有算错

差值(这里的2是指ord为2的范数,即除以):

image-20230708154400361

关于梯度检验实现的注记

首先不要在训练中使用梯度检验,他只用于调试

梯度检验和dropout不能同时使用,除非将keep-prob设置为1

Author

yyyyyyxnp

Posted on

2023-07-19

Updated on

2024-09-29

Licensed under

You need to set install_url to use ShareThis. Please set it in _config.yml.
You forgot to set the business or currency_code for Paypal. Please set it in _config.yml.

Comments

You forgot to set the shortname for Disqus. Please set it in _config.yml.