深度学习 效果突然下降_深度学习中 Batch Normalization是什么,效果为什么好?

acecc88c4623a64585d50459269b790d.png

这段刚好在听Jeremy Howard团队的 fastai相关课程,里面专门有一部分提到了Batch Norm. Batch normalization被立即认为是有巨大影响的。在2015当它刚出现时,迅速风靡。大家在谈论它的时候都会引用下面的图片:

1d581377860ba2eae852920dba67dc4e.png

这个图片出自那篇经典的文章:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift。它展示当时的最佳ImageNet模型Inception。这是它得到一个很好的结果花的时间,然后他们用这个叫btach norm的新东西做了同样的事情,它们做得非常非常快。

这篇文章指出,它通过减少内部协变量移位(internal covariate shift)来加速训练。什么是内部协变量移位?这不重要。因为btach norm是一些研究者靠直觉提出来的、要试试看的东西。他们成功了,它的效果很好,他们事后补充了一些数学分析来试着说明为什么它是有效的。最终,这些数学分析完全错了。

因为btach norm是一些研究者靠直觉提出来的、要试试看的东西。他们成功了,它的效果很好,他们事后补充了一些数学分析来试着说明为什么它是有效的。最终,这些数学分析完全错了。

67c8eb97b2305cafd08f5551da98d7ef.png

后来人们花了三年指出这个问题,指出batch normalization根本没有减少内部协变量移位。并且,就算真的减少了,也对模型的效果没什么帮助。Jeremy认为这是一个非常有意义的学术自我批评和反思,也说明为什么我们要专注于做实践者和实验主义者,提升直觉。

batch norm做的是你看到的下面这个图片上的东西。横轴代表步数(steps)工者batch,纵轴代表的损失(loss),红色的线是没有batch norm时训练的情况,波动较大。蓝张是用了batch norm后的情况,波动不大了。「这些表明batch norm可以提高学习率」,因为这些大的波动代表训练权重跳出到权重空间里可怕的、再也没办法回来的地方,这很危险,波动越多遇到危险的次数就越多。「如果它没有那么多波动,我们可以用更高的学习率来训练它」。这就是它的原理。

55e2d59f05682786f1b91a3d42322cc0.png

回来看batch norm的算法如下:

fb1b7c8bc8013fb001ab5828dcc4902f.png

从算法的伪代码来看,这个算法非常简洁。

算法会取一个mini batch。我们有了一个mini batch,记住,这是一个层,进入这个层的是激活值。batch norm是一个层,它会接收激活值。激活值被叫做

等等。
  • 首先,我们要计算这些激活值的平均值(mean),总和和除以数量就是平均值。
  • 第二件事,我们找到激活值的方差(variance),差值的平方求和,再除以数量是就方差。
  • 然后做标准化(normalize),激活值减去平均指除以标准差,就是标准化。这实际上不是很重要。我们曾经以为很重要,但后来发现不是。真正重要的部分是下面的东西。
  • 我们取这些值,加上一个bias的向量(这里把它叫做
    )。加上bias。然后用另外一个和bias很像的东西,但不是加上它,而是乘以它。这些参数
    ,
    是要学习的参数。

在神经网络里,只有两种数字:「激活值和参数」

是参数。是用梯度下降学习到的东西。
只是一个普通的bias层,
是一个做乘法的bias层。没有人这样叫它,但它就是这样的。它就像bias一样,但我们乘以它,而不是加上它。这就是batch norm。这就是这一层做的事。

为什么这可以实现了不起的结果?Jeremy的解释发下。

究竟发生了什么?我们的预测值y-hat是权重的函数,参数数量可以达到上百万,它也是一个关于输入的函数。

这个函数f是我们的神经网络函数(很多地方把神经网络看成一个特殊函数,有输入和输出),无论神经网络里是什么。然后,我们的损失函数,假设是均方差,只是实际值减去预测值的平方。

假设我们要预测电影评分,它们在1到5之间。我们已经训练过模型,最后的激活值在-1到1之间。这和它们应该是的值不一致。区间不一致、平均值不一致。我们应该怎么做?

  • 一个方法是用一个新的权重集合,让区间增长,让平均值增长。但是这很难,因为所有这些参数有很密切复杂的相互作用。所有这些非线性单元,是组合在一起的。想让它们变大,要穿过复杂的参数空间,我们用像动量、Adam之类的东西来帮助我们,但还要做很多事情才能达到目的。这会花很长时间,波动会很大。

那如果乘以

,再加上
会怎么样?

多加了两个参数向量。现在它很简单。这个数

直接增大区间。这个数
直接改变平均值。没有相互作用和复杂性,都是直来直去的,这就是batch norm做的事。batch norm让使输出变大变小这个重要工作更容易做到。这就是为什么我们能得到这样的结果。

这些细节,在某种意义上,不是特别重要。真正重要的是你肯定需要用它。如果不用它,也会用类似的东西。现在,有很多其它类型的标准化方法,但batch norm效果很好。

刚好碰到这个问题,就回答一下,这里面的思想来自于Jeremy的课程里。不是本人原创,只是原来也有这样的困惑,就查阅了相关资料。学术的东西有些时候各种计算公式,看起来非常复杂,但是有时候实践中也可以出真知。所以人类生活中,有些科学家发明家的发现和发明来自于长年累月的实践及观察。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值