当前位置: 首页 > 科技观察

深度学习中归一化技术的一般总结

时间:2023-03-19 21:28:14 科技观察

训练深度神经网络是一项具有挑战性的任务。多年来,研究人员提出了不同的方法来加速和稳定学习过程。归一化是一种已被证明在这方面非常有效的技术。在这篇文章中,我将使用类比和可视化来回顾其中的一些方法,这将帮助您理解它们产生的原因以及您的思考过程。为什么要规范化?例如,我们现在构建一个具有两个特征的简单神经网络模型。这两个特征是年龄:范围从0到65和薪水:范围从0到10000。我们将这些特征提供给模型并计算梯度。不同大小的输入会导致不同的权重更新和优化器向最小值的不平衡步骤。这也使得损失函数的形状不成比例。在这种情况下,有必要使用较低的学习率来避免过冲,这意味着学习过程较慢。所以我们的解决方案是通过减去均值(居中)并除以标准差来归一化输入并收缩特征。这个过程也被称为“漂白”,处理后所有值的均值和单位方差都为零,可以提供更快的收敛和更稳定的训练。这是一个很好的解决方案,那么我们为什么不规范化网络中每一层的激活呢?我们先来看激活的归一化方法BatchNormalization。2015年,SergeyIoffe和ChristianSzegedy[3]采用了Thisidea来解决internalcovariateshift的问题。以前,由于权重的更新,输入层分布是不断变化的。所以下层总是需要适应新的分布,导致收敛速度变慢,训练不稳定。批量归一化提供了一种控制和优化每一层之后的分布的方法。该过程与输入归一化相同,但我们添加了两个可学习参数γ和β。通过代码来解释比枯燥的公式好很多,所以BN的代码如下:defBatchNorm(x,gamma,beta,eps=1e-5):#x:inputshape[N,C,H,W]N,C,H,W=x.shapemean=torch.mean(input=x,dim=[0,2,3],keepdim=True)var=torch.var(input=x,dim=[0,2,3],keepdim=True)#mean,varshape:[1,C,1,1]x=(x-mean)/torch.sqrt(var+eps)returnx*gamma+beta这两个参数传给反向传播沿着网络学习。他们通过缩放(γ)和移动(β)激活来优化分布。由于存在固定分布,可以提高学习率,加快收敛速度??。除了计算提升之外,BN还可以用作正则化技术。数据集统计数据的近似产生的噪声消除了dropout的需要。但这是一把双刃剑。此估计仅适用于较大的批次。当批次数量很少时,性能会急剧下降。BN的另一个缺点是对批处理的依赖。如果我们传递单个样本而不是一批样本,网络将不得不使用预先计算的训练均值和方差,这可能会导致不同的结果。这个问题的重要性促使创建替代方案以避免依赖批处理。LayerNormalization这是GeoffreyE.Hinton等人的首次尝试。在2016[4]中减少了对批量大小的限制。提出这种方法的主要原因是找不到BN在递归神经网络中的应用,需要找到一种替代方法。在深度神经网络中,由于层数是固定的,所以很容易存储每个BN层的统计信息。然而,在RNN中,输入和输出形状的长度不同。因此,在这种情况下,最好使用来自单个时间步长(样本)而不是整个批次的统计数据进行归一化。defLayerNorm(x,gamma,beta,eps=1e-5):#x:输入形状[N,C,H,W]N,C,H,W=x.shapemean=torch.mean(input=x,dim=[1,2,3],keepdim=True)var=torch.var(input=x,dim=[1,2,3],keepdim=True)#mean,var形状:[N,1,1,1]x=(x-mean)/torch.sqrt(var+eps)returnx*gamma+beta在此方法中,batch(N)中的每个示例都在[C,H,W]维度上归一化。和BN一样,它加速和稳定训练并且不受批次限制。该方法可用于批量大小为1的在线学习任务。InstanceNormalizationInstanceNormalization由DmitryUlyanov等人介绍。在他们2016年的论文[5]中。这是尝试减少对批处理的依赖以改进样式传输网络的另一个结果。defInstanceNorm(x,gamma,beta,eps=1e-5):#x:输入形状[N,C,H,W]N,C,H,W=x.shapemean=torch.mean(input=x,dim=[2,3],keepdim=True)var=torch.var(input=x,dim=[2,3],keepdim=True)#mean,var形状:[N,C,1,1]x=(x-mean)/torch.sqrt(var+eps)returnx*gamma+beta跨批次和通道的归一化允许从图像中移除特定的对比度信息,这有助于泛化。这种方法在Pix2Pix或CycleGAN等生成模型中广受欢迎,并成为著名的StyleGAN2中使用的自适应实例归一化的先驱。GroupNormalizationGroupNormalization是在2018[1]论文中引入的,直接解决了CNN的BN局限性。主要针对分布式学习,batch分到很多机器上。这些都是针对少量示例进行训练的,比如6-8,在某些情况下甚至是1-2。GN可以理解为Layer和Instance的混合体。GN将通道分成组并在它们之间进行归一化。该方案使计算独立于批量大小。defGroupNorm(x,gamma,beta,G,eps=1e-5):#x:形状为[N,C,H,W]的输入特征#G:组数N,C,H,W=x.shapex=torch.reshape(input=x,shape=[N,G,C//G,H,W])均值=torch.mean(input=x,dim=[2,3,4],keepdim=True)var=torch.var(input=x,dim=[2,3,4],keepdim=True)#mean,var形状:[N,G,1,1,1]x=(x-mean)/torch.sqrt(var+eps)x=torch.reshape(input=x,shape=[N,C,H,W])返回x*gamma+betaGN优于在小批量上训练的BN,但无法击败大批量,但这是一个很好的起点。上面的激活归一化方法我们基本都听说过,也经常用到。下面介绍一下权重的归一化方法。权重标准化我们已经标准化了输入和层输出,唯一剩下的就是权重。因为它们可以在没有任何控制的情况下变大,尤其是当我们想要对输出进行归一化时。通过标准化权重,我们实现了更平滑的损失和更稳定的训练。defWeightStand(w,eps=1e-5):#w:输入特征形状[Cin,Cout,kernel_size,kernel_size]mean=torch.mean(input=w,dim=[0,2,3],keepdim=True)var=torch.var(input=w,dim=[0,2,3],keepdim=True)#mean,varshape:[1,Cout,1,1]w=(w-mean)/torch.sqrt(var+eps)returnwweight的归一化对Gro??upNormalization是一个很好的辅助。在BN(大批量)仅使用一个样本的情况下,结合这些方法会产生更好的结果。除此之外,还有人提出了一种BCN方法,叫做BatchChannelNormalization。简而言之,每一层都使用了BN和GN。总结归一化是深度学习中的一个基本概念。它加快了计算速度并稳定了训练。多年来已经开发了许多不同的技术。本文整理了目前与之相关的方法,希望对大家有所帮助。