第二课:改进神经网络:超参数调整、正则化和优化

目录

0 完整章节内容:

1 优质笔记:

2 重点:

2.1 随着数据规模的增长,数据集三拆分的比例该如何变化?

2.2 数据集最好要来自同一分布。

2.3 判断偏差和方差的高低要和哪个指标进行比较?

2.4 偏差与方差角度着手——优化模型性能的基本流程

2.5 为什么压缩L2范数,或者弗罗贝尼乌斯范数或者参数可以减少过拟合?

2.6 dropout正则化最常用的方法——Inverted Dropout(反向随机失活) 

2.7 Dropout可以随机删除网络中的神经单元,他为什么可以通过正则化发挥如此大的作用呢? 

2.8 实施dropout的另一个细节

2.9 其他正则化方法 —— 数据扩增与 Early Stopping 

2.10 如何归一化输入?

2.11 为何要进行归一化输入?

2.12 梯度消失与梯度爆炸。

2.13 神经网络的权重如何初始化?为何合理的初始化可以缓解梯度消失或梯度爆炸?

2.14 梯度的数值逼近(Numerical Approximation of Gradients)

2.15 梯度检验(Gradient Checking)

2.16 梯度检验应用的注意事项(Gradient Checking Implementation Notes)

2.17 什么时候使用batch梯度下降?什么时候使用mini-batch梯度下降?

2.18 什么是指数加权平均数(Exponentially Weighted Averages)?

2.19 如何理解指数加权平均的偏差修正(Bias Correction)?

2.20 动量梯度下降法(Gradient Descent with Momentum).

2.21 RMSprop

2.22 Adam 优化算法(Adam optimization algorithm)

2.23 学习率衰减(Learning rate decay) 

2.24 局部最优与鞍点.

2.25 识别重要的参数。

2.26 超参数寻优方法.

2.27 在搜索超参数时,要选择合适的标尺进行取值。

2.28 两种超参数搜索策略.

2.29 Batch Normalization(BN)详解

2.30 Batch Normalization为什么会起作用? 

2.31 Softmax

3 补充知识点:

3.1 为什么人们在训练网络时,越来越倾向于使用L2正则化?

3.2 L2正则化和dropout在输入、效果等因素方面

3.3 为什么随机初始化时权重随机到非常大的值模型工作的会非常不好? 

3.4 常见的深度学习框架

4 实战演练:

4.1 第二课——Week5:

4.2 第二课——Week6:

4.3 第二课——Week7:


0 完整章节内容:

深度学习入门指南——2021吴恩达学习笔记deeplearning.ai《深度学习专项课程》篇

1 优质笔记:

第一周:深度学习的实践层面(Practical aspects of Deep Learning)

第二周:优化算法 (Optimization algorithms)

第三周 超参数调试、Batch正则化和程序框架(Hyperparameter tuning)

2 重点:

2.1 随着数据规模的增长,数据集三拆分的比例该如何变化?

在机器学习发展的小数据量时代,常见做法是将所有数据三七分,就是人们常说的70%验证集,30%测试集,如果没有明确设置验证集,也可以按照60%训练,20%验证和20%测试集来划分。

数据集规模较大的,假设我们有100万条数据,其中1万条作为验证集,1万条作为测试集,100万里取1万,比例是1%,即:训练集占98%,验证集和测试集各占1%。对于数据量过百万的应用,训练集可以占到99.5%,验证和测试集各占0.25%,或者验证集占0.4%,测试集占0.1%。

2.2 数据集最好要来自同一分布。

假设你要构建一个用户可以上传大量图片的应用程序,目的是找出并呈现所有猫咪图片,可能你的用户都是爱猫人士,训练集可能是从网上下载的猫咪图片,而验证集和测试集是用户在这个应用上上传的猫的图片,就是说,训练集可能是从网络上抓下来的图片。而验证集和测试集是用户上传的图片。结果许多网页上的猫咪图片分辨率很高,很专业,后期制作精良,而用户上传的照片可能是用手机随意拍摄的,像素低,比较模糊,这两类数据有所不同,针对这种情况,根据经验,我建议大家要确保验证集和测试集的数据来自同一分布。 

2.3 判断偏差和方差的高低要和哪个指标进行比较?

最优误差(也即贝叶斯误差)

偏差、方差高低的分析都是基于假设预测的,假设人眼辨别的错误率接近0%,一般来说,最优误差也被称为贝叶斯误差,所以,最优误差接近0%,我就不在这里细讲了,如果最优误差或贝叶斯误差非常高,比如15%。我们再看看这个分类器(训练误差15%,验证误差16%),15%的错误率对训练集来说也是非常合理的,偏差不高,方差也非常低。 

2.4 偏差与方差角度着手——优化模型性能的基本流程

  • 步骤1:初始训练模型,评估训练误差和验证误差,判断是偏差问题还是方差问题。
  • 步骤2:根据诊断结果,选择适合的方法来优化模型:
    • 偏差较高:增加模型复杂度、延长训练时间、优化学习率等。
    • 方差较高:增加数据量、应用正则化、使用Dropout、早停等。
  • 步骤3:重复尝试,不断调整和优化,直到找到一个低偏差、低方差的模型框架。

在深度学习和大数据时代,通过构建更大的模型和使用更多数据,偏差与方差的权衡变得不再明显。(也即采用如下手段减小一方通常不会导致另一方的增大)

  1. 增加模型的复杂度(更大的网络)通常能够在不显著增加方差的情况下减少偏差。
  2. 使用更多数据可以在不增加偏差的情况下减少方差。 

2.5 为什么压缩L2范数,或者弗罗贝尼乌斯范数或者参数可以减少过拟合?

直观理解: 

我们尝试消除或至少减少许多隐藏单元的影响,最终这个网络会变得更简单,这个神经网络越来越接近逻辑回归,我们直觉上认为大量隐藏单元被完全消除了,其实不然,实际上是该神经网络的所有隐藏单元依然存在,但是它们的影响变得更小了。神经网络变得更简单了,貌似这样更不容易发生过拟合,但我并不确定这个直觉经验是否有用,不过在编程中执行正则化时,你实际看到一些方差减少的结果。

正则化的参与——逐渐逻辑回归化

另一个例子,假设我们用的是这样的双曲线激活函数。

这里我们利用了双曲正切函数的线性状态,我们发现,只要z非常小,激活函数就较为线性;然而z扩展为更大值或者更小值,激活函数开始变得非线性。

总结一下,如果正则化参数变得很大,参数W很小,z也会相对变小,此时忽略的影响,会相对变小,实际上,z的取值范围很小,这个激活函数,也就是曲线函数tahn会相对呈线性,整个神经网络会计算离线性函数近的值,这个线性函数非常简单,并不是一个极复杂的高度非线性函数,不会发生过拟合。

2.6 dropout正则化最常用的方法——Inverted Dropout(反向随机失活) 

drop正则化原理

那么为什么要除以p呢?

首先我们要明确一点,Dropout 是一种在训练阶段用于减少过拟合的正则化方法。在测试阶段,我们需要对输入数据进行稳定且确定的预测,因此并不适用Dropout技术。如果在测试阶段继续使用 Dropout,模型每次的预测结果可能会不同,因为不同的神经元会被随机失活。这种随机性会导致预测结果不一致,不利于模型评估和实际应用。

训练时使用Dropout,保留的神经元数量减少了,因此整个层的输出也会变小,平均激活值会降低。但由于测试时我们使用的是完整的网络,两者激活值的期望并不相同,从而影响模型的性能。

解决方法:除以 p

接下来我们还会产生新的疑问——训练阶段使用 Dropout,测试阶段使用完整网络,为什么能有效? 

其实这是因为等效于对多个子网络的集成

  • 训练阶段,使用 Dropout 的网络可以看作是在训练许多不同的子网络,这些子网络共享权重。这样训练过程中产生了大量不同的网络,每个网络都在不同的输入样本上做了更新。
  • 测试阶段使用完整的网络时,相当于对训练阶段产生的多个子网络的“集成”。研究表明,这种方式能显著提高模型的泛化能力。

2.7 Dropout可以随机删除网络中的神经单元,他为什么可以通过正则化发挥如此大的作用呢? 

直观上理解:

不要依赖于任何一个特征,因为该单元的输入可能随时被清除,通过兼顾所有参数的权重,dropout将产生收缩权重的平方范数的效果,和之前讲的正则化类似。

我们从单个神经元入手,如图,这个单元的工作就是输入并生成一些有意义的输出。通过dropout,该单元的输入几乎被消除,有时这两个单元会被删除,有时会删除其它单元,就是说,我用紫色圈起来的这个单元,它不能依靠任何特征,因为特征都有可能被随机清除,或者说该单元的输入也都可能被随机清除。我不愿意把所有赌注都放在一个节点上,不愿意给任何一个输入加上太多权重,因为它可能会被删除,因此该单元将通过这种方式积极地传播开,并为单元的四个输入增加一点权重,通过传播所有权重,dropout将产生收缩权重的平方范数的效果,和我们之前讲过的L2正则化类似.

2.8 实施dropout的另一个细节

不同规模的权重矩阵keep-prob也可以因地制宜,一般而言规模越大keep-prob值越小。

2.9 其他正则化方法 —— 数据扩增与 Early Stopping 

1. 数据扩增(Data Augmentation)

概念

  • 数据扩增是一种通过对现有训练数据进行变换,生成新的样本的方法,常用于图像、文本等领域。
  • 通过数据扩增,可以有效增加训练集的样本数量,从而减少模型的过拟合。
  • 例如对于光学字符识别,我们还可以通过添加数字,随意旋转或扭曲数字来扩增数据,把这些数字添加到训练集,它们仍然是数字。

常见的图像数据扩增方法

  • 水平翻转:将图片进行水平翻转,保留原图与翻转后的图作为训练样本。
  • 随机裁剪:对图像进行随机裁剪,获取不同的子图。
  • 旋转与缩放:对图像进行轻微的旋转或缩放,保持图像的主要特征不变。
  • 颜色扰动:调整图像的亮度、对比度等参数,增加样本的多样性。

优点

  • 增加数据量:在不采集新数据的情况下,扩充训练数据量,增强模型的泛化能力。
  • 廉价易实现:不需要额外的采集成本,代价较低。
  • 提高鲁棒性:通过增加样本的多样性,提升模型在不同输入上的表现。

缺点

  • 冗余信息:人工合成的样本不能完全替代真实数据,可能存在一定的冗余。
  • 增加训练时间:扩充数据会导致训练时间增加。

2. Early Stopping(提前停止训练)

概念

  • Early Stopping 是在训练过程中,根据验证集的误差来决定何时停止训练的一种方法。
  • 在训练早期,模型的误差会下降,但如果继续训练,模型可能会开始过拟合,验证集误差会上升。此时可以通过提前停止训练,避免模型过拟合。

工作原理

  • 在训练时,持续监控验证集上的误差。当验证误差不再下降(甚至上升)时,停止训练,选取误差最低时对应的模型参数作为最终模型。

优点

  • 避免过拟合:通过在最佳验证误差处停止训练,防止模型进一步过拟合。
  • 节省时间:减少不必要的训练时间,在验证集误差开始上升时就停止训练。

缺点

  • 与代价函数优化冲突:提早停止意味着训练代价函数可能没有完全最小化,与优化目标有一定冲突。
  • 调参复杂模型优化与正则化问题无法独立分离,增加了调参的难度。

3. 总结

吴恩达老师个人更倾向于使用L2正则化,即使要承担大量计算的代价。

2.10 如何归一化输入?

训练神经网络,其中一个加速训练的方法就是归一化输入。假设一个训练集有两个特征,输入特征为2维,归一化需要两个步骤:

  1. 零均值

  2. 归一化方差;

我们希望无论是训练集和测试集都是通过相同的\mu\sigma ^{2}定义的数据转换,这两个是由训练集得出来的。

2.11 为何要进行归一化输入?

如果你使用非归一化的输入特征,代价函数会像这样:

这是一个非常细长狭窄的代价函数,你要找的最小值应该在这里。但如果特征值在不同范围,假如x1取值范围从1到1000,特征x2的取值范围从0到1,结果是参数w1和w2值的范围或比率将会非常不同,这些数据轴应该是w1和w2,但直观理解,我标记为w和b,代价函数就有点像狭长的碗一样,如果你能画出该函数的部分轮廓,它会是这样一个狭长的函数。 

然而如果你归一化特征,代价函数平均起来看更对称,如果你在上图这样的代价函数上运行梯度下降法,你必须使用一个非常小的学习率。因为如果是在这个位置,梯度下降法可能需要多次迭代过程,直到最后找到最小值。但如果函数是一个更圆的球形轮廓,那么不论从哪个位置开始,梯度下降法都能够更直接地找到最小值,你可以在梯度下降法中使用较大步长,而不需要像在左图中那样反复执行。

执行这类归一化并不会产生什么危害,吴恩达老师通常会做归一化处理,虽然他不确定它能否提高训练或算法速度。 

2.12 梯度消失与梯度爆炸。

概念:

当神经网络层数较多时,前向传播和反向传播过程中,梯度会不断累乘各层的权重。在这个过程中,如果权重的初始化选择不当,梯度值可能会出现以下两种情况:

  • 梯度爆炸:权重值较大时,梯度在层层累乘后呈指数级增长,导致梯度爆炸,使得权重更新过大,模型不稳定,甚至可能无法训练。
  • 梯度消失:权重值较小时,梯度在层层累乘后呈指数级减小,导致梯度消失,使得更新步长极小,模型训练进展缓慢。

梯度消失与梯度爆炸的影响

  • 梯度消失
    • 更新时梯度变得非常小,参数更新缓慢,训练停滞。
    • 神经网络的前几层(靠近输入层)无法有效训练,模型性能差。
  • 梯度爆炸
    • 更新时梯度过大,参数更新过快,权重值变得非常大,导致训练过程中的损失函数振荡甚至溢出。
    • 模型训练不稳定,可能出现 NaN(非数值)错误。

2.13 神经网络的权重如何初始化?为何合理的初始化可以缓解梯度消失或梯度爆炸?

  • Xavier 初始化通过调节权重的方差,使得每层的输入和输出方差保持一致,防止梯度在反向传播过程中变得过小或过大。 
  • 由于 ReLU 激活函数在负值区域的导数为0,因此为了避免 ReLU 死亡(即激活值为0),需要选择较大的方差,使得激活值的方差维持在合理范围。He 初始化比 Xavier 初始化更适合 ReLU,因为它考虑到了 ReLU 激活函数的特性。

注:橙色部分为“为何合理的初始化可以缓解梯度消失或梯度爆炸?”的原因

2.14 梯度的数值逼近(Numerical Approximation of Gradients)

在反向传播(backpropagation)中,梯度检验用于确保反向传播实现的正确性。尽管你可以写出梯度方程,但无法100%确定细节完全正确。因此,使用数值逼近的方法来进行梯度的验证很重要。

数值逼近的方式可以通过使用较小的增量(ε)来估算梯度。传统的方法使用单边公差,而使用双边公差则可以提供更精确的结果。在双边公差方法中,通过考虑增量的两侧而不是单侧,可以更准确地接近梯度的真实值。

数学上,双边误差方法的计算公式如下:

这种方法比单边误差方法更精确,误差趋近于0,特别适合在进行梯度检验时应用。

2.15 梯度检验(Gradient Checking)

梯度检验是一种有效的工具,用于调试神经网络中的反向传播过程。其基本步骤是将所有模型参数展开为一个大的向量,再计算相应的代价函数的梯度,并与数值逼近的梯度进行比较。如果两者误差非常小,则说明反向传播的实现是正确的。

具体来说,梯度检验通过以下步骤进行:

  1. 将所有参数从矩阵转化为向量。
  2. 使用数值逼近计算梯度。
  3. 比较计算出的梯度与反向传播得到的梯度,查看误差。

通过计算梯度的欧几里得范数(L2范数),我们可以判断两个向量是否接近。理想情况下,误差应该非常小(小于1e-5),如果误差较大,就需要检查是否存在反向传播的实现问题。

2.16 梯度检验应用的注意事项(Gradient Checking Implementation Notes)

在实际应用中,梯度检验有一些注意事项:

  1. 不要在训练中使用梯度检验:梯度检验计算耗时较长,只应在调试阶段使用。训练时应该关闭梯度检验,以免影响训练速度。
  2. 检查失败时的调试:如果梯度检验失败,应仔细检查每个参数,找出与目标梯度差距较大的项,进而定位可能的错误。
  3. 考虑正则化项:在使用正则化时,代价函数中应包括正则化项,并确保梯度计算正确。
  4. 避免与dropout同时使用:因为dropout会随机消除部分神经元,每次训练的结果不同,无法有效计算梯度。建议先关闭dropout,确保反向传播和梯度检验正确,再开启dropout。
  5. 当参数接近0时进行检查:在网络初始化时,参数接近0可能使得梯度检验结果正确,但随着训练的进行,参数会逐渐变大,此时可能需要重新检查。

2.17 什么时候使用batch梯度下降?什么时候使用mini-batch梯度下降?

首先,如果训练集较小,直接使用batch梯度下降法,样本集较小就没必要使用mini-batch梯度下降法,你可以快速处理整个训练集,所以使用batch梯度下降法也很好,这里的少是说小于2000个样本,这样比较适合使用batch梯度下降法。不然,样本数目较大的话,一般的mini-batch大小为64到512,考虑到电脑内存设置和使用的方式,如果mini-batch大小是2的n次方,代码会运行地快一些,64就是2的6次方,以此类推,128是2的7次方,256是2的8次方,512是2的9次方。所以我经常把mini-batch大小设成2的次方。在上一个视频里,我的mini-batch大小设为了1000,建议你可以试一下1024,也就是2的10次方。也有mini-batch的大小为1024,不过比较少见,64到512的mini-batch比较常见。

2.18 什么是指数加权平均数(Exponentially Weighted Averages)?

概述: 指数加权平均数是一种平滑数据的技术,用于减少噪声并捕捉趋势。它是一种计算局部平均值的算法,在深度学习优化中应用广泛,比如在动量梯度下降法中。

如何理解其含义呢?

2.19 如何理解指数加权平均的偏差修正(Bias Correction)?

你学过了如何计算指数加权平均数,有一个技术名词叫做偏差修正,可以让平均数运算更加准确,来看看它是怎么运行的。 

2.20 动量梯度下降法(Gradient Descent with Momentum).

在梯度下降法中,由于代价函数在不同维度上的曲率不同(收输入值x的影响),因此参数更新的幅度也不尽相同。

例如,如果你要优化成本函数,函数形状如图,红点代表最小值的位置,假设你从这里(蓝色点)开始梯度下降法,如果进行梯度下降法的一次迭代,无论是batchmini-batch下降法,也许会指向这里,现在在椭圆的另一边,计算下一步梯度下降,结果或许如此,然后再计算一步,再一步,计算下去,你会发现梯度下降法要很多计算步骤对吧?

慢慢摆动到最小值,这种上下波动减慢了梯度下降法的速度,你就无法使用更大的学习率,如果你要用较大的学习率(紫色箭头),结果可能会偏离函数的范围,为了避免摆动过大,你要用一个较小的学习率。

另一个看待问题的角度是,在纵轴上,你希望学习慢一点,因为你不想要这些摆动,但是在横轴上,你希望加快学习,你希望快速从左向右移,移向最小值,移向红点。 

因此我们需要使用动量梯度下降法:通过引入动量项,利用梯度的指数加权平均值来更新参数,从而减少震荡并加速收敛

让我们做个类比,便于理解。

滚动的球

  • 标准梯度下降:就像一个球每次滚动时只根据当前的位置决定方向和速度。由于每次滚动都只依赖于当前的“坡度”(梯度),当坡度快速变化时(即曲率较大时),球会左右摇摆,无法保持稳定。
  • 动量法:类似于给球增加了“惯性”。球滚动时,不仅受到当前坡度的影响,还保留了之前滚动的速度和方向(动量)。这样即使坡度(梯度)在纵轴上有剧烈变化,球的惯性会让它更加平稳地滚下,不容易被快速的坡度变化影响。反之,在横轴上,由于惯性的积累,球会在这个方向上加速,滚动得更快。

那么动量法为什么“球更快、更稳”?

1. 动量累积效果(滚动更快)

  • 动量法不仅考虑当前梯度,还考虑之前几次更新的梯度,即它引入了“动量”这个物理概念。想象一下在物理世界中,一个滚动的小球下山时会越来越快,因为它积累了速度和动量。
  • 在动量法中,每次更新参数时,不仅考虑当前梯度(瞬时加速度),还保留了之前梯度的累积(动量)。所以在横轴方向(变化慢的方向),梯度虽然小,但累积起来后形成的“动量”会推动参数更新得更快,从而加快收敛速度。

2. 减少摆动效果(滚动更稳)

  • 动量法在纵轴方向也有抑制震荡的效果。由于纵轴方向的梯度变化大,正负梯度会快速交替,因此动量累积的结果会在该方向上相互抵消,形成一个较小的平均动量。
  • 总结:动量法在横轴方向累积动量,增强更新力度,加快收敛速度;在纵轴方向消除震荡,减小摆动幅度,让更新过程更稳定。

2.21 RMSprop

我们知道了动量(Momentum)可以加快梯度下降,还有一个叫做RMSprop的算法,全称是root mean square prop算法,它也可以加速梯度下降,我们来看看它是如何运作的。

RMSprop的影响就是你的更新最后会变成这样(绿色线),纵轴方向上摆动较小,而横轴方向继续推进。还有个影响就是,你可以用一个更大学习率,然后加快学习,而无须在纵轴上垂直方向偏离。

2.22 Adam 优化算法(Adam optimization algorithm)

在深度学习的历史上,包括许多知名研究者在内,提出了优化算法,并很好地解决了一些问题,但随后这些优化算法被指出并不能一般化,并不适用于多种神经网络,时间久了,深度学习圈子里的人开始多少有些质疑全新的优化算法,很多人都觉得动量(Momentum)梯度下降法很好用,很难再想出更好的优化算法。

RMSprop以及Adam优化算法,就是少有的经受住人们考验的两种算法,已被证明适用于不同的深度学习结构,这个算法我会毫不犹豫地推荐给你,因为很多人都试过,并且用它很好地解决了许多问题。

Adam优化算法基本上就是将MomentumRMSprop结合在一起,它结合了动量(Momentum)RMSprop两种优化方法的优点,并且能够适应不同类型的神经网络。

Adam的工作原理:

Adam的优点:

超参数:

2.23 学习率衰减(Learning rate decay) 

学习率衰减概述

学习率衰减是指在训练过程中逐渐减小学习率的策略,这可以帮助模型在训练后期以较小的步伐进行微调,从而避免在最优解附近震荡或跳过最优解。这个策略特别适合于使用mini-batch梯度下降时,可以避免噪音导致的不稳定,并帮助模型更好地收敛。

为什么要使用学习率衰减?

在训练初期,使用较大的学习率可以加快模型的收敛速度。但是,随着训练的进行,模型越来越接近最优解时,大步伐的更新可能会使得模型在最优解附近摆动,甚至错过最优解。因此,逐渐减小学习率可以使得模型在接近最优解时以更小的步伐精细调整,确保更好的收敛。

例如,在使用mini-batch梯度下降时,由于不同的mini-batch存在噪音,梯度更新会呈现震荡(如蓝色线所示)。如果在训练过程中逐步降低学习率(如绿色线所示),会减少这种震荡,帮助模型稳定地收敛到最小值。

如何实现学习率衰减?

常用的学习率衰减策略:

2.24 局部最优与鞍点.

在深度学习的早期,人们对优化算法的理解中,常常担心算法会陷入局部最优,无法找到全局最优解。然而,随着深度学习理论的发展,特别是在高维度空间中,局部最优并不是主要问题。现代研究表明,优化算法在训练大规模神经网络时,更常遇到的是鞍点(Saddle Point),而非传统的局部最优点。

这是因为如果你在2万维空间中,那么想要得到局部最优,所有的2万个方向都需要是这样,但发生的机率也许很小,也许是2^{-20000},你更有可能遇到有些方向的曲线会这样向上弯曲,另一些方向曲线向下弯,而不是所有的都向上弯曲,因此在高维度空间,你更可能碰到鞍点。

就像下面这种:

鞍点

而不会碰到局部最优。至于为什么会把一个曲面叫做鞍点,你想象一下,就像是放在马背上的马鞍一样,如果这是马,这是马的头,这就是马的眼睛,画得不好请多包涵,然后你就是骑马的人,要坐在马鞍上,因此这里的这个点,导数为0的点,这个点叫做鞍点。我想那确实是你坐在马鞍上的那个点,而这里导数为0。

为什么叫做鞍点?

如果局部最优不是问题,那么问题是什么?

问题是平稳段会减缓学习,平稳段是一块区域,其中导数长时间接近于0,如果你在此处,梯度会从曲面从从上向下下降,因为梯度等于或接近0,曲面很平坦,你得花上很长时间慢慢抵达平稳段的这个点。

因为左边或右边的随机扰动,然后你的算法能够走出平稳段(红色笔)。

在平稳段慢慢走出鞍点

总结:

  • 在高维空间中,我们不太可能陷入极差的局部最优。相反,优化算法更常遇到的是鞍点。
  • 平稳段会显著减缓学习过程,导致训练速度缓慢。这是现代优化算法(如Adam等)发挥作用的地方,它们通过引入动量或调整学习率帮助更快地突破平稳段。
  • 深度学习的优化问题本质上来自于高维空间的复杂性,随着理论的发展,学者们对这些问题的理解不断深化,优化算法也会越来越成熟。

2.25 识别重要的参数。

2.26 超参数寻优方法.

  • 随机取样:相比传统的网格搜索,随机取样更适用于深度学习。因为不同超参数对模型性能的影响权重不同,随机取样可以更均匀地探索整个超参数空间。
  • 粗到细的搜索策略:先在较大的取值范围内进行粗略搜索,找到效果较好的区域后,再缩小搜索范围,进行更加精细的探索。

2.27 在搜索超参数时,要选择合适的标尺进行取值。

1. 均匀随机取样 vs 合适标尺

  • 线性均匀随机取样适合某些参数,例如隐藏单元数量、网络层数等,这些参数可以直接在指定的整数范围(如50到100或2到4)内均匀随机选择。
  • 对于学习速率等参数,使用线性标尺进行均匀取样会导致大部分取值集中在较大的范围(如0.1到1之间),这不利于探索更小范围(如0.0001到0.1)内的潜在重要值。

2. 对数标尺(Log Scale)

  • 对于学习速率等参数,更适合使用对数标尺来进行取样。
  • 具体做法是:
    • 计算取值范围内最小值和最大值的对数,例如对于0.0001到1的范围,对应的对数是-4和0。
    • 在这个对数范围内均匀随机取值,再使用10^{r}来得到实际的超参数取值。
  • 这样可以更均匀地探索整个取值范围,包括较小的值区间,使得搜索资源分配更合理。

3. 特殊参数的处理

  • 对于一些参数,例如动量参数β(0.9到0.999之间),直接在这个区间进行均匀随机取值也不合适。
  • 因为在接近1时,β的微小变化会对结果有较大影响,而在0.9到0.9005之间的变化则几乎没有影响。
  • 因此,我们可以对(1−β)进行对数标尺取样,如(1−0.9)=0.1和(1−0.999)=0.001,在0.1到0.001的对数范围内均匀取值,然后计算对应的β。

4. 选择标尺的重要性

  • 使用合适的标尺(对数标尺)进行超参数取样,可以更加均匀和高效地探索重要的取值范围,避免资源浪费在不重要的区间。
  • 即便一开始使用的是线性标尺随机取值,只要点数足够多,结合后续的从粗到细的搜索策略,最终也能逐步聚焦到更为合适的取值范围。

2.28 两种超参数搜索策略.

两种超参数搜索策略

  • 熊猫方式:适用于计算资源有限的场景。
    • 主要特点:在资源有限的情况下,只能逐一尝试模型。在调参时,需要密切观察一个模型的表现,并根据其学习曲线逐步调整参数。
    • 优点:适合资源受限或需要针对特定问题细致调试的情况。可以在实际训练过程中不断调整和改进模型。
    • 缺点:需要耗费大量时间和精力在单个模型上,调参效率较低。
  • 鱼子酱方式:适用于拥有充足计算资源的场景。
    • 主要特点:同时尝试多种不同的超参数配置,平行地训练多个模型,从中选择表现最好的模型。
    • 优点:可以在短时间内尝试大量不同的配置,大大提高调参效率。适合大规模实验和并行计算资源丰富的场景。
    • 缺点:需要较多的计算资源,适合在数据量大且有能力并行训练多个模型的情况下使用。

两种策略的选择依据

  • 计算资源:选择哪种策略主要取决于你拥有的计算资源。如果计算资源有限,采用熊猫方式逐步调试模型;如果资源充足,可以使用鱼子酱方式同时测试多个配置。
  • 应用领域:一些特定领域,如在线广告和计算机视觉,数据量巨大,往往更依赖熊猫方式,因为调试单个模型可以更精细地适应特定数据特征。

结合使用

  • 即便在熊猫方式中,当你在单一模型上调试到一定阶段,也可以偶尔尝试并行启动几个不同的模型,以验证不同配置的效果。这种结合方式可以在有限资源下更有效地搜索超参数。

2.29 Batch Normalization(BN)详解

什么是 Batch Normalization?

Batch Normalization(BN,批量归一化)由 Sergey Ioffe 和 Christian Szegedy 于 2015 年提出,是一种加速深度神经网络训练并提高模型泛化能力的技术。BN 的主要思想是在每一层的输入进行归一化,使得这些输入拥有均值为 0 和方差为 1 的分布,并且通过训练可学习的缩放参数和偏移参数来保留网络的表达能力。

为什么需要归一化?

在进行深度学习训练时,输入特征标准化(Normalization)已经被广泛使用,因为它可以加快收敛速度和提升训练的稳定性。然而,深度网络中不仅有输入层的特征,还有各个隐藏层的激活值。如果能够对隐藏层的激活值进行归一化,就可以进一步加速训练,减少梯度消失/爆炸现象。

BN 的关键思想是将这种标准化引入到每个隐藏层,从而解决内部协变量偏移(Internal Covariate Shift)问题,即由于前面层参数变化导致输入分布发生变化,影响模型训练。

Batch Normalization 如何实现?

Batch Normalization 在深度神经网络中的应用

Batch Normalization 的优势

  • 加速收敛: BN 通过标准化输入,减少了输入数据的偏移和变化,使得梯度更新更加稳定,优化速度加快。
  • 减少内部协变量偏移: BN 使每一层的输入数据分布更加一致,减小了网络训练时各层之间的协变量偏移效应。
  • 降低模型对初始化的依赖: BN 提高了深度网络的鲁棒性,模型对参数初始化不再过于敏感。
  • 可使用较大的学习率: 由于 BN 减少了梯度爆炸和梯度消失问题,训练时可以使用更大的学习率,加快优化速度。
  • 一定程度上的正则化效果: BN 在训练时使用 mini-batch 计算均值和方差,相当于在输入中加入噪声,这对模型有类似正则化的效果。

在 mini-batch 中的使用

在训练阶段,BN 需要根据 mini-batch 的数据计算均值和方差,因此对每个 mini-batch 都会重新计算。在测试阶段,我们使用整个训练集的均值和方差,这通常通过移动平均(moving average)来估计:

实践中的使用

在主流深度学习框架(如 TensorFlow, PyTorch)中,BN 通常作为一层来使用,并且只需一行代码即可实现:

  • TensorFlow: tf.keras.layers.BatchNormalization()
  • PyTorch: torch.nn.BatchNorm1d() or torch.nn.BatchNorm2d()

2.30 Batch Normalization为什么会起作用? 

1. 归一化激活值,减少内层协变量偏移(Internal Covariate Shift)

  • 输入特征归一化的动机:我们通常会对输入特征进行归一化处理,将其调整为均值为0、方差为1。这有助于模型快速收敛,因为归一化可以让特征值在相同尺度上波动,避免某些特征在值较大时对模型学习产生不良影响。

  • BN的作用:BN对神经网络中的隐藏层激活值进行类似的归一化操作,不仅限于输入层。这意味着BN通过归一化每一层的激活值,让这些值的分布更加一致,减少了由于深层网络中层层传播引起的“内部协变量偏移”(Internal Covariate Shift)。

  • 内部协变量偏移:内部协变量偏移是指随着网络训练,隐藏层激活值的分布会不断变化,导致后续层需要不断调整以适应这些变化。BN通过将每个mini-batch的激活值归一化,使得每层的激活值分布在训练过程中更为稳定,从而加速收敛。

让我们举一个例子,第一个模型所使用的数据集如左图所示,第二个模型所使用的数据集如左图所示。你会发现,在左边训练得很好的模型,很难在右边也运行得很好,即使真的存在这样一个函数,但你的学习算法很难去发现这样一个适用于不同数据分布的绿色的决策边界,如果只看左边数据的话。

2. 解耦层之间的相互依赖,加速训练

  • 在深层神经网络中,前层参数的更新会影响到后续层的输入分布,而BN通过固定激活值的均值和方差,使得即便前层的参数发生变化,后续层看到的输入分布变化较小,这减少了层与层之间的依赖性。

  • 这种解耦效果允许每一层独立地进行学习,而不需要频繁调整以适应其他层的变化,进而加速整个模型的训练过程。

3. 轻微的正则化效果

  • 噪声引入:BN在训练时是通过mini-batch计算均值和方差的,而不是在整个数据集上计算。因此,均值和方差是基于mini-batch的随机样本估算的,会存在一些估计误差(噪声)。

  • 正则化作用:这种mini-batch带来的随机性,会在某种程度上给每个mini-batch添加轻微的噪声,类似于Dropout。这个随机噪声使得模型在训练时不会过于依赖某些特定的激活单元,具有一定的正则化效果,减少了过拟合的风险。

  • mini-batch大小的影响:如果使用较大的mini-batch,那么噪声会减少,因此正则化效果会减弱。相反,较小的mini-batch会带来更多的噪声,从而增加正则化效果。

4. 简化模型超参数的调节

  • 在没有BN时,网络中不同层的激活值尺度差异较大,这可能会导致梯度消失或爆炸问题,尤其是在深层网络中。为了避免这种情况,我们通常需要仔细调节学习率和初始化权重。

  • 有了BN,激活值的均值和方差被固定在一定范围内,这在一定程度上缓解了梯度问题,因此我们可以选择更大的学习率,或者减少对权重初始化的敏感性,从而简化超参数的调节。

5. 测试阶段的BN处理细节

  • 训练阶段:在训练过程中,BN使用的是mini-batch的均值和方差。

  • 测试阶段:测试时,我们通常只用一个样本或很小的一组样本进行预测,这时直接使用mini-batch的均值和方差会带来不稳定性。因此在测试阶段,BN会使用训练期间累积的移动平均(moving average)来计算全局均值和方差,保证测试阶段的预测结果稳定。

  • 为了解决这个问题,我们需要估算整个训练集的均值和方差,这里一般采用指数加权平均(Exponential Moving Average, EMA)的方法。

2.31 Softmax

  • 它通过 Softmax 激活函数计算各类别的概率分布,使得输出的概率总和为 1。
  • 训练时使用交叉熵损失函数,并通过梯度下降法进行优化。
  • 对于更复杂的分类任务,通常会使用包含隐藏层的深层神经网络,这样可以学习到更加复杂的非线性决策边界。

3 补充知识点:

3.1 为什么人们在训练网络时,越来越倾向于使用L2正则化?

  • L2 正则化 对权重的惩罚效果是平滑和连续的,它将所有权重都缩小到较小的值,而不是像L1一样直接将一些权重变为 0导致w稀疏。这使得模型参数的更新过程更加平滑,有利于梯度下降算法的稳定性。
  • L1 正则化 不同,L2 正则化 在权重较小时,惩罚力度较小,因此更适合对大量特征进行处理,而不至于过分惩罚小权重。

3.2 L2正则化和dropout在输入、效果等因素方面

  1. L2正则化的计算开销较低。
  2. dropout更适用于不同的输入范围。
  3. dropout一大缺点就是代价函数J不再被明确定义,每次迭代,都会随机移除一些节点,如果再三检查梯度下降的性能,实际上是很难进行复查的。因此建议先关闭dropout函数,将keep-prob的值设为1,运行代码,确保J函数单调递减。然后打开dropout函数,希望在dropout过程中,代码并未引入bug

3.3 为什么随机初始化时权重随机到非常大的值模型工作的会非常不好? 

  • 梯度爆炸(Gradient Explosion):

    • 在反向传播中,梯度是由误差通过层层传播计算出来的。如果初始权重值过大,前向传播时,网络层的激活值也会非常大。反向传播时,误差的梯度会随着网络层数的增加而指数级增长,这会导致梯度爆炸。
    • 梯度爆炸会让权重更新变得非常剧烈,从而导致网络无法有效收敛,甚至出现"NaN"(非数值)的情况。
  • 激活函数饱和:

    • 对于像Sigmoid和Tanh这样的激活函数,当输入值非常大时,它们会饱和(Sigmoid趋向于1或0,Tanh趋向于1或-1)。并且当它得到错误的示例时,它会导致该示例的非常高的损失。

    • 如果大量神经元处于这种饱和状态,反向传播时计算的梯度也会接近0,导致梯度消失,使得网络学习变得非常缓慢,甚至无法更新权重。
  • 输出值不稳定:

    • 初始权重值较大时,输入信号在前向传播时会被过度放大,使得输出值变得非常不稳定。训练初期的网络输出会变得毫无规律,不利于模型的有效训练。

3.4 常见的深度学习框架

以下是几种主流的深度学习框架,每个框架都有自己独特的优势和应用场景:

  1. TensorFlow

    • 由谷歌开发,是一个强大且功能全面的深度学习框架。
    • 支持多种平台(如PC、移动设备和云服务),能够处理从小规模实验到大规模生产部署。
    • 丰富的生态系统,如Keras(简化的高层API)、TensorFlow Lite(移动设备支持)和TensorFlow Serving(部署模型)。
    • 使用灵活,既支持低层次的操作定义,也支持高层次的模型构建。
  2. PyTorch

    • 由Meta(Facebook)开发,以其动态计算图和Pythonic的代码风格而著称。
    • 代码编写和调试非常方便,特别适合研究人员和实验性项目。
    • 社区活跃度高,近年来越来越多的学术研究和工业应用选择PyTorch。
    • 支持ONNX(Open Neural Network Exchange),方便将模型转换为其他框架使用。
  3. Keras

    • 最初是一个独立的深度学习库,现已成为TensorFlow的高层API接口。
    • 以易用性和快速原型设计为目标,代码简洁、易于阅读。
    • 适合入门和快速构建简单到中等复杂度的模型。
  4. MXNet

    • 由Apache基金会支持,是一个高性能的深度学习框架。
    • 支持灵活的编程范式(命令式和符号式编程),适合不同的开发需求。
    • 得到了亚马逊AWS的支持,用于其深度学习服务(如SageMaker)。
  5. JAX

    • 由谷歌开发,以Python和NumPy为基础,强调自动微分和并行计算。
    • 适合处理科学计算和大规模的模型训练任务。

4 实战演练:

4.1 第二课——Week5:

课后练习 之 第二课——Week5-CSDN博客

4.2 第二课——Week6:

课后练习 之 第二课——Week6-CSDN博客

4.3 第二课——Week7:

课后练习 之 第二课——Week7-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值