Normalization如何解决梯度消失

转载大神的文章。感觉写的通俗易懂

https://blog.csdn.net/sinat_33741547/article/details/87158830

具体计算的方法可以看我的博客https://blog.csdn.net/gbz3300255/article/details/107997814

在训练过程中,随着网络加深,分布逐渐发生变动,导致整体分布逐渐往激活函数的饱和区间移动,从而反向传播时底层出现梯度消失,也就是收敛越来越慢的原因。

说白了Normalization就是为了解决上面问题,不让梯度往激活函数的饱和区移动

而Normalization则是把分布强行拉回到均值为0方差为1的标准正态分布,使得激活输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,避免梯度消失问题产生,加速收敛,如下:

                                            

如上,假设正态分布均值是-2,方差是0.5,如上图绿色曲线,通过标准化操作转换为均值为0,方差为1的正态分布,如上图红色曲线。
实际上是将输入x的取值正态分布整体右移2(均值变化),图形曲线更平缓了(方差变化)。那么这么做的好处是什么呢?

                  

图为标准正态分布的图形,可以看到,在一个标准差范围,有68%的概率x其值落在[-1,1]的范围内;在两个标准差范围,有95%的概率x其值落在了[-2,2]的范围内,假如这就是需要进行激活的分布,激活函数为sigmoid,如下:

                                       

可以看到,在[-2, 2]的范围内,即是标准正态分布两个标注差范围内,在sigmoid函数中为线性变换区域,微小的变化就能得到很大的改变,也即是梯度比较大。
如果不经过变换,存在一个均值为-6,方差为1的分布,对应到激活函数中就是[-8, -4]的区域,这已经是饱和区了,这也就是所谓的梯度消失。

所以标准化其实就是把大部分激活的值落入非线性函数的线性区内,其对应的导数远离导数饱和区,这样来加速训练收敛过程。饱和区就是梯度接近消失的区域。

猜你喜欢

转载自blog.csdn.net/gbz3300255/article/details/111244997