![acecc88c4623a64585d50459269b790d.png](https://i-blog.csdnimg.cn/blog_migrate/3e6b8dc2fc9a3414b1a7222a6af4db08.jpeg)
这段刚好在听Jeremy Howard团队的 fastai相关课程,里面专门有一部分提到了Batch Norm. Batch normalization被立即认为是有巨大影响的。在2015当它刚出现时,迅速风靡。大家在谈论它的时候都会引用下面的图片:
![1d581377860ba2eae852920dba67dc4e.png](https://i-blog.csdnimg.cn/blog_migrate/613994230f029c8596c5f712337b7234.jpeg)
这个图片出自那篇经典的文章:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift。它展示当时的最佳ImageNet模型Inception。这是它得到一个很好的结果花的时间,然后他们用这个叫btach norm的新东西做了同样的事情,它们做得非常非常快。
这篇文章指出,它通过减少内部协变量移位(internal covariate shift)来加速训练。什么是内部协变量移位?这不重要。因为btach norm是一些研究者靠直觉提出来的、要试试看的东西。他们成功了,它的效果很好,他们事后补充了一些数学分析来试着说明为什么它是有效的。最终,这些数学分析完全错了。
因为btach norm是一些研究者靠直觉提出来的、要试试看的东西。他们成功了,它的效果很好,他们事后补充了一些数学分析来试着说明为什么它是有效的。最终,这些数学分析完全错了。
![67c8eb97b2305cafd08f5551da98d7ef.png](https://i-blog.csdnimg.cn/blog_migrate/113e37c28b995b559bd1f26f2a97a5f3.jpeg)
后来人们花了三年指出这个问题,指出batch normalization根本没有减少内部协变量移位。并且,就算真的减少了,也对模型的效果没什么帮助。Jeremy认为这是一个非常有意义的学术自我批评和反思,也说明为什么我们要专注于做实践者和实验主义者,提升直觉。
batch norm做的是你看到的下面这个图片上的东西。横轴代表步数(steps)工者batch,纵轴代表的损失(loss),红色的线是没有batch norm时训练的情况,波动较大。蓝张是用了batch norm后的情况,波动不大了。「这些表明batch norm可以提高学习率」,因为这些大的波动代表训练权重跳出到权重空间里可怕的、再也没办法回来的地方,这很危险,波动越多遇到危险的次数就越多。「如果它没有那么多波动,我们可以用更高的学习率来训练它」。这就是它的原理。
![55e2d59f05682786f1b91a3d42322cc0.png](https://i-blog.csdnimg.cn/blog_migrate/4c54572345db41d7f100d94a16f4d0e2.jpeg)
回来看batch norm的算法如下:
![fb1b7c8bc8013fb001ab5828dcc4902f.png](https://i-blog.csdnimg.cn/blog_migrate/6324f1a0dba09be2b42b2c41f95beedf.jpeg)
从算法的伪代码来看,这个算法非常简洁。
算法会取一个mini batch。我们有了一个mini batch,记住,这是一个层,进入这个层的是激活值。batch norm是一个层,它会接收激活值。激活值被叫做
- 首先,我们要计算这些激活值的平均值(mean),总和和除以数量就是平均值。
- 第二件事,我们找到激活值的方差(variance),差值的平方求和,再除以数量是就方差。
- 然后做标准化(normalize),激活值减去平均指除以标准差,就是标准化。这实际上不是很重要。我们曾经以为很重要,但后来发现不是。真正重要的部分是下面的东西。
- 我们取这些值,加上一个bias的向量(这里把它叫做
)。加上bias。然后用另外一个和bias很像的东西,但不是加上它,而是乘以它。这些参数
,
和
是要学习的参数。
在神经网络里,只有两种数字:「激活值和参数」。
为什么这可以实现了不起的结果?Jeremy的解释发下。
究竟发生了什么?我们的预测值y-hat是权重的函数,参数数量可以达到上百万,它也是一个关于输入的函数。
这个函数f是我们的神经网络函数(很多地方把神经网络看成一个特殊函数,有输入和输出),无论神经网络里是什么。然后,我们的损失函数,假设是均方差,只是实际值减去预测值的平方。
假设我们要预测电影评分,它们在1到5之间。我们已经训练过模型,最后的激活值在-1到1之间。这和它们应该是的值不一致。区间不一致、平均值不一致。我们应该怎么做?
- 一个方法是用一个新的权重集合,让区间增长,让平均值增长。但是这很难,因为所有这些参数有很密切复杂的相互作用。所有这些非线性单元,是组合在一起的。想让它们变大,要穿过复杂的参数空间,我们用像动量、Adam之类的东西来帮助我们,但还要做很多事情才能达到目的。这会花很长时间,波动会很大。
那如果乘以
多加了两个参数向量。现在它很简单。这个数
这些细节,在某种意义上,不是特别重要。真正重要的是你肯定需要用它。如果不用它,也会用类似的东西。现在,有很多其它类型的标准化方法,但batch norm效果很好。
刚好碰到这个问题,就回答一下,这里面的思想来自于Jeremy的课程里。不是本人原创,只是原来也有这样的困惑,就查阅了相关资料。学术的东西有些时候各种计算公式,看起来非常复杂,但是有时候实践中也可以出真知。所以人类生活中,有些科学家发明家的发现和发明来自于长年累月的实践及观察。