社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

彻底搞懂深度学习-正则化和归一化(动图讲解)

架构师带你玩转AI • 1 年前 • 397 次点击  

你是否也有这样的困扰?"我的模型在训练集上100分,测试集上却只有60分?""我的神经网络训练了500轮还是不收敛?"

别慌!这些问题的根源往往在于两个关键技术:正则化和归一化。正则化就像严格的老师,防止学生死记硬背;归一化则是标准化的教材,让学习更高效。

一、正则化(Regularization)

正则化(Regularization)是什么?

正则化就像一个严格的老师,防止学生过度背书。

正则化的目的是 通过引入额外的约束或惩罚项来限制模型的复杂度,从而提高模型在未知数据上的泛化能力。

过拟合的学生不仅记住了知识点,连教材上的错别字、页码都背下来了;正则化后的学生只会记住核心知识,能举一反三。

如何实现正则化?正则化是通过重新定义损失函数来实现的。新的损失函数由两部分组成:原始的预测损失和一个正则化项。

正则化通过给损失函数"加料",在原有的预测误差基础上,再添加一个基于模型参数计算得出的惩罚项。

原来的损失函数,只看考试成绩;正则化后的损失函数,看考试成绩 + 惩罚项(防止死记硬背)。

Regularization in Deep Learning: A Clear and Intuitive Guide | by Illuri  Sandeep | Medium

L1正则化和L2正则化是最主流的两种正则化技术,前者通过引入权重绝对值的约束来产生稀疏权重(许多权重为零),后者则通过权重平方和的惩罚来控制参数规模(保持权重值较小)。

L1正则化(Lasso): "断舍离大师"

L1正则化在损失函数L中添加L1正则项,即模型参数绝对值之和作为惩罚项

喜欢把不重要的权重直接变成0,这样倾向于产生稀疏权重矩阵,即部分特征权重为零,有助于特征选择。

def l1_regularization(model, lambda_l1):    l1_loss = 0    for param in model.parameters():        l1_loss += torch.norm(param, p=1)  # 绝对值之和    return lambda_l1 * l1_loss
# 训练时修改loss计算loss = criterion(outputs, labels) + l1_regularization(model, 0.001)

L2正则化(Ridge): "均衡发展者"

L2正则化则在损失函数L中添加L2正则项 ,即模型参数平方和作为惩罚项。

让所有权重都保持在合理范围内,这样倾向于使模型权重均匀分布,有助于防止模型过于复杂,减少过拟合。

def l2_regularization(model, lambda_l2):    l2_reg = torch.tensor(0.0)    for param in model.parameters():        l2_reg += torch.norm(param, p=2)  # 平方和    return lambda_l2 * l2_reg
# 在训练循环中手动添加loss = criterion(outputs, labels) + l2_regularization(model, 0.001)

二、归一化(Normalization)

归一化(Normalization)是什么?

归一化就像给所有数据穿上统一的校服,让它们在同一个"频道"上交流。

小明的身高:175cm,小红的体重:50kg,小李的年龄:20岁,直接比较毫无意义!归一化后,它们都变成了-1到1之间的数字,就能公平比较了。

这样当模型面对来自不同量纲的特征数据时,归一化能够将它们统一转换到相同的数值范围内,比如标准正态分布(均值0,标准差1)。通过这种统一化处理,让神经网络能够更均衡地学习各个特征的重要性。

归一化的过程是什么?

三步法把不同尺度的数据调整到相同标准

  1. 测量数据范围:找出最大值、最小值、平均值等
  2. 应用魔法公式:用数学公式把数据"压缩"到标准范围
  3. 获得标准化数据:所有数据都在同一个尺度上了

常用的归一化有哪些?

主要包括批量归一化(BN)、层归一化(LN)、实例归一化(IN)和组归一化(GN )

批量归一化(Batch Normalization, BN):"班级统一标准"

看这个班级,这一批学生的平均分和分数分布,把所有分数调整到统一标准(平均0,标准差1)。最适合:图像处理任务。
    # 卷积网络标准配置nn.Sequential(    nn.Conv2d(3, 64, 3),    nn.BatchNorm2d(64),  # 批量归一化    nn.ReLU())

    层归一化(Layer Normalization, LN):"个人标准化"

    不看其他学生,只看自己各科成绩,把自己的各科成绩标准化。最适合: 文本处理、Transformer模型。
      # Transformer Block结构class TransformerLayer(nn.Module):    def __init__(self):        super().__init__()        self.ln1 = nn.LayerNorm(512)        self.ln2 = nn.LayerNorm(512)

      实例归一化(Instance Normalization, IN):"独立个体标准"

      每个样本完全独立处理,适合每个样本都有独特风格的任务。最适合:  图像风格迁移、艺术生成。
      # 风格迁移网络片段style_transfer = nn.Sequential(    nn.Conv2d(3, 128, 3),    nn.InstanceNorm2d(128),  # 单样本单通道归一化    nn.AdaptiveAvgPool2d(1))

      组归一化(Group Normalization, GN):“小组标准化"

      把特征分成几个小组,每个小组内部标准化。最适合: 医学图像分割、小batch训练。
        # 医学图像分割网络nn.Sequential(    nn.Conv2d(64, 128, 3),    nn.GroupNorm(4, 128),  # 128通道分为4组    nn.LeakyReLU())

        Python社区是高质量的Python/Django开发社区
        本文地址:http://www.python88.com/topic/184203