-
Notifications
You must be signed in to change notification settings - Fork 5.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Batch Normalization Survey #3684
Comments
主要原理在神经网络的训练过程中,各层的参数在每一轮迭代中都会发生变化,因此除了原始输入数据外,后面各层的输入数据(即上一层的输出)的分布情况都在发生着变化。如果某一层的输出数据分部不理想,很可能会增加后面层的训练难度。为了解决这一问题,可以在神经网络内部的层与层之间对数据再进行一次归一化(0均值,1方差),即
其中 但这种归一化过于简单粗暴,很可能破坏有用的数据分布。因此,batch_norm在进行上述简单归一化之后,又对输出的数据
其中 需要注意的是,batch_norm的前向计算需要用到 |
主要困难相对于一般的OP来说,batch_norm在实现上主要有两个挑战:
|
Caffe2 的实现在caffe2中,batch_norm在python中被定义为一个layer(batch_normalization.py)。但在这个layer中只有 net.SpatialBN([input_blob, self.scale,
self.bias, self.rm, self.riv],
output_blobs,
momentum=self.momentum,
is_test=is_test,
order=self.order) 各个参数意义如下:
其中
下面主要介绍一下Caffe2是如何克服了上述的两个实现上的困难: trian和infer时行为不同Caffe2的
|
TensorFlow的实现在TensorFlow中,batch_normalization也是一个单独的op,代码实现在FusedBatchNormOp类中。具体的思路和Caffe2几乎完全一样。一个比较明显的区别是,在更新 |
|
目前还只是看了下单线程的实现,思考和现在框架的兼容情况,还没看多线程的实现,接下来会继续看一下~ |
多线程计算上没啥区别,多线程会分数据,mean 和 std 的计算都是基于每个线程自己分到的数据,这样会出现多个mean 和 std,保存的时候只保存一份。 merge 所有线程的数据计算mean 和 std 比较麻烦,见过很多方法讨论怎样去merge结果,但真正实现进各个框架的好像不多(我没调查过。。)? |
还有一个问题,暂时估计不重要/不需要考虑?感觉也不难弄。。 Layer normalization 计算上恰就是将 batch normalization 的输入矩阵转置,之后的计算和batch norm完全一致,输出时再转置回去(需要保证layer输出宽度是固定的)。 转置之后可以避免在mini-batch上估计 mean 和 std,于是不再需要区别训练和infer。这个方法是Hinton提的,似乎用的人并不太多(论文引用量好低),但谷歌自己发的论文有在用。。 不知道有没有可能非常方便的复用 batch norm(TF是分开实现的)。 可能对batch norm wrap 一次就可以?这个是临时想到的,可能也不需要考虑。。。 |
其实我觉得这个问题可以算是op的粒度问题。如果我们只在C++端提供细粒度的op,在python端组成各种layer,那么应该是可以比较容易地实现复用的。 在目前的重构设计中我们遵循了上面说的这种思路,比如C++端只提供了 mul, add和sigmoid这样的操作,然后在python里实现fc。 但是这样是否会有严重的性能问题,感觉也很值得考虑。 |
嗯, batch norm 靠拼出来会有9个还是11个来次的小运算,前向和反向的中间结果会很多,带来额外的计算(可以化简)和内存,不必要的内存消耗会阻止训练深层网络。。。。 |
@Canpio BatchNorm实现时希望增加一个功能:训练时可支持使用global moving mean/var,当前Paddle没有支持该功能。 |
想了一下,在当前框架下,为了实现batch norm,需要考虑下面几个问题:
|
@qingqing01 这应该是可以实现的,感觉问题不是很大 |
This is a survey about main principles and difficulties of batch normalization. Its implementation in Caffe2 and TensorFlow are also included.
related #3658
The text was updated successfully, but these errors were encountered: