Batch Normalization做了什么?
在数据在最初进来的时候,都希望是(IID)独立同分布的。
但是batch Normalization的作者觉得不够,应该在deep learning中的每层都进行一次处理,保证在每层都是同分布。
他是这么想的:假设网络有n层,网络正在训练,还没有收敛。这时候被输入,经过了第一层,但是第一层还没有学到正确的weight,所以经过weight的矩阵乘法后,第二层的数会不会很乱?会不会第二层有些节点值是个位数,有些节点值蹦到好几百?细想一下,确实挺有可能啊,内部的参数都是随机初始化的,那蹦啥结果确实不好说啊。然后恐怖的事情来了,第二层这些乱蹦的数,又输到了第三层,那第三层的输入就是乱蹦的数,输出当然好不了,以此类推。
所以主要产生了两个问题:
1.所以在前面的网络没有收敛的时候,后面的网络其实并学不到什么。(一栋大楼底部都是晃的,那上面也好不了。所以必须要等前面的层收敛后,后面层的训练才有效果。)
2.因为一般来说网络内部每层都需要加一层激活来增加非线性化嘛,那么如果值比较大,它通过激活以后在S曲线上会比较接近0或1,梯度很小,收敛会很慢。
所以batch Normalization就想在每层都加一个norm进行标准化,让每层