点击上方“AI公园”,关注公众号,选择加“星标“或“置顶”
作者:dhwani mehta
编译:ronghuaiyang
导读
对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将有更多的特征需要删除,在训练迭代中需要学习的权重的比例也将减少,最终减少过拟合。因此,用更大的block大小训练的模型去除了更多的语义信息,从而使正则化更强。并且可以推断,当block大小保持1时,DropBlock对应于Dropout,当block大小覆盖了全部feature map大小时,DropBlock类似于SpatialDropout。
从上面的图中可以明显看出,与其他曲线相比,在绿色曲线(没有经过DropBlock训练的模型)的推理过程中,随着保持概率的降低,随着坡度越陡,验证精度会迅速下降。由于在block大小为1时,DropBlock与Dropout相似,因此,在block大小为1时,随着保持概率的降低,验证准确性迅速下降,DropBlock在删除语义信息方面更加有效。
γ在DropBlock中对于正则化的效果
这个参数描述了要删除的激活单元的数量,这取决于keep_prob和block_size。
其中:
keep_prob 是设置阈值概率,所有低于这个值的元素都会去掉。
feat_size 是特征图的尺寸
feat_size - block_size + 1 是有效的种子区域
可以推断出,keep_prob越大,被删除的激活就越少。
DropBlock策略
实验研究表明,在训练过程中逐渐增加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被证明是一种有效的目标检测正则化方法。
—END—
英文原文:https://medium.com/swlh/overview-on-dropblock-regularization-b1b9590fd3c2
请长按或扫描二维码关注本公众号
喜欢的话,请给我个好看吧!