机器学习06-正则化

机器学习06-正则化

文章目录

0-核心逻辑脉络

  • 1)欠拟合和过拟合的含义
  • 2)过拟合的解决办法
  • 3)常用的正则化之间的对比
  • 4)Dropout在模型训练的时候有用,在模型预测的时候不会用
  • 5)L1和L2用在什么地方->损失函数+正则化函数(用来约束损失函数不要因为某个参数的权重而倾斜)->
    类比:你赚钱快是不是,我用梯度缴税(正则约束)去治你,再有钱你也麻头皮
  • 6)Layer Normalization正则化->多用于文本训练,针对每个句子(样本)进行正则化
  • 7)Layer Normalization(层归一化)通过归一化每个样本的特征向量来实现这一点,而不是像Batch Normalization(批归一化)那样归一化整个批次的数据。
  • 8)Batch Normalization(批归一化)通过对每个批次的数据进行归一化来实现这一点,具体来说,是对每个特征维度在批次中的分布进行归一化。

1-参考网址


  • 正则化知识概念

  • 常用的正则化


3-大模型训练中的正则化

1.正则化的定义与作用

正则化是机器学习和深度学习中的一种技术,旨在通过在模型的损失函数中添加惩罚项来控制模型的复杂度,从而防止模型在训练数据上过度拟合,提高模型的泛化能力。常见的正则化方法包括L1正则化、L2正则化、弹性网络正则化、Dropout、Batch

Normalization等。

2.常见的正则化方法及其应用场景

2.1 L1正则化(Lasso)

原理:通过在损失函数中添加特征权重的绝对值和,使得某些特征权重减小到零,从而实现特征选择。

应用场景:适用于高维数据和稀疏数据,特别是在特征数量大于样本数量时。

优点:可以实现特征选择,减少模型参数数量。

缺点:可能导致模型参数不稳定。

2.2 L2正则化(Ridge)

原理:通过在损失函数中添加特征权重的平方和,鼓励权重均匀分布,减小模型复杂性。

应用场景:适用于一般情况下有较少噪声的数据集。

优点:模型参数稳定,易于解释。

缺点:无法实现特征选择。

2.3 弹性网络正则化(Elastic Net)

原理:结合了L1和L2正则化,通过调节参数来平衡两者的影响。

应用场景:适用于大量特征且存在多重共线性的问题时。

优点:结合了L1和L2正则化的优点,可以同时实现特征选择和参数压缩。

缺点:参数选择较为复杂。

2.4 Dropout

原理:在训练过程中随机忽略神经网络中的一部分神经元,从而减少网络对特定神经元的依赖,提高泛化能力。

应用场景:广泛应用于深度学习中的神经网络模型训练时。

优点:可以有效防止过拟合,提高模型的泛化能力。

缺点:可能会增加训练时间。

2.5 Batch Normalization

原理:通过对每一层的输入进行标准化,加速训练过程并提高模型的泛化能力。

应用场景:广泛应用于深度学习中的各种神经网络模型。

优点:可以加速训练过程,提高模型的稳定性和泛化能力。

缺点:增加了模型的复杂度和计算量。

2.6 早停(Early Stopping)

原理:在训练过程中,当验证集上的性能不再提升时,提前停止训练,以防止过拟合。

应用场景:适用于各种机器学习和深度学习模型。

优点:简单有效,可以防止过拟合。

缺点:可能会导致模型欠拟合,需要合理选择停止条件。

2.7 权重衰减(Weight Decay)

原理:与L2正则化相似,通过在优化过程中引入权重的平方惩罚项来限制权重的大小,从而减少模型的复杂度。

应用场景:广泛应用于深度学习的优化过程中,尤其是针对大规模模型。

优点:能有效防止网络过拟合,尤其是在训练数据有限时。

缺点:与L2正则化类似,无法实现特征选择。

2.8 梯度惩罚(Gradient Penalty)

原理:对神经网络的梯度大小进行正则化,目的是约束网络的梯度不至于过大,避免过拟合。

应用场景:在对抗训练、生成对抗网络(GAN)和强化学习中具有广泛应用。

优点:可以促使模型学习到更加平滑的决策边界,从而提高模型的泛化能力。

缺点:增加了模型的复杂度和计算量。

2.9 特征选择和降维

原理:通过选择对预测有用的特征或对数据进行降维(如PCA)来减少模型的输入维度,从而降低模型复杂度。

应用场景:广泛应用于机器学习中的监督学习任务,尤其是高维数据集的处理。

优点:可以减少过拟合,提高模型的可解释性和计算效率。

缺点:可能会丢失一些有用的信息。

3.不同正则化方法的对比

正则化方法 原理 优点 缺点 适用场景
L1正则化 添加权重的绝对值和 实现特征选择,减少参数数量 参数不稳定 高维稀疏数据
L2正则化 添加权重的平方和 参数稳定,易于解释 无法实现特征选择 一般数据集
弹性网络 结合L1和L2正则化 同时实现特征选择和参数压缩 参数选择复杂 多重共线性数据
Dropout 随机忽略神经元 防止过拟合,提高泛化能力 增加训练时间 神经网络模型
Batch Normalization 输入标准化 加速训练,提高稳定性 增加复杂度 各种神经网络
Layer Normalization 每一层各特征维度的标准化 提升梯度流动稳定性,适合更深层模型 计算成本高 RNN、Transformer、小批量数据
早停 提前停止训练 防止过拟合 可能欠拟合 各种模型
权重衰减 权重平方惩罚 防止过拟合 无法特征选择 大规模模型
梯度惩罚 梯度大小正则化 学习平滑决策边界 增加复杂度 对抗训练、GAN
特征选择和降维 选择有用特征或降维 减少过拟合,提高效率 可能丢失信息 高维数据集

4-Batch Normalization

Batch Normalization(批归一化)是一种用于神经网络的技术,旨在加快训练速度并提高模型性能。它通过对每个批次的数据进行归一化来实现这一点,具体来说,是对每个特征维度在批次中的分布进行归一化。

简单示例

假设我们有一个简单的神经网络,其中有一个全连接层(Fully Connected Layer),输入是一个形状为 (batch_size, features)

的张量。我们以一个具体的例子来说明Batch Normalization的工作原理。

输入数据

假设我们有一个小批量数据,大小为 batch_size = 2,每个样本有 features = 3 个特征。输入数据如下:

python 复制代码
x = [[0.8, -1.2, 0.5],
     [1.0, 0.3, -0.7]]
计算步骤
  1. 计算每个特征维度的均值和方差

    • 对于第一个特征维度 [0.8, 1.0]
      • 均值:mean1 = (0.8 + 1.0) / 2 = 0.9
      • 方差:var1 = [(0.8 - 0.9)^2 + (1.0 - 0.9)^2] / 2 = 0.01
    • 对于第二个特征维度 [-1.2, 0.3]
      • 均值:mean2 = (-1.2 + 0.3) / 2 = -0.45
      • 方差:var2 = [(-1.2 - (-0.45))^2 + (0.3 - (-0.45))^2] / 2 = 0.9025
    • 对于第三个特征维度 [0.5, -0.7]
      • 均值:mean3 = (0.5 + (-0.7)) / 2 = -0.1
      • 方差:var3 = [(0.5 - (-0.1))^2 + (-0.7 - (-0.1))^2] / 2 = 0.18
  2. 归一化

    • 对于第一个特征维度:

      python 复制代码
      normalized1 = [(0.8 - 0.9) / sqrt(0.01 + eps),
                     (1.0 - 0.9) / sqrt(0.01 + eps)]

      其中 eps 是一个很小的数,用于防止除零错误。

    • 对于第二个特征维度:

      python 复制代码
      normalized2 = [(-1.2 - (-0.45)) / sqrt(0.9025 + eps),
                     (0.3 - (-0.45)) / sqrt(0.9025 + eps)]
    • 对于第三个特征维度:

      python 复制代码
      normalized3 = [(0.5 - (-0.1)) / sqrt(0.18 + eps),
                     (-0.7 - (-0.1)) / sqrt(0.18 + eps)]
  3. 线性变换

    • 归一化后的数据会通过一个线性变换参数 gammabeta 进行调整。

      python 复制代码
      output1 = gamma1 * normalized1 + beta1
      output2 = gamma2 * normalized2 + beta2
      output3 = gamma3 * normalized3 + beta3
总结

通过Batch Normalization,我们为每个特征维度计算批次内的均值和方差,并进行归一化,这样可以确保每个特征维度在批次中的分布更加稳定,从而有助于模型更好地学习和收敛。这种方法有效地减少了内部协变量偏移(Internal

Covariate Shift),提高了训练的稳定性和速度。

代码实现

在实际的深度学习框架中,Batch Normalization通常通过以下方式实现:

python 复制代码
import torch
import torch.nn as nn

# 定义Batch Normalization
batch_norm = nn.BatchNorm1d(num_features=3)

# 输入数据
x = torch.tensor([[0.8, -1.2, 0.5],
                  [1.0, 0.3, -0.7]], dtype=torch.float32)

# 应用Batch Normalization
output = batch_norm(x)

print(output)

这个简单的示例展示了Batch Normalization的基本操作流程。


5-Layer Normalization

Layer Normalization(层归一化)是一种用于神经网络的正则化技术,旨在提高模型的训练稳定性和收敛速度。它通过归一化每个样本的特征向量来实现这一点,而不是像Batch

Normalization(批归一化)那样归一化整个批次的数据。

简单示例

假设我们有一个简单的神经网络,其中有一个全连接层(Fully Connected Layer),输入是一个形状为 (batch_size, features)

的张量。我们以一个具体的例子来说明Layer Normalization的工作原理。

输入数据

假设我们有一个小批量数据,大小为 batch_size = 2,每个样本有 features = 3 个特征。输入数据如下:

python 复制代码
x = [[0.8, -1.2, 0.5],
     [1.0, 0.3, -0.7]]
计算步骤
  1. 计算每个样本的均值和方差

    • 对于第一个样本 [0.8, -1.2, 0.5]
      • 均值:mean1 = (0.8 + (-1.2) + 0.5) / 3 = 0.0333
      • 方差:var1 = [(0.8 - 0.0333)^2 + (-1.2 - 0.0333)^2 + (0.5 - 0.0333)^2] / 3 = 0.7667
    • 对于第二个样本 [1.0, 0.3, -0.7]
      • 均值:mean2 = (1.0 + 0.3 + (-0.7)) / 3 = 0.2
      • 方差:var2 = [(1.0 - 0.2)^2 + (0.3 - 0.2)^2 + (-0.7 - 0.2)^2] / 3 = 0.5467
  2. 归一化

    • 对于第一个样本:

      python 复制代码
      normalized1 = [(0.8 - 0.0333) / sqrt(0.7667 + eps),
                     (-1.2 - 0.0333) / sqrt(0.7667 + eps),
                     (0.5 - 0.0333) / sqrt(0.7667 + eps)]

      其中 eps 是一个很小的数,用于防止除零错误。

    • 对于第二个样本:

      python 复制代码
      normalized2 = [(1.0 - 0.2) / sqrt(0.5467 + eps),
                     (0.3 - 0.2) / sqrt(0.5467 + eps),
                     (-0.7 - 0.2) / sqrt(0.5467 + eps)]
  3. 线性变换

    • 归一化后的数据会通过一个线性变换参数 gammabeta 进行调整。

      python 复制代码
      output1 = gamma * normalized1 + beta
      output2 = gamma * normalized2 + beta
总结

通过Layer Normalization,我们为每个样本独立地计算均值和方差,并进行归一化,这样可以确保每个样本在特征维度上的分布更加稳定,从而有助于模型更好地学习和收敛。

代码实现

在实际的深度学习框架中,Layer Normalization通常通过以下方式实现:

python 复制代码
import torch
import torch.nn as nn

# 定义Layer Normalization
layer_norm = nn.LayerNorm(normalized_shape=[3])

# 输入数据
x = torch.tensor([[0.8, -1.2, 0.5],
                  [1.0, 0.3, -0.7]], dtype=torch.float32)

# 应用Layer Normalization
output = layer_norm(x)

print(output)

这个简单的示例展示了Layer Normalization的基本操作流程。


相关推荐
科技前沿资讯5 分钟前
走出实验室的人形机器人,将复刻ChatGPT之路?
人工智能
顾道长生'25 分钟前
(EMNLP-2023)预训练语言模型的稀疏低秩自适应
人工智能·语言模型·自然语言处理
顾道长生'1 小时前
(NIPS-2024)GAN 已死;GAN 万岁!现代基线 GAN
人工智能·神经网络·生成对抗网络
口_天_光健1 小时前
机器学习——逻辑回归
python·机器学习·逻辑回归
打码人的日常分享1 小时前
智慧城市视联网一体化平台整体解决方案(Word原件)
大数据·数据库·人工智能·智慧城市·规格说明书
成都远石1 小时前
实景三维模型在智慧城市中的应用
人工智能·智慧城市·实景三维模型
yzx9910131 小时前
opencv仿射变换
人工智能·opencv·计算机视觉
图扑软件2 小时前
智慧充电桩可视化管理提升能源效率
前端·javascript·人工智能·能源·数字孪生·可视化·充电桩
啵啵鱼爱吃小猫咪2 小时前
Franka例程学习——joint_point_to_point_motion
c++·人工智能·python·算法·ubuntu·机器人
游戏乐趣2 小时前
借助扣子AI辅导孩子学习英语
人工智能·学习