作者: 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