网站续费多少钱购物网站功能详细介绍

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

网站续费多少钱,购物网站功能详细介绍,微网站建设图片,phpcms 手机网站后台批量归一化层#xff08;BatchNorm层#xff09;#xff0c;或简称为批量归一化#xff08;Batch Normalization#xff09;#xff0c;是深度学习中常用的一种技术#xff0c;旨在加速神经网络的训练并提高收敛速度。 一、基本思想 为了让数据在训练过程中保持同一分布…        批量归一化层BatchNorm层或简称为批量归一化Batch Normalization是深度学习中常用的一种技术旨在加速神经网络的训练并提高收敛速度。 一、基本思想 为了让数据在训练过程中保持同一分布在神经网络的中间层隐藏层的一层或多层上进行批量归一化。对于每一个小批次数据mini-batch计算该batch的均值与方差在将线性计算结果送入激活函数之前先对计算结果进行批量归一化处理即减均值、除标准差保证计算结果符合均值为0、方差为1的标准正态分布然后再将计算结果作为激活函数的输入值进行计算。这样可以使得网络中间层的输入保持相对稳定有助于解决训练过程中的梯度消失或梯度爆炸问题。 批量归一化的本质对于每个隐层神经元把逐渐向非线性函数映射后向取值区间极限饱和区靠拢的输入分布强制拉回到均值为0方差为1的标准正态分布使得非线性变换函数的输入值落入对输入比较敏感的区域。 一般而言将数据转化为均值为0、方差为1的分布这一过程被称为标准化Standardization而归一化Normalization一般指的是将一列数据变化到某个固定区间范围中。 二、了解几个概念 1. 批次batch 神经网络处理数据不是一个数据一个数据的处理而是一次输入很大一个批次比如99张图片输入之后再划分很多个批次一次处理一个批次。 图1 神经网络中多批次数据输入 2. 均值与方差 在训练过程中分批次训练划分batch和batch_size计算每一个批次batch的对应位置的均值和方差。如计算一个批次中所有图片的每一个位置的元素的均值与方差一张图片有多少个元素就有多少个均值与方差。最后得到的均值和方差是用向量的形式表现的。 图2 小批次中的计算机过程 例一个batch有3个输入每个输入是一个长度为4的向量 图3 归一化的均值计算 三、若干归一化要解决的问题 为什么要进行批量归一化主要是在神经网络训练过程中存在以下问题 1. 协变量偏移 在机器学习中一般假设模型输入数据的分布是稳定的若是模型输入数据的分布发生变化这种现象被称为协变量偏移covariate shift模型的训练集和测试集的分布不一致也属于协变量偏移现象同理在一个复杂的机器学习系统中也会要求系统的各个子模块在训练过程中输入分布是稳定的若是不满足则称为内部协变量偏移internal covariate shiftICS。 图4 训练集和测试集的分布不一致导致的协变量偏移问题 2. 梯度消失问题 经过神经网络中多层的变换很可能使得后面层的输入数据变得过大或过小从而掉进激活函数例如Sigmoid、Tanh的饱和区。 图5 Sigmoid函数存在梯度消失问题 饱和区的梯度随x的变化y的变化很不明显即会产生梯度消失问题进而导致学习过程停止。为防止这个问题我们希望数据落入激活函数中间的非饱和区。为了降低内部协变量偏移所带来的负面影响在训练过程中一般会采用非饱和型激活函数ReLU、精细的网络参数初始化保守的学习率但这不仅会使得网络的学习速度太慢还会使得最终效果特别依赖于网络的初始化。 3. 梯度爆炸问题 梯度爆炸Gradient Explosion指的是在反向传播过程中梯度值变得非常大超出了网络的处理范围从而导致权重更新变得不稳定甚至不收敛的现象。 图6 梯度爆炸问题 4. 过拟合问题 四、归一化的数学表达 对全连接层做批量归一化时。通常将批量归一化层置于全连接层中的仿射变换和激活函数之间。设全连接层的输入为u权重参数和偏差参数分别为W和b则批量归一化输入必由仿射变换xWub得到。 图7 全连接层结构 激活函数sigmoid为设批量归一化的运算符为BN。那么使用批量归一化的全连接层的输出为。u是由多个小批量batch组成其中一个batch由m个样本组成仿射变换的输出为一个新的batch正是批量归一化层的输入中任意样本批量归一化层的输出同样是d维向量。 归一化层的输出由以下几步求得。 1. 求小批量的均值和方差。 其中的平方计算是按元素求平方。 2. 标准化和归一化。 1标准化。使用按元素开方和按元素除法的方法对进行标准化。 这里是一个很小的常数保证分母大于0。 2归一化。在上面标准化的基础上批量归一化层引入了两个可以学习的模型参数缩放scale参数和偏移shift参数。这两个参数和形状相同皆为d维向量。 3. 计算批量归一化层的输出参数和参数与分别做按元素乘法符号⊙和加法计算 至此我们得到了的批量归一化的输出。 注意当和可学习的拉伸和偏移两个参数对归一化操作无益即学出的模型可以不使用批量归一化。 五、工作流程 批量归一化可以看作是在每一层输入和上一层输出之间加入了一个新的计算层对数据的分布进行额外的约束来解决以上问题。 在训练过程中批量归一化会对每个神经元卷积核中的一个通道的激活输入进行如下变换具体实现步骤如下 计算批量均值与方差对于给定的小批量数据计算其特征的均值与方差。归一化使用计算出的均值和方差对小批量数据中的每个特征进行归一化处理确保输出的均值接近0方差接近1。缩放与偏移引入缩放因子γ和偏移因子β两个可学习的参数这两个参数是在训练过程中学习得到的归一化后的数据会通过这两个参数进行缩放和偏移允许模型恢复可能被归一化操作去除的有用特征。 其算法流程如图所示 图8 归一化算法流程 在模型推理或测试时均值和方差不再针对每个小批量实时计算而是使用整个训练集的移动平均值。 六、作用与优势 1. 加速训练收敛通过减小内部协变量偏移Internal Covariate Shift使得输入分布更加稳定从而可以使用更高的学习率加速训练收敛速度减少训练时间加速神经网络的训练过程。 2. 提高稳定性批量归一化有助于控制梯度的变化范围防止梯度爆炸或消失从而提高训练的稳定性。 3. 提高模型性能稳定的输入数据分布有助于模型学习到更加鲁棒的特征表示从而提高模型的性能。 4. 减少过拟合BatchNorm层也可以被看作一种正则化方法因为它可以减少模型的过拟合风险。 5. 减少对权重初始化的依赖和敏感性使得网络对权重初始化的依赖减小简化了超参数的选择。即使初始化不是最优的模型也能较好地收敛。 七、注意事项 在使用BatchNorm层时需要注意选择合适的小批量大小Batch Size过小或过大的小批量都可能影响BatchNorm层的效果。BatchNorm层通常位于卷积层或全连接层之后激活函数之前。但也有一些变种将BatchNorm层放在激活函数之后。在训练过程中BatchNorm层会维护均值和方差的指数移动平均以供推理阶段使用。因此在训练结束后需要保存这些移动平均值作为模型的一部分。 八、应用场景 批量归一化在神经网络中广泛应用特别是在卷积神经网络CNN和全连接网络FCN中。当神经网络各层的输入数据分布发生变化时例如训练过程中每个批次的数据分布不一致这种情况下适合使用批量归一化来稳定网络的训练。 而在深度学习框架中BatchNorm层通常作为一层如BatchNorm层来实现可以轻松地集成到神经网络模型中。在训练阶段BatchNorm层会根据小批量的统计信息来规范化输入数据在推理测试阶段BatchNorm层则使用训练过程中计算得到的移动平均均值和方差来规范化输入数据。 九、PyTorch实现 在PyTorch中可以通过nn.BatchNorm1d、nn.BatchNorm2d和nn.BatchNorm3d等类来实现一维、二维和三维的批量归一化。以下是一个简单的示例展示了如何在全连接神经网络中使用批量归一化 pythonimport torchimport torch.nn as nnimport torch.optim as optimclass SimpleNN(nn.Module):def init(self, input_size, hidden_size, output_size):super(SimpleNN, self).init()self.fc1 nn.Linear(input_size, hidden_size)self.bn1 nn.BatchNorm1d(hidden_size)self.relu nn.ReLU()self.fc2 nn.Linear(hidden_size, output_size)def forward(self, x):out self.fc1(x)out self.bn1(out)out self.relu(out)out self.fc2(out)return out# 定义模型、损失函数和优化器model SimpleNN(input_size20, hidden_size50, output_size10)criterion nn.CrossEntropyLoss()optimizer optim.Adam(model.parameters(), lr0.001)# 模拟训练过程for epoch in range(100):inputs torch.randn(32, 20)  # 小批量数据labels torch.randint(0, 10, (32,))  # 标签# 前向传播outputs model(inputs)loss criterion(outputs, labels)# 反向传播和优化optimizer.zero_grad()loss.backward()optimizer.step() 在这个示例中nn.BatchNorm1d用于对隐藏层的输出进行批量归一化从而提高训练效率和稳定性。