美文网首页机器学习
CBN(Cross-Iteration Batch Normal

CBN(Cross-Iteration Batch Normal

作者: ce0b74704937 | 来源:发表于2020-08-19 21:00 被阅读0次

原文链接:Cross-Iteration Batch Normalization
代码链接:https://github.com/Howal/Cross-iterationBatchNorm

随着BN的提出,现有的网络基本都在使用。但是在显存有限或者某些任务不允许大batch(比如检测或者分割任务相比分类任务训练时的batchsize一般会小很多)的情况下,BN效果就会差很多,如下图所示,当batch小于16时分类准确率急剧下降。


1

为了改善小batch情况下网络性能下降的问题,有各种新的normalize方法被提出来了(LN、IN、GN),详情请看文章GN-Group Normalization。上述不同的normalize方式适用于不同的任务,其中GN就是为检测任务设计的,但是它会降低推断时的速度。

本文的思想其实很简单,既然从空间维度不好做,那么就从时间维度进行,通过以前算好的BN参数用来计算更新新的BN参数,从而改善网络性能。从上图可以看出使用新提出的CBN,即使batch size小也可以获得较好的分类准确率。

通过过去的BN参数来计算新的BN参数有个问题,就是过去的BN参数是根据过去的网络参数计算出的feature来估算的,新的BN参数计算时,参数已经更新过了,如果直接使用之前的参数来计算新的BN参数会使得参数估计不准,网络性能下降,如上图中的Naive CBN。为了改进这种缺陷,文章使用泰勒多项式来估算新的BN参数。下面来介绍具体的计算方式。

一、Batch Normalization

先来回顾一下原始的BN计算公式。
BN操作的公式如下
\hat{x}_{t,i}(\theta_t) = \frac{x_{t,i}(\theta_t)-\mu_t(\theta_t)}{\sqrt{\sigma_t(\theta_t)^2 + \epsilon}}
y_{t,i}(\theta_t)=\gamma \hat{x}_{t,i}(\theta_t)+\beta
上式中\theta_t表示第t个mini-batch训练时的网络参数,x_{t,i}(\theta_t)表示第t个mini-batch中第i个样本经过网络得到的feature map,\hat{x}_{t,i}(\theta_t)表示bn后均值为0和方差为1的特征,\mu_t(\theta_t)\sigma_t(\theta_t)表示当前mini-batch计算出来的均值和方差,\epsilon是防除零的系数,\gamma\beta表示BN中需要学习的参数。

\mu_t(\theta_t)\sigma_t(\theta_t)计算方式如下
\mu_t(\theta_t)=\frac{1}{m}\sum^m_{i=1} x_{t,i}(\theta_t)
\sigma_t(\theta_t)=\sqrt{\frac{1}{m}\sum^m_{i=1} (x_{t,i}(\theta_t)-\mu_t(\theta_t))^2} = \sqrt{\nu_t(\theta_t)-\mu_t(\theta_t)^2}
其中\nu_t(\theta_t)=\frac{1}{m}\sum^m_{i=1} x_{t,i}(\theta_t)^2,m表示mini-batch里面有m个样本。

二、估计之前的均值和方差

假设现在是第t次迭代,那t之前的迭代计算时,拿t-\tau次迭代来说,已经计算过了对应的均值和方差了,但是之前的计算是使用之前的网络参数得到的,用符号表示为\mu_{t-\tau}(\theta_{t-\tau})\nu_{t-\tau}(\theta_{t-\tau})。现在想要估计的是参数\mu_{t-\tau}(\theta_{t})\nu_{t-\tau}(\theta_{t})。文章认为连续几次网络参数的变化是平滑的,所以根据泰勒展开式可以估计出上述的两个参数:
\mu_{t-\tau}(\theta_{t})=\mu_{t-\tau}(\theta_{t-\tau}) + \frac{\partial \mu_{t-\tau}(\theta_{t-\tau})}{\partial \theta_{t-\tau}}(\theta_{t}-\theta_{t-\tau})+O(\lVert \theta_{t}-\theta_{t-\tau}\lVert ^2)
\nu_{t-\tau}(\theta_{t})=\nu_{t-\tau}(\theta_{t-\tau}) + \frac{\partial \nu_{t-\tau}(\theta_{t-\tau})}{\partial \theta_{t-\tau}}(\theta_{t}-\theta_{t-\tau})+O(\lVert \theta_{t}-\theta_{t-\tau}\lVert ^2)

其中\frac{\partial\mu_{t-\tau}(\theta_{t-\tau})}{\partial\theta_{t-\tau}}\frac{\partial\nu_{t-\tau}(\theta_{t-\tau})}{\partial\theta_{t-\tau}}表示对网络参数求偏导数,O(\lVert \theta_{t}-\theta_{t-\tau}\lVert ^2)表示泰勒展开式的高阶项,当(\theta_{t}-\theta_{t-\tau})较小时,高阶项可以忽略不计。

注意:要精确的获得上式中的\frac{\partial\mu_{t-\tau}(\theta_{t-\tau})}{\partial\theta_{t-\tau}}\frac{\partial\nu_{t-\tau}(\theta_{t-\tau})}{\partial\theta_{t-\tau}}的值计算量会很大,因为网络中的第l层的参数{\mu^l_{t-\tau}(\theta_{t-\tau})}{\nu^l_{t-\tau}(\theta_{t-\tau})}会依赖之前的层,例如依赖\frac{\partial\mu^l_{t-\tau}(\theta_{t-\tau})}{\partial\theta^r_{t-\tau}}\neq0\frac{\partial\nu^l_{t-\tau}(\theta_{t-\tau})}{\partial\theta^r_{t-\tau}}\neq 0,这里r\leq l,\theta^r_{t-\tau}表示第r层的参数。实际上文章发现当r\leq l时,偏导数\frac{\partial\mu^l_{t-\tau}(\theta_{t})}{\partial\theta^r_{t}}\frac{\partial\nu^l_{t}(\theta_{t})}{\partial\theta^r_{t}}减小的非常快。

所以上两等式可以近似表示为下两式
\mu^l_{t-\tau}(\theta_{t})\approx\mu^l_{t-\tau}(\theta_{t-\tau}) + \frac{\partial \mu^l_{t-\tau}(\theta_{t-\tau})}{\partial \theta^l_{t-\tau}}(\theta^l_{t} - \theta^l_{t-\tau})
\nu^l_{t-\tau}(\theta_{t})\approx\nu^l_{t-\tau}(\theta_{t-\tau}) + \frac{\partial \nu^l_{t-\tau}(\theta_{t-\tau})}{\partial \theta^l_{t-\tau}}(\theta^l_{t} - \theta^l_{t-\tau})

三、Cross-Iteration Batch Normalization

CBN的工作方式如下


2

上一节利用之前的参数估算出来了当前参数下l层在t-\tau次迭代的参数值,通过这些估计值可以计算出l层在当前迭代时的BN参数,计算公式如下:
\bar{\mu}^l_{t,k}(\theta_t)=\frac{1}{k}\sum^{k-1}_{\tau=0}\mu^l_{t-\tau}(\theta_t)
\bar{\nu}^l_{t,k}(\theta_t)=\frac{1}{k}\sum^{k-1}_{\tau=0} max[\nu^l_{t-\tau}(\theta_t) , \mu^l_{t-\tau}(\theta_t)^2]
\bar{\sigma}_{t,k}(\theta_t)= \sqrt{\bar{\nu}_{t,k}(\theta_t)-\bar{\mu}_{t,k}(\theta_t)^2}
注意:在有效的统计时\nu^l_{t-\tau}(\theta_t) \geq \mu^l_{t-\tau}(\theta_t)^2是一直都会满足的,但是利用泰勒展开式估算不一定能满足条件,所以上述使用了max函数来保证这一点。还要说的是,代码实现的时候并没有这样写,实现时k是指所有\nu^l_{t-\tau}(\theta_t) \geq \mu^l_{t-\tau}(\theta_t)^2的元素,即过滤了不满足条件的值

最后CBN更新特征的方式同BN
\hat{x}^l_{t,i}(\theta_t) = \frac{x^l_{t,i}(\theta_t)-\bar\mu^l_t(\theta_t)}{\sqrt{\bar\sigma^l_t(\theta_t)^2 + \epsilon}}

CBN的伪代码如下


截屏2020-08-19 下午6.41.57.png

四、计算量优化

文章附录还有一个求偏导的优化方式来节省计算量,假设l和l-1层卷积的通道数为C^lC^{l-1},K表示l层卷积的kernelsize,因此\mu^l_{t-\tau}\nu^l_{t-\tau}通道数为C^l\theta^l_{t-\tau}的维度数为C^l \times C^{l-1} \times K,如果直接计算\frac{\partial\mu^l_{t-\tau}(\theta_{t-\tau})}{\partial\theta^l_{t-\tau}}\frac{\partial\nu^l_{t-\tau}(\theta_{t-\tau})}{\partial\theta^l_{t-\tau}},时间复杂度为O(C^l \times C^l \times C^{l-1} \times K)。通过下面的推导我们可以知道可以在O(C^{l-1} \times K)O(C^l \times C^{l-1} \times K)时间内求出\mu\nu

下面拿\mu来举例说明,为了简化符号,下面用\mu^l\theta^l代替\mu^l_{t-\tau}(\theta_{t-\tau})\nu^l_{t-\tau}(\theta_{t-\tau})
\mu^l_j=\frac{1}{m}\sum^m_{i=1} x^l_{i,j}
上式中\mu^l_j表示\mu^l中第j个通道的值,x^l_{i,j}表示第i个样本的第j个通道值。

x^l_{i,j}=\sum^{C^{l-1}}_{n=1}\sum^K_{k=1}\theta^l_{j,n,k}\cdot y^{l-1}_{i + offset(k),n}
上式中,n和k分别表示输入feature的通道维度索引和卷积的kernel维度索引,offset表示卷积时的索引值,y^{l-1}表示l-1层的输出。

\frac{\partial{\mu^l}}{\partial{\theta^l}}\in R^{C^l \times C^l \times C^{l-1} \times K}计算公式如下
[\frac{\partial{\mu^l}}{\partial{\theta^l}}]_{j,q,p,\eta}=\frac{\partial \mu^l_j}{ \partial \theta^l_{q,p,n} } \\ =\frac{\partial \frac{1}{m}\sum^m_{i=1}\sum^{C^{l-1}}_{n=1}\sum^{K}_{k=1}\theta^{l}_{j,n,k}\cdot y^{l-1}_{i+offset(k),n}}{\partial \theta^l_{q,p,n}} \\ = \left\{ \begin{array}{lr} \frac{1}{m}\sum^{m}_{i=1} y^{l-1}_{i+offset(\eta) , p} && , j=q \\ 0 && , j\neq q \end{array} \right.
从上式可以看出当j=q时才要计算,其它情况不用计算,这样就减少了计算量。

到这里CBN就介绍完了,思想很简单,但是公式较多,可以看看代码实现,代码量不多。最后要说的是,这篇文章提出来时为了解决小batch训练的情况,yolov4提出有一点就是方便用户使用一个GPU训练,所以yolov4借用了该算法的思想。

相关文章

网友评论

    本文标题:CBN(Cross-Iteration Batch Normal

    本文链接:https://www.haomeiwen.com/subject/ypzrjktx.html