当卷积层后跟batch normalization层时为什么不要偏置b
2017-09-20 23:08
309 查看
起因
之前使用的是inception-v2模型,在v2中,标准的卷积模块为:* conv_w_b->bn->relu ->pooling*
即,在v2中,尽管在卷积之后、激活函数之前大量使用batch normalization,但是卷积层依然使用可学习的偏置参数。
这也比较符合我的直观理解,因为偏置在一般的卷积神经网络中本来就是很重要的,可以让超判决面不过原点。
但是我在读inception-v3的代码时,发现v3中一个卷积模块中 bn和bias是不共存的,这令我很费解,这么重要的参数为什么没有?
解
后来想明白了,接下来是明白的过程:首先,看bias的有无到底会不会对bn的结果造成影响?
bn操作的关键一步可以简写为:
yi=xi−x¯D(x)−−−−√
当加上偏置之后,为:
ybi=xbi−xb¯D(xb)−−−−−√
其中:
xbi=xi+b
,然后我们对公式进行化简:
ybi=xi+b−(x¯+b)D(xb)−−−−−√=xi−x¯D(xb)−−−−−√
而:
D(xb)=E[(xb)2]−[E(xb)]2D(xb)=1N∑i(xbi)2−(x¯+b)2D(xb)=1N∑i(xi+b)2−(x¯+b)2D(xb)=1N∑ix2i+2bx¯+b2−(x¯+b)2D(xb)=1N∑ix2i−x¯2D(xb)=D(x)
所以:
ybi=yi
。
好了。
那么为什么没有bias的卷积层能够对bn后的输入学习到很好的决策面呢?
当然啦,bn本身就是将数据归一化到标准分布的呀~
相关文章推荐
- 前端,我为什么不要你
- 实例说明为什么不要行内使用javascript
- 为什么不要用eval函数
- 为什么打开vs2008项目时vss不要输入密码
- “我们为什么不要牛实习生”----对于实习生的劝诫
- 程序员,为什么千万不要重写代码?
- 为什么我们不要.NET程序员
- 为什么不要在构造函数中调用虚函数
- 为什么不要在android或者ios上直连mysql或者sqlserver之类的数据库(跳大神)
- 为什么劝你不要过度纠结于技术细节?
- 为什么尽量不要让时间有富裕的员工去做一些测试?
- 如果我真的好,你为什么不要。
- 为什么不要重写原有类方法
- 为什么Service层最好不要和Dao层参数同名
- 为什么不要做微商?
- 为什么我们不要 .NET 程序员
- 为什么不要将spring-boot相关依赖打入二方包
- 为什么我们不要 .NET 程序员
- “我们为什么不要牛实习生”----对于实习生的劝诫
- 走的时候不要太急,有时间要停下来想一想当初为什么而走,这样,才会走的更稳,走的更明白。