欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 明星 > 深度学习:抑制过拟合

深度学习:抑制过拟合

2025/4/2 10:36:55 来源:https://blog.csdn.net/m0_49786943/article/details/143312697  浏览:    关键词:深度学习:抑制过拟合

过拟合问题
1.过拟合:当模型在训练数据上表现很好,但在未见过的测试数据上表现较差时,我们称之为过拟合。过拟合通常发生在模型过于复杂,参数过多,或者训练数据量不足的情况下。
2.权重过大:在过拟合的情况下,模型可能会过度依赖某些特征,导致某些权重变得非常大。这些大的权重会使模型对训练数据的微小变化非常敏感,从而在测试数据上表现不佳。
抑制过拟合的方法
一、权值衰减
通过在学习的过程中对大的权重进行惩罚,来抑制过拟合。例如为损失函数加上权重的平方范数(即L2正则化或权重衰减)是一种常见的正则化技术,用于抑制权重的变大。

  1. L2正则化:L2正则化通过在损失函数中添加权重的平方范数来抑制权重的变大。具体来说,损失函数变为:
    Loss=原始损失函数+(1/2)λ∑wi**2​
    其中,λ是正则化强度参数,wi是模型的权重。
  2. 抑制权重变大的机制
    1.梯度下降更新:在梯度下降法中,权重的更新公式为:
    wi←wi−η(∂原始损失函数/∂wi+λwi)
    其中,η 是学习率。
    从公式中可以看出,L2正则化项 λwi会使权重 wi在每次更新时都减小。这种减小效应随着权重的增大而增大,从而有效地抑制了权重的变大。
    2.权重衰减:L2正则化可以看作是在每次权重更新时,对权重进行一个小的衰减(即乘以一个小于1的因子)。这种衰减效应有助于防止权重变得过大。
    二、Dropout
    Dropout 是一种在深度学习中常用的正则化技术,旨在防止模型过拟合。它通过在训练过程中随机丢弃(即设置为零)神经元的输出来实现这一目标。
    代码如下:
class Dropout:def __init__(self, dropout_ratio=0.5):self.dropout_ratio = dropout_ratioself.mask = Nonedef forward(self, x, train_flg=True):if train_flg:self.mask = np.random.rand(*x.shape) > self.dropout_rationreturn x * self.maskelse:return x * (1.0 - self.dropout_ratio)def backward(self, dout):return dout * self.mask

每次正向传播时,self.mask中都会以False的形式保存要删除的神经元。self.mask会随机生成和x形状相同的数组,并将值比dropout_ratio大的元素设为True。反向传播时的行为和ReLU相同。也就是说,正向传播时传递了信号的神经元,反向传播时按原样传递信号;正向传播时没有传递信号的神经元,反向传播时信号将停在那里。
以下是对部分代码的解释:

  1. np.random.rand(*x.shape)
    np.random.rand(*x.shape): 这行代码生成一个与输入 x 形状相同的随机数数组。具体来说,np.random.rand 生成一个在 [0, 1) 区间内均匀分布的随机数数组。
    *x.shape 是一个解包操作,它将 x.shape 元组中的元素解包为单独的参数传递给 np.random.rand。例如,如果 x 的形状是 (3, 4),那么 np.random.rand(*x.shape) 等价于 np.random.rand(3, 4)。
    生成的随机数数组中的每个元素都在 [0, 1) 之间。
  2. train_flg
    train_flg: 这是一个布尔标志,用于指示当前是在训练阶段还是在测试阶段。
    训练阶段 (train_flg=True): 在训练阶段,Dropout 会随机丢弃一部分神经元的输出。具体来说,self.mask = np.random.rand(*x.shape) > self.dropout_ratio 会生成一个与 x 形状相同的掩码(mask),其中每个元素是一个布尔值。如果随机数大于 self.dropout_ratio,则对应的掩码值为 True,否则为 False。然后,x * self.mask 会将 x 中对应掩码为 False 的元素设置为零,从而实现 Dropout。
    测试阶段 (train_flg=False): 在测试阶段,Dropout 不会丢弃任何神经元的输出。相反,它会按比例缩放输入,以保持期望值与训练时一致。具体来说,x * (1.0 - self.dropout_ratio) 会将输入 x 按比例缩放,以补偿训练时丢弃的神经元。
  3. backward(self, dout)
    backward(self, dout): 这是反向传播的实现。在反向传播过程中,梯度会通过 Dropout 层传递。由于在训练时只有部分神经元被保留(即掩码为 True 的神经元),因此在反向传播时,梯度也只会通过这些保留的神经元传递。dout * self.mask 会将梯度 dout 中对应掩码为 False 的元素设置为零,从而实现与前向传播一致的 Dropout 效果。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词