Batch_Norm公式推导与Darknet代码理解
论文:《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》
URL:https://arxiv.org/pdf/1502.03167.pdf
1. Batch_Norm的正向推导
2. Batch_Norm反向推导
其中对均值与xi的求导会用到复合函数的求导计算:
3. darknet代码
3.1 batch_norm的正向传播代码
(1) 求均值
(2)求方差
(3) 归一化
(4) 前向传播
这里存在一个滑动均值与滑动方差的概念:
滑动平均可以用来估计变量的局部均值,使得表里的更新与一段时间内的历史取值有关。变量在时刻记为,为变量在时刻的取值,即在不使用滑动平均模型时,在使用滑动平均模型后,的更新公式如下:
其中beta一般取0.9,0.99,0.999等。函数scal_cpu计算的是,axpy_cpu计算的是, l.mean表示,l.rolling_mean表示上一行计算的。
3.2 batch_norm的反向传播代码
根据第二部分反向传播公式,依次对应darknet中的代码。
(1) 对求导
(2)对方差求导
(3) 对均值求导
这里存在的问题:为什么darknet中会丢弃第二项?很多博客求导推导的时候只有第一项,没有第二项,也没有解释原因。
原因:第二项存在,这项的意义表示在一个样本空间中,每个样本减去该样本空间的均值,然后再求各个差值的和必然为0,所以darknet把第二项丢掉了。
(4) 对求导
(5) 反向传播