正则化,权重衰减,Dropout丢弃法

正则化

  • 正则化(Regularization)是机器学习中常用的一种技术,通过在模型训练过程中引入附加项或约束来控制模型复杂度,并减少过拟合问题。

  • 在机器学习中,模型的目标是通过拟合训练数据来学习输入数据的模式和规律。然而,当模型过于复杂或参数过多时,往往容易出现过拟合的问题,即在训练数据上表现良好,但在新数据上表现较差。过拟合表示模型过度地记忆了训练数据的噪声和细节,而没有很好地捕捉到真正的数据趋势。

  • 为了解决过拟合问题,正则化技术被引入。正则化的目标是在模型的损失函数中添加额外的项,以对模型的复杂度进行控制。这样做可以使模型倾向于选择简单的参数设置,以提高模型的泛化能力。常见的正则化方法包括L1正则化(L1 regularization)和L2正则化(L2 regularization)等。

  • 正则化的主要原理是在损失函数中增加一个正则化项,该项与模型参数相关,并随着参数的增大而增大。通过对模型参数施加约束,正则化可以达到以下几个目的:

  • 简化模型:正则化惩罚模型复杂度,鼓励模型选择简单的参数设置,避免过于复杂的拟合,从而减少模型的过拟合风险。

  • 特征选择:对于具有大量特征的问题,正则化技术可以通过对权重进行惩罚,将一些特征参数推向零,从而实现特征选择的效果,提高模型的解释性和泛化能力。

  • 控制模型复杂度:通过调整正则化项的权重,可以在模型的偏差和方差之间进行平衡。较大的正则化权重可以减少模型的方差(减小过拟合),较小的正则化权重可以减少模型的偏差(减小欠拟合)。

  • 正则化是一种常用的技术,可以在很大程度上改善模型的性能,并提高泛化能力。它是机器学习中常用的工具之一,尤其在数据集有限、噪声较多或特征维度较高的情况下,正则化对于构建鲁棒性更强的模型非常重要。

权重衰减

  • 权重衰减(Weight Decay),也称为L2正则化(L2 Regularization),是一种常用的正则化技术,用于防止深度学习模型过度拟合(overfitting)。

  • 权重衰减通过在模型的损失函数中添加一个正则化项,惩罚模型的权重参数,以减少参数的绝对值大小。它的名称"权重衰减"源自参数值随着训练的进行而逐渐减小的特征。在优化过程中,权重衰减通过使权重向零方向调整,并约束参数的取值范围,有助于防止模型过拟合。

  • 具体而言,将权重衰减应用于模型的优化过程,可以通过在损失函数中添加一个正则化项来实现,该正则化项是权重参数的平方和乘以一个正则化系数(通常表示为λ)。即,对于一个深度学习模型的损失函数J,加入权重衰减项后的损失函数表示为:
    J(θ) = Loss(θ) + λ * ||θ||^2
    其中,θ 表示模型的权重参数,||θ||^2表示其L2范数的平方。λ是一个超参数,用于控制正则化项的强度,较大的λ会对权重施加更大的惩罚,防止权重过大。在进行梯度下降等优化算法的参数更新时,考虑到正则化项的影响,梯度更新公式会发生变化。对于 L2正则化,更新公式如下:
    θ = θ - α * (∂Loss(θ)/∂θ + 2λθ)

  • 其中 α 表示学习率,∂Loss(θ)/∂θ 是原始损失函数关于参数的梯度。
    在参数更新过程中,与原始损失函数梯度相加的部分是 2λθ,它是正则化项的梯度。通过这一项的引入,新的参数更新公式会使参数 θ 倾向于减小,即朝着减少原始损失函数和正则化项的和的方向进行优化。

  • 正则化系数 λ 调节了正则化项的强度。较大的 λ 值将导致更大的惩罚,使模型参数更趋向于接近零。相反,较小的 λ 值意味着对正则化项的惩罚较轻,主要侧重于优化原始损失函数。

  • 通过在损失函数中加入L2正则化项,并调节正则化系数,我们可以在训练过程中对模型复杂度进行惩罚,防止过拟合,并促使模型选择较小的参数取值,从而提高模型在未见过的数据上的泛化能力。

Dropout

  • Dropout是一种常用的正则化技术,用于减少深度神经网络的过拟合(overfitting)问题。在训练过程中,Dropout会以一定的概率将部分神经元的输出置为零,从而强制网络在每次迭代中仅利用部分神经元进行前向传播和反向传播。

  • Dropout的工作原理如下:

  • 训练过程中的随机失活:在每次前向传播过程中,Dropout会以一定的概率(通常是0.5)随机丢弃一部分神经元的输出。具体来说,对于每个神经元,以概率p(dropout率)将其输出置为零,以概率1-p保留其输出。这相当于随机将一部分神经元的信息屏蔽掉,使得网络无法过度依赖特定的神经元,增加了网络的泛化能力。

  • 推理过程中的缩放:在模型推理阶段,Dropout不再随机丢弃神经元的输出。为了保持模型的期望输出不变,一般采用缩放(scaling)的方式。即将每个神经元的输出乘以(1-p),即保留率(1-p)作为新的权重,确保期望输出值保持一致。

  • Dropout通常应用在全连接层上,而对于卷积层和池化层,一般直接保留所有的神经元输出

  • 代码实现:

import torch
import torch.nn as nn

def dropout_layer(X,dropout):
	# 用于判断输入的dropout是否符合要求
    assert 0 <= dropout <= 1
    # 如果dropout为1,则意味着全部舍弃,因此返回一个形状相同的全0张量
    if dropout == 1:
        return torch.zeros_like(X)
    # 如果dropout为0,则意味着全保留,因此返回X本身
    if dropout == 0:
        return X
    # 生成一个dropout遮罩(mask),用于实现随机dropout的效果
    # 逐句分析
    # torch.Tensor(X.shape).uniform_(0,1)用于生成一个与X形状相同并且取值为0-1之间的张量
    # 将生成的张量与dropout作比较,得到布尔张量
    # .float()将该布尔张量转为浮点,便于与X相乘,实现取舍
    mask = (torch.Tensor(X.shape).uniform_(0,1) > dropout).float()
    # mask = (torch.rand(X.shape) > dropout).float()
    return mask * X / (1.0 - dropout)

你可能感兴趣的:(深度再学习,机器学习,人工智能,python)