购物网站的页面设计,衡水网站建设优化推广,猫猫出品wordpress,旅游网页设计页面模板深度学习正则化
学习⽬标 知道 L2 正则化与 L1 正则化的⽅法 知道随机失活 droupout 的应⽤ 知道提前停⽌的使⽤⽅法 知道 BN 层的使⽤⽅法 在设计机器学习算法时不仅要求在训练集上误差⼩#xff0c;⽽且希望在新样本上的泛化能⼒强。许多机器学习算法都采⽤相关的策略来减⼩…深度学习正则化
学习⽬标 知道 L2 正则化与 L1 正则化的⽅法 知道随机失活 droupout 的应⽤ 知道提前停⽌的使⽤⽅法 知道 BN 层的使⽤⽅法 在设计机器学习算法时不仅要求在训练集上误差⼩⽽且希望在新样本上的泛化能⼒强。许多机器学习算法都采⽤相关的策略来减⼩测试误差这些策略被统称为正则化。因为神经⽹络的强⼤的表示能⼒经常遇到过拟合所以需要使⽤不同形式的正则化策略。 正则化通过对算法的修改来减少泛化误差⽬前在深度学习中使⽤较多的策略有参数范数惩罚提前终⽌ DropOut 等接下来我们对其进⾏详细的介绍。 1. L1与L2正则化(回顾) L1 和 L2 是最常⻅的正则化⽅法。它们在损失函数 cost function 中增加⼀个正则项由于添加了这个正则化项权重矩阵的值减⼩因为它假定具有更⼩权重矩阵的神经⽹络导致更简单的模型。 因此它也会在⼀定程度上减少过拟合。然⽽这个正则化项在 L1 和 L2 中是不同的。 L2 正则化 这⾥的 λ 是正则化参数它是⼀个需要优化的超参数。 L2 正则化⼜称为权重衰减因为其导致权重趋向于 0 但不全是 0 L1 正则化 这⾥我们惩罚权重矩阵的绝对值。其中 λ 为正则化参数是超参数不同于 L2 权重值可能被减少到 0. 因此 L1 对于压缩模型很有⽤。其它情况下⼀般选择优先选择 L2 正则化。 2.Dropout正则化 dropout 是在深度学习领域最常⽤的正则化技术。 Dropout 的原理很简单假设我们的神经⽹络结构如下所示在每个迭代过程中随机选择某些节点并且删除前向和后向连接。 因此每个迭代过程都会有不同的节点组合从⽽导致不同的输出这可以看成机器学习中的集成⽅法 ensemble technique 。集成模型⼀般优于单⼀模型因为它们可以捕获更多的随机性。相似地 dropout 使得神经⽹络模型优于正常的模型。 代码分析 # 这行代码创建了一个 Dropout 层失活概率为 0.4即在训练过程中每个神经元有 40% 的概率被设置为零。
dropout nn.Dropout(p 0.4)
# 创建了一个形状为 (1, 4) 的输入张量值在 0 到 9 之间并将其转换为浮点数
inputs torch.randint(0,10,size(1,4)).float()
# 创建了一个线性层输入特征维度为 4输出特征维度为 5
layer nn.Linear(4,5)
y layer(inputs)
print(未失活FC层的输出结果\n, y)
y dropout(y)
print(失活后FC层的输出结果\n, y)
未失活FC层的输出结果tensor([[-5.5901, 1.1587, 2.6764, -3.0007, 5.9511]],grad_fnAddmmBackward0)
失活后FC层的输出结果tensor([[-0.0000, 0.0000, 4.4607, -5.0012, 0.0000]], grad_fnMulBackward0)3.提前停⽌ 提前停⽌ early stopping 是将⼀部分训练集作为验证集 validationset 。 当验证集的性能越来越差时或者性能不再提升则⽴即停⽌对该模型的训练。 这被称为提前停⽌。 在上图中在虚线处停⽌模型的训练此时模型开始在训练数据上过拟合。 1. 定义提前停止的逻辑
提前停止需要设置以下参数 patience允许模型在验证集上性能没有提升的最大 epoch 数。min_delta验证集性能提升的最小阈值只有当提升超过此值时才认为性能有改善。best_val_loss记录当前最佳的验证损失。patience_counter记录验证损失没有改善的连续 epoch 数。 import torch
import torch.nn as nn
import torch.optim as optim# 定义模型
model nn.Linear(10, 1) # 示例模型
criterion nn.MSELoss() # 损失函数
optimizer optim.SGD(model.parameters(), lr0.01) # 优化器# 提前停止的参数
early_stopping_patience 5 # 耐心值
min_delta 0.001 # 最小性能提升
best_val_loss float(inf) # 初始化最佳验证损失
patience_counter 0 # 耐心计数器# 模拟训练和验证数据
train_loader [(torch.randn(10, 10), torch.randn(10, 1)) for _ in range(100)]
val_loader [(torch.randn(10, 10), torch.randn(10, 1)) for _ in range(20)]def validate(model, val_loader, criterion):model.eval() # 设置为评估模式total_loss 0with torch.no_grad():for inputs, targets in val_loader:outputs model(inputs)loss criterion(outputs, targets)total_loss loss.item()return total_loss / len(val_loader)# 训练循环
num_epochs 100
for epoch in range(num_epochs):model.train() # 设置为训练模式train_loss 0for inputs, targets in train_loader:optimizer.zero_grad()outputs model(inputs)loss criterion(outputs, targets)loss.backward()optimizer.step()train_loss loss.item()train_loss / len(train_loader)# 验证阶段val_loss validate(model, val_loader, criterion)print(fEpoch {epoch1}/{num_epochs}, Train Loss: {train_loss:.4f}, Val Loss: {val_loss:.4f})# 提前停止逻辑if val_loss best_val_loss - min_delta:best_val_loss val_losstorch.save(model.state_dict(), best_model.pth) # 保存最佳模型patience_counter 0 # 重置耐心计数器else:patience_counter 1if patience_counter early_stopping_patience:print(Early stopping triggered...)break 4. 批标准化BN层 批标准化 (BN 层 ,Batch Normalization) 是 2015 年提出的⼀种⽅法在进⾏深度⽹络训练时⼤多会采取这种算法与全连接层⼀样 BN 层也是属于⽹络中的⼀层。 批标准化Batch Normalization简称BN是一种在深度神经网络中常用的技巧旨在解决训练过程中的内部协变量偏移Internal Covariate Shift问题从而加速训练过程并提高模型的稳定性和性能。内部协变量偏移是指由于网络参数在训练过程中的变化导致每一层的输入分布也在不断变化这会使得网络的训练变得困难。 在每⼀层输⼊之前将数据进⾏ BN 然后再送⼊后续⽹络中进⾏学习 批标准化的工作原理 批标准化通过在每一层的输入上进行标准化处理使得每一层的输入分布保持相对稳定。具体来说批标准化包括以下步骤 计算均值和方差对于每个小批量mini-batch的数据计算该层输入的均值和方差 其中 m 是小批量的大小 xi 是第 i 个输入样本。 标准化使用计算得到的均值和方差对每个输入样本进行标准化 其中 ϵ 是一个很小的常数用于防止除以零的情况。 缩放和偏移为了使网络具有足够的表达能力引入两个可学习的参数 γ 和 β对标准化后的输入进行缩放和偏移 其中 γ 和 β 是通过训练学习得到的参数。 PyTorch中的实现在PyTorch中批标准化可以通过torch.nn.BatchNorm1d、torch.nn.BatchNorm2d 和 torch.nn.BatchNorm3d 等类来实现分别用于1D、2D和3D数据。 api
torch.nn.BatchNorm2d 是 PyTorch 中用于对二维卷积层输出进行 批量归一化Batch Normalization的模块。它通过规范化层的输入来 减少内部协变量偏移从而加速训练过程并提高模型的泛化能力。 torch.nn.BatchNorm2d(num_features, eps1e-05, momentum0.1, affineTrue, track_running_statsTrue) 参数名 解释 num_features 输入的通道数num_channels即输入张量的第二个维度。 eps 一个数值稳定性的小常数用于防止除以零。默认值为 1e-5。 momentum 用于更新运行时均值和方差的动量参数。默认值为 0.1。较大的 momentum 会使估计值更依赖于之前的统计信息。 affine 布尔值 如果为 True则引入可学习的缩放因子gamma和偏移因子beta用于对归一化后的数据进行仿射变换。如果设置为False则不会引入可学习的参数仅进行归一化默认值为 True。 track_running_stats 布尔值如果为 True则在训练过程中跟踪运行时的均值和方差并在评估模式下使用这些统计量进行归一化。默认值为 True。 以下是一个使用torch.nn.BatchNorm2d 的示例 import torch
import torch.nn as nn# 定义 BatchNorm2d 模块
bn nn.BatchNorm2d(3) # 假设输入通道数为 3# 创建一个假的输入数据形状为 [batch_size, num_channels, height, width]
input torch.randn(4, 3, 10, 10)# 应用 BatchNorm2d 模块
output bn(input)
print(output.shape) # 输出形状与输入相同 import torch
import torch.nn as nn# affine参数设为True表示weight和bias将被使用
m nn.BatchNorm2d(2, eps1e-05, momentum0.1, affineTrue) 2表示输入张量的通道数为2。
eps1e-05一个小的常数用于防止除以零的情况。
momentum0.1用于计算运行时均值和方差的动量值。
affineTrue表示会使用可学习的权重和偏置参数。# 创建一个形状为 (1, 2, 3, 4) 的随机张量表示一个批量大小为1通道数为2高度为3宽度为4的输入数据。
input torch.randn(1, 2, 3, 4)
print(input--, input)
output m(input)
print(output--, output)
print(output.size())
print(m.weight)
print(m.bias)input-- tensor([[[[-0.8234, -1.2278, -0.4963, -2.3977],[-0.8070, 0.2189, -1.0539, 0.0155],[-2.8108, -2.0466, 0.3954, -0.0352]],[[-0.5503, -2.3331, -1.0138, -0.7310],[-1.2487, 0.2061, -1.0572, 0.0954],[ 0.5301, -0.3816, 0.1127, 0.0587]]]])
output-- tensor([[[[ 0.0989, -0.3051, 0.4256, -1.4736],[ 0.1153, 1.1400, -0.1314, 0.9369],[-1.8862, -1.1229, 1.3163, 0.8862]],[[-0.0314, -2.3395, -0.6315, -0.2653],[-0.9356, 0.9479, -0.6877, 0.8046],[ 1.3674, 0.1870, 0.8270, 0.7571]]]],grad_fnNativeBatchNormBackward0)
torch.Size([1, 2, 3, 4])
Parameter containing:
tensor([1., 1.], requires_gradTrue)
Parameter containing:
tensor([0., 0.], requires_gradTrue)批标准化层的权重和偏置参数默认初始化为1和0但可以根据需要进行自定义初始化。 import torch
import torch.nn as nn# 创建一个卷积层
conv_layer nn.Conv2d(in_channels3, out_channels16, kernel_size3, padding1)# 创建一个批标准化层
bn_layer nn.BatchNorm2d(num_features16)# 创建一个激活函数层
activation_layer nn.ReLU()# 创建一个输入张量假设是一个小批量的图像数据
input_tensor torch.randn(4, 3, 32, 32) # (batch_size, channels, height, width)# 前向传播
conv_output conv_layer(input_tensor)
bn_output bn_layer(conv_output)
activated_output activation_layer(bn_output)print(卷积层输出的形状:, conv_output.shape)
print(批标准化层输出的形状:, bn_output.shape)
print(激活函数层输出的形状:, activated_output.shape)
批标准化的优点 加速训练批标准化可以减少内部协变量偏移使得每一层的输入分布保持相对稳定从而加速训练过程。提高模型性能批标准化可以提高模型的稳定性和性能尤其是在使用较深的网络时。减少对初始化的依赖批标准化可以减少对初始权重的依赖使得模型对初始权重的选择更加鲁棒。允许使用更高的学习率由于批标准化可以减少梯度爆炸和梯度消失的问题因此可以使用更高的学习率进行训练。 批标准化的注意事项 小批量大小批标准化依赖于小批量的统计数据因此小批量的大小不能太小。如果小批量大小太小计算得到的均值和方差可能会不够准确从而影响批标准化的效果。推理时的行为在推理inference时批标准化层会使用在训练过程中计算得到的全局均值和方差而不是当前小批量的均值和方差。这是通过在训练过程中逐步更新全局均值和方差来实现的。与Dropout的结合批标准化和Dropout都是正则化技术但它们的作用机制不同。在使用批标准化时可以适当减少Dropout的比例因为批标准化本身也具有一定的正则化效果。 总结 知道 L2 正则化与 L1 正则化的⽅法 在损失函数 cost function 中增加⼀个正则项由于添加了这个正则化项权重矩阵的值减⼩因为它假定具有更⼩权重矩阵的神经⽹络导致更简单的模型 知道随机失活 droupout 的应⽤ 在每个迭代过程中随机选择某些节点并且删除前向和后向连接知道提前停⽌的使⽤⽅法 当看到验证集的性能越来越差时或者性能不再提升⽴即停⽌对该模型的训练 知道 BN 层的使⽤⽅法 利⽤⽹络训练时⼀个 mini-batch 的数据来计算该神经元 xi 的均值和⽅差 , 归⼀化后并重构因⽽称为 Batch Normalization