YOLOv4的Tricks解读二 --- 正则化(DropOut/DropConnect/DropBlock)


YOLOv4中采用了DropBlock正则化方法,本文就YOLOv4中涉及和采用的DropBlock进行总结和学习。

DropOut

在这里插入图片描述
DropOut在全连接层使用,进行随机放弃连接。

  • 在训练阶段,对于每个节点,以p概率将其输出值保留,以1-p概率将其输出值乘以0(以一定的概率让神经元的激活函数停止工作,相当于这个神经元就废了~~)。
  • 在测试阶段,输出结果要乘以p。原因是:保持训练阶段和测试阶段的期望值相同。训练阶段,对于每个节点,dropout之前的输出是x, 经历dropout之后的期望值是px+(1−p)∗0=px,因此在测试阶段需要将结果乘以p,从而输出的期望值是px(可以看到,这样增加了测试阶段的计算量,影响测试性能。)。

按照原文的话就是进行激活函数运算之后乘以一个二进制的掩码向量(向量的中的0,1是随机的),这样就是dropout的计算。

DropOut之前的计算:
在这里插入图片描述
使用DropOut后的计算:
在这里插入图片描述
其中p是概率大小,公式中Bernoulli函数,是为了以概率p,随机生成一个0、1的向量。

dropout为什么可以缓解网络过拟合?

  • 减少了节点之间的co-adaptation(共适应性)
  • bagging的极限形式

DropConnect

在这里插入图片描述
由上图看出,DropOut是将神经元激活输出随机置0,而DropConnect是作用于权重,以1-p概率将节点中的每个与其相连的输入权重清0(一个作用于神经元激活输出,一个作用于神经元输入 — 隐层权重)。
看看DropConnect的trainning和inference两部分。
在这里插入图片描述
注意:因为DropConnect只能用于全连接的网络层(和dropout一样),如果网络中用到了卷积,则用patch卷积时的隐层节点是不使用DropConnect的,因此上面的流程里有一个Extract feature步骤,该步骤就是网络前面那些非全连接层的传播过程,比如卷积+pooling.
简单来说,DropConnect的训练过程是:

  • 按照伯努利分布以概率p生成一个Mask二进制矩阵
  • 使用上步生成的Mask矩阵乘以权重,这样就将权重矩阵中的部分元素值0,即将部分权重清0,然后乘以特征矩阵,再然后经过记过函数得到激活层输出。
  • 计算模型输出
  • 开始反向传播,更新梯度

注意更新梯度那里在更新DropConnect layer的梯度时,置0权重的梯度不参与更新。它的考虑是前向计算的时候这些被选中的W都是0,那么在梯度更新的时候也不允许有更新,因此这里梯度矩阵先乘以Mask矩阵,将置0的权重对应的梯度置零,那么对应的权重梯度就没有得到更新

DropBlock

论文:https://arxiv.org/pdf/1810.12890.pdf
代码:https://github.com/miguelvr/dropblock

DropOut的主要问题就是随机drop特征,这一点对于FC层是有效的,但在卷积层是无效的,因为卷积层的特征是空间强相关的。当特征相关时,即使有DropOut,信息仍能传送到下一层,导致过拟合。

DropBlock是适用于卷积层的正则化方法,它作用的对象的特征图。在DropBlock中,特征在一个个block中,当应用DropBlock时,一个feature map中的连续区域会一起被drop掉。那么模型为了拟合数据网络就不得不往别出看以寻找新的证据。

看下图:
在这里插入图片描述
其中(a)是输入到卷积网络的原始图像,(b)和©中的绿色区域包括激活单元,这些激活单元在输入图像中包含语义信息。随机丢弃激活对删除语义信息无效,因为附近的激活包含紧密相关的信息。 相反,删除连续区域可以删除某些语义信息(例如,头或脚),从而强制其余单元学习用于分类输入图像的其它特征,这样就增加了模型的泛化能力。

依据论文的说法,在一系列模型和数据集中,DropBlock的性能远远优于Dropout。 将DropBlock添加到ResNet-50体系结构可将ImageNet上的图像分类准确性从76.51%提高到78.13%。 在检测到COCO时,DropBlock将RetinaNet的AP从36.8%提高到38.4%。

它与dropout的主要区别在于,它从图层的特征图中删除连续区域,而不是删除独立的随机单位(看起来DropBlock的本质其实就是将Cutout方法应用于CNN的每一个特征图。)。 DropBlock具有两个主要参数,分别是block_size和γ。 block_size是要删除的块的大小,而γ控制要删除的激活单元数。DropBlock的伪代码如下:
在这里插入图片描述

  • 输入为:层激活输出(也就是feature map A),block_size,γ,mode-

  • 当mode是inference时直接返回特征图,不做DropBlock。

  • 按照伯努利分布(0-1分布)采样mask M

  • 对于每个零位置M_ij,创建一个以M_ij为中心,宽度,高度为block_size的空间正方形mask,并将正方形中M的所有值设置为0(参见图2)。(需要注意的是仅从浅绿色区域采样M的中心点,这样block就是完整的)

  • 新的A = A * M

  • 特征归一化:A = A * count(M)/count_ones(M)

在这里插入图片描述
根据论文,有在不同的特征通道上共享DropBlock mask和每个特征通道上独享DropBlock mask两种方法,实验证实第二种效果更好。

设置block_size的值。 在作者的实现中,作者为所有特征图设置了恒定的block_size,而与特征图的分辨率无关。 当block_size = 1时,DropBlock类似于dropout;当block_size覆盖整个功能图时,DropBlock类似于SpatialDropout (drop掉一个feature map的整个通道)。

设定γ的值。 实践中,作者没有明确设置γ。 γ根据以下公式进行调整:
在这里插入图片描述
其中keep_prob可以解释为将单元保留在dropout的概率。 有效种子区域的大小为(feat_size -block_size +1)^2,其中feat_size是feature map的大小。 DropBlock的主要细微差别是在丢弃的块中会有一些重叠,因此上面的方程式只是一个近似值。 实验中,首先估计要使用的keep_prob(介于0.75和0.95之间),然后根据上式计算γ。

预定的DropBlock。 作者发现在训练期间使用固定的keep_prob的DropBlock效果不佳。 应用小值的keep_prob会损害一开始的学习。 相反,随着时间的推移,将keep_prob从1逐渐减小到目标值更加稳健,并且对大多数keep_prob值进行了改进。 实验中,作者使用了降低keep_prob值的线性方案,该方案在许多超参数设置中都可以正常工作。 此线性方案类似于ScheduledDropPath 。

看看实验结果:
在这里插入图片描述
第一行为原始的图片,第二行为未使用DropBlock,第三行为block_size=1,第四行为block_size=7。可以看出

(1)使用DropBlock比不使用DropBlock具有更大的热量图

(2)DropBlock的block_size越大,热量图的激活部分越多

ImageNet 图像分类:
在这里插入图片描述
COCO 目标检测:
在这里插入图片描述
PASCAL VOC 图像分割:
在这里插入图片描述

参考
https://www.pianshen.com/article/9279561411/
https://blog.csdn.net/qq_14845119/article/details/85103503
https://www.jianshu.com/p/cf403e991a88

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章