首页 > 编程知识 正文

正则化方程(对正则化的理解)

时间:2023-05-06 00:07:51 阅读:92539 作者:1183

作者: dhwani mehta

编译:龙海阳

导读

CNN中更好的dropout方法的理解。

规范化技术有助于避免数据科学专家面临的最常见的问题,即过拟合。 关于正则化,提出了L1和L2正则化、Dropout、Early Stopping、数据扩展等几种方法。 本文主要讨论的是DropBlock规范化技术。 特别是在使用卷积层时,其性能明显优于传统的规范化方法。

DropBlock 算法的简单直觉

引入DropBlock方法是为了克服Dropout随机丢弃特性的主要缺点,该方法已被证明是全连接网络的有效策略,但在与特征空间相关的卷积层中效果较差。 DropBlock技术在被称为块的相邻关联区域中丢弃特征。 这样可以达到生成更简单模型的目的,同时引入每次训练迭代学习部分网络权重的概念,补偿权重矩阵,减少过拟合。

在卷积层中使用Dropout在根本上有什么不一样?

和全连接层的dropout操作可以理解为神经网络的权重矩阵的列为零的操作。 据此,也可以不训练这个神经元。 dropout在卷积层中得不到同样的效果。 即使卷积的权重矩阵的列为零,通过卷积核也能够训练权重。 因为特征图的邻接区域具有相关的特征。

DropBlock算法

DropBlock算法的主要参数是: a )要删除的块的大小,即block_size,b )需要删除多少激活单元,即,在各个特征信道上显示其DropBlock掩码

DropBlock中的block大小对规范化的影响

从直观上看,如果将样本掩码m上的各个零扩展到block_size X block_size大小的0 block,我们的feature map需要删除更多的特征,训练迭代中需要学习的权重比例也将减少,最终过拟合。 因此,以更大的块大小训练的模型会去除更多的语义信息,使正则化更强。 另外,块大小为1时,可以推断出DropBlock对应于Dropout,块大小复盖了所有特征地图大小时,DropBlock类似于SpatialDropout。

由上图可以看出,在绿色曲线(未经DropBlock训练的模型)的推理过程中,验证精度随着保持概率的降低,随着梯度的变陡而急速下降。 块大小为1时,DropBlock类似于Dropout,因此块大小为1时,随着保持概率的降低,验证精度迅速降低,DropBlock在删除语义信息方面更有效。

在DropBlock中对正则化的效果

此参数描述要删除的活动单元的数量,具体取决于keep_prob和block_size。

其中:

keep_prob是设定阈值的概率,低于该值的所有元素都会被删除。

feat_size是特征地图的大小

feat_size - block_size 1是有效的种子区域

估计keep_prob越大,被删除的激活就越少。

删除块策略

实验研究表明,在训练中逐渐增加dropout单元的数量,可以提高训练的准确性和对超参数选择的鲁棒性。 如果在训练中维持一定的保留概率,或者从一开始就降低值,那么更多的激活单元会从一开始就被抛弃,失去信息,从而破坏学习过程。 随着时间的经过,可以从1线性地将keep_prob减少到目标值

提供更健壮的结果。

算法的简单可视化

DropBlock Mask的计算

import torch from torch import * """ Step-1]  Generate a random feature map using NCHW format  Here I am considering a batch_size=1, no. of channels = 1, Height and width of the feature map to be 5 each """ x = torch.randint(1,10, (1, 1, 5, 5)) print(x) class DropBlock(torch.nn.Module):     """     Step-2] Parameters Initialization     Initialization of block_size, keep_prob, stride and padding respectively      which can be altered accordingly for experimentation     """     def __init__(self, block_size=3, keep_prob=0.9):         self.block_size = block_size         self.keep_prob = keep_prob         self.gamma = None         self.kernel_size = (block_size, block_size)         self.stride = (1, 1)         self.padding = (block_size//2, block_size//2)         self.training=True     """     Step-3] Compute gamma using the equation mentioned aprior in the blog.     Dependency can be seen on block_size and keep_prob for its computation.     """     def calculate_gamma(self, x):                  return (1 - self.keep_prob) * x.shape[-1]**2/                 (self.block_size**2 * (x.shape[-1] - self.block_size + 1)**2)           def forward(self, x):         """         Step-4]         Check on whether it is inference mode as DropBlock Algorithm like DropOut Algorithm is performed only during the time of training         """         if not self.training:             return x         if self.gamma is None:             self.gamma = self.calculate_gamma(x)         """         Step-5]         Use the gamma obtained to compute the sample mask using Bernoulli         """         p = torch.ones_like(x) * self.gamma         mask = 1 - torch.nn.functional.max_pool2d(torch.bernoulli(p),                                                   self.kernel_size,                                                   self.stride,                                                   self.padding)        """        Step-6]        Normalization of Features        """         return mask * x * (mask.numel()/mask.sum()) """ Make respective function calls """ db = DropBlock() db.calculate_gamma(x) db.forward(x)

总结

DropBlock技术被证明可以有效的打败一些通过传统的dropout得到的最好的性能结果,Spatial Dropout,DropPath,CutOut这些也显示了更好的结果,但是这些要归功于强力的数据增强的方法。DropBlock被证明是一种有效的目标检测正则化方法。

英文原文:https://medium.com/swlh/overview-on-dropblock-regularization-b1b9590fd3c2

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。