改善深度神经网络:超参数调试(一) 深度学习实践层面
本文最后更新于 103 天前,其中的信息可能已经有所发展或是发生改变。

深度学习实践层面

1.1 训练集、验证集、测试集

深度学习是一个典型的迭代过程,需要进行多次循环往复,得到自己称心如意的神经网络。因此,循环过程的效率是决定项目推进速度的关键因素,而创建高质量的训练、验证和测试集有助于提高循环过程的效率。

通常,将训练数据分为三部分,一部分作为训练集,一部分作为简单交叉验证集,最后一部分作为测试集。接下来对模型进行训练,通过验证集选择最好的模型,经过充分验证,得到了最终模型,然后就可以在测试集上进行了评估,为了无偏估计算法的运行状况。

1、在小数据集时代,即数据在100,1000,10000这个量级,常见的做法是“三七分”,即70%的数据作为验证集,30%测试集。如果没有明确设置验证集,也可以按照60%训练集,20%验证集,20%测试集来进行划分,这是前几年机器学习领域公认的最好的数据划分方法。

image-20230709172256728

2、在大数据时代,我们获取的数据在百万级别,验证集和测试集占的比例就会相应的减少。验证集的作用是检验不同的算法,验证哪个算法最有效,因此需要足够大才能对算法进行评估,而在大数据时代,数据集的1%就可能有上万组数据,足以验证不同的算法,因此,我们不可能拿出20%的数据来作为验证集。

因此,在数据足够多的情况,例如有100w组数据,其中1w组,即作为验证集,1w组作为测试集,98w组作为训练集,测试集和验证集各占1%,训练集占98%。在数据更大的情况中,训练集可以达到99.5%,验证和测试集各占0.25%,或者验证0.4%,测试集0.1%。

image-20230709173016052

现代深度学习的另一个趋势是训练和测试集不匹配的情况下进行训练,训练的数据可能是在网上爬取的,而进行验证和测试的数据是网友上传的,这两种数据有所不同,来自于不同的分布。根据经验,为了更好的提高训练性能,要保证验证集和测试集来自于同一个分布。

1.2 方差、偏差(Variance,Bias)

image-20230709173844698

假设这就是数据集,假设将这个数据集拟合为一条直线,这就是逻辑回归拟合,但它并不能很好的你和数据,存在高偏差(high bias)的现象,我们称之为欠拟合(underfitting)

相反,我们设置一个非常复杂的分类器,比如深度神经网络,可能非常适合这个数据集,但是可能不是一个好的拟合方式,存在高方差(high variance)的现象,称之为过拟合(overfitting)

在两者之间,可能存在一个复杂程度适中,对数据集拟合适度的分类器,我们称之为适度拟合(just right)

image-20230709173638109

两个特征的二维数据集中,我们可以绘制数据,将偏差和方差可视化。在多维空间数据中,绘制数据和可视化分割边界无法实现,但我们可以通过几个指标来研究偏差和方差。

理解偏差和方差的两个关键数据是训练集误差(Train set error)验证集误差(Dev set error)。通过分析在训练集上训练算法产生的误差和验证集上验证算法 产生的误差来诊断算法是否存在高偏差和高方差

image-20230709175312935

  1. 假定训练集误差是 1%,为了方便论证,假定验证集误差是 11%,可以看出训练集设置得非常好,而验证集设置相对较差,我们可能过度拟合了训练集,在某种程度上,验证集并没有充分利用交叉验证集的作用,像这种情况,我们称之为“高方差”
  2. 假设训练集误差是 15%,验证集误差是 16%。算法并没有在训练集中得到很好训练,如果训练数据的拟合度不高,就是数据欠拟合,就可以说这种算法偏差比较高。 相反,它对于验证集产生的结果却是合理的,验证集中的错误率只比训练集的多了 1%,所 以这种算法偏差高,因为它甚至不能拟合训练集
  3. 训练集误差是 15%,偏差相当高,但是,验证集的评估结果更糟糕,错误率达到 30%,在这种情况下,我会认为这种算法偏差高,因为它在训练集上结果不理想, 而且方差也很高,这是方差偏差都很糟糕的情况
  4. 训练集误差是 0.5%,验证集误差是 1%,偏差和方差都很低

1.3 机器学习基础

初始模型训练完成后,试着评估训练集或训练数据的性能,如果偏差较高,甚至无法拟合训练集,那么你要做的就是选择一个新的网络,比如含有更多隐藏层或者隐藏单元的网络,或者花费更多时间来训练网络,或者尝试更先进的优化算法。

一旦偏差降低到可以接受的数值,检查一下方差有没有问题,为了评估方差,我们要查看验证集性能,我们能从一个性能理想的训练集推断出验证集的性能是否也理想,如果方差高,最好的解决办法就是采用更多数据,我们也可以尝试通过正则化来减少过拟合。

总之就是不断 重复尝试,直到找到一个低偏差,低方差的框架,这时你就成功了。

1.4 L2正则化

深度学习可能存在过拟合问题——高方差,有两个解决方法,一个是正则化,另一个是准备更多的数据,这是非常可靠的方法,但你可能无法时时刻刻准备足够多的训练数据或者获取更多数据的成本很高,但正则化通常有助于避免过拟合或减少你的网络误差。

神经网络模型中通常使用L2正则化损失函数进行修正,给损失函数加上正则项。

image-20230709180748111

image-20230709181437852

image-20230709181531720

其中$\lambda$是正则化参数,正则项代表了利用权重计算的过程。L2正则损失部分是神经网络中每一层的权重矩阵$W$的Frobenius范数的平方和。

对于正向传播而言,只需要考虑对损失函数进行正则化计算。对于反向传播还需要考虑梯度计算时多出来的正则项,必须针对新损失函数计算所有梯度。

image-20230709181258182

image-20230709181711583

因此梯度下降方向变为:

image-20230709181828739

该正则项说明,不论$𝑊^{[𝑙]}$是什么,我们都试图让它变得更小,实际上,相当于我们给矩阵$ W $乘以$(1-a𝜆/𝑚)$倍的权重,矩阵$𝑊$减去$𝛼𝜆/𝑚$倍的它,也就是用这个系数$(1-a𝜆/𝑚)$乘以矩阵$ 𝑊$,相对于一般的梯度下降,$ 𝑊$被更新为少了$a$乘以 backprop 输出的最初梯度值,同时$𝑊$也乘以了这个系数,这个系数小于 1,因此$𝐿2正则化$也被称为“权重衰减”

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

直观上理解就是如果正则化$𝜆$设置得足够大,权重矩阵$𝑊$被设置为接近于 0 的值,直观理解就是把多隐藏单元的权重设为 0,于是基本上消除了这些隐藏单元的许多影响。如果是 这种情况,这个被大大简化了的神经网络会变成一个很小的网络,小到如同一个逻辑回归单 元,可是深度却很大,它会使这个网络从过度拟合的状态向的高偏差状态转移。

但是$𝜆$会存在一个中间值,于是会有一个接近“Just Right”的中间状态。

1.5 Dropout正则化

Dropout提供了正则化一大类模型的方法,计算方便但功能强大。简单来说Dropout可以理解为在概率意义上随机删除神经网络中的节点,以此简化神经网络模型来防止过拟合的一种正则化方法,下图说明了Dropout的处理过程。

在这里插入图片描述

Dropout会在每次迭代中随机关闭一些神经元,其中涉及到正则化参数keep-prob,keep-prob是一个随机数,在正向传播时,我们给每一个神经元赋予一个概率,通过比较keep-prob与神经元的随机概率大小来给出决策。当该概率小于keep-prob时,我们关闭该神经元。做法是通过应用掩码来关闭正向传播过程中的某些神经元。对于反向传播,将用相同的掩码重新来关闭相同的神经元,进而进行导数的计算。

计算视觉中的输入量非常大,输入太多像素,以至于没有足够的数据,所以 dropout 在计算机视觉中应用得比较频繁,它在其它领域应用得比较少。

1.6 其他正则化方法

数据扩增

假设我们的数据集是图片,那对图片进行旋转、裁剪等可以达到数据扩增的目的。

img

early stopping

过拟合一定程度上是由于训练过度导致的,为了防止过拟合带了的高方差,把方差和损失函数作为训练结束的评判标准可以一定程度上减少过拟合。

image-20230709184153827

1.7 归一化输入

训练神经网络,其中一个加速训练的方法就是归一化输入。

归一化需要两个步骤:

(1)零均值$\mu$

(2)归一化方差$σ^2$

image-20230709184604962

第一步是零均值化

image-20230709184918199

它是一个向量,$𝑥$等于每个训练数据 $𝑥$减去$𝜇$,意思是移动训练集,直到它完成零均值化。

第二步是归一化方差,我们要做的是给𝜎 赋值

image-20230709185021292

这是节点𝑦 的平方,$𝜎^2$是一个向量,它的每个特征都有方差,注意,我们已经完成零值均化,$(𝑥^{(𝑖)} )^2$元素$𝑦^2$就是方差,我们把所有数据除以向量$𝜎^2$,最后变成上图形式。

实际上如果假设特征𝑥1范围在 0-1 之间,𝑥2的范围在-1 到 1 之间,𝑥3范围在 1-2 之间, 它们是相似范围,所以会表现得很好。 当它们在非常不同的取值范围内,如其中一个从 1 到 1000,另一个从 0 到 1,这对优化算法非常不利。但是仅将它们设置为均化零值,假设方差为 1,确保所有特征都在相似范围内,通常可以帮助学习算法运行得更快

1.8 梯度消失和梯度爆炸

目前深度学习方法中,深度神经网络的发展造就了我们可以构建更深层的网络完成更复杂的任务,深层网络比如深度卷积网络,LSTM等等,而且最终结果表明,在处理复杂任务上,深度网络比浅层的网络具有更好的效果。但是,目前优化神经网络的方法都是基于反向传播的思想,即根据损失函数计算的误差通过梯度反向传播的方式,指导深度网络权值的更新优化。这样做是有一定原因的,首先,深层网络由许多非线性层堆叠而来,每一层非线性层都可以视为是一个非线性函数$F(x)$ (非线性来自于非线性激活函数),因此整个深度网络可以视为是一个复合的非线性多元函数。

image-20230709185830791

图中是一个四层的全连接网络,假设每一层网络激活后的输出为$fi(x)$ ,其中$i$为第$i$层,$ x$代表第$i$层的输入,也就是第$i-1$层的输出,$f$是激活函数,那么,得出$f{i+1}= f(f_i w_i+1+bi +1)$,简单记为$f{i+1} = f(f w_i+ 1)$。

BP算法基于梯度下降策略,以目标的负梯度方向对参数进行调整,参数的更新为$w=w-\alpha dw$ ,如果要更新第二隐藏层的权值信息,根据链式求导法则,更新梯度信息:

image-20230709190653070

所以说,$ \frac{ \partial f_4 }{ \partial f_3 }$就是对激活函数进行求导,如果此部分大于1,那么层数增多的时候,最终的求出的梯度更新将以指数形式增加,即发生梯度爆炸,如果此部分小于1,那么随着层数增多,求出的梯度更新信息将会以指数形式衰减,即发生了梯度消失。从而导致训练难度上升,尤其是梯度指数小于$𝐿$时,梯 度下降算法的步长会非常非常小,梯度下降算法将花费很长时间来学习。

1.9 神经网络的权重初始化

1.10 梯度逼近

1.11 梯度检验

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇