当前位置: 首页 > article >正文

深度学习:抑制过拟合

过拟合问题
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_ratio
        self.mask = None
        
    def forward(self, x, train_flg=True):
        if train_flg:
            self.mask = np.random.rand(*x.shape) > self.dropout_ration
            return x * self.mask
        else:
            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 效果。

http://www.kler.cn/a/369527.html

相关文章:

  • InnoDB存储引擎对MVCC实现
  • Elasticsearch 构建实时数据可视化应用
  • QT建立工程时出现了:Reading Project
  • Ceph 存储系统全解
  • XJ02、消费金融|消费金融业务模式中的主要主体
  • AIGC中的图像生成:基于GAN的实现
  • 开源社区的兴起
  • 安全见闻8,量子力学见闻
  • 诺基亚的裁员风暴
  • 深入探讨全流量回溯分析与网络性能监控系统
  • Springboot整合spring-boot-starter-data-elasticsearch
  • Uni-App-02
  • STM32 从0开始系统学习2
  • sql server 之动态sql
  • python学习笔记:___getattr__
  • Unity 实现音频进度条(可控制)
  • iframe里放的视频,如何采用纯css适配
  • 完美结局 ubuntu开机卡在等待网络连接
  • 【深度学习】合合信息:生成式AI时代的内容安全与系统构建
  • Linux运行时动态库搜索路径优先级
  • 偷懒总结篇|贪心算法|动态规划|单调栈|图论
  • Mqtt协议快速入门Demo
  • RK3568 android11 usb接口TP与电磁笔触点上报优先级问题
  • HCIP-HarmonyOS Application Developer 习题(十八)
  • Unity URP ShaderGraph 基本设置
  • [论文阅读]Detecting Pretraining Data from Large Language Models