目录
L1和L2正则化
为什么需要正则化?
正则化是机器学习中一种关键的技术,用于防止模型在训练数据上过拟合,从而提高其在新数据上的泛化能力。
正则化实现目标?
上图从左到右分别是欠拟合、理想状态和过拟合。
欠拟合从字面意思来看就是欠缺拟合程度,这一般在复杂度很低的模型中出现。从数学上来看,一元一次函数为一条直线、一元二次函数为一个曲线,以此类推。那么参数越多,其越能拟合更复杂的特征,但是一味的增加模型的复杂度就会造成过拟合现象。一旦过拟合,模型的泛化能力以及鲁棒性将特别差。那么怎么解决过拟合现象呢?我们先介绍传统的正则化,后再接着讲Dropout。
在从数学方面分析来看,为了减小过拟合,要将一部分参数置为0,最直观的方法就是限制参数的个数,因此可以通过正则化来解决,即减小模型参数大小或参数数量,缓解过拟合。
正则化主要通过对模型的复杂度进行惩罚来实现其目标。其核心思想是:在优化模型对训练数据的拟合程度的同时,也要求模型尽可能地简单。
具体来说,正则化在模型的损失函数中加入了一个正则项(Regularization Term)。这个正则项是模型参数的函数,它会惩罚那些“大”的参数值,从而达到以下目标:
- 限制模型复杂度: 通过惩罚大参数值,正则化迫使模型选择更小的参数,使得模型函数变得更平滑,降低了模型对训练数据中微小变化的敏感性,从而降低了过拟合的风险。
- 提升泛化能力: 一个更简单的模型通常具有更好的泛化能力,因为它更侧重于学习数据中的普遍模式,而不是特例或噪声。
- 防止共线性: 在某些情况下,特别是L2正则化,可以帮助处理特征之间的共线性问题,稳定模型参数。
L1正则化
L1正则化,又称“最小绝对收缩和选择算子”(Lasso),它在损失函数中加入了所有模型权重(w)的绝对值之和作为惩罚项。
实现方式和效果
- 惩罚机制: L1正则化对权重值进行“线性惩罚”,这意味着无论权重值的大小,惩罚的力度都是线性的。(与L2不同,L2是平方)
- 稀疏性(Sparsity)与特征选择: 这是L1正则化最显著的特点。由于L1范数的特性(在0点处不可导且形状是菱形),L1正则化倾向于将不重要特征的权重完全压缩为零。这意味着L1正则化可以自动地进行特征选择,识别出对模型预测不重要的特征并将其排除。这在特征数量非常多时特别有用,可以简化模型并提高可解释性。
- 模型解释性: 由于能够产生稀疏模型,L1正则化使得我们可以更容易地理解哪些特征是模型做出预测的关键。
- 非零权重数量减少: 最终模型中非零权重的数量会大大减少。
L2正则化
L2正则化,又称“岭回归”,它在损失函数中加入了所有模型权重(w)的平方和作为惩罚项。
实现方式和效果
- 惩罚机制: L2正则化对大权重值进行“二次惩罚”,这意味着权重值越大,惩罚的力度越大。
- 权重收缩(Weight Shrinkage): L2正则化倾向于将所有非零的权重值等比例地向零收缩,但不会将权重完全变为零。这意味着它会使得权重值变得更小,但通常不会导致特征选择(即某些特征的权重变为零)。
- 平滑模型: 通过限制权重的大小,L2正则化使得模型函数更加平滑,对输入数据的微小变化不那么敏感,从而降低了过拟合的风险。
- 处理共线性: L2正则化在面对特征之间存在高度相关性(共线性)时,能够更稳定地选择权重,因为它不会像L1那样倾向于只选择一个特征而完全忽略另一个。
总结
需要理解其思想就是基于模型权重来给损失函数加惩罚项,参数量大了,loss就大了,就需要让模型自己去降低自己的loss值。其他的基于数学的思想可学可不学,L1和L2正则化现在应用也较少了。
Dropout
为什么会需要dropout?
因为在训练深度神经网络的时候,当网络拥有大量参数时,模型具有极强的学习能力,它可以非常精确地拟合训练数据。然而,这种能力也带来一个严重的弊端:过拟合(Overfitting)。就类似于你一直在学一套卷子,当你学多了和学久了,你自然就把这套卷子都给掌握了。
过拟合的具体表现:模型在训练时的损失函数较小,预测准确率较高;但到了测试数据上时,损失函数则较大,预测准确率较低。就类似于你只会那套卷子,其他卷子就不会做了,不会举一反三。
过拟合的危害: 当模型出现过拟合时,这意味着模型学习到了训练数据中的噪声和特有模式,而不是数据中普遍存在的、有用的规律。过拟合的模型泛化能力差,无法在实际应用中取得好的效果。就类似于你只会死记硬背,没有基于知识的本质和规律去了解和掌握这些知识,从而实现触类旁通。
出现过拟合的原因:1. 参数过多: 相对于训练样本数量,神经网络的参数过多,导致模型容量(model capacity)过大,能够“记住”训练样本的每一个细节。即背多了练多了,那套卷子就被你记住了。传统的正则化方法,如 L1/L2 正则化,通过限制模型参数的大小来减少模型的复杂度。然而,这些方法并不能完全解决神经网络特有的“共适应”问题。
2. 神经元之间的“共适应”(Co-adaptation): 在没有dropout的情况下,神经网络中的神经元在训练过程中可能会学习到相互依赖、相互补偿的复杂关系。例如,某个神经元可能总是依赖于另一个特定神经元的输出来进行激活。这种“共适应”使得网络对训练数据中的特定模式非常敏感,一旦输入稍微偏离,就会导致性能下降。就类似于那套卷子,你是在老师帮助下去进行学习和练习的,那如果老师走了,你就不会做了。或者可以想象成一个团队,如果成员之间过度依赖,一旦某个关键成员缺席,整个团队就会瘫痪。
过拟合是很多机器学习的通病,如果模型过拟合,那得到的模型就几乎不能用了?那聪明的你可能想到了,我不能训练多个模型来集成,并将它们的结果以一个“多数投票机制”来得到最终结果不行吗?可以是可以,但这样的话你还是没有解决单个模型在训练过程中存在的过拟合问题,另外,训练多个模型也带来费时费力费钱的问题,结果可能也是吃力不讨好。那如何解决单个模型在训练过程中存在的过拟合问题呢,那就需要dropout了。
何为dropout?
dropout 是一种在神经网络训练过程中使用的正则化技术,旨在解决深度学习模型中常见的过拟合(Overfitting)问题,提高模型的泛化能力。
dropout的实现目标
- 防止过拟合,提高模型泛化能力: 这是最核心的目标。通过在训练过程中随机“关闭”部分神经元,迫使网络学习到更鲁棒、更具泛化性的特征。
- 打破神经元之间的“共适应”: 由于每次训练迭代都有不同的神经元子集被激活,神经元无法再依赖于固定的其他神经元的存在。这迫使每个神经元学习到更加独立的、更具信息量的特征,从而降低了它们之间的复杂依赖关系。
- 近似集成学习(Ensemble Learning): Dropout可以被看作是对模型进行“廉价”的集成。每次随机丢弃神经元,都相当于在训练一个“稀疏”的子网络。在一个epoch中,模型实际上训练了指数级的不同子网络。最终的模型可以看作是这些大量子网络预测的平均(或集成),而集成模型通常比单一模型具有更好的泛化能力。
dropout的实现方法
dropout的实现方式相对简单,根据上述dropout的实现目标,我们可以大致知道其实现的方法了,那接下来就是具体讨论其实现方式了。
在训练阶段:
- 随机失活: 对于神经网络中的每一个隐藏层,在每次前向传播时,以一个预设的概率 p(称为失活率或丢弃率,通常设置为0.5),随机地将该层的一些神经元的输出设置为零。这意味着这些神经元在本次迭代中不参与前向传播和反向传播的计算。
- 保留概率: 对应的,每个神经元有 1−p 的概率被保留。
- 尺度缩放:由于训练时神经元有 p 的概率被丢弃,所以其输出的期望值会比所有神经元都激活时低。为了补偿这种差异,并在推理时保持激活值的期望不变,推理时需要对激活值进行尺度缩放,对于未被丢弃的神经元,其输出值会按照 1/(1−p) 的比例进行缩放。这就类似你原本不dropout的时候是100个人打100桶水,现在你dropout了,变成50个人了,你的目标还是实现打100桶水,那每个人就需要打 1/0.5 = 2桶,这样的话才能满足打100桶水。这就是为何需要进行缩放,因为目标是基本不变的,变的只是实现时所用的神经元数目。这部分主要是为了在测试阶段不需要进行缩放,保持测试阶段的输出与训练阶段的期望输出一致。
- 非激活与激活: 被“失活”的神经元在本次迭代中不产生任何输出,就像它们暂时从网络中移除了一样。(前向传播)
- 权重更新: 只有那些被保留的神经元及其连接的权重会根据反向传播的梯度进行更新。(反向传播)
- 示例: 假设一个隐藏层有100个神经元,如果设置 p=0.5,那么在每次训练迭代中,平均会有50个神经元被随机地“关闭”,而在你这轮训练的epoch中参数的更新只会更新这50个保留的神经元,其他被搁置的50个神经元不进行更新,它们保留的还是它们之前的参数。
在推理阶段
- 不应用Dropout: 在推理阶段,所有的神经元都应该保持激活状态,不进行任何丢弃。这是因为我们希望模型能够利用所有学习到的信息来做出最准确的预测。
- 由于在训练阶段,保留的神经元的输出已经进行了 1/(1−p) 的缩放,因此在测试阶段,网络的输出直接作为最终结果,不需要进行任何额外的缩放。这保证了在测试阶段的神经元激活值与训练阶段的期望激活值保持一致。
dropout为何这么实现?
随机性:每次迭代都随机丢弃神经元,确保了网络不会过度依赖任何特定的神经元组合。(一方面你降低了模型的参数,另一方面你dropout的神经元可能是依赖关系中的一环,通过dropout来减少这种依赖关系。)
逆 Dropout :在训练阶段进行缩放,使得测试阶段可以不做任何处理,直接使用完整的网络进行预测,这样计算更高效,也避免了在部署时忘记处理缩放因子的问题。
dropout为什么可以防止过拟合?
- 强制学习更鲁棒的特征:每次训练时,一部分神经元被随机禁用。这意味着任何一个神经元都不能过于依赖其他特定神经元的存在。它被迫学习到更独立的、对输入变化的更鲁棒的特征。这就像一个团队,如果队员随时可能“下线”,那么每个队员都必须独立思考和完成任务,不能只依赖于特定队友。
- 减少共适应:由于神经元之间的连接被随机切断,它们之间形成复杂的、相互依赖的“共适应”模式的机会大大减少。每个神经元都必须学习到对预测结果有独立贡献的特征,而不是仅仅与其他神经元形成特定组合来达到目的。(独立自主,不要过于依靠别人的判断)
- 集成学习效果:每次前向传播时,Dropout 实际上都在训练一个“瘦”网络(原网络的一个子集)。在一个训练过程中,我们实际上训练了
(其中 N 是网络中神经元的总数,而每个神经元有两个状态,要么被激活,要么不被激活,那么总的组合就有
)个不同但共享权重的网络。在推理时,使用完整的网络,这可以看作是对所有这些“瘦”网络预测结果的平均,类似于集成学习(Ensemble Learning)的效果。集成学习通常比单一模型具有更好的泛化能力。
- 类似于噪音注入:随机丢弃神经元也可以被视为在网络中引入了噪音。这种噪音使得网络对输入的微小扰动更加不敏感,从而提高了模型的鲁棒性和泛化能力。
总结
梯度下降
梯度下降是一种迭代优化算法,用于寻找函数最小值。在机器学习中,我们通常将模型训练看作是一个优化问题:我们需要找到一组模型参数,使得模型的损失函数 (Loss Function) 或成本函数 (Cost Function) 达到最小。梯度下降就是解决这个问题的最常用和最基础的算法之一。
核心思想与直观理解
想象您在一个漆黑的山谷中,目标是走到山谷的最低点(即损失函数的最小值)。由于四周一片漆黑,您看不到整个山谷的全貌,但您可以通过感受脚下地面的坡度来判断方向。
- 梯度 (Gradient): 在数学中,函数的梯度是一个向量,它指向函数值增长最快的方向,同时其模(大小)表示该方向上的变化率。
- “下降”: 为了找到函数的最小值,我们应该沿着函数值下降最快的方向走。这个方向正是梯度方向的反方向。
因此,梯度下降算法的直观思想就是:从当前位置出发,沿着损失函数梯度(坡度)的负方向(最陡峭的下坡方向)迈出一步,然后重复这个过程,直到达到或接近山谷的最低点。
你的目的是下山,那快点下山的路径就是哪里陡走哪里,这样就是最快的。
目标函数与迭代更新
假设我们的损失函数为 J(θ),其中 θ 代表模型的所有参数(例如神经网络中的权重和偏置)。梯度下降算法通过以下迭代更新规则来调整参数:
太大,会意味着你下山太快,快到可能是跌倒某个洞里去了,你后续就出不来了,而没有抵达山底。(实现的是局部最优,而不是全局最优)
太小,意味着下山比较慢,不会轻易跌倒洞里去,但下山所花的时间变多了。
每次迭代时,算法会计算当前参数下损失函数的梯度,然后将参数沿着梯度的反方向(即负梯度方向)移动一小步,步长由学习率控制。这个过程重复进行,直到损失函数收敛到最小值或达到预设的迭代次数。
整个过程就类似是下山(减小loss),目标是达到山底(loss最小),你的下山速度取决于你的步长(梯度)和步频(学习率),下山速度(步频*步长)决定了你下山的时间。步频太快(学习率大),而且你迈的又远(沿着梯度的反方向),那就可能会跌入洞里(局部最优)。步频太慢(学习率小),可以让你不轻易掉入洞中(局部最优),但会让你下山的这个过程花费较多的时间。
在模型训练过程中,可以调的就只有学习率,梯度的大小是模型自己计算的,因此学习率的设置相对重要一点,一般取值为
反向传播
前向传播
在了解反向传播前,我们需了解何为前向传播。
前向传播是神经网络通过层级结构和参数,将输入数据逐步转换为预测结果的过程,实现输入与输出之间的复杂映射。把神经网络看成是一个函数f(x),x就是输入数据,y=f(x)就是输出结果。
前向传播:
- 将输入数据从网络的输入层向前传递,逐层计算每个神经元的激活值,直到输出层。
- 根据网络的输出和真实标签,计算出当前的损失值。
从输入到输出这个过程中,输入需要与神经网络层中的一些可训练的权重项和偏置项(相当于函数)进行计算以得到输出。而反向传播就是要基于loss值来对这些可训练的网络参数进行优化,从而优化函数
,这样的话,就可以使得输出趋向正确。(相当于事后诸葛亮,之后再对流程优化。又或者基于考试成绩来判断自己哪方面知识不足,通过查缺补漏,来使得下一次考试成绩更好。)
反向传播
反向传播算法利用链式法则,通过从输出层向输入层逐层计算误差梯度,高效求解神经网络参数的偏导数,以实现网络参数的优化和损失函数的最小化。
反向传播:
- 从网络的输出层开始,计算输出层的误差(即损失函数对输出层激活值的梯度)。
- 将这个误差(梯度)反向传播回网络的前一层。在传播过程中,利用链式法则,计算出每一层对损失函数的贡献,并计算损失函数相对于该层权重和偏置的梯度。
- 这个过程一直持续到网络的输入层。并在这个过程中,会根据算得到的梯度信息,使用梯度下降或其他优化算法来更新网络中的权重和偏置参数,以最小化前向传播时的损失函数。
简单来说,就是先“正向计算”出结果和误差,然后“反向追溯”误差的来源,并计算出每个参数应该如何调整才能减小误差。(根据考试中哪里错的比较多,通过优化来避免之后犯此类错误,从而实现下次考试成绩的提高。)
链式法则
反向传播的数学基础是微积分的链式法则。链式法则是微积分中的一个基本定理,用于计算复合函数的导数。如果一个函数是由多个函数复合而成,那么该复合函数的导数可以通过各个简单函数导数的乘积来计算。
Adam和AdamW优化器
优化器的作用
在神经网络的训练过程中,我们通过反向传播算法计算出损失函数相对于每个模型参数(权重和偏置)的梯度。这些梯度告诉我们,如果想减小损失,每个参数应该如何调整。然而,仅仅知道方向还不够,我们还需要一个策略来决定每次调整的步长和方式。这就是优化器的作用。(根据考试的成绩,老师告诉了你哪方面还需要加强(反向传播),并告诉了你可以通过哪些方式来加强这些方面(优化器),从而实现下次考试成绩的提高。) 反向传播告诉了哪些方面有缺陷,优化器是根据这些缺陷来针对性地提出解决方法。
优化器是决定模型参数如何根据梯度进行更新的算法。它旨在以最有效的方式使损失函数达到最小值。
Adam和AdamW
Adam 和 AdamW 是两种常用的优化器,它们都是基于梯度下降算法的优化器,用于训练神经网络。它们之间的主要区别在于权重衰减(Weight Decay)的处理方式。
Adam
Adam 优化器可以理解为结合了两种非常有效的优化策略:动量和自适应学习率
动量 — 像一个滚动的球:
- 想象一个球在山坡上滚动。它不仅会沿着当前的坡度方向滚动,还会记住它之前滚动的方向和速度,并把这些信息带到下一步。
- 在Adam中,这对应于计算梯度的指数加权平均值(第一阶矩)。这意味着,Adam会记住过去几次迭代的梯度方向和大小。如果参数在某个方向上持续获得相同方向的梯度,即使当前梯度很小,动量也会帮助它继续加速前进,从而加快收敛。同时,它也能平滑梯度方向的波动,帮助模型跳出浅层的局部最优。
思想就是如果之前前进速度是比较快的,那就证明这条路很可能是正确的,而不会说当你到达山中的某个平地(此时梯度变小了)时而减缓你的移动速度。
自适应学习率 — 像根据坡度调整步长
- 想象您在不同坡度的地形上行走。在平坦的区域,您可以迈大步快速前进;而在陡峭的区域,您需要小心翼翼地迈小步,以防摔倒。
- Adam为每个参数维护一个独立的学习率。它是通过计算梯度的平方的指数加权平均值(第二阶矩)来实现的。
- 如果某个参数的梯度在过去一直很大(对应陡峭的坡度),Adam会给它一个较小的有效学习率,防止更新过猛。
- 如果某个参数的梯度在过去一直很小(对应平坦的坡度),Adam会给它一个较大的有效学习率,帮助它更快地探索并找到更好的方向。
- 这种自适应性使得Adam能够很好地处理稀疏梯度(某些参数很少更新)和不同特征尺度的问题,让模型在各种复杂的损失函数地形中都能高效优化。
偏差校正
- Adam在计算上述动量和自适应学习率的初期,由于初始值设为零,会导致估计值偏向零。Adam引入了一个简单的偏差校正机制,确保在训练初期,这些估计值能够更准确地反映真实的梯度。
Adamw
Adam的局限性体现在处理L2正则化(也称为权重衰减)的方式上。
传统 L2 正则化的问题: 传统的L2正则化方法是直接在损失函数中添加一个惩罚项:
损失+。这意味着在计算梯度时,这个惩罚项的梯度 (
) 会被直接加到原始的梯度上。然后,Adam会根据这个包含了L2惩罚的梯度来计算自适应学习率和动量。 问题在于,Adam的自适应学习率部分会根据梯度的平方和来缩小更新步长。对于那些拥有非常大的原始梯度(例如,某些参数在训练初期变化很快)的参数,自适应学习率会变得非常小,这实际上抵消了甚至“淹没”了 L2 正则化项对该参数的惩罚作用(因为损失函数为什么大,就是因为被惩罚了,因此想进行优化,但是你此时学习率却变小了,反而影响我去优化了)。结果就是,L2正则化对这些参数变得无效或效果很弱,导致模型更容易过拟合。
AdamW 的解决方案:解耦权重衰减 (Decoupled Weight Decay):
AdamW的核心思想是将权重衰减(L2正则化)从梯度更新中分离出来。它不再将L2惩罚项的梯度加到损失函数中去,而是直接在参数更新的最后一步,单独地对权重进行衰减。
简单来说:
- Adam:
参数更新 = 学习率 * (原始梯度 + L2惩罚项的梯度)
- AdamW:
参数更新 = 学习率 * (原始梯度) + 学习率 * (权重衰减项)
更精确地说,AdamW的更新步骤是:先按照Adam的规则计算出一个更新量,然后在这个更新量的基础上,额外地减去一个与当前权重成比例的量(这就是权重衰减)。
这样,无论参数的原始梯度大小如何,权重衰减项都会以一个固定的比例作用于权重,从而实现更有效、更一致的正则化效果。
总结
-
Adam: 是一个非常优秀且通用的优化器,在大多数情况下都能提供快速的收敛速度和良好的性能。如果你不确定从哪里开始,Adam通常是一个安全的默认选择。
-
AdamW: 当模型出现过拟合,或者当你明确知道L2正则化(权重衰减)对你的模型泛化能力很重要时,强烈推荐使用AdamW。它能确保权重衰减被正确且一致地应用,从而获得更好的泛化性能。在训练大型深度学习模型,特别是涉及Transformer架构或大型卷积神经网络时,AdamW往往是更优的选择。
-
Adam本身是优秀的,但忽视了正则化(权重衰减)所带来的影响,因此AdamW针对这个问题,将正则化(权重衰减)的计算给分离出来了,从而实现优化。